@agentforge/tools 0.12.6 → 0.14.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/README.md +16 -0
- package/dist/index.cjs +5207 -57
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1894 -248
- package/dist/index.d.ts +1894 -248
- package/dist/index.js +5171 -58
- package/dist/index.js.map +1 -1
- package/package.json +25 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/web/http/types.ts","../src/web/http/tools/http-client.ts","../src/web/http/tools/http-get.ts","../src/web/http/tools/http-post.ts","../src/web/http/index.ts","../src/web/scraper/types.ts","../src/web/scraper/tools/web-scraper.ts","../src/web/scraper/index.ts","../src/web/html-parser/types.ts","../src/web/html-parser/tools/html-parser.ts","../src/web/html-parser/tools/extract-links.ts","../src/web/html-parser/tools/extract-images.ts","../src/web/html-parser/index.ts","../src/web/url-validator/types.ts","../src/web/url-validator/tools/url-validator.ts","../src/web/url-validator/tools/url-builder.ts","../src/web/url-validator/tools/url-query-parser.ts","../src/web/url-validator/index.ts","../src/web/web-search/schemas.ts","../src/web/web-search/utils.ts","../src/web/web-search/providers/duckduckgo.ts","../src/web/web-search/providers/serper.ts","../src/web/web-search/index.ts","../src/web/slack/auth.ts","../src/web/slack/tools/send-slack-message.ts","../src/web/slack/tools/notify-slack.ts","../src/web/slack/tools/get-slack-channels.ts","../src/web/slack/tools/get-slack-messages.ts","../src/web/slack/index.ts","../src/web/confluence/auth.ts","../src/web/confluence/tools/search-confluence.ts","../src/web/confluence/tools/get-confluence-page.ts","../src/web/confluence/tools/list-confluence-spaces.ts","../src/web/confluence/tools/get-space-pages.ts","../src/web/confluence/tools/create-confluence-page.ts","../src/web/confluence/tools/update-confluence-page.ts","../src/web/confluence/tools/archive-confluence-page.ts","../src/web/confluence/index.ts","../src/data/csv/types.ts","../src/data/csv/tools/csv-parser.ts","../src/data/csv/tools/csv-generator.ts","../src/data/csv/tools/csv-to-json.ts","../src/data/csv/tools/json-to-csv.ts","../src/data/csv/index.ts","../src/data/json/types.ts","../src/data/json/tools/json-parser.ts","../src/data/json/tools/json-stringify.ts","../src/data/json/tools/json-query.ts","../src/data/json/tools/json-validator.ts","../src/data/json/tools/json-merge.ts","../src/data/json/index.ts","../src/data/xml/types.ts","../src/data/xml/tools/xml-parser.ts","../src/data/xml/tools/xml-generator.ts","../src/data/xml/tools/xml-to-json.ts","../src/data/xml/tools/json-to-xml.ts","../src/data/xml/index.ts","../src/data/transformer/types.ts","../src/data/transformer/tools/array-filter.ts","../src/data/transformer/tools/array-map.ts","../src/data/transformer/tools/array-sort.ts","../src/data/transformer/tools/array-group-by.ts","../src/data/transformer/tools/object-pick.ts","../src/data/transformer/tools/object-omit.ts","../src/data/transformer/index.ts","../src/data/neo4j/types.ts","../src/data/neo4j/connection.ts","../src/data/neo4j/embeddings/utils.ts","../src/data/neo4j/embeddings/providers/openai.ts","../src/data/neo4j/embeddings/providers/cohere.ts","../src/data/neo4j/embeddings/providers/huggingface.ts","../src/data/neo4j/embeddings/providers/voyage.ts","../src/data/neo4j/embeddings/providers/ollama.ts","../src/data/neo4j/embeddings/embedding-manager.ts","../src/data/neo4j/utils/result-formatter.ts","../src/data/neo4j/tools/neo4j-query.ts","../src/data/neo4j/tools/neo4j-get-schema.ts","../src/data/neo4j/utils/cypher-sanitizer.ts","../src/data/neo4j/tools/neo4j-find-nodes.ts","../src/data/neo4j/tools/neo4j-traverse.ts","../src/data/neo4j/tools/neo4j-vector-search.ts","../src/data/neo4j/tools/neo4j-vector-search-with-embedding.ts","../src/data/neo4j/tools/neo4j-create-node-with-embedding.ts","../src/data/neo4j/index.ts","../src/file/operations/types.ts","../src/file/operations/tools/file-reader.ts","../src/file/operations/tools/file-writer.ts","../src/file/operations/tools/file-append.ts","../src/file/operations/tools/file-delete.ts","../src/file/operations/tools/file-exists.ts","../src/file/operations/index.ts","../src/file/directory/types.ts","../src/file/directory/tools/directory-list.ts","../src/file/directory/tools/directory-create.ts","../src/file/directory/tools/directory-delete.ts","../src/file/directory/tools/file-search.ts","../src/file/directory/index.ts","../src/file/path/types.ts","../src/file/path/tools/path-join.ts","../src/file/path/tools/path-resolve.ts","../src/file/path/tools/path-parse.ts","../src/file/path/tools/path-basename.ts","../src/file/path/tools/path-dirname.ts","../src/file/path/tools/path-extension.ts","../src/file/path/tools/path-relative.ts","../src/file/path/tools/path-normalize.ts","../src/file/path/index.ts","../src/utility/date-time/types.ts","../src/utility/date-time/tools/current-date-time.ts","../src/utility/date-time/tools/date-formatter.ts","../src/utility/date-time/tools/date-arithmetic.ts","../src/utility/date-time/tools/date-difference.ts","../src/utility/date-time/tools/date-comparison.ts","../src/utility/date-time/index.ts","../src/utility/string/types.ts","../src/utility/string/tools/string-case-converter.ts","../src/utility/string/tools/string-trim.ts","../src/utility/string/tools/string-replace.ts","../src/utility/string/tools/string-split.ts","../src/utility/string/tools/string-join.ts","../src/utility/string/tools/string-substring.ts","../src/utility/string/tools/string-length.ts","../src/utility/string/index.ts","../src/utility/math/types.ts","../src/utility/math/tools/calculator.ts","../src/utility/math/tools/math-functions.ts","../src/utility/math/tools/random-number.ts","../src/utility/math/tools/statistics.ts","../src/utility/math/index.ts","../src/utility/validation/types.ts","../src/utility/validation/tools/email-validator.ts","../src/utility/validation/tools/url-validator-simple.ts","../src/utility/validation/tools/phone-validator.ts","../src/utility/validation/tools/credit-card-validator.ts","../src/utility/validation/tools/ip-validator.ts","../src/utility/validation/tools/uuid-validator.ts","../src/utility/validation/index.ts","../src/agent/ask-human/types.ts","../src/agent/ask-human/tool.ts"],"names":["z","toolBuilder","ToolCategory","axios","cheerio","cheerio2","cheerio3","cheerio4","resolve","WebClient","logger","LogLevel","createLogger","auth","getAuthHeader","logLevel","searchConfluence","getConfluencePage","listConfluenceSpaces","getSpacePages","createConfluencePage","updateConfluencePage","archiveConfluencePage","parse","stringify","XMLParser","format","XMLBuilder","path","neo4j","DEFAULT_RETRY_CONFIG","isRetryableError","sleep","retryWithBackoff","Integer","Node","Relationship","Path","fs","recursive","files","path2","matches","path3","path4","path5","path6","basename","path7","dirname","path8","path9","relative","path10","path11","isValid","add","sub","differenceInDays","differenceInHours","differenceInMinutes","isBefore","isAfter","randomUUID"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,IAAM,UAAA,GAAaA,KAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,SAAS,CAAC;AAKtF,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,KAAKA,KAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,SAAS,gCAAgC,CAAA;AAAA,EAC/D,QAAQ,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA,CAAE,SAAS,oBAAoB,CAAA;AAAA,EAC/D,OAAA,EAASA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,uBAAuB,CAAA;AAAA,EACzE,MAAMA,KAAA,CAAE,GAAA,GAAM,QAAA,EAAS,CAAE,SAAS,8CAA8C,CAAA;AAAA,EAChF,OAAA,EAASA,MAAE,MAAA,EAAO,CAAE,QAAQ,GAAK,CAAA,CAAE,SAAS,iCAAiC,CAAA;AAAA,EAC7E,MAAA,EAAQA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,+BAA+B;AAClF,CAAC;AAiBM,IAAM,aAAA,GAAgBA,MAAE,MAAA,CAAO;AAAA,EACpC,KAAKA,KAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,SAAS,kBAAkB,CAAA;AAAA,EACjD,OAAA,EAASA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,uBAAuB,CAAA;AAAA,EACzE,MAAA,EAAQA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,+BAA+B;AAClF,CAAC;AAKM,IAAM,cAAA,GAAiBA,MAAE,MAAA,CAAO;AAAA,EACrC,KAAKA,KAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,SAAS,oBAAoB,CAAA;AAAA,EACnD,IAAA,EAAMA,KAAA,CAAE,GAAA,EAAI,CAAE,SAAS,yCAAyC,CAAA;AAAA,EAChE,OAAA,EAASA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,uBAAuB;AAC3E,CAAC;;;AC5BM,SAAS,oBAAA,CACd,cAAA,GAAyB,GAAA,EACzB,cAAA,GAAyC,EAAC,EAC1C;AACA,EAAA,OAAOC,gBAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,2HAA2H,CAAA,CACvI,QAAA,CAASC,iBAAA,CAAa,GAAG,CAAA,CACzB,KAAK,CAAC,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,KAAK,CAAC,CAAA,CACtC,MAAA,CAAO,iBAAiB,CAAA,CACxB,SAAA,CAAU,OAAO,KAAA,KAAiC;AACjD,IAAA,MAAM,MAAA,GAA6B;AAAA,MACjC,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,SAAS,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAM,OAAA,EAAQ;AAAA,MAC/C,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAA,EAAS,MAAM,OAAA,IAAW,cAAA;AAAA,MAC1B,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,gBAAgB,MAAM;AAAA;AAAA,KACxB;AAEA,IAAA,MAAM,QAAA,GAAW,MAAMC,wBAAA,CAAM,MAAM,CAAA;AAEnC,IAAA,OAAO;AAAA,MACL,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,MAAA,EAAQ,MAAM,MAAA,IAAU;AAAA,KAC1B;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC1CO,SAAS,iBAAA,CACd,cAAA,GAAyB,GAAA,EACzB,cAAA,GAAyC,EAAC,EAC1C;AACA,EAAA,OAAOF,gBAAAA,EAAY,CAChB,IAAA,CAAK,UAAU,CAAA,CACf,YAAY,uEAAuE,CAAA,CACnF,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,KAAK,CAAC,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,KAAK,CAAC,CAAA,CACpC,MAAA,CAAO,aAAa,CAAA,CACpB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,QAAA,GAAW,MAAMC,wBAAAA,CAAM,GAAA,CAAI,MAAM,GAAA,EAAK;AAAA,MAC1C,SAAS,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAM,OAAA,EAAQ;AAAA,MAC/C,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB,CAAC,EACA,KAAA,EAAM;AACX;ACnBO,SAAS,kBAAA,CACd,cAAA,GAAyB,GAAA,EACzB,cAAA,GAAyC,EAAC,EAC1C;AACA,EAAA,OAAOF,gBAAAA,EAAY,CAChB,IAAA,CAAK,WAAW,CAAA,CAChB,YAAY,8EAA8E,CAAA,CAC1F,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,KAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAC,CAAA,CACnC,MAAA,CAAO,cAAc,CAAA,CACrB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,WAAW,MAAMC,wBAAAA,CAAM,KAAK,KAAA,CAAM,GAAA,EAAK,MAAM,IAAA,EAAM;AAAA,MACvD,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAG,cAAA;AAAA,QACH,GAAG,KAAA,CAAM;AAAA,OACX;AAAA,MACA,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB,CAAC,EACA,KAAA,EAAM;AACX;;;ACvBO,IAAM,aAAa,oBAAA;AACnB,IAAM,UAAU,iBAAA;AAChB,IAAM,WAAW,kBAAA;AAGjB,IAAM,SAAA,GAAY,CAAC,UAAA,EAAY,OAAA,EAAS,QAAQ;AAgBhD,SAAS,eAAA,CAAgB,MAAA,GAA0B,EAAC,EAAG;AAC5D,EAAA,MAAM,EAAE,cAAA,GAAiB,GAAA,EAAO,cAAA,GAAiB,IAAG,GAAI,MAAA;AAExD,EAAA,OAAO;AAAA,IACL,oBAAA,CAAqB,gBAAgB,cAAc,CAAA;AAAA,IACnD,iBAAA,CAAkB,gBAAgB,cAAc,CAAA;AAAA,IAChD,kBAAA,CAAmB,gBAAgB,cAAc;AAAA,GACnD;AACF;ACXO,IAAM,gBAAA,GAAmBH,MAAE,MAAA,CAAO;AAAA,EACvC,KAAKA,KAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,SAAS,mCAAmC,CAAA;AAAA,EAClE,UAAUA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,oDAAoD,CAAA;AAAA,EAC7F,WAAA,EAAaA,MAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,oCAAoC,CAAA;AAAA,EACpF,WAAA,EAAaA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,0BAA0B,CAAA;AAAA,EAC3E,YAAA,EAAcA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,iCAAiC,CAAA;AAAA,EACnF,aAAA,EAAeA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,sCAAsC,CAAA;AAAA,EACzF,eAAA,EAAiBA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,8CAA8C,CAAA;AAAA,EACnG,OAAA,EAASA,MAAE,MAAA,EAAO,CAAE,QAAQ,GAAK,CAAA,CAAE,SAAS,iCAAiC;AAC/E,CAAC;ACdM,SAAS,oBAAA,CACd,cAAA,GAAyB,GAAA,EACzB,SAAA,GAAoB,mEAAA,EACpB;AACA,EAAA,OAAOC,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,WAAA,CAAY,mIAAmI,CAAA,CAC/I,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,IAAA,CAAK,CAAC,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAC,CAAA,CACnD,MAAA,CAAO,gBAAgB,CAAA,CACvB,SAAA,CAAU,OAAO,KAAA,KAAkC;AAElD,IAAA,MAAM,QAAA,GAAW,MAAMC,wBAAAA,CAAM,GAAA,CAAI,MAAM,GAAA,EAAK;AAAA,MAC1C,OAAA,EAAS,MAAM,OAAA,IAAW,cAAA;AAAA,MAC1B,OAAA,EAAS;AAAA,QACP,YAAA,EAAc;AAAA;AAChB,KACD,CAAA;AAED,IAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,IAAA,MAAM,CAAA,GAAYC,wBAAK,IAAI,CAAA;AAE3B,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,KAAK,KAAA,CAAM;AAAA,KACb;AAGA,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,GAAW,CAAA,CAAE,MAAM,QAAQ,CAAA,GAAI,EAAE,MAAM,CAAA;AAG/D,IAAA,IAAI,MAAM,WAAA,EAAa;AACrB,MAAA,MAAA,CAAO,IAAA,GAAO,SAAA,CAAU,IAAA,EAAK,CAAE,IAAA,EAAK;AAAA,IACtC;AAGA,IAAA,IAAI,MAAM,WAAA,EAAa;AACrB,MAAA,MAAA,CAAO,IAAA,GAAO,SAAA,CAAU,IAAA,EAAK,IAAK,EAAA;AAAA,IACpC;AAGA,IAAA,IAAI,MAAM,YAAA,EAAc;AACtB,MAAA,MAAA,CAAO,QAAQ,EAAC;AAChB,MAAA,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,EAAA,KAAO;AAC3B,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,EAAE,CAAA,CAAE,KAAK,MAAM,CAAA;AAC9B,QAAA,IAAI,IAAA,EAAM;AAER,UAAA,IAAI;AACF,YAAA,MAAM,cAAc,IAAI,GAAA,CAAI,IAAA,EAAM,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA;AAC7C,YAAA,MAAA,CAAO,KAAA,CAAO,KAAK,WAAW,CAAA;AAAA,UAChC,CAAA,CAAA,MAAQ;AACN,YAAA,MAAA,CAAO,KAAA,CAAO,KAAK,IAAI,CAAA;AAAA,UACzB;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,MAAM,aAAA,EAAe;AACvB,MAAA,MAAA,CAAO,SAAS,EAAC;AACjB,MAAA,CAAA,CAAE,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,EAAA,KAAO;AAC5B,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,EAAE,CAAA,CAAE,KAAK,KAAK,CAAA;AAC5B,QAAA,IAAI,GAAA,EAAK;AAEP,UAAA,IAAI;AACF,YAAA,MAAM,cAAc,IAAI,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA;AAC5C,YAAA,MAAA,CAAO,MAAA,CAAQ,KAAK,WAAW,CAAA;AAAA,UACjC,CAAA,CAAA,MAAQ;AACN,YAAA,MAAA,CAAO,MAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,UACzB;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,MAAM,eAAA,EAAiB;AACzB,MAAA,MAAA,CAAO,WAAW,EAAC;AAGnB,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,MAAU,CAAA,CAAE,2BAA2B,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA;AAChF,MAAA,IAAI,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,KAAA,GAAQ,KAAA;AAGnC,MAAA,MAAM,WAAA,GAAc,CAAA,CAAE,0BAA0B,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA,IAC7C,CAAA,CAAE,iCAAiC,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA;AACtE,MAAA,IAAI,WAAA,EAAa,MAAA,CAAO,QAAA,CAAS,WAAA,GAAc,WAAA;AAG/C,MAAA,CAAA,CAAE,4BAA4B,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,EAAA,KAAO;AAC9C,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,IAAK,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,UAAU,CAAA;AACxD,QAAA,MAAM,OAAA,GAAU,CAAA,CAAE,EAAE,CAAA,CAAE,KAAK,SAAS,CAAA;AACpC,QAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,UAAA,MAAA,CAAO,QAAA,CAAU,IAAI,CAAA,GAAI,OAAA;AAAA,QAC3B;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,MAAM,QAAA,EAAU;AAClB,MAAA,MAAA,CAAO,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,CAAC,GAAG,EAAA,MAAQ;AAAA,QAC1C,MAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,GAAO,IAAA,EAAK;AAAA,QACxB,IAAA,EAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA;AAAK,OACnB,CAAE,EAAE,GAAA,EAAI;AAAA,IACV;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,EACA,KAAA,EAAM;AACX;;;ACxHO,IAAM,aAAa,oBAAA;AAGnB,IAAM,YAAA,GAAe,CAAC,UAAU;AAgBhC,SAAS,kBAAA,CAAmB,MAAA,GAAkD,EAAC,EAAG;AACvF,EAAA,MAAM,EAAE,cAAA,GAAiB,GAAA,EAAO,SAAA,GAAY,qEAAoE,GAAI,MAAA;AACpH,EAAA,OAAO,CAAC,oBAAA,CAAqB,cAAA,EAAgB,SAAS,CAAC,CAAA;AACzD;ACnBO,IAAM,gBAAA,GAAmBJ,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2BAA2B,CAAA;AAAA,EACrD,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+BAA+B,CAAA;AAAA,EAC7D,WAAA,EAAaA,MAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,6CAA6C,CAAA;AAAA,EAC7F,WAAA,EAAaA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,yCAAyC,CAAA;AAAA,EAC1F,iBAAA,EAAmBA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,cAAc,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,gEAAgE;AACtJ,CAAC;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wCAAwC,CAAA;AAAA,EAClE,OAAA,EAASA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,6CAA6C;AAC7F,CAAC;AAKM,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yCAAyC,CAAA;AAAA,EACnE,OAAA,EAASA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,kDAAkD;AAClG,CAAC;AChBM,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAOC,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,WAAA,CAAY,wHAAwH,CAAA,CACpI,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,IAAA,CAAK,CAAC,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,SAAS,CAAC,CAAA,CACrD,MAAA,CAAO,gBAAgB,CAAA,CACvB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,CAAA,GAAYG,kBAAA,CAAA,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACjC,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA;AAElC,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,CAAC,GAAG,EAAA,KAAO;AACvC,MAAA,MAAM,GAAA,GAAM,EAAE,EAAE,CAAA;AAChB,MAAA,MAAM,OAAY,EAAC;AAEnB,MAAA,IAAI,MAAM,WAAA,EAAa;AACrB,QAAA,IAAA,CAAK,IAAA,GAAO,GAAA,CAAI,IAAA,EAAK,CAAE,IAAA,EAAK;AAAA,MAC9B;AAEA,MAAA,IAAI,MAAM,WAAA,EAAa;AACrB,QAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,EAAK;AAAA,MACvB;AAEA,MAAA,IAAI,KAAA,CAAM,iBAAA,IAAqB,KAAA,CAAM,iBAAA,CAAkB,SAAS,CAAA,EAAG;AACjE,QAAA,IAAA,CAAK,aAAa,EAAC;AACnB,QAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,iBAAA,EAAmB;AAC1C,UAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAC3B,UAAA,IAAI,UAAU,MAAA,EAAW;AACvB,YAAA,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,GAAI,KAAA;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,EAAE,GAAA,EAAI;AAEP,IAAA,OAAO;AAAA,MACL,OAAO,OAAA,CAAQ,MAAA;AAAA,MACf;AAAA,KACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC1CO,SAAS,sBAAA,GAAyB;AACvC,EAAA,OAAOJ,gBAAAA,EAAY,CAChB,IAAA,CAAK,eAAe,CAAA,CACpB,YAAY,wFAAwF,CAAA,CACpG,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,KAAK,CAAC,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,QAAQ,CAAC,CAAA,CAC3C,MAAA,CAAO,kBAAkB,CAAA,CACzB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,CAAA,GAAYI,kBAAA,CAAA,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACjC,IAAA,MAAM,QAA+D,EAAC;AAEtE,IAAA,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,EAAA,KAAO;AAC3B,MAAA,MAAM,GAAA,GAAM,EAAE,EAAE,CAAA;AAChB,MAAA,IAAI,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,IAAK,EAAA;AAG/B,MAAA,IAAI,KAAA,CAAM,WAAW,IAAA,EAAM;AACzB,QAAA,IAAI;AACF,UAAA,IAAA,GAAO,IAAI,GAAA,CAAI,IAAA,EAAM,KAAA,CAAM,OAAO,CAAA,CAAE,IAAA;AAAA,QACtC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,CAAE,IAAA,EAAK;AAAA,QACtB,IAAA;AAAA,QACA,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,OAAO;AAAA,OACxB,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAO,KAAA,CAAM,MAAA;AAAA,MACb;AAAA,KACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACrCO,SAAS,uBAAA,GAA0B;AACxC,EAAA,OAAOL,gBAAAA,EAAY,CAChB,IAAA,CAAK,gBAAgB,CAAA,CACrB,YAAY,iFAAiF,CAAA,CAC7F,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,KAAK,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAW,KAAK,CAAC,CAAA,CACzC,MAAA,CAAO,mBAAmB,CAAA,CAC1B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,CAAA,GAAYK,kBAAA,CAAA,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACjC,IAAA,MAAM,SAAgG,EAAC;AAEvG,IAAA,CAAA,CAAE,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,EAAA,KAAO;AAC5B,MAAA,MAAM,GAAA,GAAM,EAAE,EAAE,CAAA;AAChB,MAAA,IAAI,GAAA,GAAM,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,IAAK,EAAA;AAG7B,MAAA,IAAI,KAAA,CAAM,WAAW,GAAA,EAAK;AACxB,QAAA,IAAI;AACF,UAAA,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,IAAA;AAAA,QACpC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,GAAA;AAAA,QACA,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAAA,QACnB,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAAA,QACvB,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAAA,QACvB,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,QAAQ;AAAA,OAC1B,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAO,MAAA,CAAO,MAAA;AAAA,MACd;AAAA,KACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;AC1CO,IAAM,aAAa,oBAAA;AACnB,IAAM,eAAe,sBAAA;AACrB,IAAM,gBAAgB,uBAAA;AAGtB,IAAM,eAAA,GAAkB,CAAC,UAAA,EAAY,YAAA,EAAc,aAAa;AAahE,SAAS,qBAAA,CAAsB,MAAA,GAAqD,EAAC,EAAG;AAC7F,EAAA,OAAO;AAAA,IACL,oBAAA,EAAqB;AAAA,IACrB,sBAAA,EAAuB;AAAA,IACvB,uBAAA;AAAwB,GAC1B;AACF;ACbO,IAAM,kBAAA,GAAqBP,MAAE,MAAA,CAAO;AAAA,EACzC,GAAA,EAAKA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+BAA+B;AAC1D,CAAC;AAKM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,QAAA,EAAUA,MAAE,MAAA,EAAO,CAAE,QAAQ,OAAO,CAAA,CAAE,SAAS,8BAA8B,CAAA;AAAA,EAC7E,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yBAAyB,CAAA;AAAA,EACvD,MAAMA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,sBAAsB,CAAA;AAAA,EAC3D,QAAA,EAAUA,MAAE,MAAA,EAAO,CAAE,QAAQ,GAAG,CAAA,CAAE,SAAS,UAAU,CAAA;AAAA,EACrD,KAAA,EAAOA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,qCAAqC,CAAA;AAAA,EACrF,MAAMA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,mBAAmB;AAC1D,CAAC;AAKM,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EAC3C,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qEAAqE;AAClG,CAAC;AC/BM,SAAS,sBAAA,GAAyB;AACvC,EAAA,OAAOC,gBAAAA,EAAY,CAChB,IAAA,CAAK,eAAe,CAAA,CACpB,YAAY,+IAA+I,CAAA,CAC3J,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,KAAK,CAAC,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,UAAU,CAAC,CAAA,CAC9C,MAAA,CAAO,kBAAkB,CAAA,CACzB,aAAA,CAAc,OAAO,KAAA,KAAwC;AAC5D,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAEhC,IAAA,OAAO;AAAA,MACL,KAAK,MAAA,CAAO,IAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,QAAQ,MAAA,CAAO;AAAA,KACjB;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACnBO,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,iFAAiF,CAAA,CAC7F,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,KAAK,CAAC,KAAA,EAAO,SAAA,EAAW,WAAW,CAAC,CAAA,CACpC,OAAO,gBAAgB,CAAA,CACvB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,MAAM,QAAQ,CAAA,GAAA,EAAM,KAAA,CAAM,QAAQ,CAAA,CAAE,CAAA;AAE3D,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,GAAA,CAAI,OAAO,KAAA,CAAM,IAAA;AAAA,IACnB;AAEA,IAAA,GAAA,CAAI,QAAA,GAAW,MAAM,QAAA,IAAY,GAAA;AAEjC,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,KAAK,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACpD,QAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,KAAK,CAAA;AAAA,MACpC,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,GAAA,CAAI,OAAO,KAAA,CAAM,IAAA;AAAA,IACnB;AAEA,IAAA,OAAO;AAAA,MACL,KAAK,GAAA,CAAI,IAAA;AAAA,MACT,UAAA,EAAY;AAAA,QACV,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,QAAQ,GAAA,CAAI;AAAA;AACd,KACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC3CO,SAAS,wBAAA,GAA2B;AACzC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,kBAAkB,CAAA,CACvB,YAAY,4EAA4E,CAAA,CACxF,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,KAAK,CAAC,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,QAAQ,CAAC,CAAA,CACxC,MAAA,CAAO,oBAAoB,CAAA,CAC3B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI,YAAA;AAEJ,IAAA,IAAI;AAEF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAC/B,MAAA,YAAA,GAAe,GAAA,CAAI,YAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AAEN,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAM,KAAA;AAC/E,MAAA,YAAA,GAAe,IAAI,gBAAgB,WAAW,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,SAA4C,EAAC;AAEnD,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AACnC,MAAA,IAAI,MAAA,CAAO,GAAG,CAAA,EAAG;AAEf,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG;AAC9B,UAAC,MAAA,CAAO,GAAG,CAAA,CAAe,IAAA,CAAK,KAAK,CAAA;AAAA,QACtC,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAC,MAAA,CAAO,GAAG,GAAa,KAAK,CAAA;AAAA,QAC7C;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,MAChB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE;AAAA,KAC7B;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;AC1CO,IAAM,eAAe,sBAAA;AACrB,IAAM,aAAa,oBAAA;AACnB,IAAM,iBAAiB,wBAAA;AAGvB,IAAM,iBAAA,GAAoB,CAAC,YAAA,EAAc,UAAA,EAAY,cAAc;AAanE,SAAS,uBAAA,CAAwB,MAAA,GAAuD,EAAC,EAAG;AACjG,EAAA,OAAO;AAAA,IACL,sBAAA,EAAuB;AAAA,IACvB,oBAAA,EAAqB;AAAA,IACrB,wBAAA;AAAyB,GAC3B;AACF;ACpCO,IAAM,eAAA,GAAkBF,MAAE,MAAA,CAAO;AAAA,EACtC,KAAA,EAAOA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,SAAS,kBAAkB,CAAA;AAAA,EACpD,UAAA,EAAYA,KAAAA,CACT,MAAA,EAAO,CACP,IAAI,CAAC,CAAA,CACL,GAAA,CAAI,EAAE,CAAA,CACN,OAAA,CAAQ,EAAE,CAAA,CACV,SAAS,4CAA4C,CAAA;AAAA,EACxD,YAAA,EAAcA,MACX,OAAA,EAAQ,CACR,QAAQ,KAAK,CAAA,CACb,SAAS,0DAA0D,CAAA;AAAA,EACtE,OAAA,EAASA,KAAAA,CACN,MAAA,EAAO,CACP,IAAI,GAAI,CAAA,CACR,GAAA,CAAI,GAAK,CAAA,CACT,OAAA,CAAQ,GAAK,CAAA,CACb,SAAS,8DAA8D;AAC5E,CAAC;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI;AAAA,EACrB,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACvB,CAAC;AAKM,IAAM,qBAAA,GAAwBA,MAAE,MAAA,CAAO;AAAA,EAC5C,OAAA,EAASA,MAAE,OAAA,EAAQ;AAAA,EACnB,QAAQA,KAAAA,CAAE,IAAA,CAAK,CAAC,YAAA,EAAc,QAAQ,CAAC,CAAA;AAAA,EACvC,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,OAAA,EAASA,KAAAA,CAAE,KAAA,CAAM,kBAAkB,CAAA;AAAA,EACnC,YAAA,EAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,QAAA,EAAUA,MACP,MAAA,CAAO;AAAA,IACN,YAAA,EAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAClC,YAAA,EAAcA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GACpC,EACA,QAAA;AACL,CAAC;;;AC9CM,SAAS,eAAA,GAAsC;AACpD,EAAA,OAAO,QAAQ,GAAA,CAAI,cAAA;AACrB;AAYA,eAAsB,YACpB,EAAA,EAC0C;AAC1C,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,EAAA,MAAM,MAAA,GAAS,MAAM,EAAA,EAAG;AACxB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAC9B,EAAA,OAAO,EAAE,QAAQ,QAAA,EAAS;AAC5B;AAKO,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,OAAO,KAAA,CAAM,IAAA,EAAK,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACzC;AAKO,IAAM,oBAAA,GAAoC;AAAA,EAC/C,UAAA,EAAY,CAAA;AAAA,EACZ,YAAA,EAAc,GAAA;AAAA;AAAA,EACd,QAAA,EAAU,GAAA;AAAA;AAAA,EACV,iBAAA,EAAmB;AACrB,CAAA;AAKO,IAAM,eAAA,GAAkB,GAAA;AAKxB,SAAS,iBAAiB,KAAA,EAAqB;AAEpD,EAAA,IAAI,KAAA,CAAM,SAAS,YAAA,IAAgB,KAAA,CAAM,SAAS,WAAA,IAAe,KAAA,CAAM,SAAS,WAAA,EAAa;AAC3F,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAM,IAAA,KAAS,cAAA,IAAkB,MAAM,OAAA,EAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,IAAU,OAAO,KAAA,CAAM,QAAA,EAAU,SAAS,GAAA,EAAK;AACjE,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACQ,aAAY,UAAA,CAAWA,QAAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAKA,eAAsB,gBAAA,CACpB,EAAA,EACA,MAAA,GAAsB,oBAAA,EACV;AACZ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,QAAQ,MAAA,CAAO,YAAA;AAEnB,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,MAAA,CAAO,YAAY,OAAA,EAAA,EAAW;AAC7D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,KAAA,EAAY;AACnB,MAAA,SAAA,GAAY,KAAA;AAGZ,MAAA,IAAI,CAAC,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC5B,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,IAAI,OAAA,KAAY,OAAO,UAAA,EAAY;AACjC,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,MAAM,KAAK,CAAA;AAGjB,MAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,GAAQ,MAAA,CAAO,iBAAA,EAAmB,OAAO,QAAQ,CAAA;AAAA,IACpE;AAAA,EACF;AAGA,EAAA,MAAM,SAAA;AACR;;;AC3FO,IAAM,qBAAN,MAAmD;AAAA,EACxD,IAAA,GAAO,YAAA;AAAA;AAAA;AAAA;AAAA,EAKP,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAA,CACJ,KAAA,EACA,UAAA,EACA,UAAkB,eAAA,EACO;AACzB,IAAA,OAAO,iBAAiB,YAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAML,wBAAAA,CAAM,GAAA;AAAA,UAC3B,6BAAA;AAAA,UACA;AAAA,YACE,MAAA,EAAQ;AAAA,cACN,CAAA,EAAG,KAAA;AAAA,cACH,MAAA,EAAQ;AAAA,aACV;AAAA,YACA,OAAA,EAAS;AAAA,cACP,YAAA,EACE;AAAA,aACJ;AAAA,YACA;AAAA;AACF,SACF;AAEA,QAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,QAAA,CAAS,IAAA,EAAM,UAAU,CAAA;AAAA,MACxD,SAAS,KAAA,EAAY;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC9D;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAA,CACN,MACA,UAAA,EACgB;AAChB,IAAA,MAAM,UAA0B,EAAC;AAGjC,IAAA,IAAI,cAAc,CAAA,EAAG;AACnB,MAAA,OAAO,OAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,WAAA,EAAa;AACrC,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,KAAA,EAAO,KAAK,OAAA,IAAW,QAAA;AAAA,QACvB,MAAM,IAAA,CAAK,WAAA;AAAA,QACX,SAAS,IAAA,CAAK,QAAA;AAAA,QACd,QAAA,EAAU;AAAA,OACX,CAAA;AAGD,MAAA,IAAI,OAAA,CAAQ,UAAU,UAAA,EAAY;AAChC,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA,EAAG;AACvD,MAAA,MAAM,SAAA,GAAY,aAAa,OAAA,CAAQ,MAAA;AACvC,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,GAAG,SAAS,CAAA;AAE7D,MAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,QAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,QAAA,EAAU;AAEhC,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AACzC,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO,UAAA,CAAW,CAAC,CAAA,IAAK,KAAA,CAAM,IAAA;AAAA,YAC9B,MAAM,KAAA,CAAM,QAAA;AAAA,YACZ,SAAS,KAAA,CAAM,IAAA;AAAA,YACf,QAAA,EAAU,QAAQ,MAAA,GAAS;AAAA,WAC5B,CAAA;AAAA,QACH;AAAA,MACF;AAGA,MAAA,IAAI,OAAA,CAAQ,UAAU,UAAA,EAAY;AAChC,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3C,MAAA,MAAM,SAAA,GAAY,aAAa,OAAA,CAAQ,MAAA;AACvC,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,GAAG,SAAS,CAAA;AAExD,MAAA,KAAA,MAAW,UAAU,gBAAA,EAAkB;AACrC,QAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,QAAA,EAAU;AAElC,UAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC1C,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO,UAAA,CAAW,CAAC,CAAA,IAAK,MAAA,CAAO,IAAA;AAAA,YAC/B,MAAM,MAAA,CAAO,QAAA;AAAA,YACb,SAAS,MAAA,CAAO,IAAA;AAAA,YAChB,QAAA,EAAU,QAAQ,MAAA,GAAS;AAAA,WAC5B,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAKO,SAAS,wBAAA,GAA+C;AAC7D,EAAA,OAAO,IAAI,kBAAA,EAAmB;AAChC;ACjIO,IAAM,iBAAN,MAA+C;AAAA,EACpD,IAAA,GAAO,QAAA;AAAA,EACC,MAAA;AAAA,EAER,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,eAAA,EAAgB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAA,CACJ,KAAA,EACA,UAAA,EACA,UAAkB,eAAA,EACO;AACzB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,iBAAiB,YAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAMA,wBAAAA,CAAM,IAAA;AAAA,UAC3B,kCAAA;AAAA,UACA;AAAA,YACE,CAAA,EAAG,KAAA;AAAA,YACH,GAAA,EAAK;AAAA,WACP;AAAA,UACA;AAAA,YACE,OAAA,EAAS;AAAA,cACP,aAAa,IAAA,CAAK,MAAA;AAAA,cAClB,cAAA,EAAgB;AAAA,aAClB;AAAA,YACA;AAAA;AACF,SACF;AAEA,QAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,QAAA,CAAS,IAAA,EAAM,UAAU,CAAA;AAAA,MACxD,SAAS,KAAA,EAAY;AACnB,QAAA,IAAI,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AAClC,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,IAAI,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AAClC,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC1D;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAA,CACN,MACA,UAAA,EACgB;AAEhB,IAAA,IAAI,CAAC,KAAK,OAAA,IAAW,IAAA,CAAK,QAAQ,MAAA,KAAW,CAAA,IAAK,cAAc,CAAA,EAAG;AACjE,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,UAA0B,EAAC;AAGjC,IAAA,MAAM,iBAAiB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,QAAQ,UAAU,CAAA;AAE/D,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,EAAgB,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AAG3B,MAAA,IAAI,CAAC,KAAK,KAAA,IAAS,CAAC,KAAK,IAAA,IAAQ,CAAC,KAAK,OAAA,EAAS;AAC9C,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,CAAA,GAAI;AAAA,OAChC,CAAA;AAGD,MAAA,IAAI,OAAA,CAAQ,UAAU,UAAA,EAAY;AAChC,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAKO,SAAS,oBAAA,GAAuC;AACrD,EAAA,OAAO,IAAI,cAAA,EAAe;AAC5B;;;ACnHO,IAAM,SAAA,GAAYF,gBAAAA,EAAY,CAClC,IAAA,CAAK,YAAY,CAAA,CACjB,WAAA;AAAA,EACC;AAGF,CAAA,CACC,SAASC,iBAAAA,CAAa,GAAG,EACzB,IAAA,CAAK,CAAC,UAAU,KAAA,EAAO,QAAA,EAAU,cAAc,QAAA,EAAU,UAAU,CAAC,CAAA,CACpE,MAAA,CAAO,eAAe,CAAA,CACtB,SAAA,CAAU,OAAO,KAAA,KAAoD;AACpE,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,UAAA,GAAa,EAAA;AAAA,IACb,YAAA,GAAe,KAAA;AAAA,IACf,OAAA,GAAU;AAAA,GACZ,GAAI,KAAA;AAGJ,EAAA,MAAM,cAAA,GAAiB,cAAc,KAAK,CAAA;AAG1C,EAAA,MAAM,aAAa,wBAAA,EAAyB;AAC5C,EAAA,MAAM,SAAS,oBAAA,EAAqB;AAGpC,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,gBAAA,GAA0C,IAAA;AAE9C,EAAA,IAAI,YAAA,IAAgB,MAAA,CAAO,WAAA,EAAY,EAAG;AACxC,IAAA,eAAA,GAAkB,MAAA;AAClB,IAAA,gBAAA,GAAmB,UAAA;AAAA,EACrB,CAAA,MAAO;AACL,IAAA,eAAA,GAAkB,UAAA;AAClB,IAAA,gBAAA,GAAmB,MAAA,CAAO,WAAA,EAAY,GAAI,MAAA,GAAS,IAAA;AAAA,EACrD;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,QAAA,KAAa,MAAM,WAAA;AAAA,MAAY,MACtD,eAAA,CAAgB,MAAA,CAAO,cAAA,EAAgB,YAAY,OAAO;AAAA,KAC5D;AAGA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,QAAQ,eAAA,CAAgB,IAAA;AAAA,QACxB,KAAA,EAAO,cAAA;AAAA,QACP,OAAA;AAAA,QACA,cAAc,OAAA,CAAQ,MAAA;AAAA,QACtB,QAAA,EAAU;AAAA,UACR,YAAA,EAAc,QAAA;AAAA,UACd,YAAA,EAAc;AAAA;AAChB,OACF;AAAA,IACF;AAGA,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAM,EAAE,MAAA,EAAQ,eAAA,EAAiB,QAAA,EAAU,gBAAA,KACzC,MAAM,WAAA;AAAA,QAAY,MAChB,gBAAA,CAAkB,MAAA,CAAO,cAAA,EAAgB,YAAY,OAAO;AAAA,OAC9D;AAEF,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,QAAQ,gBAAA,CAAiB,IAAA;AAAA,QACzB,KAAA,EAAO,cAAA;AAAA,QACP,OAAA,EAAS,eAAA;AAAA,QACT,cAAc,eAAA,CAAgB,MAAA;AAAA,QAC9B,QAAA,EAAU;AAAA,UACR,YAAA,EAAc,gBAAA;AAAA,UACd,YAAA,EAAc;AAAA;AAChB,OACF;AAAA,IACF;AAGA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,QAAQ,eAAA,CAAgB,IAAA;AAAA,MACxB,KAAA,EAAO,cAAA;AAAA,MACP,SAAS,EAAC;AAAA,MACV,YAAA,EAAc,CAAA;AAAA,MACd,QAAA,EAAU;AAAA,QACR,YAAA,EAAc,QAAA;AAAA,QACd,YAAA,EAAc;AAAA;AAChB,KACF;AAAA,EACF,SAAS,KAAA,EAAY;AAEnB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAQ,eAAA,CAAgB,IAAA;AAAA,MACxB,KAAA,EAAO,cAAA;AAAA,MACP,SAAS,EAAC;AAAA,MACV,OAAO,KAAA,CAAM;AAAA,KACf;AAAA,EACF;AACF,CAAC,EACA,KAAA;ACzHI,SAAS,8BAAA,CACd,KAAA,EACA,OAAA,GAAkB,gBAAA,EAClB,UAAkB,cAAA,EACsC;AACxD,EAAA,IAAI,gBAAA,GAAqC,IAAA;AAEzC,EAAA,OAAO,SAAS,wBAAA,GAA6E;AAC3F,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,MAAM,aAAa,KAAA,IAAS,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,QAAQ,GAAA,CAAI,eAAA;AACxE,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,gBAAA,GAAmB,IAAIO,iBAAU,UAAU,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,gBAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,OAAO,KAAA,IAAS,OAAA,CAAQ,IAAI,gBAAA,IAAoB,OAAA,CAAQ,IAAI,eAAA,IAAmB,EAAA;AAAA,QAC/E,OAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF,CAAA;AACF;AAKA,IAAI,kBAAA,GAAuC,IAAA;AAEpC,SAAS,qBAAA,GAA0E;AACxF,EAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,QAAQ,GAAA,CAAI,eAAA;AAC1D,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,kBAAA,GAAqB,IAAIA,iBAAU,KAAK,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,kBAAA;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,OAAO,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,OAAA,CAAQ,IAAI,eAAA,IAAmB,EAAA;AAAA,MACtE,OAAA,EAAS,gBAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACX,GACF;AACF;ACpDO,SAAS,0BAAA,CACd,gBACAC,OAAAA,EACA;AACA,EAAA,OAAOT,kBAAY,CAChB,IAAA,CAAK,oBAAoB,CAAA,CACzB,WAAA,CAAY,4EAA4E,CAAA,CACxF,QAAA,CAASC,iBAAAA,CAAa,GAAG,EACzB,IAAA,CAAK,CAAC,SAAS,WAAA,EAAa,eAAe,CAAC,CAAA,CAC5C,UAAA;AAAA,IACC;AAAA,GAEF,CACC,QAAA,CAAS,CAAC,oBAAoB,CAAC,CAAA,CAC/B,MAAA;AAAA,IACCF,MAAE,MAAA,CAAO;AAAA,MACP,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wDAAwD,CAAA;AAAA,MACrF,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yBAAyB;AAAA,KACvD;AAAA,IAEF,aAAA,CAAc,OAAO,EAAE,OAAA,EAAS,SAAQ,KAAM;AAC7C,IAAAU,OAAAA,CAAO,KAAK,2BAAA,EAA6B,EAAE,SAAS,aAAA,EAAe,OAAA,CAAQ,QAAQ,CAAA;AAEnF,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,KAAW,cAAA,EAAe;AAGjD,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY;AAAA,QAC1C,OAAA;AAAA,QACA,IAAA,EAAM,OAAA;AAAA,QACN,UAAU,MAAA,CAAO,OAAA;AAAA,QACjB,YAAY,MAAA,CAAO;AAAA,OACpB,CAAA;AAED,MAAAA,OAAAA,CAAO,KAAK,2BAAA,EAA6B;AAAA,QACvC,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,WAAW,MAAA,CAAO,EAAA;AAAA,QAClB,eAAe,OAAA,CAAQ,MAAA;AAAA,QACvB,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,OAAO;AAAA,QACL,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,OAAA;AAAA,QACA,WAAW,MAAA,CAAO,EAAA;AAAA,QAClB,YAAY,MAAA,CAAO;AAAA,OACrB;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAAA,OAAAA,CAAO,MAAM,2BAAA,EAA6B;AAAA,QACxC,OAAA;AAAA,QACA,OAAO,KAAA,CAAM,OAAA;AAAA,QACb,MAAM,KAAA,CAAM;AAAA,OACb,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACzDO,SAAS,qBAAA,CACd,gBACAA,OAAAA,EACA;AACA,EAAA,OAAOT,kBAAY,CAChB,IAAA,CAAK,cAAc,CAAA,CACnB,WAAA,CAAY,kFAAkF,CAAA,CAC9F,QAAA,CAASC,iBAAAA,CAAa,GAAG,EACzB,IAAA,CAAK,CAAC,SAAS,cAAA,EAAgB,OAAO,CAAC,CAAA,CACvC,UAAA;AAAA,IACC;AAAA,GAEF,CACC,QAAA,CAAS,CAAC,oBAAoB,CAAC,CAAA,CAC/B,MAAA;AAAA,IACCF,MAAE,MAAA,CAAO;AAAA,MACP,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oBAAoB,CAAA;AAAA,MACjD,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,sBAAsB,CAAA;AAAA,MACnD,QAAA,EAAUA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,0CAA0C;AAAA,KAC7F;AAAA,GACH,CACC,cAAc,OAAO,EAAE,SAAS,OAAA,EAAS,QAAA,GAAW,EAAC,EAAE,KAAM;AAC5D,IAAAU,OAAAA,CAAO,KAAK,qBAAA,EAAuB;AAAA,MACjC,OAAA;AAAA,MACA,eAAe,OAAA,CAAQ,MAAA;AAAA,MACvB,cAAc,QAAA,CAAS;AAAA,KACxB,CAAA;AAED,IAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,KAAW,cAAA,EAAe;AAGjD,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,SAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,GAAG,IAAI,GAAA,GAAM,EAAA;AAC3F,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,WAAW,CAAA,EAAG,OAAO,CAAA,CAAA;AAG5C,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY;AAAA,MAC1C,OAAA;AAAA,MACA,IAAA,EAAM,WAAA;AAAA,MACN,UAAU,MAAA,CAAO,OAAA;AAAA,MACjB,YAAY,MAAA,CAAO;AAAA,KACpB,CAAA;AAED,IAAAA,OAAAA,CAAO,KAAK,qBAAA,EAAuB;AAAA,MACjC,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,WAAW,MAAA,CAAO,EAAA;AAAA,MAClB,UAAU,QAAA,CAAS;AAAA,KACpB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAA,EAAS,WAAA;AAAA,MACT,QAAA;AAAA,MACA,WAAW,MAAA,CAAO,EAAA;AAAA,MAClB,iBAAiB,MAAA,CAAO;AAAA,KAC1B;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACzDO,SAAS,0BAAA,CACd,gBACAA,OAAAA,EACA;AACA,EAAA,OAAOT,kBAAY,CAChB,IAAA,CAAK,oBAAoB,CAAA,CACzB,WAAA,CAAY,gFAAgF,CAAA,CAC5F,QAAA,CAASC,iBAAAA,CAAa,GAAG,EACzB,IAAA,CAAK,CAAC,SAAS,UAAA,EAAY,MAAM,CAAC,CAAA,CAClC,UAAA;AAAA,IACC;AAAA,IAGD,OAAA,CAAQ,CAAC,oBAAA,EAAsB,cAAc,CAAC,CAAA,CAC9C,MAAA;AAAA,IACCF,MAAE,MAAA,CAAO;AAAA,MACP,iBAAiBA,KAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,2CAA2C;AAAA,KAC7F;AAAA,IAEF,aAAA,CAAc,OAAO,EAAE,eAAA,GAAkB,OAAM,KAAM;AACpD,IAAAU,OAAAA,CAAO,IAAA,CAAK,2BAAA,EAA6B,EAAE,iBAAiB,CAAA;AAE5D,IAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,cAAA,EAAe;AAGzC,IAAA,MAAM,cAAA,GAAiB,MAAM,KAAA,CAAM,aAAA,CAAc,IAAA,CAAK;AAAA,MACpD,KAAA,EAAO,gBAAA;AAAA,MACP,gBAAA,EAAkB;AAAA,KACnB,CAAA;AAED,IAAA,IAAI,WAAA,GAAc,cAAA,CAAe,QAAA,IAAY,EAAC;AAG9C,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,eAAA,GAAkB,MAAM,KAAA,CAAM,aAAA,CAAc,IAAA,CAAK;AAAA,QACrD,KAAA,EAAO,iBAAA;AAAA,QACP,gBAAA,EAAkB;AAAA,OACnB,CAAA;AACD,MAAA,WAAA,GAAc,CAAC,GAAG,WAAA,EAAa,GAAI,eAAA,CAAgB,QAAA,IAAY,EAAG,CAAA;AAAA,IACpE;AAEA,IAAAA,OAAAA,CAAO,KAAK,2BAAA,EAA6B;AAAA,MACvC,cAAc,WAAA,CAAY,MAAA;AAAA,MAC1B,cAAA,EAAgB;AAAA,KACjB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAO,WAAA,CAAY,MAAA;AAAA,MACnB,QAAA,EAAU,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAChC,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,UAAA,EAAY,EAAE,UAAA,IAAc,KAAA;AAAA,QAC5B,WAAA,EAAa,EAAE,WAAA,IAAe;AAAA,OAChC,CAAE;AAAA,KACJ;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACzDO,SAAS,0BAAA,CACd,gBACAA,OAAAA,EACA;AACA,EAAA,OAAOT,kBAAY,CAChB,IAAA,CAAK,oBAAoB,CAAA,CACzB,WAAA,CAAY,4EAA4E,CAAA,CACxF,QAAA,CAASC,kBAAa,GAAG,CAAA,CACzB,KAAK,CAAC,OAAA,EAAS,YAAY,SAAA,EAAW,MAAM,CAAC,CAAA,CAC7C,UAAA;AAAA,IACC;AAAA,GAEF,CACC,QAAA,CAAS,CAAC,oBAAoB,CAAC,CAAA,CAC/B,MAAA;AAAA,IACCF,MAAE,MAAA,CAAO;AAAA,MACP,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wDAAwD,CAAA;AAAA,MACrF,KAAA,EAAOA,KAAAA,CACJ,MAAA,EAAO,CACP,KAAI,CACJ,GAAA,CAAI,CAAC,CAAA,CACL,IAAI,GAAG,CAAA,CACP,QAAA,EAAS,CACT,SAAS,wDAAwD;AAAA,KACrE;AAAA,IAEF,aAAA,CAAc,OAAO,EAAE,OAAA,EAAS,KAAA,GAAQ,IAAG,KAAM;AAChD,IAAAU,QAAO,IAAA,CAAK,2BAAA,EAA6B,EAAE,OAAA,EAAS,OAAO,CAAA;AAE3D,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,cAAA,EAAe;AAGzC,MAAA,IAAI,SAAA,GAAY,OAAA;AAChB,MAAA,IAAI,CAAC,QAAQ,UAAA,CAAW,GAAG,KAAK,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACxD,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,aAAA,CAAc,IAAA,CAAK;AAAA,UAC9C,KAAA,EAAO,gCAAA;AAAA,UACP,gBAAA,EAAkB;AAAA,SACnB,CAAA;AACD,QAAA,MAAM,KAAA,GAAQ,SAAS,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AAC/D,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAAA,OAAAA,CAAO,KAAA,CAAM,uCAAA,EAAyC,EAAE,SAAS,CAAA;AACjE,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,YAAY,OAAO,CAAA,8DAAA;AAAA,WACrB;AAAA,QACF;AACA,QAAA,SAAA,GAAY,KAAA,CAAM,EAAA;AAAA,MACpB;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,aAAA,CAAc,OAAA,CAAQ;AAAA,QAC/C,OAAA,EAAS,SAAA;AAAA,QACT,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,GAAG;AAAA;AAAA,OAC3B,CAAA;AAED,MAAAA,OAAAA,CAAO,KAAK,2BAAA,EAA6B;AAAA,QACvC,OAAA,EAAS,SAAA;AAAA,QACT,YAAA,EAAc,MAAA,CAAO,QAAA,EAAU,MAAA,IAAU,CAAA;AAAA,QACzC;AAAA,OACD,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,SAAA;AAAA,QACT,KAAA,EAAO,MAAA,CAAO,QAAA,EAAU,MAAA,IAAU,CAAA;AAAA,QAClC,QAAA,EACE,MAAA,CAAO,QAAA,EAAU,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC3B,IAAA,EAAM,EAAE,IAAA,IAAQ,SAAA;AAAA,UAChB,IAAA,EAAM,EAAE,IAAA,IAAQ,EAAA;AAAA,UAChB,WAAW,CAAA,CAAE,EAAA;AAAA,UACb,WAAW,CAAA,CAAE,SAAA;AAAA,UACb,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,SAAS,CAAA,CAAE;AAAA,SACb,CAAE,KAAK;AAAC,OACZ;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAAA,OAAAA,CAAO,MAAM,2BAAA,EAA6B;AAAA,QACxC,OAAA;AAAA,QACA,OAAO,KAAA,CAAM,OAAA;AAAA,QACb,MAAM,KAAA,CAAM;AAAA,OACb,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;ACpDA,IAAM,WAAY,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,WAAA,MAA8BC,aAAA,CAAS,IAAA;AAChF,IAAM,SAASC,iBAAA,CAAa,eAAA,EAAiB,EAAE,KAAA,EAAO,UAAU,CAAA;AAKzD,IAAM,gBAAA,GAAmB,0BAAA,CAA2B,qBAAA,EAAuB,MAAM;AACjF,IAAM,WAAA,GAAc,qBAAA,CAAsB,qBAAA,EAAuB,MAAM;AACvE,IAAM,gBAAA,GAAmB,0BAAA,CAA2B,qBAAA,EAAuB,MAAM;AACjF,IAAM,gBAAA,GAAmB,0BAAA,CAA2B,qBAAA,EAAuB,MAAM;AASjF,IAAM,UAAA,GAAa;AAAA;AAAA,EAExB,gBAAA;AAAA,EACA,WAAA;AAAA;AAAA,EAEA,gBAAA;AAAA,EACA;AACF;AAsCO,SAAS,gBAAA,CAAiB,MAAA,GAAgD,EAAC,EAAG;AACnF,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,OAAA,GAAU,gBAAA;AAAA,IACV,OAAA,GAAU,cAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ,GAAI,MAAA;AAGJ,EAAA,MAAM,wBAAA,GAA2B,8BAAA,CAA+B,KAAA,EAAO,OAAA,EAAS,OAAO,CAAA;AAGvF,EAAA,MAAM,UAAA,GAAa,iBACfA,iBAAA,CAAa,eAAA,EAAiB,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA,GACvD,MAAA;AAGJ,EAAA,MAAM,WAAA,GAAc,0BAAA,CAA2B,wBAAA,EAA0B,UAAU,CAAA;AACnF,EAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,wBAAA,EAA0B,UAAU,CAAA;AACzE,EAAA,MAAM,WAAA,GAAc,0BAAA,CAA2B,wBAAA,EAA0B,UAAU,CAAA;AACnF,EAAA,MAAM,WAAA,GAAc,0BAAA,CAA2B,wBAAA,EAA0B,UAAU,CAAA;AAGnF,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC9HO,SAAS,uBAAA,CACd,MAAA,EACA,KAAA,EACA,OAAA,EACsB;AACtB,EAAA,OAAO,SAAS,iBAAA,GAAoC;AAClD,IAAA,MAAM,iBAAA,GAAoB,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,iBAAA,IAAqB,EAAA;AACrE,IAAA,MAAM,eAAA,GAAkB,KAAA,IAAS,OAAA,CAAQ,GAAA,CAAI,eAAA,IAAmB,EAAA;AAChE,IAAA,MAAM,kBAAA,GAAA,CAAsB,WAAW,OAAA,CAAQ,GAAA,CAAI,sBAAsB,EAAA,EAAI,OAAA,CAAQ,OAAO,EAAE,CAAA;AAE9F,IAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,eAAA,IAAmB,CAAC,kBAAA,EAAoB;AACjE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,iBAAA,EAAmB,eAAA,EAAiB,kBAAA,EAAmB;AAAA,EAClE,CAAA;AACF;AAMO,SAAS,8BACd,iBAAA,EACc;AACd,EAAA,OAAO,SAAS,uBAAA,GAAkC;AAChD,IAAA,MAAM,EAAE,iBAAA,EAAmB,eAAA,EAAgB,GAAI,iBAAA,EAAkB;AACjE,IAAA,MAAMC,KAAAA,GAAO,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,eAAe,IAAI,iBAAiB,CAAA,CAAE,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA;AACrF,IAAA,OAAO,SAASA,KAAI,CAAA,CAAA;AAAA,EACtB,CAAA;AACF;AAKO,SAAS,SAAA,GAA4B;AAC1C,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,GAAA,CAAI,iBAAA,IAAqB,EAAA;AAC3D,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,GAAA,CAAI,eAAA,IAAmB,EAAA;AACvD,EAAA,MAAM,sBAAsB,OAAA,CAAQ,GAAA,CAAI,sBAAsB,EAAA,EAAI,OAAA,CAAQ,OAAO,EAAE,CAAA;AAEnF,EAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,eAAA,IAAmB,CAAC,kBAAA,EAAoB;AACjE,IAAA,MAAM,IAAI,MAAM,+GAA+G,CAAA;AAAA,EACjI;AAEA,EAAA,OAAO,EAAE,iBAAA,EAAmB,eAAA,EAAiB,kBAAA,EAAmB;AAClE;AAKO,SAAS,aAAA,GAAwB;AACtC,EAAA,MAAM,EAAE,iBAAA,EAAmB,eAAA,EAAgB,GAAI,SAAA,EAAU;AACzD,EAAA,MAAMA,KAAAA,GAAO,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,eAAe,IAAI,iBAAiB,CAAA,CAAE,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA;AACrF,EAAA,OAAO,SAASA,KAAI,CAAA,CAAA;AACtB;ACtDO,SAAS,0BAAA,CACd,OAAA,EACAC,cAAAA,EACAJ,OAAAA,EACA;AACA,EAAA,OAAOT,gBAAAA,EAAY,CAChB,IAAA,CAAK,mBAAmB,CAAA,CACxB,WAAA,CAAY,0IAA0I,CAAA,CACtJ,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,IAAI,YAAY,CAAA,CAChB,GAAA,CAAI,QAAQ,CAAA,CACZ,GAAA,CAAI,gBAAgB,CAAA,CACpB,WAAW,mPAAmP,CAAA,CAC9P,QAAA,CAAS,CAAC,qBAAqB,CAAC,CAAA,CAChC,MAAA,CAAOF,MAAE,MAAA,CAAO;AAAA,IACf,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,8FAA8F,CAAA;AAAA,IACzH,OAAOA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,4DAA4D;AAAA,GACnG,CAAC,CAAA,CACD,SAAA,CAAU,OAAO,EAAE,KAAA,EAAO,KAAA,GAAQ,EAAA,EAAG,KAAM;AAC1C,IAAAU,QAAO,IAAA,CAAK,0BAAA,EAA4B,EAAE,KAAA,EAAO,OAAO,CAAA;AAExD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,kBAAA,EAAmB,GAAI,OAAA,EAAQ;AACvC,MAAA,MAAM,WAAW,MAAMP,wBAAAA,CAAM,GAAA,CAAI,CAAA,EAAG,kBAAkB,CAAA,6BAAA,CAAA,EAAiC;AAAA,QACrF,OAAA,EAAS;AAAA,UACP,eAAeW,cAAAA,EAAc;AAAA,UAC7B,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,GAAA,EAAK,KAAA;AAAA,UACL,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA;AAAA,UACzB,MAAA,EAAQ;AAAA;AACV,OACD,CAAA;AAED,MAAA,MAAM,EAAE,kBAAA,EAAoB,OAAA,EAAQ,GAAI,OAAA,EAAQ;AAChD,MAAA,MAAM,UAAU,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,QACxD,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,IAAQ,SAAA;AAAA,QAC3B,QAAA,EAAU,IAAA,CAAK,KAAA,EAAO,GAAA,IAAO,EAAA;AAAA,QAC7B,KAAK,CAAA,EAAG,OAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,OAAO,KAAK,CAAA,CAAA;AAAA,QACxC,YAAA,EAAc,IAAA,CAAK,OAAA,EAAS,IAAA,IAAQ;AAAA,OACtC,CAAE,CAAA;AAGF,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAAJ,OAAAA,CAAO,KAAK,yFAAA,EAA2F;AAAA,UACrG,KAAA;AAAA,UACA,KAAA;AAAA,UACA,SAAA,EAAW,SAAS,IAAA,CAAK;AAAA,SAC1B,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAAA,OAAAA,CAAO,KAAK,0BAAA,EAA4B;AAAA,UACtC,KAAA;AAAA,UACA,aAAa,OAAA,CAAQ,MAAA;AAAA,UACrB,SAAA,EAAW,SAAS,IAAA,CAAK,SAAA;AAAA,UACzB,MAAA,EAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAW,EAAE,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC;AAAA;AAAA,SACpD,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,IAAA;AAAA,QACT,OAAO,OAAA,CAAQ,MAAA;AAAA,QACf,KAAA,EAAO,SAAS,IAAA,CAAK,SAAA;AAAA,QACrB;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAAA,OAAAA,CAAO,MAAM,yBAAA,EAA2B;AAAA,QACtC,KAAA;AAAA,QACA,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM,OAAA;AAAA,QAC9C,MAAA,EAAQ,MAAM,QAAA,EAAU;AAAA,OACzB,CAAA;AAED,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM;AAAA,OAC/C,CAAA;AAAA,IACH;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AClFO,SAAS,2BAAA,CACd,OAAA,EACAI,cAAAA,EACAJ,OAAAA,EACA;AACA,EAAA,OAAOT,gBAAAA,EAAY,CAChB,IAAA,CAAK,qBAAqB,CAAA,CAC1B,WAAA,CAAY,yIAAyI,CAAA,CACrJ,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,IAAI,YAAY,CAAA,CAChB,GAAA,CAAI,MAAM,CAAA,CACV,GAAA,CAAI,SAAS,CAAA,CACb,WAAW,+HAA+H,CAAA,CAC1I,QAAA,CAAS,CAAC,mBAAmB,CAAC,CAAA,CAC9B,MAAA,CAAOF,MAAE,MAAA,CAAO;AAAA,IACf,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,8CAA8C;AAAA,GAC5E,CAAC,CAAA,CACD,UAAU,OAAO,EAAE,SAAQ,KAAM;AAChC,IAAAU,OAAAA,CAAO,IAAA,CAAK,4BAAA,EAA8B,EAAE,SAAS,CAAA;AAErD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,kBAAA,EAAmB,GAAI,OAAA,EAAQ;AACvC,MAAA,MAAM,QAAA,GAAW,MAAMP,wBAAAA,CAAM,GAAA,CAAI,GAAG,kBAAkB,CAAA,uBAAA,EAA0B,OAAO,CAAA,CAAA,EAAI;AAAA,QACzF,OAAA,EAAS;AAAA,UACP,eAAeW,cAAAA,EAAc;AAAA,UAC7B,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,MAAA,EAAQ;AAAA;AACV,OACD,CAAA;AAED,MAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AAEtB,MAAAJ,OAAAA,CAAO,KAAK,4BAAA,EAA8B;AAAA,QACxC,OAAA;AAAA,QACA,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,KAAA,EAAO,KAAK,KAAA,EAAO,IAAA;AAAA,QACnB,aAAA,EAAe,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,OAAO,MAAA,IAAU;AAAA,OACrD,CAAA;AAED,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,UACJ,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,IAAQ,SAAA;AAAA,UAC3B,QAAA,EAAU,IAAA,CAAK,KAAA,EAAO,GAAA,IAAO,EAAA;AAAA,UAC7B,OAAA,EAAS,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,KAAA,IAAS,EAAA;AAAA,UACtC,KAAK,CAAA,EAAG,kBAAkB,CAAA,KAAA,EAAQ,IAAA,CAAK,OAAO,KAAK,CAAA,CAAA;AAAA,UACnD,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,WAAA,IAAe,EAAA;AAAA,UACtC,YAAA,EAAc,IAAA,CAAK,OAAA,EAAS,IAAA,IAAQ,EAAA;AAAA,UACpC,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,MAAA,IAAU;AAAA;AACnC,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAAA,OAAAA,CAAO,MAAM,2BAAA,EAA6B;AAAA,QACxC,OAAA;AAAA,QACA,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM,OAAA;AAAA,QAC9C,MAAA,EAAQ,MAAM,QAAA,EAAU;AAAA,OACzB,CAAA;AAED,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM;AAAA,OAC/C,CAAA;AAAA,IACH;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACtEO,SAAS,8BAAA,CACd,OAAA,EACAI,cAAAA,EACAJ,OAAAA,EACA;AACA,EAAA,OAAOT,gBAAAA,EAAY,CAChB,IAAA,CAAK,wBAAwB,CAAA,CAC7B,WAAA,CAAY,4IAA4I,CAAA,CACxJ,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,IAAI,YAAY,CAAA,CAChB,GAAA,CAAI,QAAQ,CAAA,CACZ,GAAA,CAAI,MAAM,CAAA,CACV,WAAW,4IAA4I,CAAA,CACvJ,OAAA,CAAQ,CAAC,mBAAmB,CAAC,CAAA,CAC7B,MAAA,CAAOF,MAAE,MAAA,CAAO;AAAA,IACf,OAAOA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,kDAAkD;AAAA,GACzF,CAAC,CAAA,CACD,SAAA,CAAU,OAAO,EAAE,KAAA,GAAQ,IAAG,KAAM;AACnC,IAAAU,OAAAA,CAAO,IAAA,CAAK,+BAAA,EAAiC,EAAE,OAAO,CAAA;AAEtD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,kBAAA,EAAmB,GAAI,OAAA,EAAQ;AACvC,MAAA,MAAM,WAAW,MAAMP,wBAAAA,CAAM,GAAA,CAAI,CAAA,EAAG,kBAAkB,CAAA,oBAAA,CAAA,EAAwB;AAAA,QAC5E,OAAA,EAAS;AAAA,UACP,eAAeW,cAAAA,EAAc;AAAA,UAC7B,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,MAAA,EAAQ;AAAA,UACN;AAAA;AACF,OACD,CAAA;AAED,MAAA,MAAM,SAAS,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,MAAgB;AAAA,QACxD,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,WAAA,EAAa,KAAA,CAAM,WAAA,EAAa,KAAA,EAAO,KAAA,IAAS,EAAA;AAAA,QAChD,KAAK,CAAA,EAAG,kBAAkB,CAAA,KAAA,EAAQ,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,OACtD,CAAE,CAAA;AAEF,MAAAJ,OAAAA,CAAO,KAAK,+BAAA,EAAiC;AAAA,QAC3C,YAAY,MAAA,CAAO,MAAA;AAAA,QACnB,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAW,EAAE,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC;AAAA;AAAA,OACpD,CAAA;AAED,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,IAAA;AAAA,QACT,OAAO,MAAA,CAAO,MAAA;AAAA,QACd;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAAA,OAAAA,CAAO,MAAM,8BAAA,EAAgC;AAAA,QAC3C,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM,OAAA;AAAA,QAC9C,MAAA,EAAQ,MAAM,QAAA,EAAU;AAAA,OACzB,CAAA;AAED,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM;AAAA,OAC/C,CAAA;AAAA,IACH;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC/DO,SAAS,uBAAA,CACd,OAAA,EACAI,cAAAA,EACAJ,OAAAA,EACA;AACA,EAAA,OAAOT,gBAAAA,EAAY,CAChB,IAAA,CAAK,iBAAiB,CAAA,CACtB,WAAA,CAAY,gHAAgH,CAAA,CAC5H,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,IAAI,YAAY,CAAA,CAChB,GAAA,CAAI,OAAO,CAAA,CACX,GAAA,CAAI,OAAO,CAAA,CACX,WAAW,yGAAyG,CAAA,CACpH,QAAA,CAAS,CAAC,wBAAwB,CAAC,CAAA,CACnC,MAAA,CAAOF,MAAE,MAAA,CAAO;AAAA,IACf,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0CAA0C,CAAA;AAAA,IACzE,OAAOA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iDAAiD;AAAA,GACxF,CAAC,CAAA,CACD,SAAA,CAAU,OAAO,EAAE,SAAA,EAAW,KAAA,GAAQ,EAAA,EAAG,KAAM;AAC9C,IAAAU,QAAO,IAAA,CAAK,wBAAA,EAA0B,EAAE,SAAA,EAAW,OAAO,CAAA;AAE1D,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,kBAAA,EAAmB,GAAI,OAAA,EAAQ;AACvC,MAAA,MAAM,WAAW,MAAMP,wBAAAA,CAAM,GAAA,CAAI,CAAA,EAAG,kBAAkB,CAAA,sBAAA,CAAA,EAA0B;AAAA,QAC9E,OAAA,EAAS;AAAA,UACP,eAAeW,cAAAA,EAAc;AAAA,UAC7B,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,QAAA,EAAU,SAAA;AAAA,UACV,IAAA,EAAM,MAAA;AAAA,UACN,KAAA;AAAA,UACA,MAAA,EAAQ;AAAA;AACV,OACD,CAAA;AAED,MAAA,MAAM,QAAQ,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,QACtD,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,KAAK,CAAA,EAAG,kBAAkB,CAAA,KAAA,EAAQ,IAAA,CAAK,OAAO,KAAK,CAAA,CAAA;AAAA,QACnD,YAAA,EAAc,IAAA,CAAK,OAAA,EAAS,IAAA,IAAQ;AAAA,OACtC,CAAE,CAAA;AAGF,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAAJ,OAAAA,CAAO,KAAK,qFAAA,EAAuF;AAAA,UACjG,SAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAAA,OAAAA,CAAO,KAAK,wBAAA,EAA0B;AAAA,UACpC,SAAA;AAAA,UACA,WAAW,KAAA,CAAM,MAAA;AAAA,UACjB,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAW,EAAE,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC;AAAA;AAAA,SAClD,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,IAAA;AAAA,QACT,KAAA,EAAO,SAAA;AAAA,QACP,OAAO,KAAA,CAAM,MAAA;AAAA,QACb;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAAA,OAAAA,CAAO,MAAM,uBAAA,EAAyB;AAAA,QACpC,SAAA;AAAA,QACA,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM,OAAA;AAAA,QAC9C,MAAA,EAAQ,MAAM,QAAA,EAAU;AAAA,OACzB,CAAA;AAED,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM;AAAA,OAC/C,CAAA;AAAA,IACH;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC7EO,SAAS,8BAAA,CACd,OAAA,EACAI,cAAAA,EACAJ,OAAAA,EACA;AACA,EAAA,OAAOT,gBAAAA,EAAY,CAChB,IAAA,CAAK,wBAAwB,CAAA,CAC7B,WAAA,CAAY,gHAAgH,CAAA,CAC5H,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,IAAI,YAAY,CAAA,CAChB,GAAA,CAAI,QAAQ,CAAA,CACZ,GAAA,CAAI,OAAO,CAAA,CACX,WAAW,iMAAiM,CAAA,CAC5M,QAAA,CAAS,CAAC,wBAAwB,CAAC,CAAA,CACnC,MAAA,CAAOF,MAAE,MAAA,CAAO;AAAA,IACf,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,kEAAkE,CAAA;AAAA,IACjG,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2BAA2B,CAAA;AAAA,IACtD,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,6DAA6D,CAAA;AAAA,IAC1F,gBAAgBA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,wDAAwD;AAAA,GACxG,CAAC,CAAA,CACD,SAAA,CAAU,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,cAAA,EAAe,KAAM;AAClE,IAAAU,OAAAA,CAAO,IAAA,CAAK,+BAAA,EAAiC,EAAE,SAAA,EAAW,OAAO,SAAA,EAAW,CAAC,CAAC,cAAA,EAAgB,CAAA;AAE9F,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,kBAAA,EAAmB,GAAI,OAAA,EAAQ;AAEvC,MAAA,MAAM,QAAA,GAAgB;AAAA,QACpB,IAAA,EAAM,MAAA;AAAA,QACN,KAAA;AAAA,QACA,KAAA,EAAO,EAAE,GAAA,EAAK,SAAA,EAAU;AAAA,QACxB,IAAA,EAAM;AAAA,UACJ,OAAA,EAAS;AAAA,YACP,KAAA,EAAO,OAAA;AAAA,YACP,cAAA,EAAgB;AAAA;AAClB;AACF,OACF;AAGA,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,QAAA,CAAS,SAAA,GAAY,CAAC,EAAE,EAAA,EAAI,gBAAgB,CAAA;AAAA,MAC9C;AAEA,MAAA,MAAM,QAAA,GAAW,MAAMP,wBAAAA,CAAM,IAAA;AAAA,QAC3B,GAAG,kBAAkB,CAAA,sBAAA,CAAA;AAAA,QACrB,QAAA;AAAA,QACA;AAAA,UACE,OAAA,EAAS;AAAA,YACP,eAAeW,cAAAA,EAAc;AAAA,YAC7B,cAAA,EAAgB;AAAA;AAClB;AACF,OACF;AAEA,MAAAJ,OAAAA,CAAO,KAAK,+BAAA,EAAiC;AAAA,QAC3C,OAAA,EAAS,SAAS,IAAA,CAAK,EAAA;AAAA,QACvB,KAAA,EAAO,SAAS,IAAA,CAAK,KAAA;AAAA,QACrB,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,UACJ,EAAA,EAAI,SAAS,IAAA,CAAK,EAAA;AAAA,UAClB,KAAA,EAAO,SAAS,IAAA,CAAK,KAAA;AAAA,UACrB,KAAA,EAAO,SAAA;AAAA,UACP,KAAK,CAAA,EAAG,kBAAkB,QAAQ,QAAA,CAAS,IAAA,CAAK,OAAO,KAAK,CAAA,CAAA;AAAA,UAC5D,OAAA,EAAS,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,MAAA,IAAU;AAAA;AAC5C,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAAA,OAAAA,CAAO,MAAM,8BAAA,EAAgC;AAAA,QAC3C,SAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM,OAAA;AAAA,QAC9C,MAAA,EAAQ,MAAM,QAAA,EAAU;AAAA,OACzB,CAAA;AAED,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM;AAAA,OAC/C,CAAA;AAAA,IACH;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACrFO,SAAS,8BAAA,CACd,OAAA,EACAI,cAAAA,EACAJ,OAAAA,EACA;AACA,EAAA,OAAOT,gBAAAA,EAAY,CAChB,IAAA,CAAK,wBAAwB,CAAA,CAC7B,WAAA,CAAY,6FAA6F,CAAA,CACzG,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,IAAI,YAAY,CAAA,CAChB,GAAA,CAAI,QAAQ,CAAA,CACZ,GAAA,CAAI,OAAO,CAAA,CACX,WAAW,+OAA+O,CAAA,CAC1P,QAAA,CAAS,CAAC,qBAAqB,CAAC,CAAA,CAChC,MAAA,CAAOF,MAAE,MAAA,CAAO;AAAA,IACf,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,8BAA8B,CAAA;AAAA,IAC3D,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,4BAA4B,CAAA;AAAA,IACvD,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,4DAA4D;AAAA,GAC1F,CAAC,CAAA,CACD,SAAA,CAAU,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ,KAAM;AAChD,IAAAU,QAAO,IAAA,CAAK,+BAAA,EAAiC,EAAE,OAAA,EAAS,OAAO,CAAA;AAE/D,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,kBAAA,EAAmB,GAAI,OAAA,EAAQ;AAGvC,MAAA,MAAM,WAAA,GAAc,MAAMP,wBAAAA,CAAM,GAAA;AAAA,QAC9B,CAAA,EAAG,kBAAkB,CAAA,uBAAA,EAA0B,OAAO,CAAA,CAAA;AAAA,QACtD;AAAA,UACE,OAAA,EAAS;AAAA,YACP,eAAeW,cAAAA;AAAc,WAC/B;AAAA,UACA,MAAA,EAAQ,EAAE,MAAA,EAAQ,SAAA;AAAU;AAC9B,OACF;AAEA,MAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,MAAA;AAGhD,MAAA,MAAM,cAAA,GAAiB,MAAMX,wBAAAA,CAAM,GAAA;AAAA,QACjC,CAAA,EAAG,kBAAkB,CAAA,uBAAA,EAA0B,OAAO,CAAA,CAAA;AAAA,QACtD;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,KAAA;AAAA,UACA,OAAA,EAAS,EAAE,MAAA,EAAQ,cAAA,GAAiB,CAAA,EAAE;AAAA,UACtC,IAAA,EAAM;AAAA,YACJ,OAAA,EAAS;AAAA,cACP,KAAA,EAAO,OAAA;AAAA,cACP,cAAA,EAAgB;AAAA;AAClB;AACF,SACF;AAAA,QACA;AAAA,UACE,OAAA,EAAS;AAAA,YACP,eAAeW,cAAAA,EAAc;AAAA,YAC7B,cAAA,EAAgB;AAAA;AAClB;AACF,OACF;AAEA,MAAAJ,OAAAA,CAAO,KAAK,+BAAA,EAAiC;AAAA,QAC3C,OAAA;AAAA,QACA,KAAA,EAAO,eAAe,IAAA,CAAK,KAAA;AAAA,QAC3B,eAAA,EAAiB,cAAA;AAAA,QACjB,UAAA,EAAY,cAAA,CAAe,IAAA,CAAK,OAAA,CAAQ;AAAA,OACzC,CAAA;AAED,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,UACJ,EAAA,EAAI,eAAe,IAAA,CAAK,EAAA;AAAA,UACxB,KAAA,EAAO,eAAe,IAAA,CAAK,KAAA;AAAA,UAC3B,KAAK,CAAA,EAAG,kBAAkB,QAAQ,cAAA,CAAe,IAAA,CAAK,OAAO,KAAK,CAAA,CAAA;AAAA,UAClE,OAAA,EAAS,cAAA,CAAe,IAAA,CAAK,OAAA,CAAQ,MAAA;AAAA,UACrC,eAAA,EAAiB;AAAA;AACnB,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAAA,OAAAA,CAAO,MAAM,8BAAA,EAAgC;AAAA,QAC3C,OAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM,OAAA;AAAA,QAC9C,MAAA,EAAQ,MAAM,QAAA,EAAU;AAAA,OACzB,CAAA;AAED,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM;AAAA,OAC/C,CAAA;AAAA,IACH;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC5FO,SAAS,+BAAA,CACd,OAAA,EACAI,cAAAA,EACAJ,OAAAA,EACA;AACA,EAAA,OAAOT,gBAAAA,EAAY,CAChB,IAAA,CAAK,yBAAyB,CAAA,CAC9B,WAAA,CAAY,8JAA8J,CAAA,CAC1K,QAAA,CAASC,iBAAAA,CAAa,GAAG,CAAA,CACzB,IAAI,YAAY,CAAA,CAChB,GAAA,CAAI,SAAS,CAAA,CACb,GAAA,CAAI,QAAQ,CAAA,CACZ,WAAW,mNAAmN,CAAA,CAC9N,SAAA,CAAU,CAAC,wBAAwB,CAAC,CAAA,CACpC,MAAA,CAAOF,MAAE,MAAA,CAAO;AAAA,IACf,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+BAA+B,CAAA;AAAA,IAC5D,QAAQA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iDAAiD;AAAA,GACzF,CAAC,CAAA,CACD,SAAA,CAAU,OAAO,EAAE,OAAA,EAAS,QAAO,KAAM;AACxC,IAAAU,QAAO,IAAA,CAAK,gCAAA,EAAkC,EAAE,OAAA,EAAS,QAAQ,CAAA;AAEjE,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,kBAAA,EAAmB,GAAI,OAAA,EAAQ;AAGvC,MAAA,MAAM,WAAA,GAAc,MAAMP,wBAAAA,CAAM,GAAA;AAAA,QAC9B,CAAA,EAAG,kBAAkB,CAAA,uBAAA,EAA0B,OAAO,CAAA,CAAA;AAAA,QACtD;AAAA,UACE,OAAA,EAAS;AAAA,YACP,eAAeW,cAAAA;AAAc,WAC/B;AAAA,UACA,MAAA,EAAQ,EAAE,MAAA,EAAQ,4BAAA;AAA6B;AACjD,OACF;AAEA,MAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,MAAA;AAChD,MAAA,MAAM,WAAW,WAAA,CAAY,IAAA;AAG7B,MAAA,MAAMX,wBAAAA,CAAM,GAAA;AAAA,QACV,CAAA,EAAG,kBAAkB,CAAA,uBAAA,EAA0B,OAAO,CAAA,CAAA;AAAA,QACtD;AAAA,UACE,OAAA,EAAS,EAAE,MAAA,EAAQ,cAAA,GAAiB,CAAA,EAAE;AAAA,UACtC,OAAO,QAAA,CAAS,KAAA;AAAA,UAChB,IAAA,EAAM,MAAA;AAAA,UACN,MAAA,EAAQ,SAAA;AAAA,UACR,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,KAAA,EAAO,EAAE,GAAA,EAAK,QAAA,CAAS,MAAM,GAAA;AAAI,SACnC;AAAA,QACA;AAAA,UACE,OAAA,EAAS;AAAA,YACP,eAAeW,cAAAA,EAAc;AAAA,YAC7B,cAAA,EAAgB;AAAA;AAClB;AACF,OACF;AAEA,MAAAJ,OAAAA,CAAO,KAAK,gCAAA,EAAkC;AAAA,QAC5C,OAAA;AAAA,QACA,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,eAAA,EAAiB,cAAA;AAAA,QACjB,YAAY,cAAA,GAAiB;AAAA,OAC9B,CAAA;AAED,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,IAAA;AAAA,QACT,QAAA,EAAU;AAAA,UACR,EAAA,EAAI,OAAA;AAAA,UACJ,OAAO,QAAA,CAAS,KAAA;AAAA,UAChB,eAAA,EAAiB,cAAA;AAAA,UACjB,YAAY,cAAA,GAAiB,CAAA;AAAA,UAC7B,QAAQ,MAAA,IAAU,kBAAA;AAAA,UAClB,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAAA,OAAAA,CAAO,MAAM,+BAAA,EAAiC;AAAA,QAC5C,OAAA;AAAA,QACA,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM,OAAA;AAAA,QAC9C,MAAA,EAAQ,MAAM,QAAA,EAAU;AAAA,OACzB,CAAA;AAED,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM;AAAA,OAC/C,CAAA;AAAA,IACH;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;ACxDA,IAAMK,YAAY,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,WAAA,MAA8BJ,aAAAA,CAAS,IAAA;AAChF,IAAMD,UAASE,iBAAAA,CAAa,oBAAA,EAAsB,EAAE,KAAA,EAAOG,WAAU,CAAA;AAK9D,IAAM,gBAAA,GAAmB,0BAAA,CAA2B,SAAA,EAAW,aAAA,EAAeL,OAAM;AACpF,IAAM,iBAAA,GAAoB,2BAAA,CAA4B,SAAA,EAAW,aAAA,EAAeA,OAAM;AACtF,IAAM,oBAAA,GAAuB,8BAAA,CAA+B,SAAA,EAAW,aAAA,EAAeA,OAAM;AAC5F,IAAM,aAAA,GAAgB,uBAAA,CAAwB,SAAA,EAAW,aAAA,EAAeA,OAAM;AAC9E,IAAM,oBAAA,GAAuB,8BAAA,CAA+B,SAAA,EAAW,aAAA,EAAeA,OAAM;AAC5F,IAAM,oBAAA,GAAuB,8BAAA,CAA+B,SAAA,EAAW,aAAA,EAAeA,OAAM;AAC5F,IAAM,qBAAA,GAAwB,+BAAA,CAAgC,SAAA,EAAW,aAAA,EAAeA,OAAM;AAS9F,IAAM,eAAA,GAAkB;AAAA;AAAA,EAE7B,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA,aAAA;AAAA;AAAA,EAEA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF;AAkCO,SAAS,qBAAA,CAAsB,MAAA,GAAqD,EAAC,EAAG;AAC7F,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACZ,GAAI,MAAA;AAGJ,EAAA,MAAM,iBAAA,GAAoB,uBAAA,CAAwB,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AACxE,EAAA,MAAM,uBAAA,GAA0B,8BAA8B,iBAAiB,CAAA;AAG/E,EAAA,MAAM,UAAA,GAAa,iBACfE,iBAAAA,CAAa,kBAAA,EAAoB,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA,GAC1DF,OAAAA;AAGJ,EAAA,MAAMM,iBAAAA,GAAmB,0BAAA,CAA2B,iBAAA,EAAmB,uBAAA,EAAyB,UAAU,CAAA;AAC1G,EAAA,MAAMC,kBAAAA,GAAoB,2BAAA,CAA4B,iBAAA,EAAmB,uBAAA,EAAyB,UAAU,CAAA;AAC5G,EAAA,MAAMC,qBAAAA,GAAuB,8BAAA,CAA+B,iBAAA,EAAmB,uBAAA,EAAyB,UAAU,CAAA;AAClH,EAAA,MAAMC,cAAAA,GAAgB,uBAAA,CAAwB,iBAAA,EAAmB,uBAAA,EAAyB,UAAU,CAAA;AACpG,EAAA,MAAMC,qBAAAA,GAAuB,8BAAA,CAA+B,iBAAA,EAAmB,uBAAA,EAAyB,UAAU,CAAA;AAClH,EAAA,MAAMC,qBAAAA,GAAuB,8BAAA,CAA+B,iBAAA,EAAmB,uBAAA,EAAyB,UAAU,CAAA;AAClH,EAAA,MAAMC,sBAAAA,GAAwB,+BAAA,CAAgC,iBAAA,EAAmB,uBAAA,EAAyB,UAAU,CAAA;AAGpH,EAAA,OAAO;AAAA,IACL,gBAAA,EAAAN,iBAAAA;AAAA,IACA,iBAAA,EAAAC,kBAAAA;AAAA,IACA,oBAAA,EAAAC,qBAAAA;AAAA,IACA,aAAA,EAAAC,cAAAA;AAAA,IACA,oBAAA,EAAAC,qBAAAA;AAAA,IACA,oBAAA,EAAAC,qBAAAA;AAAA,IACA,qBAAA,EAAAC;AAAA,GACF;AACF;ACvIO,IAAM,eAAA,GAAkBtB,MAAE,MAAA,CAAO;AAAA,EACtC,GAAA,EAAKA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qBAAqB,CAAA;AAAA,EAC9C,SAAA,EAAWA,MAAE,MAAA,EAAO,CAAE,QAAQ,GAAG,CAAA,CAAE,SAAS,4BAA4B,CAAA;AAAA,EACxE,UAAA,EAAYA,MAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,mCAAmC,CAAA;AAAA,EAClF,cAAA,EAAgBA,MAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,6BAA6B,CAAA;AAAA,EAChF,IAAA,EAAMA,MAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,6BAA6B;AACxE,CAAC;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAMA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,OAAOA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,CAAS,cAAc,CAAC,CAAC,CAAA,CAAE,SAAS,oCAAoC,CAAA;AAAA,EACvG,SAAA,EAAWA,MAAE,MAAA,EAAO,CAAE,QAAQ,GAAG,CAAA,CAAE,SAAS,4BAA4B,CAAA;AAAA,EACxE,cAAA,EAAgBA,MAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,sCAAsC,CAAA;AAAA,EACzF,OAAA,EAASA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,cAAc,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,gDAAgD;AAC5H,CAAC;AAKM,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACtC,GAAA,EAAKA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uBAAuB,CAAA;AAAA,EAChD,SAAA,EAAWA,MAAE,MAAA,EAAO,CAAE,QAAQ,GAAG,CAAA,CAAE,SAAS,4BAA4B,CAAA;AAAA,EACxE,MAAA,EAAQA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,8BAA8B;AAC5E,CAAC;AAKM,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACtC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,8BAA8B,CAAA;AAAA,EACxD,SAAA,EAAWA,MAAE,MAAA,EAAO,CAAE,QAAQ,GAAG,CAAA,CAAE,SAAS,4BAA4B;AAC1E,CAAC;ACjCM,SAAS,mBAAA,CACd,mBAAmB,GAAA,EACnB,iBAAA,GAAoB,MACpB,qBAAA,GAAwB,IAAA,EACxB,cAAc,IAAA,EACd;AACA,EAAA,OAAOC,gBAAAA,EAAY,CAChB,IAAA,CAAK,YAAY,CAAA,CACjB,YAAY,8FAA8F,CAAA,CAC1G,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAC,CAAA,CACtC,MAAA,CAAO,eAAe,CAAA,CACtB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUqB,UAAA,CAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC/B,SAAA,EAAW,MAAM,SAAA,IAAa,gBAAA;AAAA,QAC9B,OAAA,EAAS,MAAM,UAAA,IAAc,iBAAA;AAAA,QAC7B,gBAAA,EAAkB,MAAM,cAAA,IAAkB,qBAAA;AAAA,QAC1C,IAAA,EAAM,MAAM,IAAA,IAAQ,WAAA;AAAA,QACpB,kBAAA,EAAoB;AAAA,OACrB,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM,OAAA;AAAA,QACN,UAAU,OAAA,CAAQ,MAAA;AAAA,QAClB,WAAA,EAAa,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,MAAA,GAAS;AAAA,OACrE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACpCO,SAAS,sBAAA,CAAuB,mBAAmB,GAAA,EAAK;AAC7D,EAAA,OAAOtB,gBAAAA,EAAY,CAChB,IAAA,CAAK,eAAe,CAAA,CACpB,YAAY,6FAA6F,CAAA,CACzG,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,KAAA,EAAO,UAAA,EAAY,WAAA,EAAa,MAAM,CAAC,CAAA,CAC7C,MAAA,CAAO,kBAAkB,CAAA,CACzB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAMsB,gBAAA,CAAU,KAAA,CAAM,IAAA,EAAM;AAAA,QAChC,SAAA,EAAW,MAAM,SAAA,IAAa,gBAAA;AAAA,QAC9B,QAAQ,KAAA,CAAM,cAAA;AAAA,QACd,SAAS,KAAA,CAAM;AAAA,OAChB,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,GAAA;AAAA,QACA,QAAA,EAAU,MAAM,IAAA,CAAK;AAAA,OACvB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC5BO,SAAS,mBAAA,CAAoB,mBAAmB,GAAA,EAAK;AAC1D,EAAA,OAAOvB,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,2FAA2F,CAAA,CACvG,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,MAAM,CAAC,CAAA,CACvC,MAAA,CAAO,eAAe,CAAA,CACtB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUqB,UAAAA,CAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC/B,SAAA,EAAW,MAAM,SAAA,IAAa,gBAAA;AAAA,QAC9B,OAAA,EAAS,IAAA;AAAA,QACT,gBAAA,EAAkB,IAAA;AAAA,QAClB,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,GACf,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,GAC/B,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAE1B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA;AAAA,QACA,aAAa,OAAA,CAAQ;AAAA,OACvB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACjCO,SAAS,mBAAA,CAAoB,mBAAmB,GAAA,EAAK;AAC1D,EAAA,OAAOtB,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,0FAA0F,CAAA,CACtG,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,MAAM,CAAC,CAAA,CACvC,MAAA,CAAO,eAAe,CAAA,CACtB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAElC,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,GAAMsB,iBAAU,IAAA,EAAM;AAAA,QAC1B,SAAA,EAAW,MAAM,SAAA,IAAa,gBAAA;AAAA,QAC9B,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,GAAA;AAAA,QACA,UAAU,IAAA,CAAK;AAAA,OACjB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;AC1BO,IAAM,YAAY,mBAAA;AAKlB,IAAM,eAAe,sBAAA;AAKrB,IAAM,YAAY,mBAAA;AAKlB,IAAM,YAAY,mBAAA;AAKlB,IAAM,QAAA,GAAW,CAAC,SAAA,EAAW,YAAA,EAAc,WAAW,SAAS;AAK/D,SAAS,cAAA,CAAe,MAAA,GAAyB,EAAC,EAAG;AAC1D,EAAA,MAAM;AAAA,IACJ,gBAAA,GAAmB,GAAA;AAAA,IACnB,iBAAA,GAAoB,IAAA;AAAA,IACpB,qBAAA,GAAwB,IAAA;AAAA,IACxB,WAAA,GAAc;AAAA,GAChB,GAAI,MAAA;AAEJ,EAAA,OAAO;AAAA,IACL,mBAAA,CAAoB,gBAAA,EAAkB,iBAAA,EAAmB,qBAAA,EAAuB,WAAW,CAAA;AAAA,IAC3F,uBAAuB,gBAAgB,CAAA;AAAA,IACvC,oBAAoB,gBAAgB,CAAA;AAAA,IACpC,oBAAoB,gBAAgB;AAAA,GACtC;AACF;ACjDO,IAAM,gBAAA,GAAmBxB,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,sBAAsB,CAAA;AAAA,EAChD,MAAA,EAAQA,MAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,oDAAoD;AACjG,CAAC;AAKM,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,KAAAA,CAAE,GAAA,EAAI,CAAE,SAAS,gCAAgC,CAAA;AAAA,EACvD,MAAA,EAAQA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,yCAAyC,CAAA;AAAA,EACrF,MAAA,EAAQA,MAAE,MAAA,EAAO,CAAE,QAAQ,CAAC,CAAA,CAAE,SAAS,wDAAwD;AACjG,CAAC;AAKM,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACtC,IAAA,EAAMA,KAAAA,CAAE,GAAA,EAAI,CAAE,SAAS,oBAAoB,CAAA;AAAA,EAC3C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,iEAAiE;AAC7F,CAAC;AAKM,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yBAAyB;AACrD,CAAC;AAKM,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACtC,OAAA,EAASA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,CAAS,iBAAiB,CAAC,CAAA,CAAE,QAAA,CAAS,2BAA2B,CAAA;AAAA,EAC1F,IAAA,EAAMA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,qCAAqC;AACjF,CAAC;ACpCM,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAOC,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,mGAAmG,CAAA,CAC/G,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAC,CAAA,CAC9B,OAAO,gBAAgB,CAAA,CACvB,aAAA,CAAc,OAAO,KAAA,KAAU;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AACpC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,MAAM,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,UAAU,OAAO;AAAA,KACjD;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACfO,SAAS,uBAAA,CAAwB,aAAA,GAAgB,CAAA,EAAG,aAAA,GAAgB,KAAA,EAAO;AAChF,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,gBAAgB,CAAA,CACrB,YAAY,6EAA6E,CAAA,CACzF,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,MAAM,CAAC,CAAA,CAC5C,MAAA,CAAO,mBAAmB,CAAA,CAC1B,aAAA,CAAc,OAAO,KAAA,KAAU;AAC9B,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,aAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,aAAA;AAE/B,IAAA,MAAM,IAAA,GAAO,MAAA,GACT,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA,GACvC,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAE7B,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACrBO,SAAS,mBAAA,GAAsB;AACpC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,YAAY,CAAA,CACjB,YAAY,+FAA+F,CAAA,CAC3G,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAC,CAAA,CACtC,MAAA,CAAO,eAAe,CAAA,CACtB,aAAA,CAAc,OAAO,KAAA,KAAU;AAC9B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAClC,IAAA,IAAI,UAAU,KAAA,CAAM,IAAA;AAEpB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,kBAAkB,CAAA;AAChD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,GAAG,GAAA,EAAK,KAAK,CAAA,GAAI,UAAA;AACvB,QAAA,OAAA,GAAU,QAAQ,GAAG,CAAA,CAAE,QAAA,CAAS,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,MAC5C,CAAA,MAAO;AACL,QAAA,OAAA,GAAU,QAAQ,IAAI,CAAA;AAAA,MACxB;AAEA,MAAA,IAAI,YAAY,MAAA,EAAW;AACzB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAAA,MACjD;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAA;AAAA,MACP,MAAM,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,UAAU,OAAO;AAAA,KAClD;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AChCO,SAAS,uBAAA,GAA0B;AACxC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,gBAAgB,CAAA,CACrB,YAAY,uGAAuG,CAAA,CACnH,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,MAAA,EAAQ,UAAA,EAAY,OAAA,EAAS,MAAM,CAAC,CAAA,CAC1C,MAAA,CAAO,mBAAmB,CAAA,CAC1B,aAAA,CAAc,OAAO,KAAA,KAAU;AAC9B,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AACrB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAS;AAAA,KACX;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACfO,SAAS,mBAAA,GAAsB;AACpC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,YAAY,CAAA,CACjB,YAAY,2FAA2F,CAAA,CACvG,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,MAAM,CAAC,CAAA,CACzC,MAAA,CAAO,eAAe,CAAA,CACtB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI,MAAM,IAAA,EAAM;AAEd,MAAA,MAAM,SAAA,GAAY,CAAC,MAAA,EAAa,MAAA,KAAqB;AACnD,QAAA,MAAM,MAAA,GAAS,EAAE,GAAG,MAAA,EAAO;AAC3B,QAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,UAAA,IAAI,MAAA,CAAO,GAAG,CAAA,IAAK,OAAO,OAAO,GAAG,CAAA,KAAM,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG;AACjF,YAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA,CAAU,MAAA,CAAO,GAAG,KAAK,EAAC,EAAG,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,UACxD,CAAA,MAAO;AACL,YAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA,CAAO,GAAG,CAAA;AAAA,UAC1B;AAAA,QACF;AACA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAEA,MAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,GAAA,KAAQ,SAAA,CAAU,GAAA,EAAK,GAAG,CAAA,EAAG,EAAE,CAAA;AAAA,IACnE,CAAA,MAAO;AAEL,MAAA,OAAO,OAAO,MAAA,CAAO,EAAC,EAAG,GAAG,MAAM,OAAO,CAAA;AAAA,IAC3C;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;AChBO,IAAM,aAAa,oBAAA;AAKnB,IAAM,gBAAgB,uBAAA;AAKtB,IAAM,YAAY,mBAAA;AAKlB,IAAM,gBAAgB,uBAAA;AAKtB,IAAM,YAAY,mBAAA;AAKlB,IAAM,YAAY,CAAC,UAAA,EAAY,aAAA,EAAe,SAAA,EAAW,eAAe,SAAS;AAKjF,SAAS,eAAA,CAAgB,MAAA,GAA0B,EAAC,EAAG;AAC5D,EAAA,MAAM;AAAA,IACJ,aAAA,GAAgB,CAAA;AAAA,IAChB,aAAA,GAAgB;AAAA,GAClB,GAAI,MAAA;AAEJ,EAAA,OAAO;AAAA,IACL,oBAAA,EAAqB;AAAA,IACrB,uBAAA,CAAwB,eAAe,aAAa,CAAA;AAAA,IACpD,mBAAA,EAAoB;AAAA,IACpB,uBAAA,EAAwB;AAAA,IACxB,mBAAA;AAAoB,GACtB;AACF;ACvDO,IAAM,eAAA,GAAkBF,MAAE,MAAA,CAAO;AAAA,EACtC,GAAA,EAAKA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qBAAqB,CAAA;AAAA,EAC9C,gBAAA,EAAkBA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,uBAAuB,CAAA;AAAA,EAC7E,mBAAA,EAAqBA,MAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,4CAA4C,CAAA;AAAA,EACpG,UAAA,EAAYA,MAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,kCAAkC;AACnF,CAAC;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAMA,KAAAA,CAAE,GAAA,EAAI,CAAE,SAAS,0BAA0B,CAAA;AAAA,EACjD,QAAA,EAAUA,MAAE,MAAA,EAAO,CAAE,QAAQ,MAAM,CAAA,CAAE,SAAS,8BAA8B,CAAA;AAAA,EAC5E,MAAA,EAAQA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,6BAA6B,CAAA;AAAA,EACzE,UAAA,EAAYA,MAAE,MAAA,EAAO,CAAE,QAAQ,CAAC,CAAA,CAAE,SAAS,wDAAwD;AACrG,CAAC;AAKM,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACtC,GAAA,EAAKA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uBAAuB,CAAA;AAAA,EAChD,gBAAA,EAAkBA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,qCAAqC,CAAA;AAAA,EAC3F,MAAA,EAAQA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,8BAA8B;AAC5E,CAAC;AAKM,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACtC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wBAAwB,CAAA;AAAA,EAClD,QAAA,EAAUA,MAAE,MAAA,EAAO,CAAE,QAAQ,MAAM,CAAA,CAAE,SAAS,8BAA8B,CAAA;AAAA,EAC5E,MAAA,EAAQA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,6BAA6B;AAC3E,CAAC;ACjCM,SAAS,mBAAA,GAAsB;AACpC,EAAA,OAAOC,gBAAAA,EAAY,CAChB,IAAA,CAAK,YAAY,CAAA,CACjB,YAAY,6FAA6F,CAAA,CACzG,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,KAAA,EAAO,OAAA,EAAS,MAAM,CAAC,CAAA,CAC7B,OAAO,eAAe,CAAA,CACtB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAIuB,uBAAA,CAAU;AAAA,QAC3B,kBAAkB,KAAA,CAAM,gBAAA;AAAA,QACxB,qBAAqB,KAAA,CAAM,mBAAA;AAAA,QAC3B,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,aAAA,EAAe;AAAA,OAChB,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAErC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACR;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC9BO,SAAS,uBAAuB,eAAA,GAAkB,MAAA,EAAQ,aAAA,GAAgB,KAAA,EAAO,oBAAoB,CAAA,EAAG;AAC7G,EAAA,OAAOxB,gBAAAA,EAAY,CAChB,IAAA,CAAK,eAAe,CAAA,CACpB,YAAY,6FAA6F,CAAA,CACzG,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,KAAA,EAAO,UAAA,EAAY,WAAA,EAAa,MAAM,CAAC,CAAA,CAC7C,MAAA,CAAO,kBAAkB,CAAA,CACzB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,UAAA,IAAc,iBAAA;AACvC,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,eAAA;AACnC,MAAA,MAAMwB,OAAAA,GAAS,MAAM,MAAA,IAAU,aAAA;AAE/B,MAAA,MAAM,OAAA,GAAU,IAAIC,wBAAA,CAAW;AAAA,QAC7B,MAAA,EAAAD,OAAAA;AAAA,QACA,QAAA,EAAU,GAAA,CAAI,MAAA,CAAO,UAAU,CAAA;AAAA,QAC/B,gBAAA,EAAkB;AAAA,OACnB,CAAA;AAGD,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,GAAI,KAAA,CAAM,IAAA,GAAO,EAAE,CAAC,QAAQ,GAAG,KAAA,CAAM,IAAA,EAAK;AACnF,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAEvC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACnCO,SAAS,mBAAA,GAAsB;AACpC,EAAA,OAAOzB,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,wFAAwF,CAAA,CACpG,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,MAAM,CAAC,CAAA,CACvC,MAAA,CAAO,eAAe,CAAA,CACtB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAIuB,uBAAAA,CAAU;AAAA,QAC3B,kBAAkB,KAAA,CAAM,gBAAA;AAAA,QACxB,mBAAA,EAAqB,IAAA;AAAA,QACrB,UAAA,EAAY;AAAA,OACb,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AACrC,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,GACf,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,GAC9B,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAEzB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AChCO,SAAS,mBAAA,CAAoB,eAAA,GAAkB,MAAA,EAAQ,aAAA,GAAgB,KAAA,EAAO;AACnF,EAAA,OAAOxB,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,qEAAqE,CAAA,CACjF,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,MAAM,CAAC,CAAA,CACvC,MAAA,CAAO,eAAe,CAAA,CACtB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAClC,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,eAAA;AACnC,MAAA,MAAMwB,OAAAA,GAAS,MAAM,MAAA,IAAU,aAAA;AAE/B,MAAA,MAAM,OAAA,GAAU,IAAIC,wBAAAA,CAAW;AAAA,QAC7B,MAAA,EAAAD,OAAAA;AAAA,QACA,QAAA,EAAU,IAAA;AAAA,QACV,gBAAA,EAAkB;AAAA,OACnB,CAAA;AAED,MAAA,MAAM,aAAA,GAAgB,KAAK,QAAQ,CAAA,GAAI,OAAO,EAAE,CAAC,QAAQ,GAAG,IAAA,EAAK;AACjE,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAEvC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;ACxBO,IAAM,YAAY,mBAAA;AAKlB,IAAM,eAAe,sBAAA;AAKrB,IAAM,YAAY,mBAAA;AAKlB,IAAM,YAAY,mBAAA;AAKlB,IAAM,QAAA,GAAW,CAAC,SAAA,EAAW,YAAA,EAAc,WAAW,SAAS;AAK/D,SAAS,cAAA,CAAe,MAAA,GAAyB,EAAC,EAAG;AAC1D,EAAA,MAAM;AAAA,IACJ,eAAA,GAAkB,MAAA;AAAA,IAClB,aAAA,GAAgB,KAAA;AAAA,IAChB,iBAAA,GAAoB;AAAA,GACtB,GAAI,MAAA;AAEJ,EAAA,OAAO;AAAA,IACL,mBAAA,EAAoB;AAAA,IACpB,sBAAA,CAAuB,eAAA,EAAiB,aAAA,EAAe,iBAAiB,CAAA;AAAA,IACxE,mBAAA,EAAoB;AAAA,IACpB,mBAAA,CAAoB,iBAAiB,aAAa;AAAA,GACpD;AACF;AChDO,IAAM,iBAAA,GAAoB1B,MAAE,MAAA,CAAO;AAAA,EACxC,KAAA,EAAOA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,CAAS,eAAe,CAAC,CAAA,CAAE,QAAA,CAAS,iBAAiB,CAAA;AAAA,EAC5E,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qEAAqE,CAAA;AAAA,EACnG,QAAA,EAAUA,KAAAA,CAAE,IAAA,CAAK,CAAC,UAAU,YAAA,EAAc,cAAA,EAAgB,WAAA,EAAa,UAAA,EAAY,aAAA,EAAe,WAAW,CAAC,CAAA,CAAE,SAAS,qBAAqB,CAAA;AAAA,EAC9I,KAAA,EAAOA,KAAAA,CAAE,GAAA,EAAI,CAAE,SAAS,0BAA0B;AACpD,CAAC;AAKM,IAAM,cAAA,GAAiBA,MAAE,MAAA,CAAO;AAAA,EACrC,KAAA,EAAOA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,CAAS,eAAe,CAAC,CAAA,CAAE,QAAA,CAAS,cAAc,CAAA;AAAA,EACzE,UAAA,EAAYA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,cAAc,CAAC,CAAA,CAAE,QAAA,CAAS,oDAAoD;AACxH,CAAC;AAKM,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACtC,KAAA,EAAOA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,CAAS,eAAe,CAAC,CAAA,CAAE,QAAA,CAAS,eAAe,CAAA;AAAA,EAC1E,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mEAAmE,CAAA;AAAA,EACjG,KAAA,EAAOA,KAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA,CAAE,QAAA,CAAS,qCAAqC;AAC9F,CAAC;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,KAAA,EAAOA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,CAAS,eAAe,CAAC,CAAA,CAAE,QAAA,CAAS,gBAAgB,CAAA;AAAA,EAC3E,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2BAA2B;AAC3D,CAAC;AAKM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,MAAA,EAAQA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,CAAS,gBAAgB,CAAC,CAAA,CAAE,QAAA,CAAS,eAAe,CAAA;AAAA,EAC7E,UAAA,EAAYA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,cAAc,CAAC,CAAA,CAAE,QAAA,CAAS,gCAAgC;AACpG,CAAC;AAKM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,MAAA,EAAQA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,CAAS,gBAAgB,CAAC,CAAA,CAAE,QAAA,CAAS,eAAe,CAAA;AAAA,EAC7E,UAAA,EAAYA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,cAAc,CAAC,CAAA,CAAE,QAAA,CAAS,gCAAgC;AACpG,CAAC;AC/CM,SAAS,qBAAA,GAAwB;AACtC,EAAA,OAAOC,gBAAAA,EAAY,CAChB,IAAA,CAAK,cAAc,CAAA,CACnB,YAAY,oGAAoG,CAAA,CAChH,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,WAAW,CAAC,CAAA,CAC7C,MAAA,CAAO,iBAAiB,CAAA,CACxB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,EAAU0B,MAAAA,KAAsB;AACtD,MAAA,OAAOA,MAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,OAAA,EAAS,GAAA,KAAQ,OAAA,GAAU,GAAG,CAAA,EAAG,GAAG,CAAA;AAAA,IACrE,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS;AAC5C,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,QAAQ,CAAA;AAErD,MAAA,QAAQ,MAAM,QAAA;AAAU,QACtB,KAAK,QAAA;AACH,UAAA,OAAO,cAAc,KAAA,CAAM,KAAA;AAAA,QAC7B,KAAK,YAAA;AACH,UAAA,OAAO,cAAc,KAAA,CAAM,KAAA;AAAA,QAC7B,KAAK,cAAA;AACH,UAAA,OAAO,YAAY,KAAA,CAAM,KAAA;AAAA,QAC3B,KAAK,WAAA;AACH,UAAA,OAAO,YAAY,KAAA,CAAM,KAAA;AAAA,QAC3B,KAAK,UAAA;AACH,UAAA,OAAO,OAAO,SAAS,CAAA,CAAE,SAAS,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,QACvD,KAAK,aAAA;AACH,UAAA,OAAO,OAAO,SAAS,CAAA,CAAE,WAAW,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,QACzD,KAAK,WAAA;AACH,UAAA,OAAO,OAAO,SAAS,CAAA,CAAE,SAAS,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,QACvD;AACE,UAAA,OAAO,KAAA;AAAA;AACX,IACF,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,aAAA,EAAe,MAAM,KAAA,CAAM,MAAA;AAAA,MAC3B,eAAe,QAAA,CAAS;AAAA,KAC1B;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC1CO,SAAS,kBAAA,GAAqB;AACnC,EAAA,OAAO3B,gBAAAA,EAAY,CAChB,IAAA,CAAK,WAAW,CAAA,CAChB,YAAY,kHAAkH,CAAA,CAC9H,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,WAAW,CAAC,CAAA,CAC1C,MAAA,CAAO,cAAc,CAAA,CACrB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACvC,MAAA,MAAM,SAAc,EAAC;AACrB,MAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,UAAA,EAAY;AAEnC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,OAAA,EAAS,GAAA,KAAQ,OAAA,GAAU,GAAG,CAAA,EAAG,IAAI,CAAA;AAC3E,QAAA,MAAA,CAAO,IAAI,CAAA,GAAI,KAAA;AAAA,MACjB;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,OAAO,MAAA,CAAO;AAAA,KAChB;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACxBO,SAAS,mBAAA,GAAsB;AACpC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,YAAY,CAAA,CACjB,YAAY,6EAA6E,CAAA,CACzF,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,WAAW,CAAC,CAAA,CAC3C,MAAA,CAAO,eAAe,CAAA,CACtB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,EAAU0B,MAAAA,KAAsB;AACtD,MAAA,OAAOA,MAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,OAAA,EAAS,GAAA,KAAQ,OAAA,GAAU,GAAG,CAAA,EAAG,GAAG,CAAA;AAAA,IACrE,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC7C,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA;AAC/C,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA;AAE/C,MAAA,IAAI,SAAS,MAAA,EAAQ,OAAO,KAAA,CAAM,KAAA,KAAU,QAAQ,EAAA,GAAK,CAAA;AACzD,MAAA,IAAI,SAAS,MAAA,EAAQ,OAAO,KAAA,CAAM,KAAA,KAAU,QAAQ,CAAA,GAAI,EAAA;AACxD,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,OAAO,MAAA,CAAO;AAAA,KAChB;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC3BO,SAAS,sBAAA,GAAyB;AACvC,EAAA,OAAO3B,gBAAAA,EAAY,CAChB,IAAA,CAAK,gBAAgB,CAAA,CACrB,YAAY,uFAAuF,CAAA,CACnG,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,WAAW,CAAC,CAAA,CAC5C,MAAA,CAAO,kBAAkB,CAAA,CACzB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,SAAgC,EAAC;AAEvC,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAC,CAAA;AACvC,MAAA,IAAI,CAAC,MAAA,CAAO,GAAG,CAAA,EAAG;AAChB,QAAA,MAAA,CAAO,GAAG,IAAI,EAAC;AAAA,MACjB;AACA,MAAA,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,IACvB;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA;AAAA,MAChC,UAAA,EAAY,MAAM,KAAA,CAAM;AAAA,KAC1B;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACzBO,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,gFAAgF,CAAA,CAC5F,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,WAAW,CAAC,CAAA,CAC5C,MAAA,CAAO,gBAAgB,CAAA,CACvB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,SAA8B,EAAC;AAErC,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,UAAA,EAAY;AACnC,MAAA,IAAI,IAAA,IAAQ,MAAM,MAAA,EAAQ;AACxB,QAAA,MAAA,CAAO,IAAI,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AAAA,MAClC;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,EACA,KAAA,EAAM;AACX;ACnBO,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,gFAAgF,CAAA,CAC5F,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,WAAW,CAAC,CAAA,CAC5C,MAAA,CAAO,gBAAgB,CAAA,CACvB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,OAAA,GAA+B,EAAE,GAAG,KAAA,CAAM,MAAA,EAAO;AAEvD,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,UAAA,EAAY;AACnC,MAAA,OAAO,QAAQ,IAAI,CAAA;AAAA,IACrB;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,CAAC,EACA,KAAA,EAAM;AACX;;;ACFO,IAAM,cAAc,qBAAA;AAKpB,IAAM,WAAW,kBAAA;AAKjB,IAAM,YAAY,mBAAA;AAKlB,IAAM,eAAe,sBAAA;AAKrB,IAAM,aAAa,oBAAA;AAKnB,IAAM,aAAa,oBAAA;AAKnB,IAAM,mBAAmB,CAAC,WAAA,EAAa,UAAU,SAAA,EAAW,YAAA,EAAc,YAAY,UAAU;AAKhG,SAAS,sBAAA,CAAuB,MAAA,GAAiC,EAAC,EAAG;AAC1E,EAAA,OAAO;AAAA,IACL,qBAAA,EAAsB;AAAA,IACtB,kBAAA,EAAmB;AAAA,IACnB,mBAAA,EAAoB;AAAA,IACpB,sBAAA,EAAuB;AAAA,IACvB,oBAAA,EAAqB;AAAA,IACrB,oBAAA;AAAqB,GACvB;AACF;AC9CO,IAAM,gBAAA,GAAmBF,MAAE,MAAA,CAAO;AAAA,EACvC,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yBAAyB,CAAA;AAAA,EACrD,UAAA,EAAYA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,4CAA4C,CAAA;AAAA,EAC9F,UAAUA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iDAAiD;AAC5F,CAAC;AAKM,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EAC3C,UAAUA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iDAAiD;AAC5F,CAAC;AAKM,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EAC3C,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0BAA0B,CAAA;AAAA,EACrD,UAAA,EAAYA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,uCAAuC,CAAA;AAAA,EACzF,KAAA,EAAOA,MAAE,MAAA,EAAO,CAAE,QAAQ,GAAG,CAAA,CAAE,SAAS,mCAAmC,CAAA;AAAA,EAC3E,UAAUA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iDAAiD;AAC5F,CAAC;AAKM,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,WAAA,EAAaA,MAAE,KAAA,CAAM;AAAA,IACnBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,mBAAmB,CAAA;AAAA,IACvCA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,mBAAmB;AAAA,GACxC,CAAA,CAAE,QAAA,CAAS,yBAAyB,CAAA;AAAA,EACrC,kBAAkBA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yEAAyE,CAAA;AAAA,EAC1H,SAAA,EAAWA,KAAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,UAAA,EAAY,MAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA,CAAE,SAAS,uBAAuB,CAAA;AAAA,EACxG,QAAA,EAAUA,MAAE,MAAA,EAAO,CAAE,QAAQ,CAAC,CAAA,CAAE,SAAS,2BAA2B,CAAA;AAAA,EACpE,KAAA,EAAOA,MAAE,MAAA,EAAO,CAAE,QAAQ,GAAG,CAAA,CAAE,SAAS,mCAAmC,CAAA;AAAA,EAC3E,UAAUA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iDAAiD;AAC5F,CAAC;AAKM,IAAM,uBAAA,GAA0BA,MAAE,MAAA,CAAO;AAAA,EAC9C,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oCAAoC,CAAA;AAAA,EACnE,WAAA,EAAaA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,wBAAwB,CAAC,CAAA,CAAE,QAAA,CAAS,oCAAoC,CAAA;AAAA,EACjH,KAAA,EAAOA,MAAE,MAAA,EAAO,CAAE,QAAQ,EAAE,CAAA,CAAE,SAAS,qCAAqC,CAAA;AAAA,EAC5E,UAAUA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iDAAiD;AAC5F,CAAC;AAKM,IAAM,oCAAA,GAAuCA,MAAE,MAAA,CAAO;AAAA,EAC3D,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oCAAoC,CAAA;AAAA,EACnE,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uDAAuD,CAAA;AAAA,EACtF,KAAA,EAAOA,MAAE,MAAA,EAAO,CAAE,QAAQ,EAAE,CAAA,CAAE,SAAS,qCAAqC,CAAA;AAAA,EAC5E,OAAOA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,uDAAuD,CAAA;AAAA,EAC7F,UAAUA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iDAAiD;AAC5F,CAAC;AAKM,IAAM,kCAAA,GAAqCA,MAAE,MAAA,CAAO;AAAA,EACzD,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,YAAY,CAAA;AAAA,EACvC,UAAA,EAAYA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,QAAO,EAAGA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,CAAS,gBAAgB,CAAC,CAAA,CAAE,SAAS,mCAAmC,CAAA;AAAA,EACjH,YAAA,EAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+CAA+C,CAAA;AAAA,EACjF,iBAAA,EAAmBA,MAAE,MAAA,EAAO,CAAE,QAAQ,WAAW,CAAA,CAAE,SAAS,oDAAoD,CAAA;AAAA,EAChH,OAAOA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,uDAAuD,CAAA;AAAA,EAC7F,UAAUA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iDAAiD;AAC5F,CAAC;AClFD,IAAMU,OAAAA,GAASE,kBAAa,6BAA6B,CAAA;AAKzD,IAAM,sBAAN,MAA0B;AAAA,EAChB,MAAA,GAAwB,IAAA;AAAA,EACxB,MAAA,GAA6B,IAAA;AAAA;AAAA;AAAA;AAAA,EAKrC,MAAM,WAAW,MAAA,EAAoC;AACnD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAAF,OAAAA,CAAO,MAAM,oCAAA,EAAsC;AAAA,MACjD,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,QAAA,EAAU,OAAO,QAAA,IAAY,OAAA;AAAA,MAC7B,qBAAA,EAAuB,OAAO,qBAAA,IAAyB,EAAA;AAAA,MACvD,iBAAA,EAAmB,OAAO,iBAAA,IAAqB;AAAA,KAChD,CAAA;AAED,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAAA,OAAAA,CAAO,MAAM,mDAAmD,CAAA;AAChE,MAAA,MAAM,KAAK,KAAA,EAAM;AAAA,IACnB;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAASmB,sBAAA,CAAM,MAAA;AAAA,MAClB,MAAA,CAAO,GAAA;AAAA,MACPhB,UAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,OAAO,QAAQ,CAAA;AAAA,MAC3C;AAAA,QACE,qBAAA,EAAuB,OAAO,qBAAA,IAAyB,EAAA;AAAA,QACvD,iBAAA,EAAmB,OAAO,iBAAA,IAAqB;AAAA;AACjD,KACF;AAGA,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAE9B,IAAAH,OAAAA,CAAO,KAAK,mCAAA,EAAqC;AAAA,MAC/C,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,QAAA,EAAU,OAAO,QAAA,IAAY,OAAA;AAAA,MAC7B,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KACxB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,GAAoC;AACxC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,KAAA,GAAQ,8BAAA;AACd,MAAAA,OAAAA,CAAO,MAAM,KAAK,CAAA;AAClB,MAAA,MAAM,IAAI,MAAM,KAAK,CAAA;AAAA,IACvB;AAEA,IAAAA,OAAAA,CAAO,MAAM,8BAA8B,CAAA;AAE3C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAO,kBAAA,EAAmB;AACrC,MAAAA,OAAAA,CAAO,MAAM,6BAA6B,CAAA;AAAA,IAC5C,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,CAAA,4BAAA,EAA+B,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA,CAAA;AAC5G,MAAAA,OAAAA,CAAO,MAAM,wCAAA,EAA0C;AAAA,QACrD,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,QAChD,GAAA,EAAK,KAAK,MAAA,EAAQ;AAAA,OACnB,CAAA;AACD,MAAA,MAAM,IAAI,MAAM,YAAY,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,QAAA,EAA4B;AACrC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC1E;AAEA,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACzB,QAAA,EAAU,QAAA,IAAY,IAAA,CAAK,MAAA,EAAQ,QAAA,IAAY;AAAA,KAChD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,MAAA,EACA,UAAA,EACA,QAAA,EACc;AACd,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,UAAU,CAAA;AACnD,MAAA,OAAO,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,UAAe,CAAA;AAAA,IAC9D,CAAA,SAAE;AACA,MAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CACJ,MAAA,EACA,UAAA,EACA,QAAA,EACc;AACd,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,WAAA,CAAY,CAAC,OAAO,EAAA,CAAG,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAC,CAAA;AAC3E,MAAA,OAAO,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,UAAe,CAAA;AAAA,IAC9D,CAAA,SAAE;AACA,MAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CACJ,MAAA,EACA,UAAA,EACA,QAAA,EACc;AACd,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,YAAA,CAAa,CAAC,OAAO,EAAA,CAAG,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAC,CAAA;AAC5E,MAAA,OAAO,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,UAAe,CAAA;AAAA,IAC9D,CAAA,SAAE;AACA,MAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAyB;AACvB,IAAA,OAAO,KAAK,MAAA,KAAW,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAAA,OAAAA,CAAO,MAAM,+BAA+B,CAAA;AAC5C,MAAA,MAAM,IAAA,CAAK,OAAO,KAAA,EAAM;AACxB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAAA,OAAAA,CAAO,KAAK,8BAA8B,CAAA;AAAA,IAC5C;AAAA,EACF;AACF,CAAA;AAKO,IAAM,SAAA,GAAY,IAAI,mBAAA;AAK7B,eAAsB,iBAAA,GAAmC;AAEvD,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW;AAC1B,IAAAA,OAAAA,CAAO,KAAK,uDAAA,EAAyD;AAAA,MACnE,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY;AAC3B,IAAAA,OAAAA,CAAO,KAAK,wDAAA,EAA0D;AAAA,MACpE,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,cAAA,EAAgB;AAC/B,IAAAA,OAAAA,CAAO,KAAK,4DAAA,EAA8D;AAAA,MACxE,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,cAAA,EAAgB;AAC/B,IAAAA,OAAAA,CAAO,MAAM,4DAAA,EAA8D;AAAA,MACzE,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,MAAA,GAAsB;AAAA,IAC1B,GAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,SAAA,IAAa,uBAAA;AAAA,IAC9B,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,UAAA,IAAc,OAAA;AAAA,IACpC,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,cAAA,IAAkB,UAAA;AAAA,IACxC,QAAA,EAAU,QAAQ,GAAA,CAAI;AAAA,GACxB;AAEA,EAAA,MAAM,SAAA,CAAU,WAAW,MAAM,CAAA;AACnC;;;AC9MO,IAAMoB,qBAAAA,GAA6C;AAAA,EACxD,UAAA,EAAY,CAAA;AAAA,EACZ,YAAA,EAAc,GAAA;AAAA;AAAA,EACd,QAAA,EAAU,GAAA;AAAA;AAAA,EACV,iBAAA,EAAmB;AACrB;AAKO,SAASC,kBAAiB,KAAA,EAAqB;AAEpD,EAAA,IAAI,KAAA,CAAM,SAAS,YAAA,IAAgB,KAAA,CAAM,SAAS,WAAA,IAAe,KAAA,CAAM,SAAS,WAAA,EAAa;AAC3F,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAM,IAAA,KAAS,cAAA,IAAkB,MAAM,OAAA,EAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAM,QAAA,EAAU,MAAA,IAAU,OAAO,KAAA,CAAM,QAAA,EAAU,SAAS,GAAA,EAAK;AACjE,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAASC,OAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACxB,aAAY,UAAA,CAAWA,QAAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAKA,eAAsByB,iBAAAA,CACpB,EAAA,EACA,MAAA,GAA+BH,qBAAAA,EACnB;AACZ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,QAAQ,MAAA,CAAO,YAAA;AAEnB,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,MAAA,CAAO,YAAY,OAAA,EAAA,EAAW;AAC7D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,KAAA,EAAY;AACnB,MAAA,SAAA,GAAY,KAAA;AAGZ,MAAA,IAAI,CAACC,iBAAAA,CAAiB,KAAK,CAAA,EAAG;AAC5B,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,IAAI,OAAA,KAAY,OAAO,UAAA,EAAY;AACjC,QAAA;AAAA,MACF;AAGA,MAAA,MAAMC,OAAM,KAAK,CAAA;AAGjB,MAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,GAAQ,MAAA,CAAO,iBAAA,EAAmB,OAAO,QAAQ,CAAA;AAAA,IACpE;AAAA,EACF;AAGA,EAAA,MAAM,SAAA;AACR;AAKO,SAAS,eAAA,GAAsC;AACpD,EAAA,OAAO,QAAQ,GAAA,CAAI,cAAA;AACrB;AAKO,SAAS,eAAA,GAAsC;AACpD,EAAA,OAAO,QAAQ,GAAA,CAAI,cAAA;AACrB;AAKO,SAAS,oBAAA,GAA2C;AACzD,EAAA,OAAO,QAAQ,GAAA,CAAI,mBAAA;AACrB;AAKO,SAAS,eAAA,GAAsC;AACpD,EAAA,OAAO,QAAQ,GAAA,CAAI,cAAA;AACrB;AAKO,SAAS,gBAAA,GAA2B;AACzC,EAAA,OAAO,OAAA,CAAQ,IAAI,eAAA,IAAmB,wBAAA;AACxC;AAKO,SAAS,oBAAA,GAA+B;AAC7C,EAAA,OAAO,OAAA,CAAQ,IAAI,kBAAA,IAAsB,QAAA;AAC3C;AAKO,SAAS,iBAAA,GAAwC;AACtD,EAAA,OAAO,QAAQ,GAAA,CAAI,eAAA;AACrB;AAKO,SAAS,aAAa,IAAA,EAAoB;AAC/C,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACrC,IAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,EACxC;AAIA,EAAA,IAAI,IAAA,CAAK,SAAS,GAAA,EAAO;AACvB,IAAA,MAAM,IAAI,MAAM,oEAAoE,CAAA;AAAA,EACtF;AACF;AAKO,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,EACzC;AAEA,EAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACvB,IAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,EACzD;AAEA,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,IAAA,IAAI;AACF,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAK,CAAA,EAAA,EAAK,iBAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,IAC/G;AAAA,EACF,CAAC,CAAA;AACH;AC7IO,IAAM,0BAAN,MAA4D;AAAA,EACxD,IAAA,GAAO,QAAA;AAAA,EACP,YAAA,GAAe,wBAAA;AAAA,EAEhB,MAAA;AAAA,EACS,OAAA,GAAU,2BAAA;AAAA,EAE3B,YAAY,MAAA,EAAiB;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,UAAU,eAAA,EAAgB;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,IAAA,EAAc,KAAA,EAA0C;AAC9E,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,IAAA,MAAM,UAAA,GAAa,SAAS,IAAA,CAAK,YAAA;AAEjC,IAAA,OAAOC,kBAAiB,YAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM9B,wBAAAA,CAAM,IAAA;AAAA,UAC3B,CAAA,EAAG,KAAK,OAAO,CAAA,WAAA,CAAA;AAAA,UACf;AAAA,YACE,KAAA,EAAO,IAAA;AAAA,YACP,KAAA,EAAO;AAAA,WACT;AAAA,UACA;AAAA,YACE,OAAA,EAAS;AAAA,cACP,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,cACtC,cAAA,EAAgB;AAAA,aAClB;AAAA,YACA,OAAA,EAAS;AAAA;AAAA;AACX,SACF;AAEA,QAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AAEtB,QAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AACxC,UAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,QACrD;AAEA,QAAA,OAAO;AAAA,UACL,SAAA,EAAW,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,CAAE,SAAA;AAAA,UACxB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,CAAC,EAAE,SAAA,CAAU,MAAA;AAAA,UACnC,KAAA,EAAO;AAAA,YACL,YAAA,EAAc,KAAK,KAAA,CAAM,aAAA;AAAA,YACzB,WAAA,EAAa,KAAK,KAAA,CAAM;AAAA;AAC1B,SACF;AAAA,MACF,SAAS,KAAA,EAAY;AAEnB,QAAA,IAAI,YAAA;AAEJ,QAAA,IAAI,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AAClC,UAAA,YAAA,GAAe,IAAI,KAAA;AAAA,YACjB;AAAA,WACF;AAAA,QACF,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AACzC,UAAA,YAAA,GAAe,IAAI,KAAA;AAAA,YACjB;AAAA,WACF;AAAA,QACF,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AACzC,UAAA,YAAA,GAAe,IAAI,KAAA;AAAA,YACjB,qBAAqB,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,WAAW,aAAa,CAAA;AAAA,WAC3E;AAAA,QACF,CAAA,MAAO;AACL,UAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuC,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,QACjF;AAGA,QAAA,IAAI,KAAA,CAAM,IAAA,EAAM,YAAA,CAAa,IAAA,GAAO,KAAA,CAAM,IAAA;AAC1C,QAAA,IAAI,KAAA,CAAM,QAAA,EAAU,YAAA,CAAa,QAAA,GAAW,KAAA,CAAM,QAAA;AAElD,QAAA,MAAM,YAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAA,CAAwB,KAAA,EAAiB,KAAA,EAA+C;AAC5F,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,KAAK,CAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,SAAS,IAAA,CAAK,YAAA;AAEjC,IAAA,OAAO8B,kBAAiB,YAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM9B,wBAAAA,CAAM,IAAA;AAAA,UAC3B,CAAA,EAAG,KAAK,OAAO,CAAA,WAAA,CAAA;AAAA,UACf;AAAA,YACE,KAAA,EAAO,KAAA;AAAA,YACP,KAAA,EAAO;AAAA,WACT;AAAA,UACA;AAAA,YACE,OAAA,EAAS;AAAA,cACP,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,cACtC,cAAA,EAAgB;AAAA,aAClB;AAAA,YACA,OAAA,EAAS;AAAA;AAAA;AACX,SACF;AAEA,QAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AAEtB,QAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AACxC,UAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,QACtD;AAGA,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA;AAE7D,QAAA,OAAO;AAAA,UACL,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,SAAS,CAAA;AAAA,UACjD,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,UAAA,EAAY,UAAA,CAAW,CAAC,CAAA,CAAE,SAAA,CAAU,MAAA;AAAA,UACpC,KAAA,EAAO;AAAA,YACL,YAAA,EAAc,KAAK,KAAA,CAAM,aAAA;AAAA,YACzB,WAAA,EAAa,KAAK,KAAA,CAAM;AAAA;AAC1B,SACF;AAAA,MACF,SAAS,KAAA,EAAY;AAEnB,QAAA,IAAI,YAAA;AAEJ,QAAA,IAAI,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AAClC,UAAA,YAAA,GAAe,IAAI,KAAA;AAAA,YACjB;AAAA,WACF;AAAA,QACF,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AACzC,UAAA,YAAA,GAAe,IAAI,KAAA;AAAA,YACjB;AAAA,WACF;AAAA,QACF,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AACzC,UAAA,YAAA,GAAe,IAAI,KAAA;AAAA,YACjB,qBAAqB,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,WAAW,aAAa,CAAA;AAAA,WAC3E;AAAA,QACF,CAAA,MAAO;AACL,UAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,0CAAA,EAA6C,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,QACvF;AAGA,QAAA,IAAI,KAAA,CAAM,IAAA,EAAM,YAAA,CAAa,IAAA,GAAO,KAAA,CAAM,IAAA;AAC1C,QAAA,IAAI,KAAA,CAAM,QAAA,EAAU,YAAA,CAAa,QAAA,GAAW,KAAA,CAAM,QAAA;AAElD,QAAA,MAAM,YAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;AC9LO,IAAM,0BAAN,MAA4D;AAAA,EACxD,IAAA,GAAO,QAAA;AAAA,EACP,YAAA,GAAe,oBAAA;AAAA,EAEhB,MAAA;AAAA,EACA,OAAA,GAAU,0BAAA;AAAA,EAElB,WAAA,CAAY,QAAiB,KAAA,EAAgB;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,iBAAA,CAAkB,IAAA,EAAc,KAAA,EAA0C;AAE9E,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,wBAAwB,CAAC,IAAI,GAAG,KAAK,CAAA;AAC/D,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,MAC9B,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,OAAO,MAAA,CAAO;AAAA,KAChB;AAAA,EACF;AAAA,EAEA,MAAM,uBAAA,CAAwB,KAAA,EAAiB,KAAA,EAA+C;AAC5F,IAAA,MAAM,UAAA,GAAa,SAAS,IAAA,CAAK,YAAA;AAEjC,IAAA,OAAO8B,kBAAiB,YAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM9B,wBAAAA,CAAM,IAAA;AAAA,UAC3B,CAAA,EAAG,KAAK,OAAO,CAAA,MAAA,CAAA;AAAA,UACf;AAAA,YACE,KAAA;AAAA,YACA,KAAA,EAAO,UAAA;AAAA,YACP,UAAA,EAAY,iBAAA;AAAA;AAAA,YACZ,eAAA,EAAiB,CAAC,OAAO;AAAA,WAC3B;AAAA,UACA;AAAA,YACE,OAAA,EAAS;AAAA,cACP,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,cACtC,cAAA,EAAgB;AAAA;AAClB;AACF,SACF;AAEA,QAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,CAAK,UAAA,CAAW,KAAA;AAC5C,QAAA,MAAM,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,EAAG,MAAA,IAAU,CAAA;AAE5C,QAAA,OAAO;AAAA,UACL,UAAA;AAAA,UACA,KAAA,EAAO,UAAA;AAAA,UACP,UAAA;AAAA,UACA,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,YAAA,GAAe;AAAA,YACxC,YAAA,EAAc,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,aAAa,YAAA,IAAgB,CAAA;AAAA,YAC9D,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,aAAa,YAAA,IAAgB;AAAA,WAC/D,GAAI,KAAA;AAAA,SACN;AAAA,MACF,SAAS,KAAA,EAAY;AACnB,QAAA,IAAIA,wBAAAA,CAAM,YAAA,CAAa,KAAK,CAAA,EAAG;AAC7B,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,EAAU,MAAA;AAC/B,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM,OAAA;AACvD,UAAA,IAAI,YAAA;AAEJ,UAAA,IAAI,WAAW,GAAA,EAAK;AAClB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,oEAAA,EAAuE,OAAO,CAAA,CAAE,CAAA;AAAA,UAC3G,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,OAAO,CAAA,CAAE,CAAA;AAAA,UACvE,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,OAAO,CAAA,CAAE,CAAA;AAAA,UACnE,CAAA,MAAO;AACL,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,MAAM,CAAA,GAAA,EAAM,OAAO,CAAA,CAAE,CAAA;AAAA,UACrE;AAGA,UAAA,IAAI,KAAA,CAAM,IAAA,EAAM,YAAA,CAAa,IAAA,GAAO,KAAA,CAAM,IAAA;AAC1C,UAAA,IAAI,KAAA,CAAM,QAAA,EAAU,YAAA,CAAa,QAAA,GAAW,KAAA,CAAM,QAAA;AAElD,UAAA,MAAM,YAAA;AAAA,QACR;AAEA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF,CAAA;ACzFO,IAAM,+BAAN,MAAiE;AAAA,EAC7D,IAAA,GAAO,aAAA;AAAA,EACP,YAAA,GAAe,wCAAA;AAAA,EAEhB,MAAA;AAAA,EACA,OAAA,GAAU,kEAAA;AAAA,EAElB,WAAA,CAAY,QAAiB,KAAA,EAAgB;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,iBAAA,CAAkB,IAAA,EAAc,KAAA,EAA0C;AAC9E,IAAA,MAAM,UAAA,GAAa,SAAS,IAAA,CAAK,YAAA;AAEjC,IAAA,OAAO8B,kBAAiB,YAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM9B,wBAAAA,CAAM,IAAA;AAAA,UAC3B,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAAA,UAC7B;AAAA,YACE,MAAA,EAAQ,IAAA;AAAA,YACR,OAAA,EAAS;AAAA,cACP,cAAA,EAAgB;AAAA;AAClB,WACF;AAAA,UACA;AAAA,YACE,OAAA,EAAS;AAAA,cACP,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,cACtC,cAAA,EAAgB;AAAA;AAClB;AACF,SACF;AAGA,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,IAAI,QAAA,CAAS,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA;AAEhF,QAAA,OAAO;AAAA,UACL,SAAA;AAAA,UACA,KAAA,EAAO,UAAA;AAAA,UACP,YAAY,SAAA,CAAU;AAAA,SACxB;AAAA,MACF,SAAS,KAAA,EAAY;AACnB,QAAA,IAAIA,wBAAAA,CAAM,YAAA,CAAa,KAAK,CAAA,EAAG;AAC7B,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,EAAU,MAAA;AAC/B,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,SAAS,KAAA,CAAM,OAAA;AACrD,UAAA,IAAI,YAAA;AAEJ,UAAA,IAAI,WAAW,GAAA,EAAK;AAClB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,8EAAA,EAAiF,OAAO,CAAA,CAAE,CAAA;AAAA,UACrH,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,OAAO,CAAA,CAAE,CAAA;AAAA,UAC5E,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,OAAO,CAAA,CAAE,CAAA;AAAA,UACxE,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,wDAAA,EAA2D,OAAO,CAAA,CAAE,CAAA;AAAA,UAC/F,CAAA,MAAO;AACL,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,MAAM,CAAA,GAAA,EAAM,OAAO,CAAA,CAAE,CAAA;AAAA,UAC1E;AAGA,UAAA,IAAI,KAAA,CAAM,IAAA,EAAM,YAAA,CAAa,IAAA,GAAO,KAAA,CAAM,IAAA;AAC1C,UAAA,IAAI,KAAA,CAAM,QAAA,EAAU,YAAA,CAAa,QAAA,GAAW,KAAA,CAAM,QAAA;AAElD,UAAA,MAAM,YAAA;AAAA,QACR;AAEA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,uBAAA,CAAwB,KAAA,EAAiB,KAAA,EAA+C;AAC5F,IAAA,MAAM,UAAA,GAAa,SAAS,IAAA,CAAK,YAAA;AAEjC,IAAA,OAAO8B,kBAAiB,YAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM9B,wBAAAA,CAAM,IAAA;AAAA,UAC3B,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAAA,UAC7B;AAAA,YACE,MAAA,EAAQ,KAAA;AAAA,YACR,OAAA,EAAS;AAAA,cACP,cAAA,EAAgB;AAAA;AAClB,WACF;AAAA,UACA;AAAA,YACE,OAAA,EAAS;AAAA,cACP,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,cACtC,cAAA,EAAgB;AAAA;AAClB;AACF,SACF;AAEA,QAAA,MAAM,aAAa,QAAA,CAAS,IAAA;AAC5B,QAAA,MAAM,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,EAAG,MAAA,IAAU,CAAA;AAE5C,QAAA,OAAO;AAAA,UACL,UAAA;AAAA,UACA,KAAA,EAAO,UAAA;AAAA,UACP;AAAA,SACF;AAAA,MACF,SAAS,KAAA,EAAY;AACnB,QAAA,IAAIA,wBAAAA,CAAM,YAAA,CAAa,KAAK,CAAA,EAAG;AAC7B,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,EAAU,MAAA;AAC/B,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,SAAS,KAAA,CAAM,OAAA;AACrD,UAAA,IAAI,YAAA;AAEJ,UAAA,IAAI,WAAW,GAAA,EAAK;AAClB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,8EAAA,EAAiF,OAAO,CAAA,CAAE,CAAA;AAAA,UACrH,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,OAAO,CAAA,CAAE,CAAA;AAAA,UAC5E,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,OAAO,CAAA,CAAE,CAAA;AAAA,UACxE,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,wDAAA,EAA2D,OAAO,CAAA,CAAE,CAAA;AAAA,UAC/F,CAAA,MAAO;AACL,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,MAAM,CAAA,GAAA,EAAM,OAAO,CAAA,CAAE,CAAA;AAAA,UAC1E;AAGA,UAAA,IAAI,KAAA,CAAM,IAAA,EAAM,YAAA,CAAa,IAAA,GAAO,KAAA,CAAM,IAAA;AAC1C,UAAA,IAAI,KAAA,CAAM,QAAA,EAAU,YAAA,CAAa,QAAA,GAAW,KAAA,CAAM,QAAA;AAElD,UAAA,MAAM,YAAA;AAAA,QACR;AAEA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF,CAAA;ACvIO,IAAM,0BAAN,MAA4D;AAAA,EACxD,IAAA,GAAO,QAAA;AAAA,EACP,YAAA,GAAe,UAAA;AAAA,EAEhB,MAAA;AAAA,EACA,OAAA,GAAU,6BAAA;AAAA,EAElB,WAAA,CAAY,QAAiB,KAAA,EAAgB;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,iBAAA,CAAkB,IAAA,EAAc,KAAA,EAA0C;AAC9E,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,wBAAwB,CAAC,IAAI,GAAG,KAAK,CAAA;AAC/D,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,MAC9B,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,OAAO,MAAA,CAAO;AAAA,KAChB;AAAA,EACF;AAAA,EAEA,MAAM,uBAAA,CAAwB,KAAA,EAAiB,KAAA,EAA+C;AAC5F,IAAA,MAAM,UAAA,GAAa,SAAS,IAAA,CAAK,YAAA;AAEjC,IAAA,OAAO8B,kBAAiB,YAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM9B,wBAAAA,CAAM,IAAA;AAAA,UAC3B,CAAA,EAAG,KAAK,OAAO,CAAA,WAAA,CAAA;AAAA,UACf;AAAA,YACE,KAAA,EAAO,KAAA;AAAA,YACP,KAAA,EAAO,UAAA;AAAA,YACP,UAAA,EAAY;AAAA;AAAA,WACd;AAAA,UACA;AAAA,YACE,OAAA,EAAS;AAAA,cACP,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,cACtC,cAAA,EAAgB;AAAA;AAClB;AACF,SACF;AAEA,QAAA,MAAM,UAAA,GAAa,SAAS,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,IAAA,KAAc,KAAK,SAAS,CAAA;AACvE,QAAA,MAAM,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,EAAG,MAAA,IAAU,CAAA;AAE5C,QAAA,OAAO;AAAA,UACL,UAAA;AAAA,UACA,KAAA,EAAO,UAAA;AAAA,UACP,UAAA;AAAA,UACA,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,KAAA,GAAQ;AAAA,YAC3B,YAAA,EAAc,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,YAAA,IAAgB,CAAA;AAAA,YAClD,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,YAAA,IAAgB;AAAA,WACnD,GAAI,KAAA;AAAA,SACN;AAAA,MACF,SAAS,KAAA,EAAY;AACnB,QAAA,IAAIA,wBAAAA,CAAM,YAAA,CAAa,KAAK,CAAA,EAAG;AAC7B,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,EAAU,MAAA;AAC/B,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,WAAW,KAAA,CAAM,OAAA;AACvD,UAAA,IAAI,YAAA;AAEJ,UAAA,IAAI,WAAW,GAAA,EAAK;AAClB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,uEAAA,EAA0E,OAAO,CAAA,CAAE,CAAA;AAAA,UAC9G,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,OAAO,CAAA,CAAE,CAAA;AAAA,UAC1E,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,OAAO,CAAA,CAAE,CAAA;AAAA,UACtE,CAAA,MAAO;AACL,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,MAAM,CAAA,GAAA,EAAM,OAAO,CAAA,CAAE,CAAA;AAAA,UACxE;AAGA,UAAA,IAAI,KAAA,CAAM,IAAA,EAAM,YAAA,CAAa,IAAA,GAAO,KAAA,CAAM,IAAA;AAC1C,UAAA,IAAI,KAAA,CAAM,QAAA,EAAU,YAAA,CAAa,QAAA,GAAW,KAAA,CAAM,QAAA;AAElD,UAAA,MAAM,YAAA;AAAA,QACR;AAEA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF,CAAA;ACvFO,IAAM,0BAAN,MAA4D;AAAA,EACxD,IAAA,GAAO,QAAA;AAAA,EACP,YAAA,GAAe,kBAAA;AAAA,EAEhB,OAAA;AAAA,EAER,WAAA,CAAY,KAAA,EAAgB,OAAA,GAAkB,wBAAA,EAA0B;AACtE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,iBAAA,CAAkB,IAAA,EAAc,KAAA,EAA0C;AAC9E,IAAA,MAAM,UAAA,GAAa,SAAS,IAAA,CAAK,YAAA;AAEjC,IAAA,OAAO8B,kBAAiB,YAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM9B,wBAAAA,CAAM,IAAA;AAAA,UAC3B,CAAA,EAAG,KAAK,OAAO,CAAA,eAAA,CAAA;AAAA,UACf;AAAA,YACE,KAAA,EAAO,UAAA;AAAA,YACP,MAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,OAAA,EAAS;AAAA,cACP,cAAA,EAAgB;AAAA;AAClB;AACF,SACF;AAEA,QAAA,MAAM,SAAA,GAAY,SAAS,IAAA,CAAK,SAAA;AAEhC,QAAA,OAAO;AAAA,UACL,SAAA;AAAA,UACA,KAAA,EAAO,UAAA;AAAA,UACP,YAAY,SAAA,CAAU;AAAA,SACxB;AAAA,MACF,SAAS,KAAA,EAAY;AACnB,QAAA,IAAIA,wBAAAA,CAAM,YAAA,CAAa,KAAK,CAAA,EAAG;AAC7B,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,EAAU,MAAA;AAC/B,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,SAAS,KAAA,CAAM,OAAA;AACrD,UAAA,IAAI,YAAA;AAEJ,UAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjC,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,IAAA,CAAK,OAAO,CAAA,sCAAA,CAAwC,CAAA;AAAA,UAC9G,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,YAAA,YAAA,GAAe,IAAI,MAAM,CAAA,8DAAA,CAAgE,CAAA;AAAA,UAC3F,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,OAAO,CAAA,CAAE,CAAA;AAAA,UACnE,CAAA,MAAO;AACL,YAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,MAAM,CAAA,GAAA,EAAM,OAAO,CAAA,CAAE,CAAA;AAAA,UACrE;AAGA,UAAA,IAAI,KAAA,CAAM,IAAA,EAAM,YAAA,CAAa,IAAA,GAAO,KAAA,CAAM,IAAA;AAC1C,UAAA,IAAI,KAAA,CAAM,QAAA,EAAU,YAAA,CAAa,QAAA,GAAW,KAAA,CAAM,QAAA;AAElD,UAAA,MAAM,YAAA;AAAA,QACR;AAEA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,uBAAA,CAAwB,KAAA,EAAiB,KAAA,EAA+C;AAC5F,IAAA,MAAM,UAAA,GAAa,SAAS,IAAA,CAAK,YAAA;AAGjC,IAAA,MAAM,aAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,iBAAA,CAAkB,MAAM,UAAU,CAAA;AAC5D,MAAA,UAAA,CAAW,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,IAClC;AAEA,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,EAAG,MAAA,IAAU,CAAA;AAE5C,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,KAAA,EAAO,UAAA;AAAA,MACP;AAAA,KACF;AAAA,EACF;AACF,CAAA;;;AChFA,IAAMO,OAAAA,GAASE,kBAAa,mCAAmC,CAAA;AAKxD,IAAM,mBAAN,MAAuB;AAAA,EACpB,QAAA,GAAsC,IAAA;AAAA,EACtC,MAAA,GAAiC,IAAA;AAAA;AAAA;AAAA;AAAA,EAKzC,WAAW,MAAA,EAA+B;AACxC,IAAAF,OAAAA,CAAO,MAAM,gCAAA,EAAkC;AAAA,MAC7C,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO;AAAA,KACf,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AAElE,IAAAA,OAAAA,CAAO,KAAK,+BAAA,EAAiC;AAAA,MAC3C,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA,IAAS,IAAA,CAAK,eAAA,CAAgB,OAAO,QAAQ;AAAA,KAC5D,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA0B;AACxB,IAAA,MAAM,eAAe,oBAAA,EAAqB;AAC1C,IAAA,MAAM,QAAQ,iBAAA,EAAkB;AAEhC,IAAAA,OAAAA,CAAO,MAAM,iDAAA,EAAmD;AAAA,MAC9D,QAAA,EAAU,YAAA;AAAA,MACV,KAAA,EAAO,KAAA,IAAS,IAAA,CAAK,eAAA,CAAgB,YAAY;AAAA,KAClD,CAAA;AAGD,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,OAAA,GAAU,EAAA;AAEd,IAAA,QAAQ,YAAA;AAAc,MACpB,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,MAAM,eAAA,EAAgB;AAC5B,QAAA,IAAI,CAAC,GAAA,EAAK;AACR,UAAAA,OAAAA,CAAO,MAAM,6CAAA,EAA+C;AAAA,YAC1D,QAAA,EAAU,QAAA;AAAA,YACV,QAAA,EAAU;AAAA,WACX,CAAA;AACD,UAAA,MAAM,IAAI,MAAM,uEAAuE,CAAA;AAAA,QACzF;AACA,QAAA,MAAA,GAAS,GAAA;AACT,QAAAA,OAAAA,CAAO,MAAM,sBAAsB,CAAA;AACnC,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,MAAM,eAAA,EAAgB;AAC5B,QAAA,IAAI,CAAC,GAAA,EAAK;AACR,UAAAA,OAAAA,CAAO,MAAM,6CAAA,EAA+C;AAAA,YAC1D,QAAA,EAAU,QAAA;AAAA,YACV,QAAA,EAAU;AAAA,WACX,CAAA;AACD,UAAA,MAAM,IAAI,MAAM,uEAAuE,CAAA;AAAA,QACzF;AACA,QAAA,MAAA,GAAS,GAAA;AACT,QAAAA,OAAAA,CAAO,MAAM,sBAAsB,CAAA;AACnC,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,aAAA,EAAe;AAClB,QAAA,MAAM,MAAM,oBAAA,EAAqB;AACjC,QAAA,IAAI,CAAC,GAAA,EAAK;AACR,UAAAA,OAAAA,CAAO,MAAM,kDAAA,EAAoD;AAAA,YAC/D,QAAA,EAAU,aAAA;AAAA,YACV,QAAA,EAAU;AAAA,WACX,CAAA;AACD,UAAA,MAAM,IAAI,MAAM,iFAAiF,CAAA;AAAA,QACnG;AACA,QAAA,MAAA,GAAS,GAAA;AACT,QAAAA,OAAAA,CAAO,MAAM,2BAA2B,CAAA;AACxC,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,MAAM,eAAA,EAAgB;AAC5B,QAAA,IAAI,CAAC,GAAA,EAAK;AACR,UAAAA,OAAAA,CAAO,MAAM,6CAAA,EAA+C;AAAA,YAC1D,QAAA,EAAU,QAAA;AAAA,YACV,QAAA,EAAU;AAAA,WACX,CAAA;AACD,UAAA,MAAM,IAAI,MAAM,0EAA0E,CAAA;AAAA,QAC5F;AACA,QAAA,MAAA,GAAS,GAAA;AACT,QAAAA,OAAAA,CAAO,MAAM,sBAAsB,CAAA;AACnC,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,QAAA;AACH,QAAA,OAAA,GAAU,gBAAA,EAAiB;AAC3B,QAAAA,OAAAA,CAAO,MAAM,2CAAA,EAA6C;AAAA,UACxD,SAAS,OAAA,IAAW;AAAA,SACrB,CAAA;AAED,QAAA;AAAA,MAEF;AACE,QAAAA,OAAAA,CAAO,MAAM,4BAAA,EAA8B;AAAA,UACzC,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,YAAY,CAAA,CAAE,CAAA;AAAA;AAIjE,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,MAAA,EAAQ,OAAO,OAAO,CAAA;AACxE,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,QAAA,EAAU,YAAA;AAAA,MACV,KAAA,EAAO,KAAA,IAAS,IAAA,CAAK,eAAA,CAAgB,YAAY,CAAA;AAAA,MACjD,MAAA,EAAQ;AAAA;AAAA,KACV;AAEA,IAAAA,OAAAA,CAAO,KAAK,gDAAA,EAAkD;AAAA,MAC5D,QAAA,EAAU,YAAA;AAAA,MACV,KAAA,EAAO,KAAK,MAAA,CAAO;AAAA,KACpB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,QAAA,KAAa,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,IAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAkC;AAChC,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,IAAI,MAAM,oFAAoF,CAAA;AAAA,IACtG;AACA,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAA6B;AAC3B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,oFAAoF,CAAA;AAAA,IACtG;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,IAAA,EAAc,KAAA,EAA0C;AAC9E,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAG9B,IAAA,MAAM,UAAA,GAAa,SAAS,MAAA,CAAO,KAAA;AAEnC,IAAAA,OAAAA,CAAO,MAAM,sBAAA,EAAwB;AAAA,MACnC,UAAU,QAAA,CAAS,IAAA;AAAA,MACnB,KAAA,EAAO,UAAA;AAAA,MACP,YAAY,IAAA,CAAK;AAAA,KAClB,CAAA;AAGD,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,iBAAA,CAAkB,MAAM,UAAU,CAAA;AAEhE,IAAAA,OAAAA,CAAO,KAAK,qBAAA,EAAuB;AAAA,MACjC,UAAU,QAAA,CAAS,IAAA;AAAA,MACnB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KACxB,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAA,CAAwB,KAAA,EAAiB,KAAA,EAA+C;AAC5F,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAG9B,IAAA,MAAM,UAAA,GAAa,SAAS,MAAA,CAAO,KAAA;AAEnC,IAAAA,OAAAA,CAAO,MAAM,6BAAA,EAA+B;AAAA,MAC1C,UAAU,QAAA,CAAS,IAAA;AAAA,MACnB,KAAA,EAAO,UAAA;AAAA,MACP,OAAO,KAAA,CAAM;AAAA,KACd,CAAA;AAGD,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,uBAAA,CAAwB,OAAO,UAAU,CAAA;AAEvE,IAAAA,OAAAA,CAAO,KAAK,4BAAA,EAA8B;AAAA,MACxC,UAAU,QAAA,CAAS,IAAA;AAAA,MACnB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,OAAO,KAAA,CAAM,MAAA;AAAA,MACb,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KACxB,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,QAAA,EAAqC;AAC3D,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,QAAA;AACH,QAAA,OAAO,wBAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,oBAAA;AAAA,MACT,KAAK,aAAA;AACH,QAAA,OAAO,wCAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,UAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,kBAAA;AAAA,MACT;AACE,QAAA,OAAO,wBAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CACN,YAAA,EACA,MAAA,EACA,KAAA,EACA,OAAA,EACoB;AACpB,IAAA,QAAQ,YAAA;AAAc,MACpB,KAAK,QAAA;AACH,QAAA,OAAO,IAAI,wBAAwB,MAAM,CAAA;AAAA,MAE3C,KAAK,QAAA;AACH,QAAA,OAAO,IAAI,wBAAwB,MAAM,CAAA;AAAA,MAE3C,KAAK,aAAA;AACH,QAAA,OAAO,IAAI,6BAA6B,MAAM,CAAA;AAAA,MAEhD,KAAK,QAAA;AACH,QAAA,OAAO,IAAI,wBAAwB,MAAM,CAAA;AAAA,MAE3C,KAAK,QAAA;AACH,QAAA,OAAO,IAAI,uBAAA,CAAwB,KAAA,EAAO,OAAA,IAAW,wBAAwB,CAAA;AAAA,MAE/E;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,YAAY,CAAA,CAAE,CAAA;AAAA;AACjE,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AACF;AAKO,IAAM,gBAAA,GAAmB,IAAI,gBAAA;AAK7B,SAAS,oBAAA,GAA6B;AAC3C,EAAA,gBAAA,CAAiB,iBAAA,EAAkB;AACrC;AAKO,SAAS,+BAA+B,MAAA,EAA+B;AAC5E,EAAA,gBAAA,CAAiB,WAAW,MAAM,CAAA;AACpC;AAKA,eAAsB,iBAAA,CAAkB,MAAc,KAAA,EAA0C;AAC9F,EAAA,OAAO,gBAAA,CAAiB,iBAAA,CAAkB,IAAA,EAAM,KAAK,CAAA;AACvD;AAKA,eAAsB,uBAAA,CAAwB,OAAiB,KAAA,EAA+C;AAC5G,EAAA,OAAO,gBAAA,CAAiB,uBAAA,CAAwB,KAAA,EAAO,KAAK,CAAA;AAC9D;AC9TO,SAAS,cAAc,KAAA,EAAiC;AAC7D,EAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,IAAA,OAAO,MAAM,QAAA,EAAS;AAAA,EACxB;AACA,EAAA,OAAO,MAAM,QAAA,EAAS;AACxB;AAKO,SAAS,YAAY,KAAA,EAAiB;AAC3C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,iBAAiBwB,aAAA,EAAS;AAC5B,IAAA,OAAO,cAAc,KAAK,CAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,iBAAiBC,UAAA,EAAM;AACzB,IAAA,OAAO,WAAW,KAAK,CAAA;AAAA,EACzB;AAGA,EAAA,IAAI,iBAAiBC,kBAAA,EAAc;AACjC,IAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,EACjC;AAGA,EAAA,IAAI,iBAAiBC,UAAA,EAAM;AACzB,IAAA,OAAO,WAAW,KAAK,CAAA;AAAA,EACzB;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,IAAI,WAAW,CAAA;AAAA,EAC9B;AAGA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,YAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC9C,MAAA,SAAA,CAAU,GAAG,CAAA,GAAI,WAAA,CAAY,GAAG,CAAA;AAAA,IAClC;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,WAAW,IAAA,EAAuB;AAChD,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAA;AAAA,IACrC,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,UAAA,EAAY,WAAA,CAAY,IAAA,CAAK,UAAU;AAAA,GACzC;AACF;AAKO,SAAS,mBAAmB,GAAA,EAAsC;AACvE,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAAA,IACpC,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,KAAA,EAAO,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AAAA,IAC9B,GAAA,EAAK,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AAAA,IAC1B,UAAA,EAAY,WAAA,CAAY,GAAA,CAAI,UAAU;AAAA,GACxC;AACF;AAKO,SAAS,WAAWT,MAAAA,EAAuB;AAChD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,UAAA,CAAWA,MAAAA,CAAK,KAAK,CAAA;AAAA,IAC5B,GAAA,EAAK,UAAA,CAAWA,MAAAA,CAAK,GAAG,CAAA;AAAA,IACxB,QAAA,EAAUA,MAAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,MACxC,KAAA,EAAO,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AAAA,MAC/B,YAAA,EAAc,kBAAA,CAAmB,OAAA,CAAQ,YAAY,CAAA;AAAA,MACrD,GAAA,EAAK,UAAA,CAAW,OAAA,CAAQ,GAAG;AAAA,KAC7B,CAAE,CAAA;AAAA,IACF,QAAQA,MAAAA,CAAK;AAAA,GACf;AACF;AAKO,SAAS,cAAc,OAAA,EAAuB;AACnD,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAC7B,IAAA,MAAM,YAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,GAAA,IAAO,OAAO,IAAA,EAAM;AAC7B,MAAA,SAAA,CAAU,GAAG,CAAA,GAAI,WAAA,CAAY,MAAA,CAAO,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,SAAA;AAAA,EACT,CAAC,CAAA;AACH;;;ACxGA,IAAMlB,OAAAA,GAASE,kBAAa,8BAA8B,CAAA;AAKnD,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAOX,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,WAAA;AAAA,IACC;AAAA,IAID,QAAA,CAASC,iBAAAA,CAAa,QAAQ,CAAA,CAC9B,IAAA,CAAK,CAAC,OAAA,EAAS,OAAA,EAAS,YAAY,QAAA,EAAU,OAAO,CAAC,CAAA,CACtD,MAAA,CAAO,gBAAgB,CAAA,CACvB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI,CAAC,SAAA,CAAU,aAAA,EAAc,EAAG;AAC9B,MAAAQ,OAAAA,CAAO,KAAK,sDAAsD,CAAA;AAClE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAAA,OAAAA,CAAO,MAAM,uBAAA,EAAyB;AAAA,MACpC,aAAA,EAAe,KAAA,CAAM,MAAA,CAAO,SAAA,CAAU,GAAG,GAAG,CAAA;AAAA,MAC5C,gBAAgB,MAAA,CAAO,IAAA,CAAK,MAAM,UAAA,IAAc,EAAE,CAAA,CAAE,MAAA;AAAA,MACpD,UAAU,KAAA,CAAM;AAAA,KACjB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA;AAEnD,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,MAAA,EAAQ,KAAA,CAAM,UAAA,IAAc,EAAE,CAAA;AACrE,QAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,MAAA,CAAO,OAAO,CAAA;AACrD,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,QAAAA,OAAAA,CAAO,KAAK,mCAAA,EAAqC;AAAA,UAC/C,WAAA,EAAa,OAAO,OAAA,CAAQ,MAAA;AAAA,UAC5B,YAAA,EAAc,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,SAAQ,CAAE,YAAA;AAAA,UAChD,YAAA,EAAc,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,SAAQ,CAAE,YAAA;AAAA,UAChD,oBAAA,EAAsB,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,SAAQ,CAAE,oBAAA;AAAA,UACxD,oBAAA,EAAsB,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,SAAQ,CAAE,oBAAA;AAAA,UACxD,aAAA,EAAe,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,SAAQ,CAAE,aAAA;AAAA,UACjD;AAAA,SACD,CAAA;AAED,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM,gBAAA;AAAA,UACN,WAAA,EAAa,OAAO,OAAA,CAAQ,MAAA;AAAA,UAC5B,OAAA,EAAS;AAAA,YACP,OAAO,KAAA,CAAM,MAAA;AAAA,YACb,YAAY,KAAA,CAAM,UAAA;AAAA,YAClB,QAAA,EAAU;AAAA,cACR,YAAA,EAAc,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,SAAQ,CAAE,YAAA;AAAA,cAChD,YAAA,EAAc,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,SAAQ,CAAE,YAAA;AAAA,cAChD,oBAAA,EAAsB,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,SAAQ,CAAE,oBAAA;AAAA,cACxD,oBAAA,EAAsB,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,SAAQ,CAAE,oBAAA;AAAA,cACxD,aAAA,EAAe,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,SAAQ,CAAE;AAAA;AACnD;AACF,SACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,MACtB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,yBAAA;AAE9D,MAAAA,OAAAA,CAAO,MAAM,8BAAA,EAAgC;AAAA,QAC3C,KAAA,EAAO,YAAA;AAAA,QACP,aAAA,EAAe,KAAA,CAAM,MAAA,CAAO,SAAA,CAAU,GAAG,GAAG,CAAA;AAAA,QAC5C;AAAA,OACD,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,YAAA;AAAA,QACP,OAAO,KAAA,CAAM;AAAA,OACf;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACtFO,SAAS,wBAAA,GAA2B;AACzC,EAAA,OAAOT,gBAAAA,EAAY,CAChB,IAAA,CAAK,kBAAkB,CAAA,CACvB,WAAA;AAAA,IACC;AAAA,IAID,QAAA,CAASC,iBAAAA,CAAa,QAAQ,CAAA,CAC9B,IAAA,CAAK,CAAC,OAAA,EAAS,OAAA,EAAS,YAAY,QAAA,EAAU,eAAe,CAAC,CAAA,CAC9D,MAAA,CAAO,oBAAoB,CAAA,CAC3B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI,CAAC,SAAA,CAAU,aAAA,EAAc,EAAG;AAC9B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA;AAEnD,MAAA,IAAI;AAEF,QAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA;AACzD,QAAA,MAAM,UAAA,GAAa,aAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,OAAO,CAAC,CAAA;AAGjE,QAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,GAAA,CAAI,6BAA6B,CAAA;AACtE,QAAA,MAAM,iBAAA,GAAoB,eAAe,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,kBAAkB,CAAC,CAAA;AAGrF,QAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,GAAA,CAAI,wBAAwB,CAAA;AAC9D,QAAA,MAAM,YAAA,GAAe,YAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,aAAa,CAAC,CAAA;AAGxE,QAAA,MAAM,iBAAA,GAAoB,MAAM,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA;AAC9D,QAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACxD,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAAA,UAClB,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAAA,UAClB,UAAA,EAAY,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,UAC9B,aAAA,EAAe,CAAA,CAAE,GAAA,CAAI,eAAe,CAAA;AAAA,UACpC,UAAA,EAAY,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,SAChC,CAAE,CAAA;AAGF,QAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AACtD,QAAA,MAAM,OAAA,GAAU,aAAA,CAAc,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAChD,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAAA,UAClB,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAAA,UAClB,UAAA,EAAY,CAAA,CAAE,GAAA,CAAI,YAAY,CAAA;AAAA,UAC9B,aAAA,EAAe,CAAA,CAAE,GAAA,CAAI,eAAe,CAAA;AAAA,UACpC,UAAA,EAAY,CAAA,CAAE,GAAA,CAAI,YAAY;AAAA,SAChC,CAAE,CAAA;AAEF,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,MAAA,EAAQ;AAAA,YACN,UAAA;AAAA,YACA,iBAAA;AAAA,YACA,YAAA;AAAA,YACA,WAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,OAAA,EAAS;AAAA,YACP,aAAa,UAAA,CAAW,MAAA;AAAA,YACxB,wBAAwB,iBAAA,CAAkB,MAAA;AAAA,YAC1C,mBAAmB,YAAA,CAAa,MAAA;AAAA,YAChC,kBAAkB,WAAA,CAAY,MAAA;AAAA,YAC9B,cAAc,OAAA,CAAQ;AAAA;AACxB,SACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,MACtB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;AC7EO,SAAS,sBAAA,CAAuB,UAAA,EAAoB,IAAA,GAAe,YAAA,EAAsB;AAC9F,EAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,IAAI,CAAA,4BAAA,CAA8B,CAAA;AAAA,EAC/D;AAGA,EAAA,MAAM,OAAA,GAAU,WAAW,IAAA,EAAK;AAEhC,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,IAAI,CAAA,+BAAA,CAAiC,CAAA;AAAA,EAClE;AAGA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,IAAI,CAAA,2BAAA,CAA6B,CAAA;AAAA,EAC9D;AAGA,EAAA,MAAM,aAAA,GAAgB,0BAAA;AAEtB,EAAA,IAAI,aAAA,CAAc,IAAA,CAAK,OAAO,CAAA,EAAG;AAE/B,IAAA,OAAO,OAAA;AAAA,EACT;AAIA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA;AAE1C,EAAA,OAAO,KAAK,OAAO,CAAA,EAAA,CAAA;AACrB;AAKO,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,OAAO,sBAAA,CAAuB,OAAO,OAAO,CAAA;AAC9C;AAKO,SAAS,oBAAoB,GAAA,EAAqB;AACvD,EAAA,OAAO,sBAAA,CAAuB,KAAK,cAAc,CAAA;AACnD;AAKO,SAAS,yBAAyB,IAAA,EAAsB;AAC7D,EAAA,OAAO,sBAAA,CAAuB,MAAM,mBAAmB,CAAA;AACzD;AAgBO,SAAS,kBAAkB,SAAA,EAAqD;AACrF,EAAA,MAAM,UAAA,GAAa,UAAU,WAAA,EAAY;AAEzC,EAAA,IAAI,UAAA,KAAe,UAAA,IAAc,UAAA,KAAe,UAAA,IAAc,eAAe,MAAA,EAAQ;AACnF,IAAA,MAAM,IAAI,MAAM,CAAA,4DAAA,CAA8D,CAAA;AAAA,EAChF;AAEA,EAAA,OAAO,UAAA;AACT;AASO,SAAS,mBAAA,CACd,UAAA,EACA,OAAA,GAAkB,GAAA,EACwC;AAC1D,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAEnC,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,EAAE,WAAA,EAAa,EAAA,EAAI,UAAA,EAAY,EAAC,EAAE;AAAA,EAC3C;AAGA,EAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,OAAA,EAAS,eAAe,CAAA;AAGnE,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,KAAA,KAAU;AAC1C,IAAA,MAAM,OAAA,GAAU,oBAAoB,GAAG,CAAA;AACvC,IAAA,MAAM,SAAA,GAAY,QAAQ,KAAK,CAAA,CAAA;AAC/B,IAAA,OAAO,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,OAAO,OAAO,SAAS,CAAA,CAAA;AAAA,EAClD,CAAC,CAAA;AAED,EAAA,MAAM,aAAkC,EAAC;AACzC,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AAC3B,IAAA,UAAA,CAAW,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE,CAAA,GAAI,WAAW,GAAG,CAAA;AAAA,EAC9C,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,CAAA,MAAA,EAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA;AAAA,IAC9C;AAAA,GACF;AACF;;;ACrHO,SAAS,wBAAA,GAA2B;AACzC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,kBAAkB,CAAA,CACvB,WAAA;AAAA,IACC;AAAA,IAID,QAAA,CAASC,iBAAAA,CAAa,QAAQ,CAAA,CAC9B,IAAA,CAAK,CAAC,OAAA,EAAS,OAAA,EAAS,YAAY,OAAA,EAAS,QAAQ,CAAC,CAAA,CACtD,MAAA,CAAO,oBAAoB,CAAA,CAC3B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI,CAAC,SAAA,CAAU,aAAA,EAAc,EAAG;AAC9B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,aAAA,CAAc,KAAA,CAAM,KAAK,CAAA;AAE3C,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA;AAEnD,MAAA,IAAI;AAEF,QAAA,IAAI,MAAA,GAAS,YAAY,SAAS,CAAA,CAAA,CAAA;AAClC,QAAA,IAAI,aAAkC,EAAC;AAGvC,QAAA,IAAI,KAAA,CAAM,cAAc,MAAA,CAAO,IAAA,CAAK,MAAM,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG;AAChE,UAAA,MAAM,EAAE,aAAa,UAAA,EAAY,YAAA,KAAiB,mBAAA,CAAoB,KAAA,CAAM,YAAY,GAAG,CAAA;AAC3F,UAAA,MAAA,IAAU,IAAI,WAAW,CAAA,CAAA;AACzB,UAAA,UAAA,GAAa,EAAE,GAAG,UAAA,EAAY,GAAG,YAAA,EAAa;AAAA,QAChD;AAGA,QAAA,MAAA,IAAU,CAAA,sBAAA,CAAA;AACV,QAAA,UAAA,CAAW,QAAQ,KAAA,CAAM,KAAA;AAEzB,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,UAAU,CAAA;AACnD,QAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,MAAA,CAAO,OAAO,CAAA;AAErD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,OAAO,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,CAAC,CAAA;AAAA,UACtC,KAAA,EAAO,OAAO,OAAA,CAAQ,MAAA;AAAA,UACtB,KAAA,EAAO;AAAA,YACL,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,YAAY,KAAA,CAAM,UAAA;AAAA,YAClB,OAAO,KAAA,CAAM;AAAA;AACf,SACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,MACtB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,sBAAA;AAAA,QAChD,KAAA,EAAO;AAAA,UACL,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,YAAY,KAAA,CAAM;AAAA;AACpB,OACF;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACrEO,SAAS,uBAAA,GAA0B;AACxC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,gBAAgB,CAAA,CACrB,WAAA;AAAA,IACC;AAAA,IAID,QAAA,CAASC,iBAAAA,CAAa,QAAQ,CAAA,CAC9B,IAAA,CAAK,CAAC,OAAA,EAAS,OAAA,EAAS,YAAY,UAAA,EAAY,eAAe,CAAC,CAAA,CAChE,MAAA,CAAO,mBAAmB,CAAA,CAC1B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI,CAAC,SAAA,CAAU,aAAA,EAAc,EAAG;AAC9B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,KAAA,CAAM,SAAA,IAAa,UAAU,CAAA;AAGrE,MAAA,MAAM,cAAc,KAAA,CAAM,gBAAA,GACtB,wBAAA,CAAyB,KAAA,CAAM,gBAAgB,CAAA,GAC/C,IAAA;AAEJ,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA;AAEnD,MAAA,IAAI;AAEF,QAAA,IAAI,UAAA,GAAa,EAAA;AACjB,QAAA,IAAI,kBAAkB,UAAA,EAAY;AAChC,UAAA,UAAA,GAAa,WAAA,GACT,OAAO,WAAW,CAAA,IAAA,EAAO,MAAM,QAAQ,CAAA,GAAA,CAAA,GACvC,CAAA,OAAA,EAAU,KAAA,CAAM,QAAQ,CAAA,GAAA,CAAA;AAAA,QAC9B,CAAA,MAAA,IAAW,kBAAkB,UAAA,EAAY;AACvC,UAAA,UAAA,GAAa,WAAA,GACT,QAAQ,WAAW,CAAA,IAAA,EAAO,MAAM,QAAQ,CAAA,EAAA,CAAA,GACxC,CAAA,QAAA,EAAW,KAAA,CAAM,QAAQ,CAAA,EAAA,CAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,UAAA,GAAa,WAAA,GACT,OAAO,WAAW,CAAA,IAAA,EAAO,MAAM,QAAQ,CAAA,EAAA,CAAA,GACvC,CAAA,OAAA,EAAU,KAAA,CAAM,QAAQ,CAAA,EAAA,CAAA;AAAA,QAC9B;AAGA,QAAA,MAAM,MAAA,GAAS;AAAA,gCAAA,EACS,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAMlC,QAAA,MAAM,UAAA,GAAa;AAAA,UACjB,WAAA,EAAa,OAAO,KAAA,CAAM,WAAA,KAAgB,QAAA,GACtC,SAAS,KAAA,CAAM,WAAA,EAAa,EAAE,CAAA,GAC9B,KAAA,CAAM,WAAA;AAAA,UACV,OAAO,KAAA,CAAM;AAAA,SACf;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,UAAU,CAAA;AACnD,QAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,MAAA,CAAO,OAAO,CAAA;AAErD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,KAAA,EAAO,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YAClC,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,KAAK,CAAA,CAAE,GAAA;AAAA,YACP,eAAe,CAAA,CAAE,IAAA;AAAA,YACjB,OAAO,CAAA,CAAE;AAAA,WACX,CAAE,CAAA;AAAA,UACF,KAAA,EAAO,OAAO,OAAA,CAAQ,MAAA;AAAA,UACtB,KAAA,EAAO;AAAA,YACL,aAAa,KAAA,CAAM,WAAA;AAAA,YACnB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,YACxB,WAAW,KAAA,CAAM,SAAA;AAAA,YACjB,UAAU,KAAA,CAAM;AAAA;AAClB,SACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,MACtB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,0BAAA;AAAA,QAChD,KAAA,EAAO;AAAA,UACL,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,UACxB,WAAW,KAAA,CAAM;AAAA;AACnB,OACF;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AClGO,SAAS,2BAAA,GAA8B;AAC5C,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,qBAAqB,CAAA,CAC1B,WAAA;AAAA,IACC;AAAA,GAGF,CACC,SAASC,iBAAAA,CAAa,QAAQ,EAC9B,IAAA,CAAK,CAAC,SAAS,OAAA,EAAS,UAAA,EAAY,UAAU,QAAA,EAAU,UAAA,EAAY,UAAU,CAAC,CAAA,CAC/E,OAAO,uBAAuB,CAAA,CAC9B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI,CAAC,SAAA,CAAU,aAAA,EAAc,EAAG;AAC9B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA;AAEnD,MAAA,IAAI;AAEF,QAAA,MAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAOf,QAAA,MAAM,UAAA,GAAa;AAAA,UACjB,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,aAAa,KAAA,CAAM;AAAA,SACrB;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,UAAU,CAAA;AACnD,QAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,MAAA,CAAO,OAAO,CAAA;AAErD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YACpC,MAAM,CAAA,CAAE,IAAA;AAAA,YACR,OAAO,CAAA,CAAE;AAAA,WACX,CAAE,CAAA;AAAA,UACF,KAAA,EAAO,OAAO,OAAA,CAAQ,MAAA;AAAA,UACtB,KAAA,EAAO;AAAA,YACL,WAAW,KAAA,CAAM,SAAA;AAAA,YACjB,eAAA,EAAiB,MAAM,WAAA,CAAY,MAAA;AAAA,YACnC,OAAO,KAAA,CAAM;AAAA;AACf,SACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,MACtB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,iCAAA;AAG9D,MAAA,IAAI,QAAA,GAAW,EAAA;AACf,MAAA,IAAI,aAAa,QAAA,CAAS,OAAO,KAAK,YAAA,CAAa,QAAA,CAAS,WAAW,CAAA,EAAG;AACxE,QAAA,QAAA,GAAW,gHAAA;AAAA,MACb;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,YAAA,GAAe,QAAA;AAAA,QACtB,KAAA,EAAO;AAAA,UACL,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,eAAA,EAAiB,MAAM,WAAA,CAAY;AAAA;AACrC,OACF;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC7EA,IAAMQ,OAAAA,GAASE,kBAAa,sCAAsC,CAAA;AAK3D,SAAS,wCAAA,GAA2C;AACzD,EAAA,OAAOX,gBAAAA,EAAY,CAChB,IAAA,CAAK,oCAAoC,CAAA,CACzC,WAAA;AAAA,IACC;AAAA,GAIF,CACC,SAASC,iBAAAA,CAAa,QAAQ,EAC9B,IAAA,CAAK,CAAC,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,QAAA,EAAU,UAAU,UAAA,EAAY,UAAA,EAAY,WAAA,EAAa,IAAI,CAAC,CAAA,CAClG,OAAO,oCAAoC,CAAA,CAC3C,SAAA,CAAU,OAAO,KAAA,KAAU;AAE1B,IAAA,IAAI,CAAC,SAAA,CAAU,aAAA,EAAc,EAAG;AAC9B,MAAAQ,OAAAA,CAAO,KAAK,8DAA8D,CAAA;AAC1E,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,gBAAA,CAAiB,aAAA,EAAc,EAAG;AACrC,MAAAA,OAAAA,CAAO,KAAK,+DAA+D,CAAA;AAC3E,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAAA,OAAAA,CAAO,MAAM,yCAAA,EAA2C;AAAA,MACtD,eAAA,EAAiB,MAAM,SAAA,CAAU,MAAA;AAAA,MACjC,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAO,KAAA,CAAM;AAAA,KACd,CAAA;AAED,IAAA,IAAI;AAEF,MAAA,MAAM,kBAAkB,MAAM,gBAAA,CAAiB,kBAAkB,KAAA,CAAM,SAAA,EAAW,MAAM,KAAK,CAAA;AAG7F,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA;AAEnD,MAAA,IAAI;AAEF,QAAA,MAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAOf,QAAA,MAAM,UAAA,GAAa;AAAA,UACjB,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,aAAa,eAAA,CAAgB;AAAA,SAC/B;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,UAAU,CAAA;AACnD,QAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,MAAA,CAAO,OAAO,CAAA;AACrD,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,QAAAA,OAAAA,CAAO,KAAK,sCAAA,EAAwC;AAAA,UAClD,WAAA,EAAa,OAAO,OAAA,CAAQ,MAAA;AAAA,UAC5B,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,gBAAgB,eAAA,CAAgB,KAAA;AAAA,UAChC,qBAAqB,eAAA,CAAgB,UAAA;AAAA,UACrC;AAAA,SACD,CAAA;AAED,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YACpC,MAAM,CAAA,CAAE,IAAA;AAAA,YACR,OAAO,CAAA,CAAE;AAAA,WACX,CAAE,CAAA;AAAA,UACF,KAAA,EAAO,OAAO,OAAA,CAAQ,MAAA;AAAA,UACtB,KAAA,EAAO;AAAA,YACL,MAAM,KAAA,CAAM,SAAA;AAAA,YACZ,WAAW,KAAA,CAAM,SAAA;AAAA,YACjB,gBAAgB,eAAA,CAAgB,KAAA;AAAA,YAChC,iBAAiB,eAAA,CAAgB,UAAA;AAAA,YACjC,OAAO,KAAA,CAAM;AAAA,WACf;AAAA,UACA,SAAA,EAAW;AAAA,YACT,OAAO,eAAA,CAAgB,KAAA;AAAA,YACvB,YAAY,eAAA,CAAgB,UAAA;AAAA,YAC5B,OAAO,eAAA,CAAgB;AAAA;AACzB,SACF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,MACtB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,gDAAA;AAG9D,MAAA,IAAI,QAAA,GAAW,EAAA;AACf,MAAA,IAAI,aAAa,QAAA,CAAS,OAAO,KAAK,YAAA,CAAa,QAAA,CAAS,WAAW,CAAA,EAAG;AACxE,QAAA,QAAA,GAAW,gHAAA;AAAA,MACb,CAAA,MAAA,IAAW,aAAa,QAAA,CAAS,SAAS,KAAK,YAAA,CAAa,QAAA,CAAS,iBAAiB,CAAA,EAAG;AACvF,QAAA,QAAA,GAAW,iEAAA;AAAA,MACb,CAAA,MAAA,IAAW,YAAA,CAAa,QAAA,CAAS,WAAW,CAAA,EAAG;AAC7C,QAAA,QAAA,GAAW,+EAAA;AAAA,MACb;AAEA,MAAAA,OAAAA,CAAO,MAAM,sBAAA,EAAwB;AAAA,QACnC,KAAA,EAAO,YAAA;AAAA,QACP,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,eAAA,EAAiB,MAAM,SAAA,CAAU,MAAA;AAAA,QACjC;AAAA,OACD,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,YAAA,GAAe,QAAA;AAAA,QACtB,KAAA,EAAO;AAAA,UACL,MAAM,KAAA,CAAM,SAAA;AAAA,UACZ,WAAW,KAAA,CAAM;AAAA;AACnB,OACF;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AClIO,SAAS,sCAAA,GAAyC;AACvD,EAAA,OAAOT,gBAAAA,EAAY,CAChB,IAAA,CAAK,kCAAkC,CAAA,CACvC,WAAA;AAAA,IACC;AAAA,GAKF,CACC,SAASC,iBAAAA,CAAa,QAAQ,EAC9B,IAAA,CAAK,CAAC,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,QAAA,EAAU,QAAQ,WAAA,EAAa,UAAA,EAAY,IAAI,CAAC,CAAA,CACpF,OAAO,kCAAkC,CAAA,CACzC,SAAA,CAAU,OAAO,KAAA,KAAU;AAE1B,IAAA,IAAI,CAAC,SAAA,CAAU,aAAA,EAAc,EAAG;AAC9B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,gBAAA,CAAiB,aAAA,EAAc,EAAG;AACrC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,YAAY,CAAA;AAEvD,MAAA,IAAI,CAAC,WAAA,IAAe,OAAO,WAAA,KAAgB,QAAA,EAAU;AACnD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,CAAA,UAAA,EAAa,KAAA,CAAM,YAAY,CAAA,0DAAA;AAAA,SACxC;AAAA,MACF;AAGA,MAAA,MAAM,kBAAkB,MAAM,gBAAA,CAAiB,iBAAA,CAAkB,WAAA,EAAa,MAAM,KAAK,CAAA;AAGzF,MAAA,MAAM,SAAA,GAAY,aAAA,CAAc,KAAA,CAAM,KAAK,CAAA;AAC3C,MAAA,MAAM,iBAAA,GAAoB,mBAAA,CAAoB,KAAA,CAAM,iBAAA,IAAqB,WAAW,CAAA;AAGpF,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA;AAEnD,MAAA,IAAI;AAEF,QAAA,MAAM,aAAA,GAAqC;AAAA,UACzC,GAAG,KAAA,CAAM;AAAA,SACX;AACA,QAAA,aAAA,CAAc,KAAA,CAAM,iBAAA,IAAqB,WAAW,CAAA,GAAI,eAAA,CAAgB,SAAA;AAGxE,QAAA,MAAM,MAAA,GAAS;AAAA,sBAAA,EACD,SAAS,CAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAKvB,QAAA,MAAM,UAAA,GAAa;AAAA,UACjB,UAAA,EAAY;AAAA,SACd;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,UAAU,CAAA;AACnD,QAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,MAAA,CAAO,OAAO,CAAA;AAErD,QAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACjC,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO;AAAA,WACT;AAAA,QACF;AAEA,QAAA,MAAM,WAAA,GAAc,iBAAiB,CAAC,CAAA;AAEtC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,MAAM,WAAA,CAAY,CAAA;AAAA,UAClB,QAAQ,WAAA,CAAY,MAAA;AAAA,UACpB,SAAA,EAAW;AAAA,YACT,OAAO,eAAA,CAAgB,KAAA;AAAA,YACvB,YAAY,eAAA,CAAgB,UAAA;AAAA,YAC5B,QAAA,EAAU,iBAAA;AAAA,YACV,OAAO,eAAA,CAAgB;AAAA,WACzB;AAAA,UACA,SAAS,CAAA,yBAAA,EAA4B,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,gBAAgB,UAAU,CAAA,sBAAA;AAAA,SACrF;AAAA,MACF,CAAA,SAAE;AACA,QAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,MACtB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,sCAAA;AAG9D,MAAA,IAAI,QAAA,GAAW,EAAA;AACf,MAAA,IAAI,aAAa,QAAA,CAAS,SAAS,KAAK,YAAA,CAAa,QAAA,CAAS,iBAAiB,CAAA,EAAG;AAChF,QAAA,QAAA,GAAW,iEAAA;AAAA,MACb,CAAA,MAAA,IAAW,aAAa,QAAA,CAAS,cAAc,KAAK,YAAA,CAAa,QAAA,CAAS,SAAS,CAAA,EAAG;AACpF,QAAA,QAAA,GAAW,qDAAA;AAAA,MACb;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,YAAA,GAAe;AAAA,OACxB;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;ACnGO,IAAM,aAAa,oBAAA;AAKnB,IAAM,iBAAiB,wBAAA;AAKvB,IAAM,iBAAiB,wBAAA;AAKvB,IAAM,gBAAgB,uBAAA;AAKtB,IAAM,oBAAoB,2BAAA;AAK1B,IAAM,iCAAiC,wCAAA;AAKvC,IAAM,+BAA+B,sCAAA;AAKrC,IAAM,UAAA,GAAa;AAAA,EACxB,UAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,8BAAA;AAAA,EACA;AACF;AAKO,IAAM,cAAA,GAAiB;AAAA,EAC5B,UAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF;AAKO,SAAS,gBAAA,CAAiB,MAAA,GAA2B,EAAC,EAAG,wBAAiC,IAAA,EAAM;AAErG,EAAA,IAAI,MAAA,CAAO,GAAA,IAAO,MAAA,CAAO,QAAA,IAAY,OAAO,QAAA,EAAU;AACpD,IAAA,SAAA,CAAU,UAAA,CAAW;AAAA,MACnB,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,uBAAuB,MAAA,CAAO,qBAAA;AAAA,MAC9B,mBAAmB,MAAA,CAAO;AAAA,KAC3B,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAClB,MAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,KAAK,CAAA;AAAA,IAC/D,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,oBAAA,EAAqB;AAAA,IACrB,wBAAA,EAAyB;AAAA,IACzB,wBAAA,EAAyB;AAAA,IACzB,uBAAA,EAAwB;AAAA,IACxB,2BAAA;AAA4B,GAC9B;AAEA,EAAA,IAAI,qBAAA,EAAuB;AACzB,IAAA,OAAO;AAAA,MACL,GAAG,SAAA;AAAA,MACH,wCAAA,EAAyC;AAAA,MACzC,sCAAA;AAAuC,KACzC;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAkBA,eAAsB,oBAAA,GAAsC;AAC1D,EAAA,MAAM,iBAAA,EAAkB;AAGxB,EAAA,IAAI;AACF,IAAA,gBAAA,CAAiB,iBAAA,EAAkB;AAAA,EACrC,SAAS,KAAA,EAAO;AAAA,EAGhB;AACF;AC5IO,IAAM,gBAAA,GAAmBF,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0BAA0B,CAAA;AAAA,EACpD,UAAUA,KAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,SAAS,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,QAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,CAAE,SAAS,eAAe;AAClH,CAAC;AAKM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2BAA2B,CAAA;AAAA,EACrD,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,8BAA8B,CAAA;AAAA,EAC3D,QAAA,EAAUA,KAAAA,CAAE,IAAA,CAAK,CAAC,QAAQ,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,KAAK,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,CAAE,SAAS,eAAe,CAAA;AAAA,EACtG,UAAA,EAAYA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,+CAAgD;AAClG,CAAC;AAKM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+BAA+B,CAAA;AAAA,EACzD,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+BAA+B,CAAA;AAAA,EAC5D,QAAA,EAAUA,KAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,CAAE,SAAS,eAAe;AACvF,CAAC;AAKM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,4BAA4B;AACxD,CAAC;AAKM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,eAAe;AAC3C,CAAC;ACpCM,SAAS,oBAAA,CAAqB,kBAA0B,MAAA,EAAQ;AACrE,EAAA,OAAOC,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,0GAA0G,CAAA,CACtH,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,YAAY,CAAC,CAAA,CACzC,MAAA,CAAO,gBAAgB,CAAA,CACvB,aAAA,CAAc,OAAO,KAAA,KAAU;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,eAAA;AACnC,IAAA,MAAM,UAAU,MAAMoC,WAAA,CAAG,QAAA,CAAS,KAAA,CAAM,MAAM,QAA0B,CAAA;AACxE,IAAA,MAAM,KAAA,GAAQ,MAAMA,WAAA,CAAG,IAAA,CAAK,MAAM,IAAI,CAAA;AAEtC,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACnBO,SAAS,oBAAA,CAAqB,eAAA,GAA0B,MAAA,EAAQ,iBAAA,GAA6B,KAAA,EAAO;AACzG,EAAA,OAAOrC,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,6FAA8F,CAAA,CAC1G,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,YAAY,CAAC,CAAA,CAC1C,MAAA,CAAO,gBAAgB,CAAA,CACvB,aAAA,CAAc,OAAO,KAAA,KAAU;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,eAAA;AACnC,IAAA,MAAM,UAAA,GAAa,MAAM,UAAA,IAAc,iBAAA;AAGvC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,GAAA,GAAW0B,gBAAA,CAAA,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AACnC,MAAA,MAAMU,YAAG,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IACzC;AAEA,IAAA,MAAMA,YAAG,SAAA,CAAU,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,SAAS,QAA0B,CAAA;AACxE,IAAA,MAAM,KAAA,GAAQ,MAAMA,WAAAA,CAAG,IAAA,CAAK,MAAM,IAAI,CAAA;AAEtC,IAAA,OAAO;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC5BO,SAAS,oBAAA,CAAqB,kBAA0B,MAAA,EAAQ;AACrE,EAAA,OAAOrC,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,4EAA6E,CAAA,CACzF,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,YAAY,CAAC,CAAA,CAC3C,MAAA,CAAO,gBAAgB,CAAA,CACvB,aAAA,CAAc,OAAO,KAAA,KAAU;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,eAAA;AACnC,IAAA,MAAMoC,YAAG,UAAA,CAAW,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,SAAS,QAA0B,CAAA;AACzE,IAAA,MAAM,KAAA,GAAQ,MAAMA,WAAAA,CAAG,IAAA,CAAK,MAAM,IAAI,CAAA;AAEtC,IAAA,OAAO;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM;AAAA,KACd;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AClBO,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAOrC,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,iFAAkF,CAAA,CAC9F,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,YAAY,CAAC,CAAA,CAC/C,MAAA,CAAO,gBAAgB,CAAA,CACvB,aAAA,CAAc,OAAO,KAAA,KAAU;AAC9B,IAAA,MAAMoC,WAAAA,CAAG,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAE1B,IAAA,OAAO;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAA,EAAS;AAAA,KACX;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AChBO,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAOrC,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,4DAA4D,CAAA,CACxE,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,YAAY,CAAC,CAAA,CAC9C,MAAA,CAAO,gBAAgB,CAAA,CACvB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAMoC,WAAAA,CAAG,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,MAAMA,WAAAA,CAAG,IAAA,CAAK,MAAM,IAAI,CAAA;AAEtC,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAA;AAAA,QACR,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACrB,WAAA,EAAa,MAAM,WAAA,EAAY;AAAA,QAC/B,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,QAAA,EAAU,KAAA,CAAM,KAAA,CAAM,WAAA;AAAY,OACpC;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,KAAA;AAAA,QACR,MAAM,KAAA,CAAM;AAAA,OACd;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;AChBO,IAAM,aAAa,oBAAA;AACnB,IAAM,aAAa,oBAAA;AACnB,IAAM,aAAa,oBAAA;AACnB,IAAM,aAAa,oBAAA;AACnB,IAAM,aAAa,oBAAA;AAKnB,IAAM,kBAAA,GAAqB;AAAA,EAChC,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AAKO,SAAS,wBAAA,CAAyB,MAAA,GAA+B,EAAC,EAAG;AAC1E,EAAA,MAAM;AAAA,IACJ,eAAA,GAAkB,MAAA;AAAA,IAClB,iBAAA,GAAoB;AAAA,GACtB,GAAI,MAAA;AAEJ,EAAA,OAAO;AAAA,IACL,qBAAqB,eAAe,CAAA;AAAA,IACpC,oBAAA,CAAqB,iBAAiB,iBAAiB,CAAA;AAAA,IACvD,qBAAqB,eAAe,CAAA;AAAA,IACpC,oBAAA,EAAqB;AAAA,IACrB,oBAAA;AAAqB,GACvB;AACF;AC7CO,IAAM,mBAAA,GAAsBtC,MAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+BAA+B,CAAA;AAAA,EACzD,SAAA,EAAWA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,0CAA0C,CAAA;AAAA,EACzF,cAAA,EAAgBA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,gDAAgD,CAAA;AAAA,EACpG,WAAWA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,sDAAsD;AAClG,CAAC;AAKM,IAAM,qBAAA,GAAwBA,MAAE,MAAA,CAAO;AAAA,EAC5C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,iCAAiC,CAAA;AAAA,EAC3D,SAAA,EAAWA,MAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,+CAAgD;AAChG,CAAC;AAKM,IAAM,qBAAA,GAAwBA,MAAE,MAAA,CAAO;AAAA,EAC5C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,iCAAiC,CAAA;AAAA,EAC3D,SAAA,EAAWA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,uCAAuC;AACxF,CAAC;AAKM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wBAAwB,CAAA;AAAA,EACvD,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uDAAuD,CAAA;AAAA,EACpF,SAAA,EAAWA,MAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,0BAA0B,CAAA;AAAA,EACxE,aAAA,EAAeA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,iCAAiC;AACtF,CAAC;AC9BM,SAAS,uBAAA,CAAwB,gBAAA,GAA4B,KAAA,EAAO,qBAAA,GAAiC,KAAA,EAAO;AACjH,EAAA,OAAOC,gBAAAA,EAAY,CAChB,IAAA,CAAK,gBAAgB,CAAA,CACrB,YAAY,6GAA6G,CAAA,CACzH,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,WAAA,EAAa,MAAA,EAAQ,OAAA,EAAS,YAAY,CAAC,CAAA,CACjD,MAAA,CAAO,mBAAmB,CAAA,CAC1B,aAAA,CAAc,OAAO,KAAA,KAAU;AAC9B,IAAA,MAAM,SAAA,GAAY,OAAO,GAAA,EAAaqC,UAAAA,KAAuC;AAC3E,MAAA,MAAM,OAAA,GAAU,MAAMD,WAAAA,CAAG,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC7D,MAAA,MAAME,SAAe,EAAC;AAEtB,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAM,QAAA,GAAgBC,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAC1C,QAAA,MAAM,YAAA,GAAoBA,gBAAA,CAAA,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,QAAQ,CAAA;AAGvD,QAAA,IAAI,KAAA,CAAM,aAAa,CAAC,KAAA,CAAM,KAAK,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA,EAAG;AAC5D,UAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAY,IAAK,CAACF,UAAAA,EAAW;AACtC,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,UAAA,MAAM,KAAA,GAAQ,MAAMD,WAAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AACpC,UAAAE,OAAM,IAAA,CAAK;AAAA,YACT,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,IAAA,EAAM,YAAA;AAAA,YACN,QAAA;AAAA,YACA,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,YACrB,WAAA,EAAa,MAAM,WAAA,EAAY;AAAA,YAC/B,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,QAAA,EAAU,KAAA,CAAM,KAAA,CAAM,WAAA;AAAY,WACnC,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAAA,OAAM,IAAA,CAAK;AAAA,YACT,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,IAAA,EAAM,YAAA;AAAA,YACN,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,YACrB,WAAA,EAAa,MAAM,WAAA;AAAY,WAChC,CAAA;AAAA,QACH;AAGA,QAAA,IAAID,UAAAA,IAAa,KAAA,CAAM,WAAA,EAAY,EAAG;AACpC,UAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,QAAA,EAAU,IAAI,CAAA;AAC/C,UAAAC,MAAAA,CAAM,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,QACxB;AAAA,MACF;AAEA,MAAA,OAAOA,MAAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,SAAA,IAAa,gBAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,KAAA,CAAM,MAAM,SAAS,CAAA;AAEnD,IAAA,OAAO;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,KAAA;AAAA,MACA,OAAO,KAAA,CAAM;AAAA,KACf;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AChEO,SAAS,yBAAA,CAA0B,mBAA4B,IAAA,EAAM;AAC1E,EAAA,OAAOvC,gBAAAA,EAAY,CAChB,IAAA,CAAK,kBAAkB,CAAA,CACvB,YAAY,uFAAwF,CAAA,CACpG,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,WAAA,EAAa,QAAA,EAAU,OAAA,EAAS,YAAY,CAAC,CAAA,CACnD,MAAA,CAAO,qBAAqB,CAAA,CAC5B,aAAA,CAAc,OAAO,KAAA,KAAU;AAC9B,IAAA,MAAM,SAAA,GAAY,MAAM,SAAA,IAAa,gBAAA;AACrC,IAAA,MAAMoC,YAAG,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,EAAE,WAAW,CAAA;AAExC,IAAA,OAAO;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAA,EAAS;AAAA,KACX;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACjBO,SAAS,yBAAA,CAA0B,mBAA4B,KAAA,EAAO;AAC3E,EAAA,OAAOrC,gBAAAA,EAAY,CAChB,IAAA,CAAK,kBAAkB,CAAA,CACvB,YAAY,8EAA8E,CAAA,CAC1F,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,WAAA,EAAa,QAAA,EAAU,QAAA,EAAU,YAAY,CAAC,CAAA,CACpD,MAAA,CAAO,qBAAqB,CAAA,CAC5B,aAAA,CAAc,OAAO,KAAA,KAAU;AAC9B,IAAA,MAAM,SAAA,GAAY,MAAM,SAAA,IAAa,gBAAA;AACrC,IAAA,MAAMoC,WAAAA,CAAG,GAAG,KAAA,CAAM,IAAA,EAAM,EAAE,SAAA,EAAW,KAAA,EAAO,OAAO,CAAA;AAEnD,IAAA,OAAO;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAA,EAAS;AAAA,KACX;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AChBO,SAAS,oBAAA,CAAqB,gBAAA,GAA4B,IAAA,EAAM,oBAAA,GAAgC,KAAA,EAAO;AAC5G,EAAA,OAAOrC,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,2FAA2F,CAAA,CACvG,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,YAAY,CAAC,CAAA,CAC7C,MAAA,CAAO,gBAAgB,CAAA,CACvB,aAAA,CAAc,OAAO,KAAA,KAAU;AAC9B,IAAA,MAAM,SAAA,GAAY,MAAM,SAAA,IAAa,gBAAA;AACrC,IAAA,MAAM,aAAA,GAAgB,MAAM,aAAA,IAAiB,oBAAA;AAE7C,IAAA,MAAM,WAAA,GAAc,OAAO,GAAA,KAAmC;AAC5D,MAAA,MAAM,OAAA,GAAU,MAAMoC,WAAAA,CAAG,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC7D,MAAA,MAAMI,WAAoB,EAAC;AAG3B,MAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CACxB,OAAA,CAAQ,OAAO,KAAK,CAAA,CACpB,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AACtB,MAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,CAAA,EAAK,aAAA,GAAgB,KAAK,GAAG,CAAA;AAEtE,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAM,QAAA,GAAgBC,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAE1C,QAAA,IAAI,MAAM,MAAA,EAAO,IAAK,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AAC5C,UAAAD,QAAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,QACvB;AAEA,QAAA,IAAI,SAAA,IAAa,KAAA,CAAM,WAAA,EAAY,EAAG;AACpC,UAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,QAAQ,CAAA;AAC7C,UAAAA,QAAAA,CAAQ,IAAA,CAAK,GAAG,UAAU,CAAA;AAAA,QAC5B;AAAA,MACF;AAEA,MAAA,OAAOA,QAAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,KAAA,CAAM,SAAS,CAAA;AAEjD,IAAA,OAAO;AAAA,MACL,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,OAAA;AAAA,MACA,OAAO,OAAA,CAAQ;AAAA,KACjB;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;ACtCO,IAAM,gBAAgB,uBAAA;AACtB,IAAM,kBAAkB,yBAAA;AACxB,IAAM,kBAAkB,yBAAA;AACxB,IAAM,aAAa,oBAAA;AAKnB,IAAM,uBAAA,GAA0B;AAAA,EACrC,aAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF;AAKO,SAAS,6BAAA,CAA8B,MAAA,GAAoC,EAAC,EAAG;AACpF,EAAA,MAAM;AAAA,IACJ,gBAAA,GAAmB,KAAA;AAAA,IACnB,qBAAA,GAAwB,KAAA;AAAA,IACxB,oBAAA,GAAuB;AAAA,GACzB,GAAI,MAAA;AAEJ,EAAA,OAAO;AAAA,IACL,uBAAA,CAAwB,kBAAkB,qBAAqB,CAAA;AAAA,IAC/D,0BAA0B,IAAI,CAAA;AAAA;AAAA,IAC9B,0BAA0B,KAAK,CAAA;AAAA;AAAA,IAC/B,oBAAA,CAAqB,kBAAkB,oBAAoB;AAAA,GAC7D;AACF;ACzCO,IAAM,cAAA,GAAiB1C,MAAE,MAAA,CAAO;AAAA,EACrC,QAAA,EAAUA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,cAAc,CAAC,CAAA,CAAE,QAAA,CAAS,uBAAuB;AACzF,CAAC;AAKM,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,KAAA,EAAOA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,cAAc,CAAC,CAAA,CAAE,QAAA,CAAS,kBAAkB;AACjF,CAAC;AAKM,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACtC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oBAAoB;AAChD,CAAC;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,WAAW,CAAA;AAAA,EACrC,eAAA,EAAiBA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,2BAA2B;AAClF,CAAC;AAKM,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,WAAW;AACvC,CAAC;AAKM,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,WAAW;AACvC,CAAC;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,aAAa,CAAA;AAAA,EACvC,EAAA,EAAIA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,kBAAkB;AAC5C,CAAC;AAKM,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mBAAmB;AAC/C,CAAC;ACrDM,SAAS,kBAAA,GAAqB;AACnC,EAAA,OAAOC,gBAAAA,EAAY,CAChB,IAAA,CAAK,WAAW,CAAA,CAChB,YAAY,uFAAuF,CAAA,CACnG,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,YAAY,CAAC,CAAA,CACnC,OAAO,cAAc,CAAA,CACrB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,MAAA,GAAc0C,gBAAA,CAAA,IAAA,CAAK,GAAG,KAAA,CAAM,QAAQ,CAAA;AAE1C,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AChBO,SAAS,qBAAA,GAAwB;AACtC,EAAA,OAAO3C,gBAAAA,EAAY,CAChB,IAAA,CAAK,cAAc,CAAA,CACnB,YAAY,gHAAgH,CAAA,CAC5H,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAY,YAAY,CAAC,CAAA,CAClD,MAAA,CAAO,iBAAiB,CAAA,CACxB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,QAAA,GAAgB2C,gBAAA,CAAA,OAAA,CAAQ,GAAG,KAAA,CAAM,KAAK,CAAA;AAE5C,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAiBA,4BAAW,QAAQ;AAAA,KACtC;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AChBO,SAAS,mBAAA,GAAsB;AACpC,EAAA,OAAO5C,gBAAAA,EAAY,CAChB,IAAA,CAAK,YAAY,CAAA,CACjB,YAAY,+EAA+E,CAAA,CAC3F,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,MAAA,EAAQ,OAAA,EAAS,YAAY,CAAC,CAAA,CACpC,OAAO,eAAe,CAAA,CACtB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,MAAA,GAAc4C,gBAAA,CAAA,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAEpC,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,UAAA,EAAiBA,gBAAA,CAAA,UAAA,CAAW,KAAA,CAAM,IAAI;AAAA,KACxC;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACpBO,SAAS,sBAAA,GAAyB;AACvC,EAAA,OAAO7C,gBAAAA,EAAY,CAChB,IAAA,CAAK,eAAe,CAAA,CACpB,YAAY,4FAA4F,CAAA,CACxG,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,MAAA,EAAQ,UAAA,EAAY,UAAA,EAAY,YAAY,CAAC,CAAA,CACnD,MAAA,CAAO,kBAAkB,CAAA,CACzB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM6C,SAAAA,GAAW,KAAA,CAAM,eAAA,GACdC,gBAAA,CAAA,QAAA,CAAS,KAAA,CAAM,IAAA,EAAWA,gBAAA,CAAA,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAC,CAAA,GAC7CA,gBAAA,CAAA,QAAA,CAAS,MAAM,IAAI,CAAA;AAE5B,IAAA,OAAO;AAAA,MACL,QAAA,EAAAD,SAAAA;AAAA,MACA,SAAA,EAAgBC,gBAAA,CAAA,OAAA,CAAQ,KAAA,CAAM,IAAI;AAAA,KACpC;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AClBO,SAAS,qBAAA,GAAwB;AACtC,EAAA,OAAO/C,gBAAAA,EAAY,CAChB,IAAA,CAAK,cAAc,CAAA,CACnB,YAAY,wEAAwE,CAAA,CACpF,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,MAAA,EAAQ,SAAA,EAAW,WAAA,EAAa,YAAY,CAAC,CAAA,CACnD,MAAA,CAAO,iBAAiB,CAAA,CACxB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM+C,QAAAA,GAAeC,gBAAA,CAAA,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAEvC,IAAA,OAAO;AAAA,MACL,OAAA,EAAAD,QAAAA;AAAA,MACA,QAAA,EAAeC,gBAAA,CAAA,QAAA,CAAS,KAAA,CAAM,IAAI;AAAA,KACpC;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AChBO,SAAS,uBAAA,GAA0B;AACxC,EAAA,OAAOjD,gBAAAA,EAAY,CAChB,IAAA,CAAK,gBAAgB,CAAA,CACrB,YAAY,uEAAuE,CAAA,CACnF,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,MAAA,EAAQ,WAAA,EAAa,KAAA,EAAO,YAAY,CAAC,CAAA,CAC/C,MAAA,CAAO,mBAAmB,CAAA,CAC1B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,GAAA,GAAWiD,gBAAA,CAAA,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAEnC,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,GAAA;AAAA,MACX,YAAA,EAAc,IAAI,MAAA,GAAS,CAAA;AAAA,MAC3B,QAAA,EAAeA,gBAAA,CAAA,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,GAAG;AAAA,KACzC;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACjBO,SAAS,sBAAA,GAAyB;AACvC,EAAA,OAAOlD,gBAAAA,EAAY,CAChB,IAAA,CAAK,eAAe,CAAA,CACpB,YAAY,iDAAiD,CAAA,CAC7D,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,MAAA,EAAQ,UAAA,EAAY,YAAY,CAAC,CAAA,CACvC,OAAO,kBAAkB,CAAA,CACzB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAMkD,SAAAA,GAAgBC,gBAAA,CAAA,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,MAAM,EAAE,CAAA;AAEnD,IAAA,OAAO;AAAA,MACL,YAAA,EAAcD,SAAAA;AAAA,MACd,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,IAAI,KAAA,CAAM;AAAA,KACZ;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACjBO,SAAS,uBAAA,GAA0B;AACxC,EAAA,OAAOnD,gBAAAA,EAAY,CAChB,IAAA,CAAK,gBAAgB,CAAA,CACrB,YAAY,wFAAwF,CAAA,CACpG,QAAA,CAASC,iBAAAA,CAAa,WAAW,CAAA,CACjC,KAAK,CAAC,MAAA,EAAQ,WAAA,EAAa,YAAY,CAAC,CAAA,CACxC,OAAO,mBAAmB,CAAA,CAC1B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,UAAA,GAAkBoD,gBAAA,CAAA,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAE5C,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;ACEO,IAAM,WAAW,kBAAA;AACjB,IAAM,cAAc,qBAAA;AACpB,IAAM,YAAY,mBAAA;AAClB,IAAM,eAAe,sBAAA;AACrB,IAAM,cAAc,qBAAA;AACpB,IAAM,gBAAgB,uBAAA;AACtB,IAAM,eAAe,sBAAA;AACrB,IAAM,gBAAgB,uBAAA;AAKtB,IAAM,gBAAA,GAAmB;AAAA,EAC9B,QAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF;AAKO,SAAS,sBAAA,CAAuB,MAAA,GAA8B,EAAC,EAAG;AACvE,EAAA,OAAO;AAAA,IACL,kBAAA,EAAmB;AAAA,IACnB,qBAAA,EAAsB;AAAA,IACtB,mBAAA,EAAoB;AAAA,IACpB,sBAAA,EAAuB;AAAA,IACvB,qBAAA,EAAsB;AAAA,IACtB,uBAAA,EAAwB;AAAA,IACxB,sBAAA,EAAuB;AAAA,IACvB,uBAAA;AAAwB,GAC1B;AACF;ACzDO,IAAM,qBAAA,GAAwBtD,MAAE,MAAA,CAAO;AAAA,EAC5C,MAAA,EAAQA,KAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA,CAAE,SAAS,eAAe,CAAA;AAAA,EACjF,cAAcA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,4EAA4E,CAAA;AAAA,EACzH,UAAUA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qCAAqC;AAChF,CAAC;AAKM,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yCAAyC,CAAA;AAAA,EACnE,YAAA,EAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2DAA2D,CAAA;AAAA,EAC7F,aAAaA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,+DAA+D;AAC7G,CAAC;AAKM,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EAC3C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,8CAA8C,CAAA;AAAA,EACxE,SAAA,EAAWA,MAAE,IAAA,CAAK,CAAC,OAAO,UAAU,CAAC,CAAA,CAAE,QAAA,CAAS,sBAAsB,CAAA;AAAA,EACtE,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2BAA2B,CAAA;AAAA,EACvD,IAAA,EAAMA,KAAAA,CAAE,IAAA,CAAK,CAAC,SAAS,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,SAAS,CAAC,CAAA,CAAE,SAAS,WAAW;AACxG,CAAC;AAKM,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EAC3C,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2CAA2C,CAAA;AAAA,EAC1E,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yCAAyC,CAAA;AAAA,EACtE,IAAA,EAAMA,KAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,CAAE,SAAS,yBAAyB;AAC/F,CAAC;AAKM,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EAC3C,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uBAAuB,CAAA;AAAA,EAClD,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wBAAwB;AACrD,CAAC;;;ACtCM,SAAS,yBAAA,GAA4B;AAC1C,EAAA,OAAOC,gBAAAA,EAAY,CAChB,IAAA,CAAK,mBAAmB,CAAA,CACxB,YAAY,2FAA2F,CAAA,CACvG,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,SAAS,CAAC,CAAA,CACvC,MAAA,CAAO,qBAAqB,CAAA,CAC5B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,KAAA,CAAM,WAAW,KAAA,EAAO;AAC1B,MAAA,SAAA,GAAY,IAAI,WAAA,EAAY;AAAA,IAC9B,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,KAAW,MAAA,EAAQ;AAClC,MAAA,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAA,KAAY,GAAI,CAAA;AAAA,IAC7C,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,KAAW,QAAA,IAAY,MAAM,YAAA,EAAc;AAC1D,MAAA,SAAA,GAAYwB,cAAA,CAAO,GAAA,EAAK,KAAA,CAAM,YAAY,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,SAAA,GAAY,IAAI,WAAA,EAAY;AAAA,IAC9B;AAEA,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,GAAA,EAAK,IAAI,WAAA,EAAY;AAAA,MACrB,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAA,KAAY,GAAI,CAAA;AAAA,MACrC,IAAA,EAAM,IAAI,WAAA,EAAY;AAAA,MACtB,KAAA,EAAO,GAAA,CAAI,QAAA,EAAS,GAAI,CAAA;AAAA,MACxB,GAAA,EAAK,IAAI,OAAA,EAAQ;AAAA,MACjB,IAAA,EAAM,IAAI,QAAA,EAAS;AAAA,MACnB,MAAA,EAAQ,IAAI,UAAA,EAAW;AAAA,MACvB,MAAA,EAAQ,IAAI,UAAA;AAAW,KACzB;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AClCO,SAAS,uBAAA,GAA0B;AACxC,EAAA,OAAOzB,gBAAAA,EAAY,CAChB,IAAA,CAAK,gBAAgB,CAAA,CACrB,YAAY,+GAA+G,CAAA,CAC3H,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAC,CAAA,CAC/B,OAAO,mBAAmB,CAAA,CAC1B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI;AACF,MAAA,IAAI,IAAA;AAGJ,MAAA,IAAI,MAAM,WAAA,EAAa;AACrB,QAAA,IAAA,GAAOqB,cAAM,KAAA,CAAM,IAAA,EAAM,MAAM,WAAA,kBAAa,IAAI,MAAM,CAAA;AAAA,MACxD,WAAW,CAAC,KAAA,CAAM,OAAO,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG;AAErC,QAAA,IAAA,GAAO,IAAI,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAI,IAAI,GAAI,CAAA;AAAA,MAC3C,CAAA,MAAO;AAEL,QAAA,IAAA,GAAO,IAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,MAC5B;AAEA,MAAA,IAAI,CAACgC,eAAA,CAAQ,IAAI,CAAA,EAAG;AAClB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY7B,cAAAA,CAAO,IAAA,EAAM,KAAA,CAAM,YAAY,CAAA;AAEjD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,SAAA;AAAA,QACA,GAAA,EAAK,KAAK,WAAA;AAAY,OACxB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC5CO,SAAS,wBAAA,GAA2B;AACzC,EAAA,OAAOzB,gBAAAA,EAAY,CAChB,IAAA,CAAK,iBAAiB,CAAA,CACtB,WAAA,CAAY,qGAAqG,CAAA,CACjH,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,IAAA,CAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,YAAY,CAAC,CAAA,CACtD,MAAA,CAAO,oBAAoB,CAAA,CAC3B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAEhC,MAAA,IAAI,CAACqD,eAAAA,CAAQ,IAAI,CAAA,EAAG;AAClB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,WAAW,EAAE,CAAC,MAAM,IAAI,GAAG,MAAM,MAAA,EAAO;AAC9C,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,SAAA,KAAc,KAAA,GAC/BC,WAAA,CAAI,MAAM,QAAQ,CAAA,GAClBC,WAAA,CAAI,IAAA,EAAM,QAAQ,CAAA;AAEtB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,OAAO,WAAA,EAAY;AAAA,QAC3B,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,OAAA,KAAY,GAAI;AAAA,OAC1C;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACpCO,SAAS,wBAAA,GAA2B;AACzC,EAAA,OAAOxD,gBAAAA,EAAY,CAChB,IAAA,CAAK,iBAAiB,CAAA,CACtB,YAAY,qFAAqF,CAAA,CACjG,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAc,UAAU,CAAC,CAAA,CAC/C,MAAA,CAAO,oBAAoB,CAAA,CAC3B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACtC,MAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAElC,MAAA,IAAI,CAACqD,eAAAA,CAAQ,KAAK,KAAK,CAACA,eAAAA,CAAQ,GAAG,CAAA,EAAG;AACpC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,IAAI,UAAA;AACJ,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,UAAA,GAAaG,wBAAA,CAAiB,KAAK,KAAK,CAAA;AAAA,MAC1C,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,QAAA,UAAA,GAAaC,yBAAA,CAAkB,KAAK,KAAK,CAAA;AAAA,MAC3C,CAAA,MAAO;AACL,QAAA,UAAA,GAAaC,2BAAA,CAAoB,KAAK,KAAK,CAAA;AAAA,MAC7C;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,UAAA;AAAA,QACA,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,SAAA,EAAW,MAAM,WAAA,EAAY;AAAA,QAC7B,OAAA,EAAS,IAAI,WAAA;AAAY,OAC3B;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC3CO,SAAS,wBAAA,GAA2B;AACzC,EAAA,OAAO3D,gBAAAA,EAAY,CAChB,IAAA,CAAK,iBAAiB,CAAA,CACtB,YAAY,gFAAgF,CAAA,CAC5F,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,YAAY,CAAC,CAAA,CAC9C,MAAA,CAAO,oBAAoB,CAAA,CAC3B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC/B,MAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAE/B,MAAA,IAAI,CAACqD,eAAAA,CAAQ,EAAE,KAAK,CAACA,eAAAA,CAAQ,EAAE,CAAA,EAAG;AAChC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,aAAA,EAAeM,gBAAA,CAAS,EAAA,EAAI,EAAE,CAAA;AAAA,QAC9B,YAAA,EAAcC,eAAA,CAAQ,EAAA,EAAI,EAAE,CAAA;AAAA,QAC5B,aAAA,EAAe,EAAA,CAAG,OAAA,EAAQ,KAAM,GAAG,OAAA,EAAQ;AAAA,QAC3C,KAAA,EAAO,GAAG,WAAA,EAAY;AAAA,QACtB,KAAA,EAAO,GAAG,WAAA;AAAY,OACxB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;AChCO,IAAM,kBAAkB,yBAAA;AACxB,IAAM,gBAAgB,uBAAA;AACtB,IAAM,iBAAiB,wBAAA;AACvB,IAAM,iBAAiB,wBAAA;AACvB,IAAM,iBAAiB,wBAAA;AAGvB,IAAM,aAAA,GAAgB;AAAA,EAC3B,eAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF;AAKO,SAAS,mBAAA,CAAoB,MAAA,GAAyB,EAAC,EAAG;AAC/D,EAAA,OAAO;AAAA,IACL,yBAAA,EAA0B;AAAA,IAC1B,uBAAA,EAAwB;AAAA,IACxB,wBAAA,EAAyB;AAAA,IACzB,wBAAA,EAAyB;AAAA,IACzB,wBAAA;AAAyB,GAC3B;AACF;AC/BO,IAAM,yBAAA,GAA4B9D,MAAE,MAAA,CAAO;AAAA,EAChD,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,iBAAiB,CAAA;AAAA,EAC3C,UAAA,EAAYA,KAAAA,CAAE,IAAA,CAAK,CAAC,aAAa,WAAA,EAAa,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,QAAQ,CAAC,CAAA,CAAE,SAAS,oBAAoB;AAC5H,CAAC;AAKM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,cAAc,CAAA;AAAA,EACxC,IAAA,EAAMA,KAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,CAAE,SAAS,oBAAoB,CAAA;AAAA,EACpF,YAAYA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,0DAA0D;AACvG,CAAC;AAKM,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mBAAmB,CAAA;AAAA,EAC7C,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uCAAuC,CAAA;AAAA,EACnE,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oBAAoB,CAAA;AAAA,EACjD,MAAA,EAAQA,MAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,0DAA0D,CAAA;AAAA,EACrG,eAAA,EAAiBA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,yBAAyB;AAChF,CAAC;AAKM,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,eAAe,CAAA;AAAA,EACzC,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,gDAAgD,CAAA;AAAA,EAC/E,OAAOA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,0BAA0B;AAClE,CAAC;AAKM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,KAAA,EAAOA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,cAAc,CAAC,CAAA,CAAE,QAAA,CAAS,0BAA0B,CAAA;AAAA,EACvF,SAAA,EAAWA,MAAE,MAAA,EAAO,CAAE,QAAQ,EAAE,CAAA,CAAE,SAAS,gCAAgC;AAC7E,CAAC;AAKM,IAAM,qBAAA,GAAwBA,MAAE,MAAA,CAAO;AAAA,EAC5C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,aAAa,CAAA;AAAA,EACvC,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0BAA0B,CAAA;AAAA,EACrD,KAAKA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,oDAAoD;AAC1F,CAAC;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,iBAAiB;AAC7C,CAAC;;;ACvDM,SAAS,6BAAA,GAAgC;AAC9C,EAAA,OAAOC,gBAAAA,EAAY,CAChB,IAAA,CAAK,uBAAuB,CAAA,CAC5B,YAAY,0GAA0G,CAAA,CACtH,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,WAAW,CAAC,CAAA,CAC/C,MAAA,CAAO,yBAAyB,CAAA,CAChC,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI,MAAA;AAEJ,IAAA,QAAQ,MAAM,UAAA;AAAY,MACxB,KAAK,WAAA;AACH,QAAA,MAAA,GAAS,KAAA,CAAM,KAAK,WAAA,EAAY;AAChC,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,MAAA,GAAS,KAAA,CAAM,KAAK,WAAA,EAAY;AAChC,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,WAAA,EAAY,CAAE,OAAA,CAAQ,SAAS,CAAC,IAAA,KAAS,IAAA,CAAK,WAAA,EAAa,CAAA;AAC/E,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,MAAA,GAAS,KAAA,CAAM,IAAA,CACZ,WAAA,EAAY,CACZ,OAAA,CAAQ,mBAAA,EAAqB,CAAC,CAAA,EAAG,IAAA,KAAS,IAAA,CAAK,WAAA,EAAa,CAAA;AAC/D,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,MAAA,GAAS,KAAA,CAAM,IAAA,CACZ,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAA,CACzB,WAAA,EAAY,CACZ,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,UAAU,EAAE,CAAA;AACvB,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,MAAA,GAAS,KAAA,CAAM,IAAA,CACZ,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAA,CACzB,WAAA,EAAY,CACZ,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,UAAU,EAAE,CAAA;AACvB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,MAAA,GAAS,MAAM,IAAA,CACZ,WAAA,GACA,OAAA,CAAQ,mBAAA,EAAqB,CAAC,CAAA,EAAG,IAAA,KAAS,KAAK,WAAA,EAAa,EAC5D,OAAA,CAAQ,IAAA,EAAM,CAAC,IAAA,KAAS,IAAA,CAAK,aAAa,CAAA;AAC7C,QAAA;AAAA,MACF;AACE,QAAA,MAAA,GAAS,KAAA,CAAM,IAAA;AAAA;AAGnB,IAAA,OAAO;AAAA,MACL,UAAU,KAAA,CAAM,IAAA;AAAA,MAChB,SAAA,EAAW,MAAA;AAAA,MACX,YAAY,KAAA,CAAM;AAAA,KACpB;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACxDO,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,uGAAuG,CAAA,CACnH,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,QAAA,EAAU,MAAA,EAAQ,YAAY,CAAC,CAAA,CACrC,OAAO,gBAAgB,CAAA,CACvB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI,MAAM,UAAA,EAAY;AACpB,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,qBAAA,EAAuB,MAAM,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AACnG,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,KAAS,MAAA,GACzB,IAAI,MAAA,CAAO,CAAA,EAAA,EAAK,KAAK,CAAA,IAAA,EAAO,KAAK,CAAA,GAAA,CAAA,EAAO,GAAG,CAAA,GAC3C,KAAA,CAAM,IAAA,KAAS,OAAA,GACf,IAAI,MAAA,CAAO,CAAA,EAAA,EAAK,KAAK,CAAA,EAAA,CAAA,EAAM,GAAG,CAAA,GAC9B,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,CAAA,EAAO,GAAG,CAAA;AAClC,MAAA,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,MAAA,GAAS,MAAM,IAAA,KAAS,MAAA,GACpB,KAAA,CAAM,IAAA,CAAK,MAAK,GAChB,KAAA,CAAM,IAAA,KAAS,OAAA,GACf,MAAM,IAAA,CAAK,SAAA,EAAU,GACrB,KAAA,CAAM,KAAK,OAAA,EAAQ;AAAA,IACzB;AAEA,IAAA,OAAO;AAAA,MACL,UAAU,KAAA,CAAM,IAAA;AAAA,MAChB,OAAA,EAAS,MAAA;AAAA,MACT,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO;AAAA,KACtC;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACjCO,SAAS,uBAAA,GAA0B;AACxC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,gBAAgB,CAAA,CACrB,YAAY,4GAA4G,CAAA,CACxH,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,QAAA,EAAU,SAAA,EAAW,YAAY,CAAC,CAAA,CACxC,OAAO,mBAAmB,CAAA,CAC1B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,SAAS,KAAA,CAAM,MAAA,GAAS,MAAM,EAAA,KAAO,KAAA,CAAM,kBAAkB,GAAA,GAAM,EAAA,CAAA;AACzE,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5C,IAAA,MAAM,SAAS,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,MAAM,OAAO,CAAA;AAGtD,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AACtC,IAAA,MAAM,KAAA,GAAQ,OAAA,GAAU,OAAA,CAAQ,MAAA,GAAS,CAAA;AAEzC,IAAA,OAAO;AAAA,MACL,UAAU,KAAA,CAAM,IAAA;AAAA,MAChB,MAAA;AAAA,MACA,YAAA,EAAc;AAAA,KAChB;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACvBO,SAAS,qBAAA,GAAwB;AACtC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,cAAc,CAAA,CACnB,YAAY,oGAAoG,CAAA,CAChH,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA,CACjC,OAAO,iBAAiB,CAAA,CACxB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,MAAM,KAAA,CAAM,SAAA,EAAW,MAAM,KAAK,CAAA;AAE3D,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,OAAO,KAAA,CAAM;AAAA,KACf;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AChBO,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,aAAa,CAAA,CAClB,YAAY,iEAAiE,CAAA,CAC7E,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAC,CAAA,CAChC,OAAO,gBAAgB,CAAA,CACvB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,MAAM,SAAS,CAAA;AAE/C,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,SAAA,EAAW,MAAM,KAAA,CAAM,MAAA;AAAA,MACvB,QAAQ,MAAA,CAAO;AAAA,KACjB;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACjBO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,kBAAkB,CAAA,CACvB,YAAY,kEAAkE,CAAA,CAC9E,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,QAAA,EAAU,WAAA,EAAa,OAAO,CAAC,CAAA,CACrC,OAAO,qBAAqB,CAAA,CAC5B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,SAAS,KAAA,CAAM,IAAA,CAAK,UAAU,KAAA,CAAM,KAAA,EAAO,MAAM,GAAG,CAAA;AAE1D,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,GAAA,EAAK,KAAA,CAAM,GAAA,IAAO,KAAA,CAAM,IAAA,CAAK;AAAA,KAC/B;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AClBO,SAAS,sBAAA,GAAyB;AACvC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,eAAe,CAAA,CACpB,YAAY,4DAA4D,CAAA,CACxE,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,QAAA,EAAU,QAAA,EAAU,OAAO,CAAC,CAAA,CAClC,OAAO,kBAAkB,CAAA,CACzB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACrE,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAEnC,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,MAAM,IAAA,CAAK,MAAA;AAAA,MACvB,OAAO,KAAA,CAAM,MAAA;AAAA,MACb,OAAO,KAAA,CAAM;AAAA,KACf;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;ACZO,IAAM,sBAAsB,6BAAA;AAC5B,IAAM,aAAa,oBAAA;AACnB,IAAM,gBAAgB,uBAAA;AACtB,IAAM,cAAc,qBAAA;AACpB,IAAM,aAAa,oBAAA;AACnB,IAAM,kBAAkB,yBAAA;AACxB,IAAM,eAAe,sBAAA;AAGrB,IAAM,kBAAA,GAAqB;AAAA,EAChC,mBAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF;AAKO,SAAS,wBAAA,CAAyB,MAAA,GAAgC,EAAC,EAAG;AAC3E,EAAA,OAAO;AAAA,IACL,6BAAA,EAA8B;AAAA,IAC9B,oBAAA,EAAqB;AAAA,IACrB,uBAAA,EAAwB;AAAA,IACxB,qBAAA,EAAsB;AAAA,IACtB,oBAAA,EAAqB;AAAA,IACrB,yBAAA,EAA0B;AAAA,IAC1B,sBAAA;AAAuB,GACzB;AACF;ACvCO,IAAM,gBAAA,GAAmBF,MAAE,MAAA,CAAO;AAAA,EACvC,SAAA,EAAWA,KAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,UAAA,EAAY,UAAA,EAAY,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAC,CAAA,CAAE,SAAS,mCAAmC,CAAA;AAAA,EAC5H,CAAA,EAAGA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,cAAc,CAAA;AAAA,EACrC,CAAA,EAAGA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,eAAe;AACxC,CAAC;AAKM,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,UAAUA,KAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,OAAO,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,KAAK,CAAC,CAAA,CAAE,SAAS,gCAAgC,CAAA;AAAA,EACxI,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,aAAa;AAC1C,CAAC;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,GAAA,EAAKA,MAAE,MAAA,EAAO,CAAE,QAAQ,CAAC,CAAA,CAAE,SAAS,2BAA2B,CAAA;AAAA,EAC/D,GAAA,EAAKA,MAAE,MAAA,EAAO,CAAE,QAAQ,CAAC,CAAA,CAAE,SAAS,gEAAgE,CAAA;AAAA,EACpG,OAAA,EAASA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,+CAA+C;AAC9F,CAAC;AAKM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,OAAA,EAASA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,cAAc,CAAC,CAAA,CAAE,QAAA,CAAS,6BAA6B;AAC9F,CAAC;;;AC3BM,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAOC,gBAAAA,EAAY,CAChB,IAAA,CAAK,YAAY,CAAA,CACjB,YAAY,sFAAsF,CAAA,CAClG,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,MAAA,EAAQ,YAAA,EAAc,YAAY,CAAC,CAAA,CACzC,OAAO,gBAAgB,CAAA,CACvB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI,MAAA;AAEJ,IAAA,QAAQ,MAAM,SAAA;AAAW,MACvB,KAAK,KAAA;AACH,QAAA,MAAA,GAAS,KAAA,CAAM,IAAI,KAAA,CAAM,CAAA;AACzB,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,MAAA,GAAS,KAAA,CAAM,IAAI,KAAA,CAAM,CAAA;AACzB,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,MAAA,GAAS,KAAA,CAAM,IAAI,KAAA,CAAM,CAAA;AACzB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,IAAI,KAAA,CAAM,MAAM,CAAA,EAAG;AACjB,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO;AAAA,WACT;AAAA,QACF;AACA,QAAA,MAAA,GAAS,KAAA,CAAM,IAAI,KAAA,CAAM,CAAA;AACzB,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAClC,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,MAAA,GAAS,KAAA,CAAM,IAAI,KAAA,CAAM,CAAA;AACzB,QAAA;AAAA,MACF;AACE,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACT;AAAA;AAGJ,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,MAAA;AAAA,MACA,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,GAAG,KAAA,CAAM,CAAA;AAAA,MACT,GAAG,KAAA,CAAM;AAAA,KACX;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACnDO,SAAS,uBAAA,GAA0B;AACxC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,gBAAgB,CAAA,CACrB,YAAY,uFAAuF,CAAA,CACnG,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,MAAA,EAAQ,WAAA,EAAa,cAAc,CAAC,CAAA,CAC1C,OAAO,mBAAmB,CAAA,CAC1B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI;AACF,MAAA,QAAQ,MAAM,QAAA;AAAU,QACtB,KAAK,MAAA;AACH,UAAA,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAC7B,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAC/B,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAC/B,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAC7B,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAC7B,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAC7B,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAC7B,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAC7B,UAAA;AAAA,QACF;AACE,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO;AAAA,WACT;AAAA;AAGJ,MAAA,IAAI,MAAM,MAAM,CAAA,IAAK,CAAC,QAAA,CAAS,MAAM,CAAA,EAAG;AACtC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,MAAA;AAAA,QACA,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,OAAO,KAAA,CAAM;AAAA,OACf;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACtEO,SAAS,sBAAA,GAAyB;AACvC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,eAAe,CAAA,CACpB,YAAY,oFAAoF,CAAA,CAChG,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,QAAA,EAAU,QAAA,EAAU,WAAW,CAAC,CAAA,CACtC,OAAO,kBAAkB,CAAA,CACzB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,GAAA,GAAM,MAAM,GAAA,IAAO,CAAA;AACzB,IAAA,MAAM,GAAA,GAAM,MAAM,GAAA,IAAO,CAAA;AACzB,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,KAAA;AAEjC,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,MAAY,GAAA,GAAM,GAAA,GAAM,EAAE,CAAA,GAAI,GAAA;AAAA,IACzD,CAAA,MAAO;AACL,MAAA,MAAA,GAAS,IAAA,CAAK,MAAA,EAAO,IAAK,GAAA,GAAM,GAAA,CAAA,GAAO,GAAA;AAAA,IACzC;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC5BO,SAAS,oBAAA,GAAuB;AACrC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,YAAY,CAAA,CACjB,YAAY,mGAAmG,CAAA,CAC/G,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,MAAA,EAAQ,YAAA,EAAc,SAAA,EAAW,KAAK,CAAC,CAAA,CAC7C,MAAA,CAAO,gBAAgB,CAAA,CACvB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC9B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAA,CAAM,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACtD,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA;AACvD,IAAA,MAAM,OAAA,GAAU,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,MAAA;AACpC,IAAA,MAAM,GAAA,GAAM,OAAO,CAAC,CAAA;AACpB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAGpC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAS,CAAC,CAAA;AACxC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,GAAS,CAAA,KAAM,KAChC,MAAA,CAAO,GAAA,GAAM,CAAC,CAAA,GAAI,MAAA,CAAO,GAAG,CAAA,IAAK,CAAA,GAClC,OAAO,GAAG,CAAA;AAGd,IAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAI,OAAA,EAAS,CAAC,GAAG,CAAC,CAAA,GAAI,MAAM,OAAA,CAAQ,MAAA;AACrG,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAEjC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAO,MAAM,OAAA,CAAQ,MAAA;AAAA,MACrB,GAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAA;AAAA,MACA,iBAAA,EAAmB,MAAA;AAAA,MACnB;AAAA,KACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;ACzCO,IAAM,aAAa,oBAAA;AACnB,IAAM,gBAAgB,uBAAA;AACtB,IAAM,eAAe,sBAAA;AACrB,IAAM,aAAa,oBAAA;AAGnB,IAAM,kBAAA,GAAqB;AAAA,EAChC,UAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF;AAKO,SAAS,wBAAA,CAAyB,MAAA,GAA+B,EAAC,EAAG;AAC1E,EAAA,OAAO;AAAA,IACL,oBAAA,EAAqB;AAAA,IACrB,uBAAA,EAAwB;AAAA,IACxB,sBAAA,EAAuB;AAAA,IACvB,oBAAA;AAAqB,GACvB;AACF;AC3BO,IAAM,oBAAA,GAAuBF,MAAE,MAAA,CAAO;AAAA,EAC3C,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2BAA2B;AACxD,CAAC;AAKM,IAAM,wBAAA,GAA2BA,MAAE,MAAA,CAAO;AAAA,EAC/C,GAAA,EAAKA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,iBAAiB;AAC5C,CAAC;AAKM,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EAC3C,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0BAA0B,CAAA;AAAA,EACrD,MAAA,EAAQA,MAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,+CAA+C;AAC7F,CAAC;AAKM,IAAM,yBAAA,GAA4BA,MAAE,MAAA,CAAO;AAAA,EAChD,UAAA,EAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,gCAAgC;AAClE,CAAC;AAKM,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,EAAA,EAAIA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wBAAwB,CAAA;AAAA,EAChD,OAAA,EAASA,KAAAA,CAAE,IAAA,CAAK,CAAC,IAAA,EAAM,IAAA,EAAM,KAAK,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA,CAAE,SAAS,gCAAgC;AAC/F,CAAC;AAKM,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,kBAAkB;AAC9C,CAAC;;;ACtCM,SAAS,wBAAA,GAA2B;AACzC,EAAA,OAAOC,gBAAAA,EAAY,CAChB,IAAA,CAAK,iBAAiB,CAAA,CACtB,YAAY,uDAAuD,CAAA,CACnE,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,YAAA,EAAc,OAAA,EAAS,UAAU,CAAC,CAAA,CACxC,OAAO,oBAAoB,CAAA,CAC3B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,UAAA,GAAa,4BAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAEzC,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAA,EAAS,QAAQ,qBAAA,GAAwB;AAAA,KAC3C;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AClBO,SAAS,4BAAA,GAA+B;AAC7C,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,sBAAsB,CAAA,CAC3B,YAAY,6CAA6C,CAAA,CACzD,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,YAAA,EAAc,KAAA,EAAO,UAAU,CAAC,CAAA,CACtC,OAAO,wBAAwB,CAAA,CAC/B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,IAAI;AACF,MAAA,IAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACjB,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,IAAA;AAAA,QACP,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,OAAA,EAAS;AAAA,OACX;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACxBO,SAAS,wBAAA,GAA2B;AACzC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,iBAAiB,CAAA,CACtB,YAAY,8FAA8F,CAAA,CAC1G,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,YAAA,EAAc,OAAA,EAAS,UAAU,CAAC,CAAA,CACxC,OAAO,oBAAoB,CAAA,CAC3B,SAAA,CAAU,OAAO,KAAA,KAAU;AAG1B,IAAA,MAAM,UAAA,GAAa,mBAAA;AACnB,IAAA,MAAM,WAAA,GAAc,oBAAA;AAEpB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,WAAA,GAAc,UAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA;AAEvD,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAA,EAAS,QAAQ,2BAAA,GAA8B;AAAA,KACjD;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACvBO,SAAS,6BAAA,GAAgC;AAC9C,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,uBAAuB,CAAA,CAC5B,YAAY,8EAA8E,CAAA,CAC1F,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,YAAA,EAAc,aAAA,EAAe,UAAA,EAAY,MAAM,CAAC,CAAA,CACtD,MAAA,CAAO,yBAAyB,CAAA,CAChC,SAAA,CAAU,OAAO,KAAA,KAAU;AAG1B,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,WAAW,EAAE,CAAA;AAGtD,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AAC1B,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,MAAA,GAAS,KAAA;AAEb,IAAA,KAAA,IAAS,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC5C,MAAA,IAAI,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAG,EAAE,CAAA;AAEnC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,KAAA,IAAS,CAAA;AACT,QAAA,IAAI,QAAQ,CAAA,EAAG;AACb,UAAA,KAAA,IAAS,CAAA;AAAA,QACX;AAAA,MACF;AAEA,MAAA,GAAA,IAAO,KAAA;AACP,MAAA,MAAA,GAAS,CAAC,MAAA;AAAA,IACZ;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,KAAO,CAAA;AAE3B,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,OAAA,EAAS,QAAQ,0BAAA,GAA6B;AAAA,KAChD;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AC/CO,SAAS,qBAAA,GAAwB;AACtC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,cAAc,CAAA,CACnB,YAAY,uDAAuD,CAAA,CACnE,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,YAAA,EAAc,IAAA,EAAM,UAAA,EAAY,SAAS,CAAC,CAAA,CAChD,MAAA,CAAO,iBAAiB,CAAA,CACxB,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,SAAA,GAAY,yBAAA;AAClB,IAAA,MAAM,SAAA,GAAY,0CAAA;AAElB,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,IAAI,eAAA;AAEJ,IAAA,IAAI,KAAA,CAAM,OAAA,KAAY,IAAA,IAAQ,KAAA,CAAM,YAAY,KAAA,EAAO;AACrD,MAAA,IAAI,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,EAAG;AAE5B,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA;AAChC,QAAA,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAA,IAAA,KAAQ;AAC1B,UAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AAC7B,UAAA,OAAO,GAAA,IAAO,KAAK,GAAA,IAAO,GAAA;AAAA,QAC5B,CAAC,CAAA;AACD,QAAA,IAAI,OAAO,eAAA,GAAkB,MAAA;AAAA,MAC/B;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,KAAU,KAAA,CAAM,YAAY,IAAA,IAAQ,KAAA,CAAM,YAAY,KAAA,CAAA,EAAQ;AACjE,MAAA,IAAI,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,EAAG;AAC5B,QAAA,KAAA,GAAQ,IAAA;AACR,QAAA,eAAA,GAAkB,MAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,OAAA,EAAS,eAAA;AAAA,MACT,OAAA,EAAS,KAAA,GAAQ,CAAA,MAAA,EAAS,eAAe,CAAA,QAAA,CAAA,GAAa;AAAA,KACxD;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;ACzCO,SAAS,uBAAA,GAA0B;AACxC,EAAA,OAAOD,gBAAAA,EAAY,CAChB,IAAA,CAAK,gBAAgB,CAAA,CACrB,YAAY,2DAA2D,CAAA,CACvE,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,KAAK,CAAC,YAAA,EAAc,MAAA,EAAQ,UAAA,EAAY,MAAM,CAAC,CAAA,CAC/C,MAAA,CAAO,mBAAmB,CAAA,CAC1B,SAAA,CAAU,OAAO,KAAA,KAAU;AAC1B,IAAA,MAAM,SAAA,GAAY,4EAAA;AAClB,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAEvC,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,EAAE,GAAG,EAAE,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAA;AAAA,MACA,OAAA,EAAS,KAAA,GAAQ,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA,GAAK;AAAA,KAC9C;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;;;ACnBO,IAAM,iBAAiB,wBAAA;AACvB,IAAM,qBAAqB,4BAAA;AAC3B,IAAM,iBAAiB,wBAAA;AACvB,IAAM,sBAAsB,6BAAA;AAC5B,IAAM,cAAc,qBAAA;AACpB,IAAM,gBAAgB,uBAAA;AAGtB,IAAM,eAAA,GAAkB;AAAA,EAC7B,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF;AAKO,SAAS,qBAAA,CAAsB,MAAA,GAA2B,EAAC,EAAG;AACnE,EAAA,OAAO;AAAA,IACL,wBAAA,EAAyB;AAAA,IACzB,4BAAA,EAA6B;AAAA,IAC7B,wBAAA,EAAyB;AAAA,IACzB,6BAAA,EAA8B;AAAA,IAC9B,qBAAA,EAAsB;AAAA,IACtB,uBAAA;AAAwB,GAC1B;AACF;ACjCO,IAAM,mBAAA,GAAsBF,MAAE,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA,EAI1C,QAAA,EAAUA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,SAAS,+BAA+B,CAAA;AAAA;AAAA;AAAA;AAAA,EAKpE,OAAA,EAASA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,qCAAqC,CAAA;AAAA;AAAA;AAAA;AAAA,EAKpF,QAAA,EAAUA,KAAAA,CAAE,IAAA,CAAK,CAAC,OAAO,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAC,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA,CAAE,SAAS,iCAAiC,CAAA;AAAA;AAAA;AAAA;AAAA,EAKpH,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,QAAA,CAAS,0CAA0C,CAAA;AAAA;AAAA;AAAA;AAAA,EAKzF,iBAAiBA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,oCAAoC,CAAA;AAAA;AAAA;AAAA;AAAA,EAKpF,WAAA,EAAaA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,mCAAmC;AAC1F,CAAC;AC9BD,IAAMe,YAAY,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,WAAA,MAA8BJ,aAAAA,CAAS,IAAA;AAChF,IAAMD,UAASE,iBAAAA,CAAa,UAAA,EAAY,EAAE,KAAA,EAAOG,WAAU,CAAA;AAuBpD,SAAS,kBAAA,GAAqB;AACnC,EAAA,OAAOd,gBAAAA,EAAY,CAChB,IAAA,CAAK,WAAW,CAAA,CAChB,WAAA;AAAA,IACC;AAAA,GAGF,CACC,QAAA,CAASC,iBAAAA,CAAa,OAAO,CAAA,CAC7B,OAAO,mBAAmB,CAAA,CAC1B,SAAA,CAAU,OAAO,KAAA,KAAmC;AAEnD,IAAA,MAAM,cAAA,GAAiB,KAAA;AACvB,IAAA,MAAM,YAAY6D,iBAAA,EAAW;AAC7B,IAAA,MAAM,WAAA,GAAc,KAAK,GAAA,EAAI;AAI7B,IAAA,IAAI,SAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,OAAO,sBAAsB,CAAA;AACrD,MAAA,SAAA,GAAa,SAAA,CAAkB,SAAA;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,EAAA,EAAI,SAAA;AAAA,MACJ,UAAU,cAAA,CAAe,QAAA;AAAA,MACzB,SAAS,cAAA,CAAe,OAAA;AAAA,MACxB,UAAU,cAAA,CAAe,QAAA;AAAA,MACzB,SAAA,EAAW,WAAA;AAAA,MACX,SAAS,cAAA,CAAe,OAAA;AAAA,MACxB,iBAAiB,cAAA,CAAe,eAAA;AAAA,MAChC,aAAa,cAAA,CAAe,WAAA;AAAA,MAC5B,MAAA,EAAQ;AAAA,KACV;AAKA,IAAArD,OAAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,cAAc,CAAA;AAE1D,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,UAAU,YAAY,CAAA;AACjC,MAAAA,OAAAA,CAAO,MAAM,mCAAA,EAAqC,EAAE,UAAU,YAAA,EAAc,OAAO,UAAU,CAAA;AAAA,IAC/F,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,MAAM,uDAAA,EAAyD;AAAA,QACpE,SAAA,EAAW,OAAO,WAAA,EAAa,IAAA;AAAA,QAC/B,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC7D,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,MAAM,WAAA,GAAc,KAAK,GAAA,EAAI;AAC7B,IAAA,MAAM,WAAW,WAAA,GAAc,WAAA;AAG/B,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,OAAA,GAAU,CAAA,IAAK,YAAY,cAAA,CAAe,OAAA;AAG1E,IAAA,MAAM,gBAAgB,QAAA,IAAY,cAAA,CAAe,eAAA,GAC7C,cAAA,CAAe,kBACd,QAAA,IAAY,EAAA;AAEjB,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,aAAA;AAAA,MACV,QAAA,EAAU;AAAA,QACR,SAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAU,cAAA,CAAe;AAAA;AAC3B,KACF;AAAA,EACF,CAAC,EACA,KAAA,EAAM;AACX;AAeO,IAAM,eAAe,kBAAA","file":"index.cjs","sourcesContent":["/**\n * HTTP Tools Types\n * \n * Type definitions for HTTP client tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * HTTP method enum\n */\nexport const HttpMethod = z.enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS']);\n\n/**\n * HTTP request schema\n */\nexport const httpRequestSchema = z.object({\n url: z.string().url().describe('The URL to make the request to'),\n method: HttpMethod.default('GET').describe('HTTP method to use'),\n headers: z.record(z.string()).optional().describe('Optional HTTP headers'),\n body: z.any().optional().describe('Optional request body (for POST, PUT, PATCH)'),\n timeout: z.number().default(30000).describe('Request timeout in milliseconds'),\n params: z.record(z.string()).optional().describe('Optional URL query parameters'),\n});\n\n/**\n * HTTP response type\n */\nexport interface HttpResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n data: any;\n url: string;\n method: string;\n}\n\n/**\n * HTTP GET request schema\n */\nexport const httpGetSchema = z.object({\n url: z.string().url().describe('The URL to fetch'),\n headers: z.record(z.string()).optional().describe('Optional HTTP headers'),\n params: z.record(z.string()).optional().describe('Optional URL query parameters'),\n});\n\n/**\n * HTTP POST request schema\n */\nexport const httpPostSchema = z.object({\n url: z.string().url().describe('The URL to post to'),\n body: z.any().describe('The request body (will be sent as JSON)'),\n headers: z.record(z.string()).optional().describe('Optional HTTP headers'),\n});\n\n/**\n * HTTP tools configuration\n */\nexport interface HttpToolsConfig {\n defaultTimeout?: number;\n defaultHeaders?: Record<string, string>;\n}\n\n","/**\n * HTTP Client Tool\n * \n * Make HTTP requests with support for GET, POST, PUT, DELETE, PATCH methods.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport axios, { AxiosRequestConfig } from 'axios';\nimport { httpRequestSchema, HttpResponse } from '../types.js';\n\n/**\n * Create HTTP client tool\n * \n * @param defaultTimeout - Default timeout in milliseconds\n * @param defaultHeaders - Default headers to include in all requests\n * \n * @example\n * ```ts\n * const result = await httpClient.execute({\n * url: 'https://api.example.com/data',\n * method: 'GET',\n * headers: { 'Authorization': 'Bearer token' }\n * });\n * ```\n */\nexport function createHttpClientTool(\n defaultTimeout: number = 30000,\n defaultHeaders: Record<string, string> = {}\n) {\n return toolBuilder()\n .name('http-client')\n .description('Make HTTP requests to web APIs and services. Supports GET, POST, PUT, DELETE, PATCH methods with custom headers and body.')\n .category(ToolCategory.WEB)\n .tags(['http', 'api', 'request', 'web'])\n .schema(httpRequestSchema)\n .implement(async (input): Promise<HttpResponse> => {\n const config: AxiosRequestConfig = {\n method: input.method,\n url: input.url,\n headers: { ...defaultHeaders, ...input.headers },\n data: input.body,\n timeout: input.timeout ?? defaultTimeout,\n params: input.params,\n validateStatus: () => true, // Don't throw on any status code\n };\n\n const response = await axios(config);\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers as Record<string, string>,\n data: response.data,\n url: input.url,\n method: input.method ?? 'GET',\n };\n })\n .build();\n}\n\n","/**\n * HTTP GET Tool\n * \n * Make simple HTTP GET requests.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport axios from 'axios';\nimport { httpGetSchema } from '../types.js';\n\n/**\n * Create HTTP GET tool\n * \n * @param defaultTimeout - Default timeout in milliseconds\n * @param defaultHeaders - Default headers to include in all requests\n */\nexport function createHttpGetTool(\n defaultTimeout: number = 30000,\n defaultHeaders: Record<string, string> = {}\n) {\n return toolBuilder()\n .name('http-get')\n .description('Make a simple HTTP GET request to a URL and return the response data.')\n .category(ToolCategory.WEB)\n .tags(['http', 'get', 'fetch', 'web'])\n .schema(httpGetSchema)\n .implement(async (input) => {\n const response = await axios.get(input.url, {\n headers: { ...defaultHeaders, ...input.headers },\n params: input.params,\n timeout: defaultTimeout,\n });\n return response.data;\n })\n .build();\n}\n\n","/**\n * HTTP POST Tool\n * \n * Make simple HTTP POST requests with JSON body.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport axios from 'axios';\nimport { httpPostSchema } from '../types.js';\n\n/**\n * Create HTTP POST tool\n * \n * @param defaultTimeout - Default timeout in milliseconds\n * @param defaultHeaders - Default headers to include in all requests\n */\nexport function createHttpPostTool(\n defaultTimeout: number = 30000,\n defaultHeaders: Record<string, string> = {}\n) {\n return toolBuilder()\n .name('http-post')\n .description('Make a simple HTTP POST request with JSON body and return the response data.')\n .category(ToolCategory.WEB)\n .tags(['http', 'post', 'api', 'web'])\n .schema(httpPostSchema)\n .implement(async (input) => {\n const response = await axios.post(input.url, input.body, {\n headers: {\n 'Content-Type': 'application/json',\n ...defaultHeaders,\n ...input.headers,\n },\n timeout: defaultTimeout,\n });\n return response.data;\n })\n .build();\n}\n\n","/**\n * HTTP Tools\n * \n * Tools for making HTTP requests to web APIs and services.\n */\n\nimport { createHttpClientTool } from './tools/http-client.js';\nimport { createHttpGetTool } from './tools/http-get.js';\nimport { createHttpPostTool } from './tools/http-post.js';\nimport type { HttpToolsConfig } from './types.js';\n\n// Export types\nexport * from './types.js';\n\n// Default tool instances\nexport const httpClient = createHttpClientTool();\nexport const httpGet = createHttpGetTool();\nexport const httpPost = createHttpPostTool();\n\n// Tools array\nexport const httpTools = [httpClient, httpGet, httpPost];\n\n/**\n * Create HTTP tools with custom configuration\n * \n * @param config - Configuration options for HTTP tools\n * @returns Array of configured HTTP tools\n * \n * @example\n * ```ts\n * const tools = createHttpTools({\n * defaultTimeout: 60000,\n * defaultHeaders: { 'User-Agent': 'MyApp/1.0' }\n * });\n * ```\n */\nexport function createHttpTools(config: HttpToolsConfig = {}) {\n const { defaultTimeout = 30000, defaultHeaders = {} } = config;\n\n return [\n createHttpClientTool(defaultTimeout, defaultHeaders),\n createHttpGetTool(defaultTimeout, defaultHeaders),\n createHttpPostTool(defaultTimeout, defaultHeaders),\n ];\n}\n\n","/**\n * Web Scraper Types\n * \n * Type definitions for web scraping tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * Scraper result type\n */\nexport interface ScraperResult {\n url: string;\n title?: string;\n text?: string;\n html?: string;\n links?: string[];\n images?: string[];\n metadata?: Record<string, string>;\n selected?: any;\n}\n\n/**\n * Scraper tools configuration\n */\nexport interface ScraperToolsConfig {\n defaultTimeout?: number;\n userAgent?: string;\n}\n\n/**\n * Web scraper input schema\n */\nexport const webScraperSchema = z.object({\n url: z.string().url().describe('The URL of the web page to scrape'),\n selector: z.string().optional().describe('Optional CSS selector to extract specific elements'),\n extractText: z.boolean().default(true).describe('Extract text content from the page'),\n extractHtml: z.boolean().default(false).describe('Extract raw HTML content'),\n extractLinks: z.boolean().default(false).describe('Extract all links from the page'),\n extractImages: z.boolean().default(false).describe('Extract all image URLs from the page'),\n extractMetadata: z.boolean().default(false).describe('Extract meta tags (title, description, etc.)'),\n timeout: z.number().default(30000).describe('Request timeout in milliseconds'),\n});\n\n","/**\n * Web Scraper Tool\n * \n * Scrape and extract data from web pages using CSS selectors.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport axios from 'axios';\nimport * as cheerio from 'cheerio';\nimport { webScraperSchema, type ScraperResult } from '../types.js';\n\n/**\n * Create a web scraper tool\n * \n * @param defaultTimeout - Default timeout in milliseconds\n * @param userAgent - User agent string for requests\n * @returns Web scraper tool\n * \n * @example\n * ```ts\n * const scraper = createWebScraperTool(60000, 'MyBot/1.0');\n * const result = await scraper.execute({\n * url: 'https://example.com',\n * selector: 'article h1',\n * extractText: true\n * });\n * ```\n */\nexport function createWebScraperTool(\n defaultTimeout: number = 30000,\n userAgent: string = 'Mozilla/5.0 (compatible; AgentForge/1.0; +https://agentforge.dev)'\n) {\n return toolBuilder()\n .name('web-scraper')\n .description('Scrape and extract data from web pages. Can extract text, HTML, links, images, and use CSS selectors to target specific elements.')\n .category(ToolCategory.WEB)\n .tags(['scraper', 'web', 'html', 'extract', 'parse'])\n .schema(webScraperSchema)\n .implement(async (input): Promise<ScraperResult> => {\n // Fetch the page\n const response = await axios.get(input.url, {\n timeout: input.timeout || defaultTimeout,\n headers: {\n 'User-Agent': userAgent,\n },\n });\n\n const html = response.data;\n const $ = cheerio.load(html);\n\n const result: ScraperResult = {\n url: input.url,\n };\n\n // Apply selector if provided\n const $selected = input.selector ? $(input.selector) : $('body');\n\n // Extract text\n if (input.extractText) {\n result.text = $selected.text().trim();\n }\n\n // Extract HTML\n if (input.extractHtml) {\n result.html = $selected.html() || '';\n }\n\n // Extract links\n if (input.extractLinks) {\n result.links = [];\n $('a[href]').each((_, el) => {\n const href = $(el).attr('href');\n if (href) {\n // Convert relative URLs to absolute\n try {\n const absoluteUrl = new URL(href, input.url).href;\n result.links!.push(absoluteUrl);\n } catch {\n result.links!.push(href);\n }\n }\n });\n }\n\n // Extract images\n if (input.extractImages) {\n result.images = [];\n $('img[src]').each((_, el) => {\n const src = $(el).attr('src');\n if (src) {\n // Convert relative URLs to absolute\n try {\n const absoluteUrl = new URL(src, input.url).href;\n result.images!.push(absoluteUrl);\n } catch {\n result.images!.push(src);\n }\n }\n });\n }\n\n // Extract metadata\n if (input.extractMetadata) {\n result.metadata = {};\n \n // Title\n const title = $('title').text() || $('meta[property=\"og:title\"]').attr('content');\n if (title) result.metadata.title = title;\n\n // Description\n const description = $('meta[name=\"description\"]').attr('content') || \n $('meta[property=\"og:description\"]').attr('content');\n if (description) result.metadata.description = description;\n\n // Other meta tags\n $('meta[name], meta[property]').each((_, el) => {\n const name = $(el).attr('name') || $(el).attr('property');\n const content = $(el).attr('content');\n if (name && content) {\n result.metadata![name] = content;\n }\n });\n }\n\n // If selector was provided, return the selected elements\n if (input.selector) {\n result.selected = $selected.map((_, el) => ({\n text: $(el).text().trim(),\n html: $(el).html(),\n })).get();\n }\n\n return result;\n })\n .build();\n}\n\n","/**\n * Web Scraper Tools\n * \n * Tools for scraping and extracting data from web pages.\n */\n\n// Export types\nexport type { ScraperResult, ScraperToolsConfig } from './types.js';\nexport { webScraperSchema } from './types.js';\n\n// Export tool factory\nexport { createWebScraperTool } from './tools/web-scraper.js';\nimport { createWebScraperTool } from './tools/web-scraper.js';\n\n// Default tool instance\nexport const webScraper = createWebScraperTool();\n\n// Tools array\nexport const scraperTools = [webScraper];\n\n/**\n * Create scraper tools with custom configuration\n * \n * @param config - Configuration options\n * @returns Array of scraper tools\n * \n * @example\n * ```ts\n * const tools = createScraperTools({\n * defaultTimeout: 60000,\n * userAgent: 'MyBot/1.0'\n * });\n * ```\n */\nexport function createScraperTools(config: import('./types.js').ScraperToolsConfig = {}) {\n const { defaultTimeout = 30000, userAgent = 'Mozilla/5.0 (compatible; AgentForge/1.0; +https://agentforge.dev)' } = config;\n return [createWebScraperTool(defaultTimeout, userAgent)];\n}\n\n","/**\n * HTML Parser Types\n * \n * Type definitions for HTML parsing tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * HTML parser tools configuration\n */\nexport interface HtmlParserToolsConfig {\n // No specific config needed for HTML parser tools currently\n}\n\n/**\n * HTML parser input schema\n */\nexport const htmlParserSchema = z.object({\n html: z.string().describe('The HTML content to parse'),\n selector: z.string().describe('CSS selector to find elements'),\n extractText: z.boolean().default(true).describe('Extract text content from selected elements'),\n extractHtml: z.boolean().default(false).describe('Extract inner HTML of selected elements'),\n extractAttributes: z.array(z.string().describe(\"String value\")).optional().describe('List of attributes to extract (e.g., [\"href\", \"src\", \"class\"])'),\n});\n\n/**\n * Extract links input schema\n */\nexport const extractLinksSchema = z.object({\n html: z.string().describe('The HTML content to extract links from'),\n baseUrl: z.string().url().optional().describe('Optional base URL to resolve relative links'),\n});\n\n/**\n * Extract images input schema\n */\nexport const extractImagesSchema = z.object({\n html: z.string().describe('The HTML content to extract images from'),\n baseUrl: z.string().url().optional().describe('Optional base URL to resolve relative image URLs'),\n});\n\n","/**\n * HTML Parser Tool\n * \n * Parse HTML content and extract data using CSS selectors.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport * as cheerio from 'cheerio';\nimport { htmlParserSchema } from '../types.js';\n\n/**\n * Create an HTML parser tool\n * \n * @returns HTML parser tool\n * \n * @example\n * ```ts\n * const parser = createHtmlParserTool();\n * const result = await parser.execute({\n * html: '<div class=\"content\"><h1>Title</h1><p>Text</p></div>',\n * selector: '.content h1'\n * });\n * ```\n */\nexport function createHtmlParserTool() {\n return toolBuilder()\n .name('html-parser')\n .description('Parse HTML content and extract data using CSS selectors. Returns text, attributes, and structure of selected elements.')\n .category(ToolCategory.WEB)\n .tags(['html', 'parser', 'css', 'selector', 'extract'])\n .schema(htmlParserSchema)\n .implement(async (input) => {\n const $ = cheerio.load(input.html);\n const $selected = $(input.selector);\n\n const results = $selected.map((_, el) => {\n const $el = $(el);\n const item: any = {};\n\n if (input.extractText) {\n item.text = $el.text().trim();\n }\n\n if (input.extractHtml) {\n item.html = $el.html();\n }\n\n if (input.extractAttributes && input.extractAttributes.length > 0) {\n item.attributes = {};\n for (const attr of input.extractAttributes) {\n const value = $el.attr(attr);\n if (value !== undefined) {\n item.attributes[attr] = value;\n }\n }\n }\n\n return item;\n }).get();\n\n return {\n count: results.length,\n results,\n };\n })\n .build();\n}\n\n","/**\n * Extract Links Tool\n * \n * Extract all links from HTML content.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport * as cheerio from 'cheerio';\nimport { extractLinksSchema } from '../types.js';\n\n/**\n * Create an extract links tool\n * \n * @returns Extract links tool\n * \n * @example\n * ```ts\n * const extractor = createExtractLinksTool();\n * const result = await extractor.execute({\n * html: '<a href=\"/page\">Link</a>',\n * baseUrl: 'https://example.com'\n * });\n * ```\n */\nexport function createExtractLinksTool() {\n return toolBuilder()\n .name('extract-links')\n .description('Extract all links (anchor tags) from HTML content with their text and href attributes.')\n .category(ToolCategory.WEB)\n .tags(['html', 'links', 'extract', 'anchor'])\n .schema(extractLinksSchema)\n .implement(async (input) => {\n const $ = cheerio.load(input.html);\n const links: Array<{ text: string; href: string; title?: string }> = [];\n\n $('a[href]').each((_, el) => {\n const $el = $(el);\n let href = $el.attr('href') || '';\n \n // Resolve relative URLs if baseUrl is provided\n if (input.baseUrl && href) {\n try {\n href = new URL(href, input.baseUrl).href;\n } catch {\n // Keep original href if URL parsing fails\n }\n }\n\n links.push({\n text: $el.text().trim(),\n href,\n title: $el.attr('title'),\n });\n });\n\n return {\n count: links.length,\n links,\n };\n })\n .build();\n}\n\n","/**\n * Extract Images Tool\n * \n * Extract all images from HTML content.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport * as cheerio from 'cheerio';\nimport { extractImagesSchema } from '../types.js';\n\n/**\n * Create an extract images tool\n * \n * @returns Extract images tool\n * \n * @example\n * ```ts\n * const extractor = createExtractImagesTool();\n * const result = await extractor.execute({\n * html: '<img src=\"/image.jpg\" alt=\"Image\">',\n * baseUrl: 'https://example.com'\n * });\n * ```\n */\nexport function createExtractImagesTool() {\n return toolBuilder()\n .name('extract-images')\n .description('Extract all images from HTML content with their src, alt, and other attributes.')\n .category(ToolCategory.WEB)\n .tags(['html', 'images', 'extract', 'img'])\n .schema(extractImagesSchema)\n .implement(async (input) => {\n const $ = cheerio.load(input.html);\n const images: Array<{ src: string; alt?: string; title?: string; width?: string; height?: string }> = [];\n\n $('img[src]').each((_, el) => {\n const $el = $(el);\n let src = $el.attr('src') || '';\n \n // Resolve relative URLs if baseUrl is provided\n if (input.baseUrl && src) {\n try {\n src = new URL(src, input.baseUrl).href;\n } catch {\n // Keep original src if URL parsing fails\n }\n }\n\n images.push({\n src,\n alt: $el.attr('alt'),\n title: $el.attr('title'),\n width: $el.attr('width'),\n height: $el.attr('height'),\n });\n });\n\n return {\n count: images.length,\n images,\n };\n })\n .build();\n}\n\n","/**\n * HTML Parser Tools\n * \n * Tools for parsing HTML content and extracting data.\n */\n\n// Export types\nexport type { HtmlParserToolsConfig } from './types.js';\nexport { htmlParserSchema, extractLinksSchema, extractImagesSchema } from './types.js';\n\n// Export tool factories\nexport { createHtmlParserTool } from './tools/html-parser.js';\nexport { createExtractLinksTool } from './tools/extract-links.js';\nexport { createExtractImagesTool } from './tools/extract-images.js';\n\n// Import for default instances\nimport { createHtmlParserTool } from './tools/html-parser.js';\nimport { createExtractLinksTool } from './tools/extract-links.js';\nimport { createExtractImagesTool } from './tools/extract-images.js';\n\n// Default tool instances\nexport const htmlParser = createHtmlParserTool();\nexport const extractLinks = createExtractLinksTool();\nexport const extractImages = createExtractImagesTool();\n\n// Tools array\nexport const htmlParserTools = [htmlParser, extractLinks, extractImages];\n\n/**\n * Create HTML parser tools with custom configuration\n * \n * @param config - Configuration options\n * @returns Array of HTML parser tools\n * \n * @example\n * ```ts\n * const tools = createHtmlParserTools();\n * ```\n */\nexport function createHtmlParserTools(config: import('./types.js').HtmlParserToolsConfig = {}) {\n return [\n createHtmlParserTool(),\n createExtractLinksTool(),\n createExtractImagesTool(),\n ];\n}\n\n","/**\n * URL Validator Types\n * \n * Type definitions for URL validation and manipulation tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * URL validation result\n */\nexport interface UrlValidationResult {\n url: string;\n protocol: string;\n hostname: string;\n port: string;\n pathname: string;\n search: string;\n hash: string;\n origin: string;\n}\n\n/**\n * URL validator tools configuration\n */\nexport interface UrlValidatorToolsConfig {\n // No specific config needed for URL validator tools currently\n}\n\n/**\n * URL validator input schema\n */\nexport const urlValidatorSchema = z.object({\n url: z.string().describe('The URL to validate and parse'),\n});\n\n/**\n * URL builder input schema\n */\nexport const urlBuilderSchema = z.object({\n protocol: z.string().default('https').describe('Protocol (http, https, etc.)'),\n hostname: z.string().describe('Hostname or domain name'),\n port: z.string().optional().describe('Optional port number'),\n pathname: z.string().default('/').describe('URL path'),\n query: z.record(z.string()).optional().describe('Query parameters as key-value pairs'),\n hash: z.string().optional().describe('URL hash/fragment'),\n});\n\n/**\n * URL query parser input schema\n */\nexport const urlQueryParserSchema = z.object({\n input: z.string().describe('URL or query string to parse (e.g., \"?foo=bar&baz=qux\" or full URL)'),\n});\n\n","/**\n * URL Validator Tool\n * \n * Validate and parse URLs.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { urlValidatorSchema, type UrlValidationResult } from '../types.js';\n\n/**\n * Create a URL validator tool\n * \n * @returns URL validator tool\n * \n * @example\n * ```ts\n * const validator = createUrlValidatorTool();\n * const result = await validator.execute({\n * url: 'https://example.com/path?query=value#hash'\n * });\n * ```\n */\nexport function createUrlValidatorTool() {\n return toolBuilder()\n .name('url-validator')\n .description('Validate and parse URLs. Returns detailed information about the URL structure including protocol, hostname, path, query parameters, and hash.')\n .category(ToolCategory.WEB)\n .tags(['url', 'validator', 'parse', 'validate'])\n .schema(urlValidatorSchema)\n .implementSafe(async (input): Promise<UrlValidationResult> => {\n const parsed = new URL(input.url);\n\n return {\n url: parsed.href,\n protocol: parsed.protocol,\n hostname: parsed.hostname,\n port: parsed.port,\n pathname: parsed.pathname,\n search: parsed.search,\n hash: parsed.hash,\n origin: parsed.origin,\n };\n })\n .build();\n}\n\n","/**\n * URL Builder Tool\n * \n * Build URLs from components.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { urlBuilderSchema } from '../types.js';\n\n/**\n * Create a URL builder tool\n * \n * @returns URL builder tool\n * \n * @example\n * ```ts\n * const builder = createUrlBuilderTool();\n * const result = await builder.execute({\n * protocol: 'https',\n * hostname: 'example.com',\n * pathname: '/path',\n * query: { foo: 'bar' }\n * });\n * ```\n */\nexport function createUrlBuilderTool() {\n return toolBuilder()\n .name('url-builder')\n .description('Build a URL from components (protocol, hostname, path, query parameters, hash).')\n .category(ToolCategory.WEB)\n .tags(['url', 'builder', 'construct'])\n .schema(urlBuilderSchema)\n .implement(async (input) => {\n const url = new URL(`${input.protocol}://${input.hostname}`);\n\n if (input.port) {\n url.port = input.port;\n }\n\n url.pathname = input.pathname ?? '/';\n \n if (input.query) {\n Object.entries(input.query).forEach(([key, value]) => {\n url.searchParams.append(key, value);\n });\n }\n \n if (input.hash) {\n url.hash = input.hash;\n }\n \n return {\n url: url.href,\n components: {\n protocol: url.protocol,\n hostname: url.hostname,\n port: url.port,\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n origin: url.origin,\n },\n };\n })\n .build();\n}\n\n","/**\n * URL Query Parser Tool\n * \n * Parse query parameters from URLs.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { urlQueryParserSchema } from '../types.js';\n\n/**\n * Create a URL query parser tool\n * \n * @returns URL query parser tool\n * \n * @example\n * ```ts\n * const parser = createUrlQueryParserTool();\n * const result = await parser.execute({\n * input: 'https://example.com?foo=bar&baz=qux'\n * });\n * ```\n */\nexport function createUrlQueryParserTool() {\n return toolBuilder()\n .name('url-query-parser')\n .description('Parse query parameters from a URL or query string into a key-value object.')\n .category(ToolCategory.WEB)\n .tags(['url', 'query', 'parse', 'params'])\n .schema(urlQueryParserSchema)\n .implement(async (input) => {\n let searchParams: URLSearchParams;\n \n try {\n // Try to parse as full URL first\n const url = new URL(input.input);\n searchParams = url.searchParams;\n } catch {\n // If that fails, treat as query string\n const queryString = input.input.startsWith('?') ? input.input.slice(1) : input.input;\n searchParams = new URLSearchParams(queryString);\n }\n \n const params: Record<string, string | string[]> = {};\n \n searchParams.forEach((value, key) => {\n if (params[key]) {\n // Handle multiple values for same key\n if (Array.isArray(params[key])) {\n (params[key] as string[]).push(value);\n } else {\n params[key] = [params[key] as string, value];\n }\n } else {\n params[key] = value;\n }\n });\n \n return {\n params,\n count: Object.keys(params).length,\n };\n })\n .build();\n}\n\n","/**\n * URL Validator Tools\n * \n * Tools for validating, parsing, and manipulating URLs.\n */\n\n// Export types\nexport type { UrlValidationResult, UrlValidatorToolsConfig } from './types.js';\nexport { urlValidatorSchema, urlBuilderSchema, urlQueryParserSchema } from './types.js';\n\n// Export tool factories\nexport { createUrlValidatorTool } from './tools/url-validator.js';\nexport { createUrlBuilderTool } from './tools/url-builder.js';\nexport { createUrlQueryParserTool } from './tools/url-query-parser.js';\n\n// Import for default instances\nimport { createUrlValidatorTool } from './tools/url-validator.js';\nimport { createUrlBuilderTool } from './tools/url-builder.js';\nimport { createUrlQueryParserTool } from './tools/url-query-parser.js';\n\n// Default tool instances\nexport const urlValidator = createUrlValidatorTool();\nexport const urlBuilder = createUrlBuilderTool();\nexport const urlQueryParser = createUrlQueryParserTool();\n\n// Tools array\nexport const urlValidatorTools = [urlValidator, urlBuilder, urlQueryParser];\n\n/**\n * Create URL validator tools with custom configuration\n * \n * @param config - Configuration options\n * @returns Array of URL validator tools\n * \n * @example\n * ```ts\n * const tools = createUrlValidatorTools();\n * ```\n */\nexport function createUrlValidatorTools(config: import('./types.js').UrlValidatorToolsConfig = {}) {\n return [\n createUrlValidatorTool(),\n createUrlBuilderTool(),\n createUrlQueryParserTool(),\n ];\n}\n\n","/**\n * Web Search Tool - Zod Schemas\n */\n\nimport { z } from 'zod';\n\n/**\n * Web search input schema\n */\nexport const webSearchSchema = z.object({\n query: z.string().min(1).describe('The search query'),\n maxResults: z\n .number()\n .min(1)\n .max(50)\n .default(10)\n .describe('Maximum number of results to return (1-50)'),\n preferSerper: z\n .boolean()\n .default(false)\n .describe('Prefer Serper API if available (requires SERPER_API_KEY)'),\n timeout: z\n .number()\n .min(1000)\n .max(60000)\n .default(30000)\n .describe('Request timeout in milliseconds (1000-60000, default: 30000)'),\n});\n\n/**\n * Search result schema\n */\nexport const searchResultSchema = z.object({\n title: z.string(),\n link: z.string().url(),\n snippet: z.string(),\n position: z.number().optional(),\n});\n\n/**\n * Web search output schema\n */\nexport const webSearchOutputSchema = z.object({\n success: z.boolean(),\n source: z.enum(['duckduckgo', 'serper']),\n query: z.string(),\n results: z.array(searchResultSchema),\n totalResults: z.number().optional(),\n error: z.string().optional(),\n metadata: z\n .object({\n responseTime: z.number().optional(),\n fallbackUsed: z.boolean().optional(),\n })\n .optional(),\n});\n\n","/**\n * Web Search Tool - Utility Functions\n */\n\nimport type { RetryConfig } from './types.js';\n\n/**\n * Get Serper API key from environment\n */\nexport function getSerperApiKey(): string | undefined {\n return process.env.SERPER_API_KEY;\n}\n\n/**\n * Check if Serper API is available\n */\nexport function isSerperAvailable(): boolean {\n return !!getSerperApiKey();\n}\n\n/**\n * Measure execution time of an async function\n */\nexport async function measureTime<T>(\n fn: () => Promise<T>\n): Promise<{ result: T; duration: number }> {\n const start = Date.now();\n const result = await fn();\n const duration = Date.now() - start;\n return { result, duration };\n}\n\n/**\n * Sanitize search query\n */\nexport function sanitizeQuery(query: string): string {\n return query.trim().replace(/\\s+/g, ' ');\n}\n\n/**\n * Default retry configuration\n */\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n initialDelay: 1000, // 1 second\n maxDelay: 10000, // 10 seconds\n backoffMultiplier: 2,\n};\n\n/**\n * Default timeout for search requests (30 seconds)\n */\nexport const DEFAULT_TIMEOUT = 30000;\n\n/**\n * Check if error is retryable (network errors, timeouts, 5xx errors)\n */\nexport function isRetryableError(error: any): boolean {\n // Network errors\n if (error.code === 'ECONNRESET' || error.code === 'ETIMEDOUT' || error.code === 'ENOTFOUND') {\n return true;\n }\n\n // Timeout errors\n if (error.code === 'ECONNABORTED' || error.message?.includes('timeout')) {\n return true;\n }\n\n // 5xx server errors (but not 4xx client errors)\n if (error.response?.status >= 500 && error.response?.status < 600) {\n return true;\n }\n\n // Rate limiting (429) - retryable with backoff\n if (error.response?.status === 429) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Sleep for specified milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry an async function with exponential backoff\n */\nexport async function retryWithBackoff<T>(\n fn: () => Promise<T>,\n config: RetryConfig = DEFAULT_RETRY_CONFIG\n): Promise<T> {\n let lastError: any;\n let delay = config.initialDelay;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error: any) {\n lastError = error;\n\n // Don't retry if error is not retryable\n if (!isRetryableError(error)) {\n throw error;\n }\n\n // Don't retry if we've exhausted all attempts\n if (attempt === config.maxRetries) {\n break;\n }\n\n // Wait before retrying\n await sleep(delay);\n\n // Increase delay for next attempt (exponential backoff)\n delay = Math.min(delay * config.backoffMultiplier, config.maxDelay);\n }\n }\n\n // All retries exhausted\n throw lastError;\n}\n\n","/**\n * DuckDuckGo Search Provider\n * \n * Free search provider using DuckDuckGo's Instant Answer API.\n * No API key required.\n */\n\nimport axios from 'axios';\nimport type { SearchProvider, SearchResult } from '../types.js';\nimport { retryWithBackoff, DEFAULT_TIMEOUT } from '../utils.js';\n\n/**\n * DuckDuckGo API response structure\n */\ninterface DuckDuckGoResponse {\n Abstract?: string;\n AbstractText?: string;\n AbstractSource?: string;\n AbstractURL?: string;\n Heading?: string;\n RelatedTopics?: Array<{\n Text?: string;\n FirstURL?: string;\n }>;\n Results?: Array<{\n Text?: string;\n FirstURL?: string;\n }>;\n}\n\n/**\n * DuckDuckGo search provider implementation\n */\nexport class DuckDuckGoProvider implements SearchProvider {\n name = 'duckduckgo' as const;\n\n /**\n * DuckDuckGo is always available (no API key required)\n */\n isAvailable(): boolean {\n return true;\n }\n\n /**\n * Search using DuckDuckGo Instant Answer API\n * @param query - Search query\n * @param maxResults - Maximum number of results to return\n * @param timeout - Request timeout in milliseconds (default: 30000)\n */\n async search(\n query: string,\n maxResults: number,\n timeout: number = DEFAULT_TIMEOUT\n ): Promise<SearchResult[]> {\n return retryWithBackoff(async () => {\n try {\n const response = await axios.get<DuckDuckGoResponse>(\n 'https://api.duckduckgo.com/',\n {\n params: {\n q: query,\n format: 'json',\n },\n headers: {\n 'User-Agent':\n 'Mozilla/5.0 (compatible; AgentForge/1.0; +https://github.com/agentforge)',\n },\n timeout,\n }\n );\n\n return this.normalizeResults(response.data, maxResults);\n } catch (error: any) {\n throw new Error(`DuckDuckGo search failed: ${error.message}`);\n }\n });\n }\n\n /**\n * Normalize DuckDuckGo response to SearchResult[]\n * Optimized for performance with large result sets\n */\n private normalizeResults(\n data: DuckDuckGoResponse,\n maxResults: number\n ): SearchResult[] {\n const results: SearchResult[] = [];\n\n // Early return if maxResults is 0\n if (maxResults <= 0) {\n return results;\n }\n\n // Add abstract as first result if available\n if (data.Abstract && data.AbstractURL) {\n results.push({\n title: data.Heading || 'Result',\n link: data.AbstractURL,\n snippet: data.Abstract,\n position: 1,\n });\n\n // Early return if we've reached maxResults\n if (results.length >= maxResults) {\n return results;\n }\n }\n\n // Add related topics (optimized: only process what we need)\n if (data.RelatedTopics && data.RelatedTopics.length > 0) {\n const remaining = maxResults - results.length;\n const topicsToProcess = data.RelatedTopics.slice(0, remaining);\n\n for (const topic of topicsToProcess) {\n if (topic.Text && topic.FirstURL) {\n // Cache split result to avoid redundant operations\n const titleParts = topic.Text.split(' - ');\n results.push({\n title: titleParts[0] || topic.Text,\n link: topic.FirstURL,\n snippet: topic.Text,\n position: results.length + 1,\n });\n }\n }\n\n // Early return if we've reached maxResults\n if (results.length >= maxResults) {\n return results;\n }\n }\n\n // Add regular results (optimized: only process what we need)\n if (data.Results && data.Results.length > 0) {\n const remaining = maxResults - results.length;\n const resultsToProcess = data.Results.slice(0, remaining);\n\n for (const result of resultsToProcess) {\n if (result.Text && result.FirstURL) {\n // Cache split result to avoid redundant operations\n const titleParts = result.Text.split(' - ');\n results.push({\n title: titleParts[0] || result.Text,\n link: result.FirstURL,\n snippet: result.Text,\n position: results.length + 1,\n });\n }\n }\n }\n\n return results;\n }\n}\n\n/**\n * Create a new DuckDuckGo provider instance\n */\nexport function createDuckDuckGoProvider(): DuckDuckGoProvider {\n return new DuckDuckGoProvider();\n}\n\n","/**\n * Serper Search Provider\n * \n * Premium search provider using Serper API (Google results).\n * Requires SERPER_API_KEY environment variable.\n * Get your API key at: https://serper.dev\n */\n\nimport axios from 'axios';\nimport type { SearchProvider, SearchResult } from '../types.js';\nimport { getSerperApiKey, retryWithBackoff, DEFAULT_TIMEOUT } from '../utils.js';\n\n/**\n * Serper API response structure\n */\ninterface SerperResponse {\n organic?: Array<{\n title?: string;\n link?: string;\n snippet?: string;\n position?: number;\n }>;\n searchParameters?: {\n q?: string;\n num?: number;\n };\n}\n\n/**\n * Serper search provider implementation\n */\nexport class SerperProvider implements SearchProvider {\n name = 'serper' as const;\n private apiKey: string | undefined;\n\n constructor() {\n this.apiKey = getSerperApiKey();\n }\n\n /**\n * Serper is available if API key is set\n */\n isAvailable(): boolean {\n return !!this.apiKey;\n }\n\n /**\n * Search using Serper API\n * @param query - Search query\n * @param maxResults - Maximum number of results to return\n * @param timeout - Request timeout in milliseconds (default: 30000)\n */\n async search(\n query: string,\n maxResults: number,\n timeout: number = DEFAULT_TIMEOUT\n ): Promise<SearchResult[]> {\n if (!this.apiKey) {\n throw new Error(\n 'Serper API key not found. Set SERPER_API_KEY environment variable. Get your key at https://serper.dev'\n );\n }\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post<SerperResponse>(\n 'https://google.serper.dev/search',\n {\n q: query,\n num: maxResults,\n },\n {\n headers: {\n 'X-API-KEY': this.apiKey,\n 'Content-Type': 'application/json',\n },\n timeout,\n }\n );\n\n return this.normalizeResults(response.data, maxResults);\n } catch (error: any) {\n if (error.response?.status === 401) {\n throw new Error(\n 'Invalid Serper API key. Get your key at https://serper.dev'\n );\n }\n if (error.response?.status === 429) {\n throw new Error(\n 'Serper API rate limit exceeded. Please try again later or upgrade your plan at https://serper.dev'\n );\n }\n throw new Error(`Serper search failed: ${error.message}`);\n }\n });\n }\n\n /**\n * Normalize Serper response to SearchResult[]\n * Optimized for performance with large result sets\n */\n private normalizeResults(\n data: SerperResponse,\n maxResults: number\n ): SearchResult[] {\n // Early return for empty results\n if (!data.organic || data.organic.length === 0 || maxResults <= 0) {\n return [];\n }\n\n // Pre-allocate array with expected size for better performance\n const results: SearchResult[] = [];\n\n // Only process the number of items we need (avoid processing entire array)\n const itemsToProcess = Math.min(data.organic.length, maxResults);\n\n for (let i = 0; i < itemsToProcess; i++) {\n const item = data.organic[i];\n\n // Skip items with missing required fields\n if (!item.title || !item.link || !item.snippet) {\n continue;\n }\n\n results.push({\n title: item.title,\n link: item.link,\n snippet: item.snippet,\n position: item.position ?? i + 1,\n });\n\n // Stop if we've collected enough results\n if (results.length >= maxResults) {\n break;\n }\n }\n\n return results;\n }\n}\n\n/**\n * Create a new Serper provider instance\n */\nexport function createSerperProvider(): SerperProvider {\n return new SerperProvider();\n}\n\n","/**\n * Web Search Tool\n * \n * Search the web using DuckDuckGo (free) or Serper (optional upgrade).\n * Provides smart fallback and normalized results.\n * \n * @example\n * ```ts\n * // Basic usage (no API key needed)\n * const result = await webSearch.invoke({\n * query: 'What is TypeScript?'\n * });\n * \n * // With Serper API key (set SERPER_API_KEY env var)\n * const result = await webSearch.invoke({\n * query: 'Best restaurants in SF 2026',\n * preferSerper: true\n * });\n * ```\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { webSearchSchema } from './schemas.js';\nimport { createDuckDuckGoProvider } from './providers/duckduckgo.js';\nimport { createSerperProvider } from './providers/serper.js';\nimport { measureTime, sanitizeQuery, DEFAULT_TIMEOUT } from './utils.js';\nimport type { WebSearchInput, WebSearchOutput, SearchProvider } from './types.js';\n\n/**\n * Web search tool implementation\n */\nexport const webSearch = toolBuilder()\n .name('web-search')\n .description(\n 'Search the web for information using DuckDuckGo (free) or Serper API (optional). ' +\n 'Returns structured search results with titles, links, and snippets. ' +\n 'Automatically falls back to Serper if DuckDuckGo returns no results and API key is available.'\n )\n .category(ToolCategory.WEB)\n .tags(['search', 'web', 'google', 'duckduckgo', 'serper', 'internet'])\n .schema(webSearchSchema)\n .implement(async (input: WebSearchInput): Promise<WebSearchOutput> => {\n const {\n query,\n maxResults = 10,\n preferSerper = false,\n timeout = DEFAULT_TIMEOUT\n } = input;\n\n // Sanitize query\n const sanitizedQuery = sanitizeQuery(query);\n\n // Initialize providers\n const duckduckgo = createDuckDuckGoProvider();\n const serper = createSerperProvider();\n\n // Determine which provider to use\n let primaryProvider: SearchProvider;\n let fallbackProvider: SearchProvider | null = null;\n\n if (preferSerper && serper.isAvailable()) {\n primaryProvider = serper;\n fallbackProvider = duckduckgo;\n } else {\n primaryProvider = duckduckgo;\n fallbackProvider = serper.isAvailable() ? serper : null;\n }\n\n try {\n // Try primary provider\n const { result: results, duration } = await measureTime(() =>\n primaryProvider.search(sanitizedQuery, maxResults, timeout)\n );\n\n // If primary provider returns results, return them\n if (results.length > 0) {\n return {\n success: true,\n source: primaryProvider.name,\n query: sanitizedQuery,\n results,\n totalResults: results.length,\n metadata: {\n responseTime: duration,\n fallbackUsed: false,\n },\n };\n }\n\n // If no results and fallback is available, try fallback\n if (fallbackProvider) {\n const { result: fallbackResults, duration: fallbackDuration } =\n await measureTime(() =>\n fallbackProvider!.search(sanitizedQuery, maxResults, timeout)\n );\n\n return {\n success: true,\n source: fallbackProvider.name,\n query: sanitizedQuery,\n results: fallbackResults,\n totalResults: fallbackResults.length,\n metadata: {\n responseTime: fallbackDuration,\n fallbackUsed: true,\n },\n };\n }\n\n // No results from either provider\n return {\n success: true,\n source: primaryProvider.name,\n query: sanitizedQuery,\n results: [],\n totalResults: 0,\n metadata: {\n responseTime: duration,\n fallbackUsed: false,\n },\n };\n } catch (error: any) {\n // Error occurred\n return {\n success: false,\n source: primaryProvider.name,\n query: sanitizedQuery,\n results: [],\n error: error.message,\n };\n }\n })\n .build();\n\n// Export types and schemas for external use\nexport * from './types.js';\nexport * from './schemas.js';\nexport * from './providers/duckduckgo.js';\nexport * from './providers/serper.js';\n\n","/**\n * Authentication helpers for Slack tools\n */\n\nimport { WebClient } from '@slack/web-api';\nimport type { SlackClientConfig } from './types.js';\n\n/**\n * Create a function to get configured Slack client\n * This is used by the factory function to create closures\n */\nexport function createGetConfiguredSlackClient(\n token?: string,\n botName: string = 'AgentForge Bot',\n botIcon: string = ':robot_face:'\n): () => { client: WebClient; config: SlackClientConfig } {\n let configuredClient: WebClient | null = null;\n\n return function getConfiguredSlackClient(): { client: WebClient; config: SlackClientConfig } {\n if (!configuredClient) {\n const slackToken = token || process.env.SLACK_USER_TOKEN || process.env.SLACK_BOT_TOKEN;\n if (!slackToken) {\n throw new Error(\n 'Slack token not configured. Please provide a token in config or set SLACK_USER_TOKEN or SLACK_BOT_TOKEN environment variable.'\n );\n }\n configuredClient = new WebClient(slackToken);\n }\n\n return {\n client: configuredClient,\n config: {\n token: token || process.env.SLACK_USER_TOKEN || process.env.SLACK_BOT_TOKEN || '',\n botName,\n botIcon,\n },\n };\n };\n}\n\n/**\n * Helper function to get default Slack client (for default tools)\n */\nlet defaultSlackClient: WebClient | null = null;\n\nexport function getDefaultSlackClient(): { client: WebClient; config: SlackClientConfig } {\n if (!defaultSlackClient) {\n const token = process.env.SLACK_USER_TOKEN || process.env.SLACK_BOT_TOKEN;\n if (!token) {\n throw new Error(\n 'Slack token not configured. Please set SLACK_USER_TOKEN or SLACK_BOT_TOKEN environment variable.'\n );\n }\n defaultSlackClient = new WebClient(token);\n }\n\n return {\n client: defaultSlackClient,\n config: {\n token: process.env.SLACK_USER_TOKEN || process.env.SLACK_BOT_TOKEN || '',\n botName: 'AgentForge Bot',\n botIcon: ':robot_face:',\n },\n };\n}\n\n","/**\n * Send a message to a Slack channel\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from '@agentforge/core';\nimport { z } from 'zod';\nimport type { WebClient } from '@slack/web-api';\nimport type { SlackClientConfig } from '../types.js';\n\n/**\n * Create the sendSlackMessage tool with the provided client and logger\n */\nexport function createSendSlackMessageTool(\n getSlackClient: () => { client: WebClient; config: SlackClientConfig },\n logger: Logger\n) {\n return toolBuilder()\n .name('send-slack-message')\n .description('Send a message to a Slack channel for team communication and notifications')\n .category(ToolCategory.WEB)\n .tags(['slack', 'messaging', 'communication'])\n .usageNotes(\n 'Use this for general team communication. For notifications with @mentions, consider using notify-slack instead. ' +\n 'Use get-slack-channels first if you need to find the right channel.'\n )\n .suggests(['get-slack-channels'])\n .schema(\n z.object({\n channel: z.string().describe(\"Channel name (e.g., 'general') or ID (e.g., 'C123456')\"),\n message: z.string().describe('Message content to send'),\n })\n )\n .implementSafe(async ({ channel, message }) => {\n logger.info('send-slack-message called', { channel, messageLength: message.length });\n\n try {\n const { client: slack, config } = getSlackClient();\n\n // Send message using Slack API\n const result = await slack.chat.postMessage({\n channel,\n text: message,\n username: config.botName,\n icon_emoji: config.botIcon,\n });\n\n logger.info('send-slack-message result', {\n channel: result.channel,\n timestamp: result.ts,\n messageLength: message.length,\n success: true,\n });\n\n return {\n channel: result.channel,\n message,\n timestamp: result.ts,\n message_id: result.ts,\n };\n } catch (error: any) {\n logger.error('send-slack-message failed', {\n channel,\n error: error.message,\n data: error.data,\n });\n throw error;\n }\n })\n .build();\n}\n\n","/**\n * Send a notification to a Slack channel (with @mention support)\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from '@agentforge/core';\nimport { z } from 'zod';\nimport type { WebClient } from '@slack/web-api';\nimport type { SlackClientConfig } from '../types.js';\n\n/**\n * Create the notifySlack tool with the provided client and logger\n */\nexport function createNotifySlackTool(\n getSlackClient: () => { client: WebClient; config: SlackClientConfig },\n logger: Logger\n) {\n return toolBuilder()\n .name('notify-slack')\n .description('Send a notification to a Slack channel with optional @mentions for urgent alerts')\n .category(ToolCategory.WEB)\n .tags(['slack', 'notification', 'alert'])\n .usageNotes(\n 'Use this for urgent notifications that require @mentions. For general messages without mentions, ' +\n 'use send-slack-message instead.'\n )\n .suggests(['get-slack-channels'])\n .schema(\n z.object({\n channel: z.string().describe('Channel name or ID'),\n message: z.string().describe('Notification message'),\n mentions: z.array(z.string()).optional().describe('List of usernames to mention (without @)'),\n })\n )\n .implementSafe(async ({ channel, message, mentions = [] }) => {\n logger.info('notify-slack called', {\n channel,\n messageLength: message.length,\n mentionCount: mentions.length,\n });\n\n const { client: slack, config } = getSlackClient();\n\n // Build message with mentions\n const mentionText = mentions.length > 0 ? mentions.map((m) => `<@${m}>`).join(' ') + ' ' : '';\n const fullMessage = `${mentionText}${message}`;\n\n // Send notification using Slack API\n const result = await slack.chat.postMessage({\n channel,\n text: fullMessage,\n username: config.botName,\n icon_emoji: config.botIcon,\n });\n\n logger.info('notify-slack result', {\n channel: result.channel,\n timestamp: result.ts,\n mentions: mentions.length,\n });\n\n return {\n channel: result.channel,\n message: fullMessage,\n mentions,\n timestamp: result.ts,\n notification_id: result.ts,\n };\n })\n .build();\n}\n\n","/**\n * Get list of available Slack channels\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from '@agentforge/core';\nimport { z } from 'zod';\nimport type { WebClient } from '@slack/web-api';\nimport type { SlackClientConfig } from '../types.js';\n\n/**\n * Create the getSlackChannels tool with the provided client and logger\n */\nexport function createGetSlackChannelsTool(\n getSlackClient: () => { client: WebClient; config: SlackClientConfig },\n logger: Logger\n) {\n return toolBuilder()\n .name('get-slack-channels')\n .description('Get a list of available Slack channels to find the right channel for messaging')\n .category(ToolCategory.WEB)\n .tags(['slack', 'channels', 'list'])\n .usageNotes(\n 'Use this first to discover available channels before sending messages. ' +\n 'Helps ensure you are sending to the correct channel.'\n )\n .follows(['send-slack-message', 'notify-slack'])\n .schema(\n z.object({\n include_private: z.boolean().optional().describe('Include private channels (default: false)'),\n })\n )\n .implementSafe(async ({ include_private = false }) => {\n logger.info('get-slack-channels called', { include_private });\n\n const { client: slack } = getSlackClient();\n\n // Get public channels\n const publicChannels = await slack.conversations.list({\n types: 'public_channel',\n exclude_archived: true,\n });\n\n let allChannels = publicChannels.channels || [];\n\n // Get private channels if requested\n if (include_private) {\n const privateChannels = await slack.conversations.list({\n types: 'private_channel',\n exclude_archived: true,\n });\n allChannels = [...allChannels, ...(privateChannels.channels || [])];\n }\n\n logger.info('get-slack-channels result', {\n channelCount: allChannels.length,\n includePrivate: include_private,\n });\n\n return {\n count: allChannels.length,\n channels: allChannels.map((c) => ({\n id: c.id,\n name: c.name,\n is_private: c.is_private || false,\n num_members: c.num_members || 0,\n })),\n };\n })\n .build();\n}\n\n","/**\n * Get message history from a Slack channel\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from '@agentforge/core';\nimport { z } from 'zod';\nimport type { WebClient } from '@slack/web-api';\nimport type { SlackClientConfig } from '../types.js';\n\n/**\n * Create the getSlackMessages tool with the provided client and logger\n */\nexport function createGetSlackMessagesTool(\n getSlackClient: () => { client: WebClient; config: SlackClientConfig },\n logger: Logger\n) {\n return toolBuilder()\n .name('get-slack-messages')\n .description('Retrieve message history from a Slack channel to read recent conversations')\n .category(ToolCategory.WEB)\n .tags(['slack', 'messages', 'history', 'read'])\n .usageNotes(\n 'Use this to read recent messages from a channel. Use get-slack-channels first if you need to find the channel ID. ' +\n 'Returns messages in reverse chronological order (newest first).'\n )\n .suggests(['get-slack-channels'])\n .schema(\n z.object({\n channel: z.string().describe(\"Channel name (e.g., 'general') or ID (e.g., 'C123456')\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe('Number of messages to retrieve (default: 20, max: 100)'),\n })\n )\n .implementSafe(async ({ channel, limit = 20 }) => {\n logger.info('get-slack-messages called', { channel, limit });\n\n try {\n const { client: slack } = getSlackClient();\n\n // Get channel ID if name was provided\n let channelId = channel;\n if (!channel.startsWith('C') && !channel.startsWith('D')) {\n const channels = await slack.conversations.list({\n types: 'public_channel,private_channel',\n exclude_archived: true,\n });\n const found = channels.channels?.find((c) => c.name === channel);\n if (!found) {\n logger.error('get-slack-messages: channel not found', { channel });\n throw new Error(\n `Channel '${channel}' not found. Use get-slack-channels to see available channels.`\n );\n }\n channelId = found.id!;\n }\n\n // Retrieve message history\n const result = await slack.conversations.history({\n channel: channelId,\n limit: Math.min(limit, 100), // Cap at 100 for performance\n });\n\n logger.info('get-slack-messages result', {\n channel: channelId,\n messageCount: result.messages?.length || 0,\n limit,\n });\n\n return {\n channel: channelId,\n count: result.messages?.length || 0,\n messages:\n result.messages?.map((m) => ({\n user: m.user || 'unknown',\n text: m.text || '',\n timestamp: m.ts,\n thread_ts: m.thread_ts,\n type: m.type,\n subtype: m.subtype,\n })) || [],\n };\n } catch (error: any) {\n logger.error('get-slack-messages failed', {\n channel,\n error: error.message,\n data: error.data,\n });\n throw error;\n }\n })\n .build();\n}\n\n","/**\n * Slack Integration Tools\n *\n * Tools for interacting with Slack workspaces - send messages, notifications,\n * list channels, and read message history.\n *\n * @packageDocumentation\n *\n * @example\n * ```ts\n * // Using default tools (reads from env vars)\n * import { sendSlackMessage } from '@agentforge/tools';\n *\n * const result = await sendSlackMessage.execute({\n * channel: 'general',\n * message: 'Hello from AgentForge!'\n * });\n *\n * // Using factory function with custom config\n * import { createSlackTools } from '@agentforge/tools';\n *\n * const slackTools = createSlackTools({\n * token: 'xoxb-your-bot-token',\n * botName: 'My Custom Bot'\n * });\n *\n * const result = await slackTools.sendMessage.execute({\n * channel: 'general',\n * message: 'Hello!'\n * });\n * ```\n */\n\nimport { createLogger, LogLevel } from \"@agentforge/core\";\nimport { getDefaultSlackClient, createGetConfiguredSlackClient } from \"./auth.js\";\nimport { createSendSlackMessageTool } from \"./tools/send-slack-message.js\";\nimport { createNotifySlackTool } from \"./tools/notify-slack.js\";\nimport { createGetSlackChannelsTool } from \"./tools/get-slack-channels.js\";\nimport { createGetSlackMessagesTool } from \"./tools/get-slack-messages.js\";\n\n// Export types\nexport type { SlackToolsConfig, SlackClientConfig } from \"./types.js\";\n\n// Create logger for default Slack tools\nconst logLevel = (process.env.LOG_LEVEL?.toLowerCase() as LogLevel) || LogLevel.INFO;\nconst logger = createLogger('[tools:slack]', { level: logLevel });\n\n/**\n * Default Slack tools using environment variables\n */\nexport const sendSlackMessage = createSendSlackMessageTool(getDefaultSlackClient, logger);\nexport const notifySlack = createNotifySlackTool(getDefaultSlackClient, logger);\nexport const getSlackChannels = createGetSlackChannelsTool(getDefaultSlackClient, logger);\nexport const getSlackMessages = createGetSlackMessagesTool(getDefaultSlackClient, logger);\n\n/**\n * Export all Slack tools\n *\n * Includes 4 tools for Slack integration:\n * - 2 write tools: send-slack-message, notify-slack\n * - 2 read tools: get-slack-channels, get-slack-messages\n */\nexport const slackTools = [\n // Write tools\n sendSlackMessage,\n notifySlack,\n // Read tools\n getSlackChannels,\n getSlackMessages,\n];\n\n/**\n * Create Slack tools with custom configuration\n *\n * This factory function allows you to create Slack tools with custom configuration,\n * such as providing a token programmatically instead of using environment variables.\n *\n * @param config - Configuration options for Slack tools\n * @returns Object containing all 4 Slack tools configured with the provided options\n *\n * @example\n * ```ts\n * // Create tools with custom token\n * const slackTools = createSlackTools({\n * token: 'xoxb-your-bot-token',\n * botName: 'My Custom Bot',\n * botIcon: ':rocket:'\n * });\n *\n * // Use the tools\n * await slackTools.sendMessage.execute({\n * channel: 'general',\n * message: 'Hello!'\n * });\n *\n * // Or use with an agent\n * const agent = createReActAgent({\n * llm,\n * tools: [\n * slackTools.sendMessage,\n * slackTools.notify,\n * slackTools.getChannels,\n * slackTools.getMessages\n * ]\n * });\n * ```\n */\nexport function createSlackTools(config: import(\"./types.js\").SlackToolsConfig = {}) {\n const {\n token,\n botName = 'AgentForge Bot',\n botIcon = ':robot_face:',\n logLevel: customLogLevel,\n } = config;\n\n // Create closures for getting configured Slack client\n const getConfiguredSlackClient = createGetConfiguredSlackClient(token, botName, botIcon);\n\n // Create logger with custom log level if provided\n const toolLogger = customLogLevel\n ? createLogger('[tools:slack]', { level: customLogLevel })\n : logger;\n\n // Build all 4 tools with configured client/logger\n const sendMessage = createSendSlackMessageTool(getConfiguredSlackClient, toolLogger);\n const notify = createNotifySlackTool(getConfiguredSlackClient, toolLogger);\n const getChannels = createGetSlackChannelsTool(getConfiguredSlackClient, toolLogger);\n const getMessages = createGetSlackMessagesTool(getConfiguredSlackClient, toolLogger);\n\n // Return all configured tools\n return {\n sendMessage,\n notify,\n getChannels,\n getMessages,\n };\n}\n\n","/**\n * Authentication helpers for Confluence tools\n */\n\nimport type { ConfluenceAuth } from \"./types.js\";\n\n/**\n * Create a function to get configured auth credentials\n * This is used by the factory function to create closures\n */\nexport function createGetConfiguredAuth(\n apiKey?: string,\n email?: string,\n siteUrl?: string\n): () => ConfluenceAuth {\n return function getConfiguredAuth(): ConfluenceAuth {\n const ATLASSIAN_API_KEY = apiKey || process.env.ATLASSIAN_API_KEY || \"\";\n const ATLASSIAN_EMAIL = email || process.env.ATLASSIAN_EMAIL || \"\";\n const ATLASSIAN_SITE_URL = (siteUrl || process.env.ATLASSIAN_SITE_URL || \"\").replace(/\\/$/, \"\");\n\n if (!ATLASSIAN_API_KEY || !ATLASSIAN_EMAIL || !ATLASSIAN_SITE_URL) {\n throw new Error(\n \"Confluence credentials not configured. Set ATLASSIAN_API_KEY, ATLASSIAN_EMAIL, and ATLASSIAN_SITE_URL in config or environment variables.\"\n );\n }\n\n return { ATLASSIAN_API_KEY, ATLASSIAN_EMAIL, ATLASSIAN_SITE_URL };\n };\n}\n\n/**\n * Create a function to get configured auth header\n * This is used by the factory function to create closures\n */\nexport function createGetConfiguredAuthHeader(\n getConfiguredAuth: () => ConfluenceAuth\n): () => string {\n return function getConfiguredAuthHeader(): string {\n const { ATLASSIAN_API_KEY, ATLASSIAN_EMAIL } = getConfiguredAuth();\n const auth = Buffer.from(`${ATLASSIAN_EMAIL}:${ATLASSIAN_API_KEY}`).toString(\"base64\");\n return `Basic ${auth}`;\n };\n}\n\n/**\n * Helper function to get configuration from environment (for default tools)\n */\nexport function getConfig(): ConfluenceAuth {\n const ATLASSIAN_API_KEY = process.env.ATLASSIAN_API_KEY || \"\";\n const ATLASSIAN_EMAIL = process.env.ATLASSIAN_EMAIL || \"\";\n const ATLASSIAN_SITE_URL = (process.env.ATLASSIAN_SITE_URL || \"\").replace(/\\/$/, \"\");\n\n if (!ATLASSIAN_API_KEY || !ATLASSIAN_EMAIL || !ATLASSIAN_SITE_URL) {\n throw new Error(\"Confluence credentials not configured. Set ATLASSIAN_API_KEY, ATLASSIAN_EMAIL, and ATLASSIAN_SITE_URL in .env\");\n }\n\n return { ATLASSIAN_API_KEY, ATLASSIAN_EMAIL, ATLASSIAN_SITE_URL };\n}\n\n/**\n * Helper function to create auth header (for default tools)\n */\nexport function getAuthHeader(): string {\n const { ATLASSIAN_API_KEY, ATLASSIAN_EMAIL } = getConfig();\n const auth = Buffer.from(`${ATLASSIAN_EMAIL}:${ATLASSIAN_API_KEY}`).toString(\"base64\");\n return `Basic ${auth}`;\n}\n\n","/**\n * Search Confluence pages using CQL (Confluence Query Language)\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from \"@agentforge/core\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport type { ConfluenceAuth } from \"../types.js\";\n\n/**\n * Create the searchConfluence tool with the provided auth and logger\n */\nexport function createSearchConfluenceTool(\n getAuth: () => ConfluenceAuth,\n getAuthHeader: () => string,\n logger: Logger\n) {\n return toolBuilder()\n .name(\"search-confluence\")\n .description(\"Search for pages in Confluence using keywords or CQL (Confluence Query Language). Returns matching pages with titles, IDs, and excerpts.\")\n .category(ToolCategory.WEB)\n .tag(\"confluence\")\n .tag(\"search\")\n .tag(\"knowledge-base\")\n .usageNotes(\"Use this to find relevant documentation, policies, or information in Confluence. You can search by keywords or use CQL for advanced queries (e.g., 'space=AI AND type=page'). Use get-confluence-page to retrieve full content of specific pages.\")\n .suggests([\"get-confluence-page\"])\n .schema(z.object({\n query: z.string().describe(\"Search query or CQL expression (e.g., 'payment processing' or 'space=BL3 AND title~payment')\"),\n limit: z.number().optional().describe(\"Maximum number of results to return (default: 10, max: 25)\"),\n }))\n .implement(async ({ query, limit = 10 }) => {\n logger.info('search-confluence called', { query, limit });\n\n try {\n const { ATLASSIAN_SITE_URL } = getAuth();\n const response = await axios.get(`${ATLASSIAN_SITE_URL}/wiki/rest/api/content/search`, {\n headers: {\n Authorization: getAuthHeader(),\n Accept: \"application/json\",\n },\n params: {\n cql: query,\n limit: Math.min(limit, 25),\n expand: \"space,version\",\n },\n });\n\n const { ATLASSIAN_SITE_URL: siteUrl } = getAuth();\n const results = response.data.results.map((page: any) => ({\n id: page.id,\n title: page.title,\n type: page.type,\n space: page.space?.name || \"Unknown\",\n spaceKey: page.space?.key || \"\",\n url: `${siteUrl}/wiki${page._links.webui}`,\n lastModified: page.version?.when || \"\",\n }));\n\n // IMPORTANT: Log when search returns no results - this is a valid outcome!\n if (results.length === 0) {\n logger.warn('search-confluence returned NO RESULTS - this is a valid outcome, agent should not retry', {\n query,\n limit,\n totalSize: response.data.totalSize\n });\n } else {\n logger.info('search-confluence result', {\n query,\n resultCount: results.length,\n totalSize: response.data.totalSize,\n titles: results.map((r: any) => r.title).slice(0, 3) // Log first 3 titles\n });\n }\n\n return JSON.stringify({\n success: true,\n count: results.length,\n total: response.data.totalSize,\n results,\n });\n } catch (error: any) {\n logger.error('search-confluence error', {\n query,\n error: error.response?.data?.message || error.message,\n status: error.response?.status\n });\n\n return JSON.stringify({\n success: false,\n error: error.response?.data?.message || error.message,\n });\n }\n })\n .build();\n}\n\n","/**\n * Get full content of a Confluence page by ID\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from \"@agentforge/core\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport type { ConfluenceAuth } from \"../types.js\";\n\n/**\n * Create the getConfluencePage tool with the provided auth and logger\n */\nexport function createGetConfluencePageTool(\n getAuth: () => ConfluenceAuth,\n getAuthHeader: () => string,\n logger: Logger\n) {\n return toolBuilder()\n .name(\"get-confluence-page\")\n .description(\"Get the full content of a specific Confluence page by its ID. Returns the page title, content (in storage format), space, and metadata.\")\n .category(ToolCategory.WEB)\n .tag(\"confluence\")\n .tag(\"page\")\n .tag(\"content\")\n .usageNotes(\"Use this after search-confluence to retrieve the full content of a specific page. The page ID can be found in search results.\")\n .requires([\"search-confluence\"])\n .schema(z.object({\n page_id: z.string().describe(\"The Confluence page ID (from search results)\"),\n }))\n .implement(async ({ page_id }) => {\n logger.info('get-confluence-page called', { page_id });\n\n try {\n const { ATLASSIAN_SITE_URL } = getAuth();\n const response = await axios.get(`${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`, {\n headers: {\n Authorization: getAuthHeader(),\n Accept: \"application/json\",\n },\n params: {\n expand: \"body.storage,space,version,history\",\n },\n });\n\n const page = response.data;\n\n logger.info('get-confluence-page result', {\n page_id,\n title: page.title,\n space: page.space?.name,\n contentLength: page.body?.storage?.value?.length || 0\n });\n\n return JSON.stringify({\n success: true,\n page: {\n id: page.id,\n title: page.title,\n type: page.type,\n space: page.space?.name || \"Unknown\",\n spaceKey: page.space?.key || \"\",\n content: page.body?.storage?.value || \"\",\n url: `${ATLASSIAN_SITE_URL}/wiki${page._links.webui}`,\n created: page.history?.createdDate || \"\",\n lastModified: page.version?.when || \"\",\n version: page.version?.number || 1,\n },\n });\n } catch (error: any) {\n logger.error('get-confluence-page error', {\n page_id,\n error: error.response?.data?.message || error.message,\n status: error.response?.status\n });\n\n return JSON.stringify({\n success: false,\n error: error.response?.data?.message || error.message,\n });\n }\n })\n .build();\n}\n\n","/**\n * List all Confluence spaces\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from \"@agentforge/core\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport type { ConfluenceAuth } from \"../types.js\";\n\n/**\n * Create the listConfluenceSpaces tool with the provided auth and logger\n */\nexport function createListConfluenceSpacesTool(\n getAuth: () => ConfluenceAuth,\n getAuthHeader: () => string,\n logger: Logger\n) {\n return toolBuilder()\n .name(\"list-confluence-spaces\")\n .description(\"List all available Confluence spaces. Returns space names, keys, types, and descriptions to help identify where to search for information.\")\n .category(ToolCategory.WEB)\n .tag(\"confluence\")\n .tag(\"spaces\")\n .tag(\"list\")\n .usageNotes(\"Use this first to discover available spaces before searching. Helps narrow down searches to specific areas (e.g., 'AI', 'BL3', 'Finance').\")\n .follows([\"search-confluence\"])\n .schema(z.object({\n limit: z.number().optional().describe(\"Maximum number of spaces to return (default: 25)\"),\n }))\n .implement(async ({ limit = 25 }) => {\n logger.info('list-confluence-spaces called', { limit });\n\n try {\n const { ATLASSIAN_SITE_URL } = getAuth();\n const response = await axios.get(`${ATLASSIAN_SITE_URL}/wiki/rest/api/space`, {\n headers: {\n Authorization: getAuthHeader(),\n Accept: \"application/json\",\n },\n params: {\n limit,\n },\n });\n\n const spaces = response.data.results.map((space: any) => ({\n key: space.key,\n name: space.name,\n type: space.type,\n description: space.description?.plain?.value || \"\",\n url: `${ATLASSIAN_SITE_URL}/wiki${space._links.webui}`,\n }));\n\n logger.info('list-confluence-spaces result', {\n spaceCount: spaces.length,\n spaceKeys: spaces.map((s: any) => s.key).slice(0, 5) // Log first 5 space keys\n });\n\n return JSON.stringify({\n success: true,\n count: spaces.length,\n spaces,\n });\n } catch (error: any) {\n logger.error('list-confluence-spaces error', {\n error: error.response?.data?.message || error.message,\n status: error.response?.status\n });\n\n return JSON.stringify({\n success: false,\n error: error.response?.data?.message || error.message,\n });\n }\n })\n .build();\n}\n\n","/**\n * Get pages from a specific Confluence space\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from \"@agentforge/core\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport type { ConfluenceAuth } from \"../types.js\";\n\n/**\n * Create the getSpacePages tool with the provided auth and logger\n */\nexport function createGetSpacePagesTool(\n getAuth: () => ConfluenceAuth,\n getAuthHeader: () => string,\n logger: Logger\n) {\n return toolBuilder()\n .name(\"get-space-pages\")\n .description(\"Get all pages from a specific Confluence space by space key. Useful for browsing content in a particular area.\")\n .category(ToolCategory.WEB)\n .tag(\"confluence\")\n .tag(\"space\")\n .tag(\"pages\")\n .usageNotes(\"Use this to explore all pages in a specific space. Get the space key from list-confluence-spaces first.\")\n .requires([\"list-confluence-spaces\"])\n .schema(z.object({\n space_key: z.string().describe(\"The space key (e.g., 'AI', 'BL3', 'FIN')\"),\n limit: z.number().optional().describe(\"Maximum number of pages to return (default: 25)\"),\n }))\n .implement(async ({ space_key, limit = 25 }) => {\n logger.info('get-space-pages called', { space_key, limit });\n\n try {\n const { ATLASSIAN_SITE_URL } = getAuth();\n const response = await axios.get(`${ATLASSIAN_SITE_URL}/wiki/rest/api/content`, {\n headers: {\n Authorization: getAuthHeader(),\n Accept: \"application/json\",\n },\n params: {\n spaceKey: space_key,\n type: \"page\",\n limit,\n expand: \"version\",\n },\n });\n\n const pages = response.data.results.map((page: any) => ({\n id: page.id,\n title: page.title,\n url: `${ATLASSIAN_SITE_URL}/wiki${page._links.webui}`,\n lastModified: page.version?.when || \"\",\n }));\n\n // Log when no pages found - this is a valid outcome!\n if (pages.length === 0) {\n logger.warn('get-space-pages returned NO PAGES - this is a valid outcome, agent should not retry', {\n space_key,\n limit\n });\n } else {\n logger.info('get-space-pages result', {\n space_key,\n pageCount: pages.length,\n titles: pages.map((p: any) => p.title).slice(0, 3) // Log first 3 titles\n });\n }\n\n return JSON.stringify({\n success: true,\n space: space_key,\n count: pages.length,\n pages,\n });\n } catch (error: any) {\n logger.error('get-space-pages error', {\n space_key,\n error: error.response?.data?.message || error.message,\n status: error.response?.status\n });\n\n return JSON.stringify({\n success: false,\n error: error.response?.data?.message || error.message,\n });\n }\n })\n .build();\n}\n\n","/**\n * Create a new Confluence page\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from \"@agentforge/core\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport type { ConfluenceAuth } from \"../types.js\";\n\n/**\n * Create the createConfluencePage tool with the provided auth and logger\n */\nexport function createCreateConfluencePageTool(\n getAuth: () => ConfluenceAuth,\n getAuthHeader: () => string,\n logger: Logger\n) {\n return toolBuilder()\n .name(\"create-confluence-page\")\n .description(\"Create a new page in a Confluence space. Requires space key, page title, and content (in HTML storage format).\")\n .category(ToolCategory.WEB)\n .tag(\"confluence\")\n .tag(\"create\")\n .tag(\"write\")\n .usageNotes(\"Use this to create new documentation pages. Content should be in Confluence storage format (HTML). Get the space key from list-confluence-spaces first. Be mindful of creating duplicate pages.\")\n .requires([\"list-confluence-spaces\"])\n .schema(z.object({\n space_key: z.string().describe(\"The space key where the page will be created (e.g., 'AI', 'BL3')\"),\n title: z.string().describe(\"The title of the new page\"),\n content: z.string().describe(\"The page content in HTML format (Confluence storage format)\"),\n parent_page_id: z.string().optional().describe(\"Optional parent page ID to create this as a child page\"),\n }))\n .implement(async ({ space_key, title, content, parent_page_id }) => {\n logger.info('create-confluence-page called', { space_key, title, hasParent: !!parent_page_id });\n\n try {\n const { ATLASSIAN_SITE_URL } = getAuth();\n\n const pageData: any = {\n type: \"page\",\n title: title,\n space: { key: space_key },\n body: {\n storage: {\n value: content,\n representation: \"storage\",\n },\n },\n };\n\n // Add parent if specified\n if (parent_page_id) {\n pageData.ancestors = [{ id: parent_page_id }];\n }\n\n const response = await axios.post(\n `${ATLASSIAN_SITE_URL}/wiki/rest/api/content`,\n pageData,\n {\n headers: {\n Authorization: getAuthHeader(),\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n logger.info('create-confluence-page result', {\n page_id: response.data.id,\n title: response.data.title,\n space: space_key\n });\n\n return JSON.stringify({\n success: true,\n page: {\n id: response.data.id,\n title: response.data.title,\n space: space_key,\n url: `${ATLASSIAN_SITE_URL}/wiki${response.data._links.webui}`,\n version: response.data.version?.number || 1,\n },\n });\n } catch (error: any) {\n logger.error('create-confluence-page error', {\n space_key,\n title,\n error: error.response?.data?.message || error.message,\n status: error.response?.status\n });\n\n return JSON.stringify({\n success: false,\n error: error.response?.data?.message || error.message,\n });\n }\n })\n .build();\n}\n\n","/**\n * Update an existing Confluence page\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from \"@agentforge/core\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport type { ConfluenceAuth } from \"../types.js\";\n\n/**\n * Create the updateConfluencePage tool with the provided auth and logger\n */\nexport function createUpdateConfluencePageTool(\n getAuth: () => ConfluenceAuth,\n getAuthHeader: () => string,\n logger: Logger\n) {\n return toolBuilder()\n .name(\"update-confluence-page\")\n .description(\"Update an existing Confluence page's content. Requires page ID, new title, and new content.\")\n .category(ToolCategory.WEB)\n .tag(\"confluence\")\n .tag(\"update\")\n .tag(\"write\")\n .usageNotes(\"Use this to update existing documentation. You must provide the page ID (from search results). The tool will automatically handle version incrementing. Always get the current page content first to avoid overwriting important information.\")\n .requires([\"get-confluence-page\"])\n .schema(z.object({\n page_id: z.string().describe(\"The ID of the page to update\"),\n title: z.string().describe(\"The new title for the page\"),\n content: z.string().describe(\"The new content in HTML format (Confluence storage format)\"),\n }))\n .implement(async ({ page_id, title, content }) => {\n logger.info('update-confluence-page called', { page_id, title });\n\n try {\n const { ATLASSIAN_SITE_URL } = getAuth();\n\n // First, get the current version\n const getResponse = await axios.get(\n `${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`,\n {\n headers: {\n Authorization: getAuthHeader(),\n },\n params: { expand: \"version\" },\n }\n );\n\n const currentVersion = getResponse.data.version.number;\n\n // Update the page\n const updateResponse = await axios.put(\n `${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`,\n {\n type: \"page\",\n title: title,\n version: { number: currentVersion + 1 },\n body: {\n storage: {\n value: content,\n representation: \"storage\",\n },\n },\n },\n {\n headers: {\n Authorization: getAuthHeader(),\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n logger.info('update-confluence-page result', {\n page_id,\n title: updateResponse.data.title,\n previousVersion: currentVersion,\n newVersion: updateResponse.data.version.number\n });\n\n return JSON.stringify({\n success: true,\n page: {\n id: updateResponse.data.id,\n title: updateResponse.data.title,\n url: `${ATLASSIAN_SITE_URL}/wiki${updateResponse.data._links.webui}`,\n version: updateResponse.data.version.number,\n previousVersion: currentVersion,\n },\n });\n } catch (error: any) {\n logger.error('update-confluence-page error', {\n page_id,\n title,\n error: error.response?.data?.message || error.message,\n status: error.response?.status\n });\n\n return JSON.stringify({\n success: false,\n error: error.response?.data?.message || error.message,\n });\n }\n })\n .build();\n}\n\n","/**\n * Archive a Confluence page (move to trash)\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from \"@agentforge/core\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport type { ConfluenceAuth } from \"../types.js\";\n\n/**\n * Create the archiveConfluencePage tool with the provided auth and logger\n */\nexport function createArchiveConfluencePageTool(\n getAuth: () => ConfluenceAuth,\n getAuthHeader: () => string,\n logger: Logger\n) {\n return toolBuilder()\n .name(\"archive-confluence-page\")\n .description(\"Archive a Confluence page by moving it to trash. The page can be restored by space admins. Note: UI may require a note explaining why the page was archived.\")\n .category(ToolCategory.WEB)\n .tag(\"confluence\")\n .tag(\"archive\")\n .tag(\"delete\")\n .usageNotes(\"Use this to archive outdated or obsolete documentation. The page is moved to trash, not permanently deleted. Space admins can restore it if needed. Be very careful - only archive pages that are truly obsolete.\")\n .conflicts([\"create-confluence-page\"])\n .schema(z.object({\n page_id: z.string().describe(\"The ID of the page to archive\"),\n reason: z.string().optional().describe(\"Optional reason for archiving (for audit trail)\"),\n }))\n .implement(async ({ page_id, reason }) => {\n logger.info('archive-confluence-page called', { page_id, reason });\n\n try {\n const { ATLASSIAN_SITE_URL } = getAuth();\n\n // Get current page data\n const getResponse = await axios.get(\n `${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`,\n {\n headers: {\n Authorization: getAuthHeader(),\n },\n params: { expand: \"version,body.storage,space\" },\n }\n );\n\n const currentVersion = getResponse.data.version.number;\n const pageData = getResponse.data;\n\n // Archive by updating status to 'trashed'\n await axios.put(\n `${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`,\n {\n version: { number: currentVersion + 1 },\n title: pageData.title,\n type: \"page\",\n status: \"trashed\",\n body: pageData.body,\n space: { key: pageData.space.key },\n },\n {\n headers: {\n Authorization: getAuthHeader(),\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n logger.info('archive-confluence-page result', {\n page_id,\n title: pageData.title,\n previousVersion: currentVersion,\n newVersion: currentVersion + 1\n });\n\n return JSON.stringify({\n success: true,\n archived: {\n id: page_id,\n title: pageData.title,\n previousVersion: currentVersion,\n newVersion: currentVersion + 1,\n reason: reason || \"Archived via API\",\n note: \"Page moved to trash. Space admins can restore it from the Confluence UI.\",\n },\n });\n } catch (error: any) {\n logger.error('archive-confluence-page error', {\n page_id,\n error: error.response?.data?.message || error.message,\n status: error.response?.status\n });\n\n return JSON.stringify({\n success: false,\n error: error.response?.data?.message || error.message,\n });\n }\n })\n .build();\n}\n\n","/**\n * Confluence Integration Tools\n * Real integration with Atlassian Confluence for knowledge base access\n *\n * @packageDocumentation\n *\n * @example\n * ```ts\n * // Using environment variables\n * import { confluenceTools } from '@agentforge/tools';\n *\n * // ATLASSIAN_API_KEY, ATLASSIAN_EMAIL, ATLASSIAN_SITE_URL must be set\n * const result = await confluenceTools[0].execute({\n * query: 'space=AI AND type=page'\n * });\n *\n * // Using factory function with custom config\n * import { createConfluenceTools } from '@agentforge/tools';\n *\n * const tools = createConfluenceTools({\n * apiKey: 'your-api-key',\n * email: 'your-email@example.com',\n * siteUrl: 'https://your-domain.atlassian.net'\n * });\n *\n * const result = await tools.searchConfluence.execute({\n * query: 'payment processing'\n * });\n * ```\n */\n\nimport { createLogger, LogLevel } from \"@agentforge/core\";\nimport { getConfig, getAuthHeader, createGetConfiguredAuth, createGetConfiguredAuthHeader } from \"./auth.js\";\nimport { createSearchConfluenceTool } from \"./tools/search-confluence.js\";\nimport { createGetConfluencePageTool } from \"./tools/get-confluence-page.js\";\nimport { createListConfluenceSpacesTool } from \"./tools/list-confluence-spaces.js\";\nimport { createGetSpacePagesTool } from \"./tools/get-space-pages.js\";\nimport { createCreateConfluencePageTool } from \"./tools/create-confluence-page.js\";\nimport { createUpdateConfluencePageTool } from \"./tools/update-confluence-page.js\";\nimport { createArchiveConfluencePageTool } from \"./tools/archive-confluence-page.js\";\n\n// Export types\nexport type { ConfluenceToolsConfig, ConfluenceAuth } from \"./types.js\";\n\n// Create logger for default Confluence tools\nconst logLevel = (process.env.LOG_LEVEL?.toLowerCase() as LogLevel) || LogLevel.INFO;\nconst logger = createLogger('[tools:confluence]', { level: logLevel });\n\n/**\n * Default Confluence tools using environment variables\n */\nexport const searchConfluence = createSearchConfluenceTool(getConfig, getAuthHeader, logger);\nexport const getConfluencePage = createGetConfluencePageTool(getConfig, getAuthHeader, logger);\nexport const listConfluenceSpaces = createListConfluenceSpacesTool(getConfig, getAuthHeader, logger);\nexport const getSpacePages = createGetSpacePagesTool(getConfig, getAuthHeader, logger);\nexport const createConfluencePage = createCreateConfluencePageTool(getConfig, getAuthHeader, logger);\nexport const updateConfluencePage = createUpdateConfluencePageTool(getConfig, getAuthHeader, logger);\nexport const archiveConfluencePage = createArchiveConfluencePageTool(getConfig, getAuthHeader, logger);\n\n/**\n * Export all Confluence tools\n *\n * Includes 7 tools for Confluence integration:\n * - 4 read tools: search, get-page, list-spaces, get-space-pages\n * - 3 write tools: create-page, update-page, archive-page\n */\nexport const confluenceTools = [\n // Read tools\n searchConfluence,\n getConfluencePage,\n listConfluenceSpaces,\n getSpacePages,\n // Write tools\n createConfluencePage,\n updateConfluencePage,\n archiveConfluencePage,\n];\n\n/**\n * Create Confluence tools with custom configuration\n *\n * This factory function allows you to create Confluence tools with programmatic configuration\n * instead of relying solely on environment variables.\n *\n * @param config - Optional configuration for Confluence tools\n * @returns Object containing all 7 Confluence tools configured with the provided settings\n *\n * @example\n * ```ts\n * // Create tools with custom credentials\n * const tools = createConfluenceTools({\n * apiKey: 'your-api-key',\n * email: 'your-email@example.com',\n * siteUrl: 'https://your-domain.atlassian.net'\n * });\n *\n * // Use the tools\n * const result = await tools.searchConfluence.execute({\n * query: 'payment processing'\n * });\n * ```\n *\n * @example\n * ```ts\n * // Create tools with custom log level\n * const tools = createConfluenceTools({\n * logLevel: LogLevel.DEBUG\n * });\n * ```\n */\nexport function createConfluenceTools(config: import(\"./types.js\").ConfluenceToolsConfig = {}) {\n const {\n apiKey,\n email,\n siteUrl,\n logLevel: customLogLevel,\n } = config;\n\n // Create closures for getting configured auth credentials\n const getConfiguredAuth = createGetConfiguredAuth(apiKey, email, siteUrl);\n const getConfiguredAuthHeader = createGetConfiguredAuthHeader(getConfiguredAuth);\n\n // Create logger with custom log level if provided\n const toolLogger = customLogLevel\n ? createLogger('tools:confluence', { level: customLogLevel })\n : logger;\n\n // Build all 7 tools with configured auth/logger\n const searchConfluence = createSearchConfluenceTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);\n const getConfluencePage = createGetConfluencePageTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);\n const listConfluenceSpaces = createListConfluenceSpacesTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);\n const getSpacePages = createGetSpacePagesTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);\n const createConfluencePage = createCreateConfluencePageTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);\n const updateConfluencePage = createUpdateConfluencePageTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);\n const archiveConfluencePage = createArchiveConfluencePageTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);\n\n // Return all configured tools\n return {\n searchConfluence,\n getConfluencePage,\n listConfluenceSpaces,\n getSpacePages,\n createConfluencePage,\n updateConfluencePage,\n archiveConfluencePage,\n };\n}\n\n","/**\n * CSV Tools Types\n * \n * Type definitions and schemas for CSV tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * CSV parser schema\n */\nexport const csvParserSchema = z.object({\n csv: z.string().describe('CSV string to parse'),\n delimiter: z.string().default(',').describe('Column delimiter character'),\n hasHeaders: z.boolean().default(true).describe('First row contains column headers'),\n skipEmptyLines: z.boolean().default(true).describe('Skip empty lines in the CSV'),\n trim: z.boolean().default(true).describe('Trim whitespace from values'),\n});\n\n/**\n * CSV generator schema\n */\nexport const csvGeneratorSchema = z.object({\n data: z.array(z.record(z.any().describe('Column value'))).describe('Array of objects to convert to CSV'),\n delimiter: z.string().default(',').describe('Column delimiter character'),\n includeHeaders: z.boolean().default(true).describe('Include header row with column names'),\n columns: z.array(z.string().describe(\"String value\")).optional().describe('Optional list of columns to include (in order)'),\n});\n\n/**\n * CSV to JSON schema\n */\nexport const csvToJsonSchema = z.object({\n csv: z.string().describe('CSV string to convert'),\n delimiter: z.string().default(',').describe('Column delimiter character'),\n pretty: z.boolean().default(false).describe('Format JSON with indentation'),\n});\n\n/**\n * JSON to CSV schema\n */\nexport const jsonToCsvSchema = z.object({\n json: z.string().describe('JSON array string to convert'),\n delimiter: z.string().default(',').describe('Column delimiter character'),\n});\n\n/**\n * CSV tools configuration\n */\nexport interface CsvToolsConfig {\n defaultDelimiter?: string;\n defaultHasHeaders?: boolean;\n defaultSkipEmptyLines?: boolean;\n defaultTrim?: boolean;\n}\n\n","/**\n * CSV Parser Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { parse } from 'csv-parse/sync';\nimport { csvParserSchema } from '../types.js';\n\n/**\n * Create CSV parser tool\n */\nexport function createCsvParserTool(\n defaultDelimiter = ',',\n defaultHasHeaders = true,\n defaultSkipEmptyLines = true,\n defaultTrim = true\n) {\n return toolBuilder()\n .name('csv-parser')\n .description('Parse CSV string into an array of objects. Supports custom delimiters, headers, and options.')\n .category(ToolCategory.UTILITY)\n .tags(['csv', 'parse', 'data', 'table'])\n .schema(csvParserSchema)\n .implement(async (input) => {\n try {\n const records = parse(input.csv, {\n delimiter: input.delimiter ?? defaultDelimiter,\n columns: input.hasHeaders ?? defaultHasHeaders,\n skip_empty_lines: input.skipEmptyLines ?? defaultSkipEmptyLines,\n trim: input.trim ?? defaultTrim,\n relax_column_count: true,\n });\n\n return {\n success: true,\n data: records,\n rowCount: records.length,\n columnCount: records.length > 0 ? Object.keys(records[0]).length : 0,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to parse CSV',\n };\n }\n })\n .build();\n}\n\n","/**\n * CSV Generator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { stringify } from 'csv-stringify/sync';\nimport { csvGeneratorSchema } from '../types.js';\n\n/**\n * Create CSV generator tool\n */\nexport function createCsvGeneratorTool(defaultDelimiter = ',') {\n return toolBuilder()\n .name('csv-generator')\n .description('Convert an array of objects to CSV string. Automatically extracts headers from object keys.')\n .category(ToolCategory.UTILITY)\n .tags(['csv', 'generate', 'stringify', 'data'])\n .schema(csvGeneratorSchema)\n .implement(async (input) => {\n try {\n const csv = stringify(input.data, {\n delimiter: input.delimiter ?? defaultDelimiter,\n header: input.includeHeaders,\n columns: input.columns,\n });\n\n return {\n success: true,\n csv,\n rowCount: input.data.length,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to generate CSV',\n };\n }\n })\n .build();\n}\n\n","/**\n * CSV to JSON Converter Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { parse } from 'csv-parse/sync';\nimport { csvToJsonSchema } from '../types.js';\n\n/**\n * Create CSV to JSON converter tool\n */\nexport function createCsvToJsonTool(defaultDelimiter = ',') {\n return toolBuilder()\n .name('csv-to-json')\n .description('Convert CSV string to JSON array. Each row becomes an object with column headers as keys.')\n .category(ToolCategory.UTILITY)\n .tags(['csv', 'json', 'convert', 'data'])\n .schema(csvToJsonSchema)\n .implement(async (input) => {\n try {\n const records = parse(input.csv, {\n delimiter: input.delimiter ?? defaultDelimiter,\n columns: true,\n skip_empty_lines: true,\n trim: true,\n });\n\n const json = input.pretty \n ? JSON.stringify(records, null, 2)\n : JSON.stringify(records);\n\n return {\n success: true,\n json,\n recordCount: records.length,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to convert CSV to JSON',\n };\n }\n })\n .build();\n}\n\n","/**\n * JSON to CSV Converter Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { stringify } from 'csv-stringify/sync';\nimport { jsonToCsvSchema } from '../types.js';\n\n/**\n * Create JSON to CSV converter tool\n */\nexport function createJsonToCsvTool(defaultDelimiter = ',') {\n return toolBuilder()\n .name('json-to-csv')\n .description('Convert JSON array to CSV string. Each object becomes a row with keys as column headers.')\n .category(ToolCategory.UTILITY)\n .tags(['json', 'csv', 'convert', 'data'])\n .schema(jsonToCsvSchema)\n .implement(async (input) => {\n try {\n const data = JSON.parse(input.json);\n \n if (!Array.isArray(data)) {\n return {\n success: false,\n error: 'Input must be a JSON array',\n };\n }\n\n const csv = stringify(data, {\n delimiter: input.delimiter ?? defaultDelimiter,\n header: true,\n });\n\n return {\n success: true,\n csv,\n rowCount: data.length,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to convert JSON to CSV',\n };\n }\n })\n .build();\n}\n\n","/**\n * CSV Tools\n * \n * Tools for parsing and generating CSV data.\n */\n\nexport * from './types.js';\nexport { createCsvParserTool } from './tools/csv-parser.js';\nexport { createCsvGeneratorTool } from './tools/csv-generator.js';\nexport { createCsvToJsonTool } from './tools/csv-to-json.js';\nexport { createJsonToCsvTool } from './tools/json-to-csv.js';\n\nimport { createCsvParserTool } from './tools/csv-parser.js';\nimport { createCsvGeneratorTool } from './tools/csv-generator.js';\nimport { createCsvToJsonTool } from './tools/csv-to-json.js';\nimport { createJsonToCsvTool } from './tools/json-to-csv.js';\nimport type { CsvToolsConfig } from './types.js';\n\n/**\n * Default CSV parser tool instance\n */\nexport const csvParser = createCsvParserTool();\n\n/**\n * Default CSV generator tool instance\n */\nexport const csvGenerator = createCsvGeneratorTool();\n\n/**\n * Default CSV to JSON converter tool instance\n */\nexport const csvToJson = createCsvToJsonTool();\n\n/**\n * Default JSON to CSV converter tool instance\n */\nexport const jsonToCsv = createJsonToCsvTool();\n\n/**\n * All CSV tools\n */\nexport const csvTools = [csvParser, csvGenerator, csvToJson, jsonToCsv];\n\n/**\n * Create CSV tools with custom configuration\n */\nexport function createCsvTools(config: CsvToolsConfig = {}) {\n const {\n defaultDelimiter = ',',\n defaultHasHeaders = true,\n defaultSkipEmptyLines = true,\n defaultTrim = true,\n } = config;\n\n return [\n createCsvParserTool(defaultDelimiter, defaultHasHeaders, defaultSkipEmptyLines, defaultTrim),\n createCsvGeneratorTool(defaultDelimiter),\n createCsvToJsonTool(defaultDelimiter),\n createJsonToCsvTool(defaultDelimiter),\n ];\n}\n\n","/**\n * JSON Tools Types\n * \n * Type definitions and schemas for JSON tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * JSON parser schema\n */\nexport const jsonParserSchema = z.object({\n json: z.string().describe('JSON string to parse'),\n strict: z.boolean().default(true).describe('Use strict JSON parsing (no trailing commas, etc.)'),\n});\n\n/**\n * JSON stringify schema\n */\nexport const jsonStringifySchema = z.object({\n data: z.any().describe('Data to convert to JSON string'),\n pretty: z.boolean().default(false).describe('Format with indentation for readability'),\n indent: z.number().default(2).describe('Number of spaces for indentation (when pretty is true)'),\n});\n\n/**\n * JSON query schema\n */\nexport const jsonQuerySchema = z.object({\n data: z.any().describe('JSON data to query'),\n path: z.string().describe('Dot notation path to query (e.g., \"user.name\" or \"items[0].id\")'),\n});\n\n/**\n * JSON validator schema\n */\nexport const jsonValidatorSchema = z.object({\n json: z.string().describe('JSON string to validate'),\n});\n\n/**\n * JSON merge schema\n */\nexport const jsonMergeSchema = z.object({\n objects: z.array(z.any().describe('Object to merge')).describe('Array of objects to merge'),\n deep: z.boolean().default(false).describe('Perform deep merge (nested objects)'),\n});\n\n/**\n * JSON tools configuration\n */\nexport interface JsonToolsConfig {\n defaultIndent?: number;\n defaultPretty?: boolean;\n}\n\n","/**\n * JSON Parser Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { jsonParserSchema } from '../types.js';\n\n/**\n * Create JSON parser tool\n */\nexport function createJsonParserTool() {\n return toolBuilder()\n .name('json-parser')\n .description('Parse JSON string into an object. Validates JSON syntax and returns parsed data or error details.')\n .category(ToolCategory.UTILITY)\n .tags(['json', 'parse', 'data'])\n .schema(jsonParserSchema)\n .implementSafe(async (input) => {\n const parsed = JSON.parse(input.json);\n return {\n data: parsed,\n type: Array.isArray(parsed) ? 'array' : typeof parsed,\n };\n })\n .build();\n}\n\n","/**\n * JSON Stringify Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { jsonStringifySchema } from '../types.js';\n\n/**\n * Create JSON stringify tool\n */\nexport function createJsonStringifyTool(defaultIndent = 2, defaultPretty = false) {\n return toolBuilder()\n .name('json-stringify')\n .description('Convert an object to a JSON string with optional formatting (pretty print).')\n .category(ToolCategory.UTILITY)\n .tags(['json', 'stringify', 'format', 'data'])\n .schema(jsonStringifySchema)\n .implementSafe(async (input) => {\n const pretty = input.pretty ?? defaultPretty;\n const indent = input.indent ?? defaultIndent;\n \n const json = pretty\n ? JSON.stringify(input.data, null, indent)\n : JSON.stringify(input.data);\n\n return {\n json,\n length: json.length,\n };\n })\n .build();\n}\n\n","/**\n * JSON Query Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { jsonQuerySchema } from '../types.js';\n\n/**\n * Create JSON query tool\n */\nexport function createJsonQueryTool() {\n return toolBuilder()\n .name('json-query')\n .description('Query JSON data using dot notation path (e.g., \"user.address.city\"). Supports array indexing.')\n .category(ToolCategory.UTILITY)\n .tags(['json', 'query', 'path', 'data'])\n .schema(jsonQuerySchema)\n .implementSafe(async (input) => {\n const parts = input.path.split('.');\n let current = input.data;\n\n for (const part of parts) {\n // Handle array indexing: items[0]\n const arrayMatch = part.match(/^(\\w+)\\[(\\d+)\\]$/);\n if (arrayMatch) {\n const [, key, index] = arrayMatch;\n current = current[key][parseInt(index, 10)];\n } else {\n current = current[part];\n }\n\n if (current === undefined) {\n throw new Error(`Path not found: ${input.path}`);\n }\n }\n\n return {\n value: current,\n type: Array.isArray(current) ? 'array' : typeof current,\n };\n })\n .build();\n}\n\n","/**\n * JSON Validator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { jsonValidatorSchema } from '../types.js';\n\n/**\n * Create JSON validator tool\n */\nexport function createJsonValidatorTool() {\n return toolBuilder()\n .name('json-validator')\n .description('Validate JSON string syntax without parsing. Returns whether the JSON is valid and any error details.')\n .category(ToolCategory.UTILITY)\n .tags(['json', 'validate', 'check', 'data'])\n .schema(jsonValidatorSchema)\n .implementSafe(async (input) => {\n JSON.parse(input.json);\n return {\n valid: true,\n message: 'Valid JSON',\n };\n })\n .build();\n}\n\n","/**\n * JSON Merge Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { jsonMergeSchema } from '../types.js';\n\n/**\n * Create JSON merge tool\n */\nexport function createJsonMergeTool() {\n return toolBuilder()\n .name('json-merge')\n .description('Merge two or more JSON objects. Later objects override earlier ones for conflicting keys.')\n .category(ToolCategory.UTILITY)\n .tags(['json', 'merge', 'combine', 'data'])\n .schema(jsonMergeSchema)\n .implement(async (input) => {\n if (input.deep) {\n // Deep merge\n const deepMerge = (target: any, source: any): any => {\n const output = { ...target };\n for (const key in source) {\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n output[key] = deepMerge(output[key] || {}, source[key]);\n } else {\n output[key] = source[key];\n }\n }\n return output;\n };\n \n return input.objects.reduce((acc, obj) => deepMerge(acc, obj), {});\n } else {\n // Shallow merge\n return Object.assign({}, ...input.objects);\n }\n })\n .build();\n}\n\n","/**\n * JSON Tools\n * \n * Tools for parsing, validating, transforming, and querying JSON data.\n */\n\nexport * from './types.js';\nexport { createJsonParserTool } from './tools/json-parser.js';\nexport { createJsonStringifyTool } from './tools/json-stringify.js';\nexport { createJsonQueryTool } from './tools/json-query.js';\nexport { createJsonValidatorTool } from './tools/json-validator.js';\nexport { createJsonMergeTool } from './tools/json-merge.js';\n\nimport { createJsonParserTool } from './tools/json-parser.js';\nimport { createJsonStringifyTool } from './tools/json-stringify.js';\nimport { createJsonQueryTool } from './tools/json-query.js';\nimport { createJsonValidatorTool } from './tools/json-validator.js';\nimport { createJsonMergeTool } from './tools/json-merge.js';\nimport type { JsonToolsConfig } from './types.js';\n\n/**\n * Default JSON parser tool instance\n */\nexport const jsonParser = createJsonParserTool();\n\n/**\n * Default JSON stringify tool instance\n */\nexport const jsonStringify = createJsonStringifyTool();\n\n/**\n * Default JSON query tool instance\n */\nexport const jsonQuery = createJsonQueryTool();\n\n/**\n * Default JSON validator tool instance\n */\nexport const jsonValidator = createJsonValidatorTool();\n\n/**\n * Default JSON merge tool instance\n */\nexport const jsonMerge = createJsonMergeTool();\n\n/**\n * All JSON tools\n */\nexport const jsonTools = [jsonParser, jsonStringify, jsonQuery, jsonValidator, jsonMerge];\n\n/**\n * Create JSON tools with custom configuration\n */\nexport function createJsonTools(config: JsonToolsConfig = {}) {\n const {\n defaultIndent = 2,\n defaultPretty = false,\n } = config;\n\n return [\n createJsonParserTool(),\n createJsonStringifyTool(defaultIndent, defaultPretty),\n createJsonQueryTool(),\n createJsonValidatorTool(),\n createJsonMergeTool(),\n ];\n}\n\n","/**\n * XML Tools Types\n * \n * Type definitions and schemas for XML tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * XML parser schema\n */\nexport const xmlParserSchema = z.object({\n xml: z.string().describe('XML string to parse'),\n ignoreAttributes: z.boolean().default(false).describe('Ignore XML attributes'),\n parseAttributeValue: z.boolean().default(true).describe('Parse attribute values (numbers, booleans)'),\n trimValues: z.boolean().default(true).describe('Trim whitespace from text values'),\n});\n\n/**\n * XML generator schema\n */\nexport const xmlGeneratorSchema = z.object({\n data: z.any().describe('Object to convert to XML'),\n rootName: z.string().default('root').describe('Name of the root XML element'),\n format: z.boolean().default(false).describe('Format XML with indentation'),\n indentSize: z.number().default(2).describe('Number of spaces for indentation (when format is true)'),\n});\n\n/**\n * XML to JSON schema\n */\nexport const xmlToJsonSchema = z.object({\n xml: z.string().describe('XML string to convert'),\n ignoreAttributes: z.boolean().default(false).describe('Ignore XML attributes in conversion'),\n pretty: z.boolean().default(false).describe('Format JSON with indentation'),\n});\n\n/**\n * JSON to XML schema\n */\nexport const jsonToXmlSchema = z.object({\n json: z.string().describe('JSON string to convert'),\n rootName: z.string().default('root').describe('Name of the root XML element'),\n format: z.boolean().default(false).describe('Format XML with indentation'),\n});\n\n/**\n * XML tools configuration\n */\nexport interface XmlToolsConfig {\n defaultRootName?: string;\n defaultFormat?: boolean;\n defaultIndentSize?: number;\n}\n\n","/**\n * XML Parser Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { XMLParser } from 'fast-xml-parser';\nimport { xmlParserSchema } from '../types.js';\n\n/**\n * Create XML parser tool\n */\nexport function createXmlParserTool() {\n return toolBuilder()\n .name('xml-parser')\n .description('Parse XML string into a JavaScript object. Supports attributes, CDATA, and nested elements.')\n .category(ToolCategory.UTILITY)\n .tags(['xml', 'parse', 'data'])\n .schema(xmlParserSchema)\n .implement(async (input) => {\n try {\n const parser = new XMLParser({\n ignoreAttributes: input.ignoreAttributes,\n parseAttributeValue: input.parseAttributeValue,\n trimValues: input.trimValues,\n parseTagValue: true,\n });\n\n const result = parser.parse(input.xml);\n\n return {\n success: true,\n data: result,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to parse XML',\n };\n }\n })\n .build();\n}\n\n","/**\n * XML Generator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { XMLBuilder } from 'fast-xml-parser';\nimport { xmlGeneratorSchema } from '../types.js';\n\n/**\n * Create XML generator tool\n */\nexport function createXmlGeneratorTool(defaultRootName = 'root', defaultFormat = false, defaultIndentSize = 2) {\n return toolBuilder()\n .name('xml-generator')\n .description('Convert a JavaScript object to XML string. Supports attributes, CDATA, and nested elements.')\n .category(ToolCategory.UTILITY)\n .tags(['xml', 'generate', 'stringify', 'data'])\n .schema(xmlGeneratorSchema)\n .implement(async (input) => {\n try {\n const indentSize = input.indentSize ?? defaultIndentSize;\n const rootName = input.rootName ?? defaultRootName;\n const format = input.format ?? defaultFormat;\n\n const builder = new XMLBuilder({\n format,\n indentBy: ' '.repeat(indentSize),\n ignoreAttributes: false,\n });\n\n // Wrap data in root element if not already wrapped\n const dataToConvert = input.data[rootName] ? input.data : { [rootName]: input.data };\n const xml = builder.build(dataToConvert);\n\n return {\n success: true,\n xml,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to generate XML',\n };\n }\n })\n .build();\n}\n\n","/**\n * XML to JSON Converter Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { XMLParser } from 'fast-xml-parser';\nimport { xmlToJsonSchema } from '../types.js';\n\n/**\n * Create XML to JSON converter tool\n */\nexport function createXmlToJsonTool() {\n return toolBuilder()\n .name('xml-to-json')\n .description('Convert XML string to JSON. Preserves structure and can include or exclude attributes.')\n .category(ToolCategory.UTILITY)\n .tags(['xml', 'json', 'convert', 'data'])\n .schema(xmlToJsonSchema)\n .implement(async (input) => {\n try {\n const parser = new XMLParser({\n ignoreAttributes: input.ignoreAttributes,\n parseAttributeValue: true,\n trimValues: true,\n });\n\n const result = parser.parse(input.xml);\n const json = input.pretty \n ? JSON.stringify(result, null, 2)\n : JSON.stringify(result);\n\n return {\n success: true,\n json,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to convert XML to JSON',\n };\n }\n })\n .build();\n}\n\n","/**\n * JSON to XML Converter Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { XMLBuilder } from 'fast-xml-parser';\nimport { jsonToXmlSchema } from '../types.js';\n\n/**\n * Create JSON to XML converter tool\n */\nexport function createJsonToXmlTool(defaultRootName = 'root', defaultFormat = false) {\n return toolBuilder()\n .name('json-to-xml')\n .description('Convert JSON string to XML. Each object key becomes an XML element.')\n .category(ToolCategory.UTILITY)\n .tags(['json', 'xml', 'convert', 'data'])\n .schema(jsonToXmlSchema)\n .implement(async (input) => {\n try {\n const data = JSON.parse(input.json);\n const rootName = input.rootName ?? defaultRootName;\n const format = input.format ?? defaultFormat;\n\n const builder = new XMLBuilder({\n format,\n indentBy: ' ',\n ignoreAttributes: false,\n });\n\n const dataToConvert = data[rootName] ? data : { [rootName]: data };\n const xml = builder.build(dataToConvert);\n\n return {\n success: true,\n xml,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to convert JSON to XML',\n };\n }\n })\n .build();\n}\n\n","/**\n * XML Tools\n * \n * Tools for parsing and generating XML data.\n */\n\nexport * from './types.js';\nexport { createXmlParserTool } from './tools/xml-parser.js';\nexport { createXmlGeneratorTool } from './tools/xml-generator.js';\nexport { createXmlToJsonTool } from './tools/xml-to-json.js';\nexport { createJsonToXmlTool } from './tools/json-to-xml.js';\n\nimport { createXmlParserTool } from './tools/xml-parser.js';\nimport { createXmlGeneratorTool } from './tools/xml-generator.js';\nimport { createXmlToJsonTool } from './tools/xml-to-json.js';\nimport { createJsonToXmlTool } from './tools/json-to-xml.js';\nimport type { XmlToolsConfig } from './types.js';\n\n/**\n * Default XML parser tool instance\n */\nexport const xmlParser = createXmlParserTool();\n\n/**\n * Default XML generator tool instance\n */\nexport const xmlGenerator = createXmlGeneratorTool();\n\n/**\n * Default XML to JSON converter tool instance\n */\nexport const xmlToJson = createXmlToJsonTool();\n\n/**\n * Default JSON to XML converter tool instance\n */\nexport const jsonToXml = createJsonToXmlTool();\n\n/**\n * All XML tools\n */\nexport const xmlTools = [xmlParser, xmlGenerator, xmlToJson, jsonToXml];\n\n/**\n * Create XML tools with custom configuration\n */\nexport function createXmlTools(config: XmlToolsConfig = {}) {\n const {\n defaultRootName = 'root',\n defaultFormat = false,\n defaultIndentSize = 2,\n } = config;\n\n return [\n createXmlParserTool(),\n createXmlGeneratorTool(defaultRootName, defaultFormat, defaultIndentSize),\n createXmlToJsonTool(),\n createJsonToXmlTool(defaultRootName, defaultFormat),\n ];\n}\n\n","/**\n * Data Transformer Tools Types\n * \n * Type definitions and schemas for data transformation tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * Array filter schema\n */\nexport const arrayFilterSchema = z.object({\n array: z.array(z.any().describe('Array element')).describe('Array to filter'),\n property: z.string().describe('Property name to filter by (use dot notation for nested properties)'),\n operator: z.enum(['equals', 'not-equals', 'greater-than', 'less-than', 'contains', 'starts-with', 'ends-with']).describe('Comparison operator'),\n value: z.any().describe('Value to compare against'),\n});\n\n/**\n * Array map schema\n */\nexport const arrayMapSchema = z.object({\n array: z.array(z.any().describe('Array element')).describe('Array to map'),\n properties: z.array(z.string().describe(\"String value\")).describe('List of property names to extract from each object'),\n});\n\n/**\n * Array sort schema\n */\nexport const arraySortSchema = z.object({\n array: z.array(z.any().describe('Array element')).describe('Array to sort'),\n property: z.string().describe('Property name to sort by (use dot notation for nested properties)'),\n order: z.enum(['asc', 'desc']).default('asc').describe('Sort order: ascending or descending'),\n});\n\n/**\n * Array group by schema\n */\nexport const arrayGroupBySchema = z.object({\n array: z.array(z.any().describe('Array element')).describe('Array to group'),\n property: z.string().describe('Property name to group by'),\n});\n\n/**\n * Object pick schema\n */\nexport const objectPickSchema = z.object({\n object: z.record(z.any().describe('Property value')).describe('Source object'),\n properties: z.array(z.string().describe(\"String value\")).describe('List of property names to pick'),\n});\n\n/**\n * Object omit schema\n */\nexport const objectOmitSchema = z.object({\n object: z.record(z.any().describe('Property value')).describe('Source object'),\n properties: z.array(z.string().describe(\"String value\")).describe('List of property names to omit'),\n});\n\n/**\n * Transformer tools configuration\n */\nexport interface TransformerToolsConfig {\n // No specific configuration needed for transformer tools\n}\n\n","/**\n * Array Filter Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { arrayFilterSchema } from '../types.js';\n\n/**\n * Create array filter tool\n */\nexport function createArrayFilterTool() {\n return toolBuilder()\n .name('array-filter')\n .description('Filter an array based on a property value. Supports equality, comparison, and contains operations.')\n .category(ToolCategory.UTILITY)\n .tags(['array', 'filter', 'data', 'transform'])\n .schema(arrayFilterSchema)\n .implement(async (input) => {\n const getNestedValue = (obj: any, path: string): any => {\n return path.split('.').reduce((current, key) => current?.[key], obj);\n };\n\n const filtered = input.array.filter((item) => {\n const itemValue = getNestedValue(item, input.property);\n \n switch (input.operator) {\n case 'equals':\n return itemValue === input.value;\n case 'not-equals':\n return itemValue !== input.value;\n case 'greater-than':\n return itemValue > input.value;\n case 'less-than':\n return itemValue < input.value;\n case 'contains':\n return String(itemValue).includes(String(input.value));\n case 'starts-with':\n return String(itemValue).startsWith(String(input.value));\n case 'ends-with':\n return String(itemValue).endsWith(String(input.value));\n default:\n return false;\n }\n });\n\n return {\n filtered,\n originalCount: input.array.length,\n filteredCount: filtered.length,\n };\n })\n .build();\n}\n\n","/**\n * Array Map Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { arrayMapSchema } from '../types.js';\n\n/**\n * Create array map tool\n */\nexport function createArrayMapTool() {\n return toolBuilder()\n .name('array-map')\n .description('Extract specific properties from each object in an array. Creates a new array with only the selected properties.')\n .category(ToolCategory.UTILITY)\n .tags(['array', 'map', 'data', 'transform'])\n .schema(arrayMapSchema)\n .implement(async (input) => {\n const mapped = input.array.map((item) => {\n const result: any = {};\n for (const prop of input.properties) {\n // Support dot notation\n const value = prop.split('.').reduce((current, key) => current?.[key], item);\n result[prop] = value;\n }\n return result;\n });\n\n return {\n mapped,\n count: mapped.length,\n };\n })\n .build();\n}\n\n","/**\n * Array Sort Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { arraySortSchema } from '../types.js';\n\n/**\n * Create array sort tool\n */\nexport function createArraySortTool() {\n return toolBuilder()\n .name('array-sort')\n .description('Sort an array by a property value. Supports ascending and descending order.')\n .category(ToolCategory.UTILITY)\n .tags(['array', 'sort', 'data', 'transform'])\n .schema(arraySortSchema)\n .implement(async (input) => {\n const getNestedValue = (obj: any, path: string): any => {\n return path.split('.').reduce((current, key) => current?.[key], obj);\n };\n\n const sorted = [...input.array].sort((a, b) => {\n const aValue = getNestedValue(a, input.property);\n const bValue = getNestedValue(b, input.property);\n \n if (aValue < bValue) return input.order === 'asc' ? -1 : 1;\n if (aValue > bValue) return input.order === 'asc' ? 1 : -1;\n return 0;\n });\n\n return {\n sorted,\n count: sorted.length,\n };\n })\n .build();\n}\n\n","/**\n * Array Group By Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { arrayGroupBySchema } from '../types.js';\n\n/**\n * Create array group by tool\n */\nexport function createArrayGroupByTool() {\n return toolBuilder()\n .name('array-group-by')\n .description('Group an array of objects by a property value. Returns an object with groups as keys.')\n .category(ToolCategory.UTILITY)\n .tags(['array', 'group', 'data', 'transform'])\n .schema(arrayGroupBySchema)\n .implement(async (input) => {\n const groups: Record<string, any[]> = {};\n \n for (const item of input.array) {\n const key = String(item[input.property]);\n if (!groups[key]) {\n groups[key] = [];\n }\n groups[key].push(item);\n }\n\n return {\n groups,\n groupCount: Object.keys(groups).length,\n totalItems: input.array.length,\n };\n })\n .build();\n}\n\n","/**\n * Object Pick Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { objectPickSchema } from '../types.js';\n\n/**\n * Create object pick tool\n */\nexport function createObjectPickTool() {\n return toolBuilder()\n .name('object-pick')\n .description('Create a new object with only the specified properties from the source object.')\n .category(ToolCategory.UTILITY)\n .tags(['object', 'pick', 'data', 'transform'])\n .schema(objectPickSchema)\n .implement(async (input) => {\n const picked: Record<string, any> = {};\n \n for (const prop of input.properties) {\n if (prop in input.object) {\n picked[prop] = input.object[prop];\n }\n }\n\n return picked;\n })\n .build();\n}\n\n","/**\n * Object Omit Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { objectOmitSchema } from '../types.js';\n\n/**\n * Create object omit tool\n */\nexport function createObjectOmitTool() {\n return toolBuilder()\n .name('object-omit')\n .description('Create a new object excluding the specified properties from the source object.')\n .category(ToolCategory.UTILITY)\n .tags(['object', 'omit', 'data', 'transform'])\n .schema(objectOmitSchema)\n .implement(async (input) => {\n const omitted: Record<string, any> = { ...input.object };\n \n for (const prop of input.properties) {\n delete omitted[prop];\n }\n\n return omitted;\n })\n .build();\n}\n\n","/**\n * Data Transformer Tools\n * \n * Tools for transforming, filtering, mapping, and manipulating data structures.\n */\n\nexport * from './types.js';\nexport { createArrayFilterTool } from './tools/array-filter.js';\nexport { createArrayMapTool } from './tools/array-map.js';\nexport { createArraySortTool } from './tools/array-sort.js';\nexport { createArrayGroupByTool } from './tools/array-group-by.js';\nexport { createObjectPickTool } from './tools/object-pick.js';\nexport { createObjectOmitTool } from './tools/object-omit.js';\n\nimport { createArrayFilterTool } from './tools/array-filter.js';\nimport { createArrayMapTool } from './tools/array-map.js';\nimport { createArraySortTool } from './tools/array-sort.js';\nimport { createArrayGroupByTool } from './tools/array-group-by.js';\nimport { createObjectPickTool } from './tools/object-pick.js';\nimport { createObjectOmitTool } from './tools/object-omit.js';\nimport type { TransformerToolsConfig } from './types.js';\n\n/**\n * Default array filter tool instance\n */\nexport const arrayFilter = createArrayFilterTool();\n\n/**\n * Default array map tool instance\n */\nexport const arrayMap = createArrayMapTool();\n\n/**\n * Default array sort tool instance\n */\nexport const arraySort = createArraySortTool();\n\n/**\n * Default array group by tool instance\n */\nexport const arrayGroupBy = createArrayGroupByTool();\n\n/**\n * Default object pick tool instance\n */\nexport const objectPick = createObjectPickTool();\n\n/**\n * Default object omit tool instance\n */\nexport const objectOmit = createObjectOmitTool();\n\n/**\n * All transformer tools\n */\nexport const transformerTools = [arrayFilter, arrayMap, arraySort, arrayGroupBy, objectPick, objectOmit];\n\n/**\n * Create transformer tools with custom configuration\n */\nexport function createTransformerTools(config: TransformerToolsConfig = {}) {\n return [\n createArrayFilterTool(),\n createArrayMapTool(),\n createArraySortTool(),\n createArrayGroupByTool(),\n createObjectPickTool(),\n createObjectOmitTool(),\n ];\n}\n\n","/**\n * Neo4j Tools Types\n * \n * Type definitions and schemas for Neo4j graph database tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * Neo4j connection configuration\n */\nexport interface Neo4jConfig {\n uri: string;\n username: string;\n password: string;\n database?: string;\n maxConnectionPoolSize?: number;\n connectionTimeout?: number;\n}\n\n/**\n * Neo4j query schema\n */\nexport const neo4jQuerySchema = z.object({\n cypher: z.string().describe('Cypher query to execute'),\n parameters: z.record(z.any()).optional().describe('Query parameters for parameterized queries'),\n database: z.string().optional().describe('Database name (defaults to configured database)'),\n});\n\n/**\n * Neo4j get schema input schema\n */\nexport const neo4jGetSchemaSchema = z.object({\n database: z.string().optional().describe('Database name (defaults to configured database)'),\n});\n\n/**\n * Neo4j find nodes schema\n */\nexport const neo4jFindNodesSchema = z.object({\n label: z.string().describe('Node label to search for'),\n properties: z.record(z.any()).optional().describe('Properties to match (key-value pairs)'),\n limit: z.number().default(100).describe('Maximum number of nodes to return'),\n database: z.string().optional().describe('Database name (defaults to configured database)'),\n});\n\n/**\n * Neo4j traverse schema\n */\nexport const neo4jTraverseSchema = z.object({\n startNodeId: z.union([\n z.string().describe('Node ID as string'),\n z.number().describe('Node ID as number')\n ]).describe('ID of the starting node'),\n relationshipType: z.string().optional().describe('Type of relationship to follow (optional, follows all if not specified)'),\n direction: z.enum(['outgoing', 'incoming', 'both']).default('outgoing').describe('Direction to traverse'),\n maxDepth: z.number().default(1).describe('Maximum depth to traverse'),\n limit: z.number().default(100).describe('Maximum number of nodes to return'),\n database: z.string().optional().describe('Database name (defaults to configured database)'),\n});\n\n/**\n * Neo4j vector search schema\n */\nexport const neo4jVectorSearchSchema = z.object({\n indexName: z.string().describe('Name of the vector index to search'),\n queryVector: z.array(z.number().describe('Vector dimension value')).describe('Query vector for similarity search'),\n limit: z.number().default(10).describe('Maximum number of results to return'),\n database: z.string().optional().describe('Database name (defaults to configured database)'),\n});\n\n/**\n * Neo4j vector search with embedding schema\n */\nexport const neo4jVectorSearchWithEmbeddingSchema = z.object({\n indexName: z.string().describe('Name of the vector index to search'),\n queryText: z.string().describe('Text to generate embedding from for similarity search'),\n limit: z.number().default(10).describe('Maximum number of results to return'),\n model: z.string().optional().describe('Embedding model to use (defaults to configured model)'),\n database: z.string().optional().describe('Database name (defaults to configured database)'),\n});\n\n/**\n * Neo4j create node with embedding schema\n */\nexport const neo4jCreateNodeWithEmbeddingSchema = z.object({\n label: z.string().describe('Node label'),\n properties: z.record(z.string(), z.any().describe('Property value')).describe('Node properties (key-value pairs)'),\n textProperty: z.string().describe('Name of the property containing text to embed'),\n embeddingProperty: z.string().default('embedding').describe('Name of the property to store the embedding vector'),\n model: z.string().optional().describe('Embedding model to use (defaults to configured model)'),\n database: z.string().optional().describe('Database name (defaults to configured database)'),\n});\n\n/**\n * Neo4j node result\n */\nexport interface Neo4jNode {\n identity: string | number;\n labels: string[];\n properties: Record<string, any>;\n}\n\n/**\n * Neo4j relationship result\n */\nexport interface Neo4jRelationship {\n identity: string | number;\n type: string;\n start: string | number;\n end: string | number;\n properties: Record<string, any>;\n}\n\n/**\n * Neo4j path result\n */\nexport interface Neo4jPath {\n start: Neo4jNode;\n end: Neo4jNode;\n segments: Array<{\n start: Neo4jNode;\n relationship: Neo4jRelationship;\n end: Neo4jNode;\n }>;\n length: number;\n}\n\n/**\n * Neo4j schema information\n */\nexport interface Neo4jSchema {\n nodeLabels: string[];\n relationshipTypes: string[];\n propertyKeys: string[];\n constraints: Array<{\n label?: string;\n type: string;\n properties: string[];\n }>;\n indexes: Array<{\n label?: string;\n type: string;\n properties: string[];\n }>;\n}\n\n/**\n * Neo4j tools configuration\n */\nexport interface Neo4jToolsConfig {\n uri?: string;\n username?: string;\n password?: string;\n database?: string;\n maxConnectionPoolSize?: number;\n connectionTimeout?: number;\n}\n\n","/**\n * Neo4j Connection Pool Management\n *\n * Manages Neo4j driver connections with pooling and health checks.\n */\n\nimport neo4j, { Driver, Session, auth } from 'neo4j-driver';\nimport { createLogger } from '@agentforge/core';\nimport type { Neo4jConfig } from './types.js';\n\nconst logger = createLogger('agentforge:tools:neo4j:pool');\n\n/**\n * Neo4j connection pool singleton\n */\nclass Neo4jConnectionPool {\n private driver: Driver | null = null;\n private config: Neo4jConfig | null = null;\n\n /**\n * Initialize the connection pool\n */\n async initialize(config: Neo4jConfig): Promise<void> {\n const startTime = Date.now();\n\n logger.debug('Initializing Neo4j connection pool', {\n uri: config.uri,\n username: config.username,\n database: config.database || 'neo4j',\n maxConnectionPoolSize: config.maxConnectionPoolSize || 50,\n connectionTimeout: config.connectionTimeout || 30000,\n });\n\n if (this.driver) {\n logger.debug('Closing existing connection before reinitializing');\n await this.close();\n }\n\n this.config = config;\n this.driver = neo4j.driver(\n config.uri,\n auth.basic(config.username, config.password),\n {\n maxConnectionPoolSize: config.maxConnectionPoolSize || 50,\n connectionTimeout: config.connectionTimeout || 30000,\n }\n );\n\n // Verify connectivity\n await this.verifyConnectivity();\n\n logger.info('Neo4j connection pool initialized', {\n uri: config.uri,\n database: config.database || 'neo4j',\n duration: Date.now() - startTime,\n });\n }\n\n /**\n * Verify connectivity to Neo4j\n */\n async verifyConnectivity(): Promise<void> {\n if (!this.driver) {\n const error = 'Neo4j driver not initialized';\n logger.error(error);\n throw new Error(error);\n }\n\n logger.debug('Verifying Neo4j connectivity');\n\n try {\n await this.driver.verifyConnectivity();\n logger.debug('Neo4j connectivity verified');\n } catch (error) {\n const errorMessage = `Failed to connect to Neo4j: ${error instanceof Error ? error.message : 'Unknown error'}`;\n logger.error('Neo4j connectivity verification failed', {\n error: error instanceof Error ? error.message : 'Unknown error',\n uri: this.config?.uri,\n });\n throw new Error(errorMessage);\n }\n }\n\n /**\n * Get a session for executing queries\n */\n getSession(database?: string): Session {\n if (!this.driver) {\n throw new Error('Neo4j driver not initialized. Call initialize() first.');\n }\n\n return this.driver.session({\n database: database || this.config?.database || 'neo4j',\n });\n }\n\n /**\n * Execute a query with automatic session management\n */\n async executeQuery<T = any>(\n cypher: string,\n parameters?: Record<string, any>,\n database?: string\n ): Promise<T[]> {\n const session = this.getSession(database);\n try {\n const result = await session.run(cypher, parameters);\n return result.records.map((record) => record.toObject() as T);\n } finally {\n await session.close();\n }\n }\n\n /**\n * Execute a read query\n */\n async executeReadQuery<T = any>(\n cypher: string,\n parameters?: Record<string, any>,\n database?: string\n ): Promise<T[]> {\n const session = this.getSession(database);\n try {\n const result = await session.executeRead((tx) => tx.run(cypher, parameters));\n return result.records.map((record) => record.toObject() as T);\n } finally {\n await session.close();\n }\n }\n\n /**\n * Execute a write query\n */\n async executeWriteQuery<T = any>(\n cypher: string,\n parameters?: Record<string, any>,\n database?: string\n ): Promise<T[]> {\n const session = this.getSession(database);\n try {\n const result = await session.executeWrite((tx) => tx.run(cypher, parameters));\n return result.records.map((record) => record.toObject() as T);\n } finally {\n await session.close();\n }\n }\n\n /**\n * Check if driver is initialized\n */\n isInitialized(): boolean {\n return this.driver !== null;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): Neo4jConfig | null {\n return this.config;\n }\n\n /**\n * Close the connection pool\n */\n async close(): Promise<void> {\n if (this.driver) {\n logger.debug('Closing Neo4j connection pool');\n await this.driver.close();\n this.driver = null;\n this.config = null;\n logger.info('Neo4j connection pool closed');\n }\n }\n}\n\n/**\n * Global connection pool instance\n */\nexport const neo4jPool = new Neo4jConnectionPool();\n\n/**\n * Initialize Neo4j connection from environment variables\n */\nexport async function initializeFromEnv(): Promise<void> {\n // Warn about missing environment variables\n if (!process.env.NEO4J_URI) {\n logger.warn('NEO4J_URI environment variable not set, using default', {\n default: 'bolt://localhost:7687',\n });\n }\n\n if (!process.env.NEO4J_USER) {\n logger.warn('NEO4J_USER environment variable not set, using default', {\n default: 'neo4j',\n });\n }\n\n if (!process.env.NEO4J_PASSWORD) {\n logger.warn('NEO4J_PASSWORD environment variable not set, using default', {\n default: 'password',\n });\n }\n\n if (!process.env.NEO4J_DATABASE) {\n logger.debug('NEO4J_DATABASE environment variable not set, using default', {\n default: 'neo4j',\n });\n }\n\n const config: Neo4jConfig = {\n uri: process.env.NEO4J_URI || 'bolt://localhost:7687',\n username: process.env.NEO4J_USER || 'neo4j',\n password: process.env.NEO4J_PASSWORD || 'password',\n database: process.env.NEO4J_DATABASE,\n };\n\n await neo4jPool.initialize(config);\n}\n\n","/**\n * Embedding Utilities\n *\n * Utility functions for embedding generation\n */\n\nimport type { EmbeddingRetryConfig } from './types.js';\n\n/**\n * Default retry configuration for embedding API calls\n */\nexport const DEFAULT_RETRY_CONFIG: EmbeddingRetryConfig = {\n maxRetries: 3,\n initialDelay: 1000, // 1 second\n maxDelay: 10000, // 10 seconds\n backoffMultiplier: 2,\n};\n\n/**\n * Check if error is retryable (network errors, timeouts, 5xx errors, rate limits)\n */\nexport function isRetryableError(error: any): boolean {\n // Network errors\n if (error.code === 'ECONNRESET' || error.code === 'ETIMEDOUT' || error.code === 'ENOTFOUND') {\n return true;\n }\n\n // Timeout errors\n if (error.code === 'ECONNABORTED' || error.message?.includes('timeout')) {\n return true;\n }\n\n // 5xx server errors (but not 4xx client errors)\n if (error.response?.status >= 500 && error.response?.status < 600) {\n return true;\n }\n\n // Rate limiting (429) - retryable with backoff\n if (error.response?.status === 429) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Sleep for specified milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry an async function with exponential backoff\n */\nexport async function retryWithBackoff<T>(\n fn: () => Promise<T>,\n config: EmbeddingRetryConfig = DEFAULT_RETRY_CONFIG\n): Promise<T> {\n let lastError: any;\n let delay = config.initialDelay;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error: any) {\n lastError = error;\n\n // Don't retry if error is not retryable\n if (!isRetryableError(error)) {\n throw error;\n }\n\n // Don't retry if we've exhausted all attempts\n if (attempt === config.maxRetries) {\n break;\n }\n\n // Wait before retrying\n await sleep(delay);\n\n // Increase delay for next attempt (exponential backoff)\n delay = Math.min(delay * config.backoffMultiplier, config.maxDelay);\n }\n }\n\n // All retries exhausted\n throw lastError;\n}\n\n/**\n * Get OpenAI API key from environment\n */\nexport function getOpenAIApiKey(): string | undefined {\n return process.env.OPENAI_API_KEY;\n}\n\n/**\n * Get Cohere API key from environment\n */\nexport function getCohereApiKey(): string | undefined {\n return process.env.COHERE_API_KEY;\n}\n\n/**\n * Get HuggingFace API key from environment\n */\nexport function getHuggingFaceApiKey(): string | undefined {\n return process.env.HUGGINGFACE_API_KEY;\n}\n\n/**\n * Get Voyage AI API key from environment\n */\nexport function getVoyageApiKey(): string | undefined {\n return process.env.VOYAGE_API_KEY;\n}\n\n/**\n * Get Ollama base URL from environment (defaults to localhost)\n */\nexport function getOllamaBaseUrl(): string {\n return process.env.OLLAMA_BASE_URL || 'http://localhost:11434';\n}\n\n/**\n * Get embedding provider from environment (defaults to 'openai')\n */\nexport function getEmbeddingProvider(): string {\n return process.env.EMBEDDING_PROVIDER || 'openai';\n}\n\n/**\n * Get embedding model from environment\n */\nexport function getEmbeddingModel(): string | undefined {\n return process.env.EMBEDDING_MODEL;\n}\n\n/**\n * Validate text for embedding generation\n */\nexport function validateText(text: string): void {\n if (!text || text.trim().length === 0) {\n throw new Error('Text cannot be empty');\n }\n \n // Most embedding models have token limits (e.g., 8191 for OpenAI)\n // This is a rough character limit check\n if (text.length > 50000) {\n throw new Error('Text is too long for embedding generation (max ~50,000 characters)');\n }\n}\n\n/**\n * Validate batch of texts\n */\nexport function validateBatch(texts: string[]): void {\n if (!texts || texts.length === 0) {\n throw new Error('Batch cannot be empty');\n }\n \n if (texts.length > 2048) {\n throw new Error('Batch size too large (max 2048 texts)');\n }\n \n texts.forEach((text, index) => {\n try {\n validateText(text);\n } catch (error) {\n throw new Error(`Invalid text at index ${index}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n });\n}\n\n","/**\n * OpenAI Embedding Provider\n * \n * Generate embeddings using OpenAI's embedding models.\n * Requires OPENAI_API_KEY environment variable.\n * Get your API key at: https://platform.openai.com/api-keys\n */\n\nimport axios from 'axios';\nimport type { IEmbeddingProvider, EmbeddingResult, BatchEmbeddingResult } from '../types.js';\nimport { getOpenAIApiKey, retryWithBackoff, validateText, validateBatch } from '../utils.js';\n\n/**\n * OpenAI API response structure for embeddings\n */\ninterface OpenAIEmbeddingResponse {\n object: 'list';\n data: Array<{\n object: 'embedding';\n embedding: number[];\n index: number;\n }>;\n model: string;\n usage: {\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n\n/**\n * OpenAI embedding provider implementation\n */\nexport class OpenAIEmbeddingProvider implements IEmbeddingProvider {\n readonly name = 'openai' as const;\n readonly defaultModel = 'text-embedding-3-small';\n \n private apiKey: string | undefined;\n private readonly baseURL = 'https://api.openai.com/v1';\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || getOpenAIApiKey();\n }\n\n /**\n * Check if OpenAI is available (API key is set)\n */\n isAvailable(): boolean {\n return !!this.apiKey;\n }\n\n /**\n * Generate embedding for a single text\n */\n async generateEmbedding(text: string, model?: string): Promise<EmbeddingResult> {\n if (!this.apiKey) {\n throw new Error(\n 'OpenAI API key not found. Set OPENAI_API_KEY environment variable. ' +\n 'Get your key at https://platform.openai.com/api-keys'\n );\n }\n\n validateText(text);\n\n const modelToUse = model || this.defaultModel;\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post<OpenAIEmbeddingResponse>(\n `${this.baseURL}/embeddings`,\n {\n input: text,\n model: modelToUse,\n },\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n timeout: 30000, // 30 seconds\n }\n );\n\n const data = response.data;\n \n if (!data.data || data.data.length === 0) {\n throw new Error('No embedding returned from OpenAI');\n }\n\n return {\n embedding: data.data[0].embedding,\n model: data.model,\n dimensions: data.data[0].embedding.length,\n usage: {\n promptTokens: data.usage.prompt_tokens,\n totalTokens: data.usage.total_tokens,\n },\n };\n } catch (error: any) {\n // Create error with helpful message while preserving metadata for retry logic\n let wrappedError: any;\n\n if (error.response?.status === 401) {\n wrappedError = new Error(\n 'Invalid OpenAI API key. Get your key at https://platform.openai.com/api-keys'\n );\n } else if (error.response?.status === 429) {\n wrappedError = new Error(\n 'OpenAI API rate limit exceeded. Please try again later or upgrade your plan.'\n );\n } else if (error.response?.status === 400) {\n wrappedError = new Error(\n `OpenAI API error: ${error.response.data?.error?.message || 'Bad request'}`\n );\n } else {\n wrappedError = new Error(`OpenAI embedding generation failed: ${error.message}`);\n }\n\n // Preserve error metadata for retry logic\n if (error.code) wrappedError.code = error.code;\n if (error.response) wrappedError.response = error.response;\n\n throw wrappedError;\n }\n });\n }\n\n /**\n * Generate embeddings for multiple texts (batch)\n */\n async generateBatchEmbeddings(texts: string[], model?: string): Promise<BatchEmbeddingResult> {\n if (!this.apiKey) {\n throw new Error(\n 'OpenAI API key not found. Set OPENAI_API_KEY environment variable. ' +\n 'Get your key at https://platform.openai.com/api-keys'\n );\n }\n\n validateBatch(texts);\n\n const modelToUse = model || this.defaultModel;\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post<OpenAIEmbeddingResponse>(\n `${this.baseURL}/embeddings`,\n {\n input: texts,\n model: modelToUse,\n },\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n timeout: 60000, // 60 seconds for batch\n }\n );\n\n const data = response.data;\n \n if (!data.data || data.data.length === 0) {\n throw new Error('No embeddings returned from OpenAI');\n }\n\n // Sort by index to ensure correct order\n const sortedData = data.data.sort((a, b) => a.index - b.index);\n\n return {\n embeddings: sortedData.map(item => item.embedding),\n model: data.model,\n dimensions: sortedData[0].embedding.length,\n usage: {\n promptTokens: data.usage.prompt_tokens,\n totalTokens: data.usage.total_tokens,\n },\n };\n } catch (error: any) {\n // Create error with helpful message while preserving metadata for retry logic\n let wrappedError: any;\n\n if (error.response?.status === 401) {\n wrappedError = new Error(\n 'Invalid OpenAI API key. Get your key at https://platform.openai.com/api-keys'\n );\n } else if (error.response?.status === 429) {\n wrappedError = new Error(\n 'OpenAI API rate limit exceeded. Please try again later or upgrade your plan.'\n );\n } else if (error.response?.status === 400) {\n wrappedError = new Error(\n `OpenAI API error: ${error.response.data?.error?.message || 'Bad request'}`\n );\n } else {\n wrappedError = new Error(`OpenAI batch embedding generation failed: ${error.message}`);\n }\n\n // Preserve error metadata for retry logic\n if (error.code) wrappedError.code = error.code;\n if (error.response) wrappedError.response = error.response;\n\n throw wrappedError;\n }\n });\n }\n}\n\n","/**\n * Cohere Embedding Provider\n * \n * Implementation of embedding generation using Cohere's API\n * https://docs.cohere.com/reference/embed\n */\n\nimport axios from 'axios';\nimport type { IEmbeddingProvider, EmbeddingResult, BatchEmbeddingResult } from '../types.js';\nimport { retryWithBackoff } from '../utils.js';\n\n/**\n * Cohere embedding provider\n */\nexport class CohereEmbeddingProvider implements IEmbeddingProvider {\n readonly name = 'cohere' as const;\n readonly defaultModel = 'embed-english-v3.0';\n\n private apiKey: string | undefined;\n private baseUrl = 'https://api.cohere.ai/v1';\n\n constructor(apiKey?: string, model?: string) {\n this.apiKey = apiKey;\n }\n\n /**\n * Check if Cohere is available (API key is set)\n */\n isAvailable(): boolean {\n return !!this.apiKey;\n }\n\n async generateEmbedding(text: string, model?: string): Promise<EmbeddingResult> {\n // Forward model parameter to batch method\n const result = await this.generateBatchEmbeddings([text], model);\n return {\n embedding: result.embeddings[0],\n model: result.model,\n dimensions: result.dimensions,\n usage: result.usage,\n };\n }\n\n async generateBatchEmbeddings(texts: string[], model?: string): Promise<BatchEmbeddingResult> {\n const modelToUse = model || this.defaultModel;\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post(\n `${this.baseUrl}/embed`,\n {\n texts,\n model: modelToUse,\n input_type: 'search_document', // For storing in vector DB\n embedding_types: ['float'],\n },\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n const embeddings = response.data.embeddings.float;\n const dimensions = embeddings[0]?.length || 0;\n\n return {\n embeddings,\n model: modelToUse,\n dimensions,\n usage: response.data.meta?.billed_units ? {\n promptTokens: response.data.meta.billed_units.input_tokens || 0,\n totalTokens: response.data.meta.billed_units.input_tokens || 0,\n } : undefined,\n };\n } catch (error: any) {\n if (axios.isAxiosError(error)) {\n const status = error.response?.status;\n const message = error.response?.data?.message || error.message;\n let wrappedError: any;\n\n if (status === 401) {\n wrappedError = new Error(`Cohere API authentication failed. Please check your COHERE_API_KEY. ${message}`);\n } else if (status === 429) {\n wrappedError = new Error(`Cohere API rate limit exceeded. ${message}`);\n } else if (status === 400) {\n wrappedError = new Error(`Cohere API request invalid: ${message}`);\n } else {\n wrappedError = new Error(`Cohere API error (${status}): ${message}`);\n }\n\n // Preserve error metadata for retry logic\n if (error.code) wrappedError.code = error.code;\n if (error.response) wrappedError.response = error.response;\n\n throw wrappedError;\n }\n\n throw error;\n }\n });\n }\n}\n\n","/**\n * HuggingFace Embedding Provider\n * \n * Implementation of embedding generation using HuggingFace Inference API\n * https://huggingface.co/docs/api-inference/detailed_parameters#feature-extraction-task\n */\n\nimport axios from 'axios';\nimport type { IEmbeddingProvider, EmbeddingResult, BatchEmbeddingResult } from '../types.js';\nimport { retryWithBackoff } from '../utils.js';\n\n/**\n * HuggingFace embedding provider\n */\nexport class HuggingFaceEmbeddingProvider implements IEmbeddingProvider {\n readonly name = 'huggingface' as const;\n readonly defaultModel = 'sentence-transformers/all-MiniLM-L6-v2';\n\n private apiKey: string | undefined;\n private baseUrl = 'https://api-inference.huggingface.co/pipeline/feature-extraction';\n\n constructor(apiKey?: string, model?: string) {\n this.apiKey = apiKey;\n }\n\n /**\n * Check if HuggingFace is available (API key is set)\n */\n isAvailable(): boolean {\n return !!this.apiKey;\n }\n\n async generateEmbedding(text: string, model?: string): Promise<EmbeddingResult> {\n const modelToUse = model || this.defaultModel;\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post(\n `${this.baseUrl}/${modelToUse}`,\n {\n inputs: text,\n options: {\n wait_for_model: true,\n },\n },\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n // HuggingFace returns the embedding directly as an array\n const embedding = Array.isArray(response.data) ? response.data : response.data[0];\n\n return {\n embedding,\n model: modelToUse,\n dimensions: embedding.length,\n };\n } catch (error: any) {\n if (axios.isAxiosError(error)) {\n const status = error.response?.status;\n const message = error.response?.data?.error || error.message;\n let wrappedError: any;\n\n if (status === 401) {\n wrappedError = new Error(`HuggingFace API authentication failed. Please check your HUGGINGFACE_API_KEY. ${message}`);\n } else if (status === 429) {\n wrappedError = new Error(`HuggingFace API rate limit exceeded. ${message}`);\n } else if (status === 400) {\n wrappedError = new Error(`HuggingFace API request invalid: ${message}`);\n } else if (status === 503) {\n wrappedError = new Error(`HuggingFace model is loading. Please retry in a moment. ${message}`);\n } else {\n wrappedError = new Error(`HuggingFace API error (${status}): ${message}`);\n }\n\n // Preserve error metadata for retry logic\n if (error.code) wrappedError.code = error.code;\n if (error.response) wrappedError.response = error.response;\n\n throw wrappedError;\n }\n\n throw error;\n }\n });\n }\n\n async generateBatchEmbeddings(texts: string[], model?: string): Promise<BatchEmbeddingResult> {\n const modelToUse = model || this.defaultModel;\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post(\n `${this.baseUrl}/${modelToUse}`,\n {\n inputs: texts,\n options: {\n wait_for_model: true,\n },\n },\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n const embeddings = response.data;\n const dimensions = embeddings[0]?.length || 0;\n\n return {\n embeddings,\n model: modelToUse,\n dimensions,\n };\n } catch (error: any) {\n if (axios.isAxiosError(error)) {\n const status = error.response?.status;\n const message = error.response?.data?.error || error.message;\n let wrappedError: any;\n\n if (status === 401) {\n wrappedError = new Error(`HuggingFace API authentication failed. Please check your HUGGINGFACE_API_KEY. ${message}`);\n } else if (status === 429) {\n wrappedError = new Error(`HuggingFace API rate limit exceeded. ${message}`);\n } else if (status === 400) {\n wrappedError = new Error(`HuggingFace API request invalid: ${message}`);\n } else if (status === 503) {\n wrappedError = new Error(`HuggingFace model is loading. Please retry in a moment. ${message}`);\n } else {\n wrappedError = new Error(`HuggingFace API error (${status}): ${message}`);\n }\n\n // Preserve error metadata for retry logic\n if (error.code) wrappedError.code = error.code;\n if (error.response) wrappedError.response = error.response;\n\n throw wrappedError;\n }\n\n throw error;\n }\n });\n }\n}\n\n","/**\n * Voyage AI Embedding Provider\n * \n * Implementation of embedding generation using Voyage AI's API\n * https://docs.voyageai.com/docs/embeddings\n */\n\nimport axios from 'axios';\nimport type { IEmbeddingProvider, EmbeddingResult, BatchEmbeddingResult } from '../types.js';\nimport { retryWithBackoff } from '../utils.js';\n\n/**\n * Voyage AI embedding provider\n */\nexport class VoyageEmbeddingProvider implements IEmbeddingProvider {\n readonly name = 'voyage' as const;\n readonly defaultModel = 'voyage-2';\n\n private apiKey: string | undefined;\n private baseUrl = 'https://api.voyageai.com/v1';\n\n constructor(apiKey?: string, model?: string) {\n this.apiKey = apiKey;\n }\n\n /**\n * Check if Voyage AI is available (API key is set)\n */\n isAvailable(): boolean {\n return !!this.apiKey;\n }\n\n async generateEmbedding(text: string, model?: string): Promise<EmbeddingResult> {\n const result = await this.generateBatchEmbeddings([text], model);\n return {\n embedding: result.embeddings[0],\n model: result.model,\n dimensions: result.dimensions,\n usage: result.usage,\n };\n }\n\n async generateBatchEmbeddings(texts: string[], model?: string): Promise<BatchEmbeddingResult> {\n const modelToUse = model || this.defaultModel;\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post(\n `${this.baseUrl}/embeddings`,\n {\n input: texts,\n model: modelToUse,\n input_type: 'document', // For storing in vector DB\n },\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n const embeddings = response.data.data.map((item: any) => item.embedding);\n const dimensions = embeddings[0]?.length || 0;\n\n return {\n embeddings,\n model: modelToUse,\n dimensions,\n usage: response.data.usage ? {\n promptTokens: response.data.usage.total_tokens || 0,\n totalTokens: response.data.usage.total_tokens || 0,\n } : undefined,\n };\n } catch (error: any) {\n if (axios.isAxiosError(error)) {\n const status = error.response?.status;\n const message = error.response?.data?.message || error.message;\n let wrappedError: any;\n\n if (status === 401) {\n wrappedError = new Error(`Voyage AI API authentication failed. Please check your VOYAGE_API_KEY. ${message}`);\n } else if (status === 429) {\n wrappedError = new Error(`Voyage AI API rate limit exceeded. ${message}`);\n } else if (status === 400) {\n wrappedError = new Error(`Voyage AI API request invalid: ${message}`);\n } else {\n wrappedError = new Error(`Voyage AI API error (${status}): ${message}`);\n }\n\n // Preserve error metadata for retry logic\n if (error.code) wrappedError.code = error.code;\n if (error.response) wrappedError.response = error.response;\n\n throw wrappedError;\n }\n\n throw error;\n }\n });\n }\n}\n\n","/**\n * Ollama Embedding Provider\n * \n * Implementation of embedding generation using Ollama (local embeddings)\n * https://github.com/ollama/ollama/blob/main/docs/api.md#generate-embeddings\n */\n\nimport axios from 'axios';\nimport type { IEmbeddingProvider, EmbeddingResult, BatchEmbeddingResult } from '../types.js';\nimport { retryWithBackoff } from '../utils.js';\n\n/**\n * Ollama embedding provider (local, privacy-focused)\n */\nexport class OllamaEmbeddingProvider implements IEmbeddingProvider {\n readonly name = 'ollama' as const;\n readonly defaultModel = 'nomic-embed-text';\n\n private baseUrl: string;\n\n constructor(model?: string, baseUrl: string = 'http://localhost:11434') {\n this.baseUrl = baseUrl;\n }\n\n /**\n * Check if Ollama is available (always true for local service)\n */\n isAvailable(): boolean {\n return true; // Ollama is local, no API key needed\n }\n\n async generateEmbedding(text: string, model?: string): Promise<EmbeddingResult> {\n const modelToUse = model || this.defaultModel;\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post(\n `${this.baseUrl}/api/embeddings`,\n {\n model: modelToUse,\n prompt: text,\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n );\n\n const embedding = response.data.embedding;\n\n return {\n embedding,\n model: modelToUse,\n dimensions: embedding.length,\n };\n } catch (error: any) {\n if (axios.isAxiosError(error)) {\n const status = error.response?.status;\n const message = error.response?.data?.error || error.message;\n let wrappedError: any;\n\n if (error.code === 'ECONNREFUSED') {\n wrappedError = new Error(`Cannot connect to Ollama at ${this.baseUrl}. Make sure Ollama is running locally.`);\n } else if (status === 404) {\n wrappedError = new Error(`Ollama model not found. Pull it with: ollama pull <model-name>`);\n } else if (status === 400) {\n wrappedError = new Error(`Ollama API request invalid: ${message}`);\n } else {\n wrappedError = new Error(`Ollama API error (${status}): ${message}`);\n }\n\n // Preserve error metadata for retry logic\n if (error.code) wrappedError.code = error.code;\n if (error.response) wrappedError.response = error.response;\n\n throw wrappedError;\n }\n\n throw error;\n }\n });\n }\n\n async generateBatchEmbeddings(texts: string[], model?: string): Promise<BatchEmbeddingResult> {\n const modelToUse = model || this.defaultModel;\n\n // Ollama doesn't support batch embeddings, so we'll call individually\n const embeddings: number[][] = [];\n\n for (const text of texts) {\n const result = await this.generateEmbedding(text, modelToUse);\n embeddings.push(result.embedding);\n }\n\n const dimensions = embeddings[0]?.length || 0;\n\n return {\n embeddings,\n model: modelToUse,\n dimensions,\n };\n }\n}\n\n","/**\n * Embedding Manager\n *\n * Manages embedding generation across different providers\n */\n\nimport { createLogger } from '@agentforge/core';\nimport type { IEmbeddingProvider, EmbeddingProvider, EmbeddingConfig, EmbeddingResult, BatchEmbeddingResult } from './types.js';\nimport { OpenAIEmbeddingProvider } from './providers/openai.js';\nimport { CohereEmbeddingProvider } from './providers/cohere.js';\nimport { HuggingFaceEmbeddingProvider } from './providers/huggingface.js';\nimport { VoyageEmbeddingProvider } from './providers/voyage.js';\nimport { OllamaEmbeddingProvider } from './providers/ollama.js';\nimport {\n getEmbeddingProvider,\n getEmbeddingModel,\n getOpenAIApiKey,\n getCohereApiKey,\n getHuggingFaceApiKey,\n getVoyageApiKey,\n getOllamaBaseUrl,\n} from './utils.js';\n\nconst logger = createLogger('agentforge:tools:neo4j:embeddings');\n\n/**\n * Singleton embedding manager\n */\nexport class EmbeddingManager {\n private provider: IEmbeddingProvider | null = null;\n private config: EmbeddingConfig | null = null;\n\n /**\n * Initialize with configuration\n */\n initialize(config: EmbeddingConfig): void {\n logger.debug('Initializing embedding manager', {\n provider: config.provider,\n model: config.model,\n });\n\n this.config = config;\n this.provider = this.createProvider(config.provider, config.apiKey);\n\n logger.info('Embedding manager initialized', {\n provider: config.provider,\n model: config.model || this.getDefaultModel(config.provider),\n });\n }\n\n /**\n * Initialize from environment variables\n */\n initializeFromEnv(): void {\n const providerName = getEmbeddingProvider() as EmbeddingProvider;\n const model = getEmbeddingModel();\n\n logger.debug('Initializing embedding manager from environment', {\n provider: providerName,\n model: model || this.getDefaultModel(providerName),\n });\n\n // Get API key based on provider\n let apiKey = '';\n let baseUrl = '';\n\n switch (providerName) {\n case 'openai': {\n const key = getOpenAIApiKey();\n if (!key) {\n logger.error('OPENAI_API_KEY environment variable not set', {\n provider: 'openai',\n required: true,\n });\n throw new Error('OPENAI_API_KEY environment variable is required for OpenAI embeddings');\n }\n apiKey = key;\n logger.debug('OpenAI API key found');\n break;\n }\n\n case 'cohere': {\n const key = getCohereApiKey();\n if (!key) {\n logger.error('COHERE_API_KEY environment variable not set', {\n provider: 'cohere',\n required: true,\n });\n throw new Error('COHERE_API_KEY environment variable is required for Cohere embeddings');\n }\n apiKey = key;\n logger.debug('Cohere API key found');\n break;\n }\n\n case 'huggingface': {\n const key = getHuggingFaceApiKey();\n if (!key) {\n logger.error('HUGGINGFACE_API_KEY environment variable not set', {\n provider: 'huggingface',\n required: true,\n });\n throw new Error('HUGGINGFACE_API_KEY environment variable is required for HuggingFace embeddings');\n }\n apiKey = key;\n logger.debug('HuggingFace API key found');\n break;\n }\n\n case 'voyage': {\n const key = getVoyageApiKey();\n if (!key) {\n logger.error('VOYAGE_API_KEY environment variable not set', {\n provider: 'voyage',\n required: true,\n });\n throw new Error('VOYAGE_API_KEY environment variable is required for Voyage AI embeddings');\n }\n apiKey = key;\n logger.debug('Voyage API key found');\n break;\n }\n\n case 'ollama':\n baseUrl = getOllamaBaseUrl();\n logger.debug('Using Ollama (local, no API key required)', {\n baseUrl: baseUrl || 'http://localhost:11434',\n });\n // Ollama doesn't require an API key (local)\n break;\n\n default:\n logger.error('Unknown embedding provider', {\n provider: providerName,\n });\n throw new Error(`Unknown embedding provider: ${providerName}`);\n }\n\n // Create provider\n this.provider = this.createProvider(providerName, apiKey, model, baseUrl);\n this.config = {\n provider: providerName,\n model: model || this.getDefaultModel(providerName),\n apiKey: '', // Not stored when using env\n };\n\n logger.info('Embedding manager initialized from environment', {\n provider: providerName,\n model: this.config.model,\n });\n }\n\n /**\n * Check if manager is initialized\n */\n isInitialized(): boolean {\n return this.provider !== null && this.config !== null;\n }\n\n /**\n * Get current provider\n */\n getProvider(): IEmbeddingProvider {\n if (!this.provider) {\n throw new Error('Embedding manager not initialized. Call initialize() or initializeFromEnv() first.');\n }\n return this.provider;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): EmbeddingConfig {\n if (!this.config) {\n throw new Error('Embedding manager not initialized. Call initialize() or initializeFromEnv() first.');\n }\n return this.config;\n }\n\n /**\n * Generate embedding for a single text\n */\n async generateEmbedding(text: string, model?: string): Promise<EmbeddingResult> {\n const startTime = Date.now();\n const provider = this.getProvider();\n const config = this.getConfig();\n\n // Use provided model, fall back to configured model, then provider default\n const modelToUse = model || config.model;\n\n logger.debug('Generating embedding', {\n provider: provider.name,\n model: modelToUse,\n textLength: text.length,\n });\n\n // Pass model parameter to provider\n const result = await provider.generateEmbedding(text, modelToUse);\n\n logger.info('Embedding generated', {\n provider: provider.name,\n model: result.model,\n dimensions: result.dimensions,\n duration: Date.now() - startTime,\n });\n\n return result;\n }\n\n /**\n * Generate embeddings for multiple texts (batch)\n */\n async generateBatchEmbeddings(texts: string[], model?: string): Promise<BatchEmbeddingResult> {\n const startTime = Date.now();\n const provider = this.getProvider();\n const config = this.getConfig();\n\n // Use provided model, fall back to configured model, then provider default\n const modelToUse = model || config.model;\n\n logger.debug('Generating batch embeddings', {\n provider: provider.name,\n model: modelToUse,\n count: texts.length,\n });\n\n // Pass model parameter to provider\n const result = await provider.generateBatchEmbeddings(texts, modelToUse);\n\n logger.info('Batch embeddings generated', {\n provider: provider.name,\n model: result.model,\n dimensions: result.dimensions,\n count: texts.length,\n duration: Date.now() - startTime,\n });\n\n return result;\n }\n\n /**\n * Get default model for a provider\n */\n private getDefaultModel(provider: EmbeddingProvider): string {\n switch (provider) {\n case 'openai':\n return 'text-embedding-3-small';\n case 'cohere':\n return 'embed-english-v3.0';\n case 'huggingface':\n return 'sentence-transformers/all-MiniLM-L6-v2';\n case 'voyage':\n return 'voyage-2';\n case 'ollama':\n return 'nomic-embed-text';\n default:\n return 'text-embedding-3-small';\n }\n }\n\n /**\n * Create a provider instance\n */\n private createProvider(\n providerName: EmbeddingProvider,\n apiKey?: string,\n model?: string,\n baseUrl?: string\n ): IEmbeddingProvider {\n switch (providerName) {\n case 'openai':\n return new OpenAIEmbeddingProvider(apiKey);\n\n case 'cohere':\n return new CohereEmbeddingProvider(apiKey);\n\n case 'huggingface':\n return new HuggingFaceEmbeddingProvider(apiKey);\n\n case 'voyage':\n return new VoyageEmbeddingProvider(apiKey);\n\n case 'ollama':\n return new OllamaEmbeddingProvider(model, baseUrl || 'http://localhost:11434');\n\n default:\n throw new Error(`Unknown embedding provider: ${providerName}`);\n }\n }\n\n /**\n * Reset the manager (for testing)\n */\n reset(): void {\n this.provider = null;\n this.config = null;\n }\n}\n\n/**\n * Singleton instance\n */\nexport const embeddingManager = new EmbeddingManager();\n\n/**\n * Initialize embedding manager from environment variables\n */\nexport function initializeEmbeddings(): void {\n embeddingManager.initializeFromEnv();\n}\n\n/**\n * Initialize embedding manager with custom configuration\n */\nexport function initializeEmbeddingsWithConfig(config: EmbeddingConfig): void {\n embeddingManager.initialize(config);\n}\n\n/**\n * Generate embedding for a single text\n */\nexport async function generateEmbedding(text: string, model?: string): Promise<EmbeddingResult> {\n return embeddingManager.generateEmbedding(text, model);\n}\n\n/**\n * Generate embeddings for multiple texts (batch)\n */\nexport async function generateBatchEmbeddings(texts: string[], model?: string): Promise<BatchEmbeddingResult> {\n return embeddingManager.generateBatchEmbeddings(texts, model);\n}\n\n","/**\n * Neo4j Result Formatter\n * \n * Utilities for formatting Neo4j query results into JSON-serializable objects.\n */\n\nimport { Node, Relationship, Path, Integer } from 'neo4j-driver';\nimport type { Neo4jNode, Neo4jRelationship, Neo4jPath } from '../types.js';\n\n/**\n * Convert Neo4j Integer to JavaScript number or string\n */\nexport function formatInteger(value: Integer): number | string {\n if (value.inSafeRange()) {\n return value.toNumber();\n }\n return value.toString();\n}\n\n/**\n * Format any Neo4j value to JSON-serializable format\n */\nexport function formatValue(value: any): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n // Handle Neo4j Integer\n if (value instanceof Integer) {\n return formatInteger(value);\n }\n\n // Handle Neo4j Node\n if (value instanceof Node) {\n return formatNode(value);\n }\n\n // Handle Neo4j Relationship\n if (value instanceof Relationship) {\n return formatRelationship(value);\n }\n\n // Handle Neo4j Path\n if (value instanceof Path) {\n return formatPath(value);\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return value.map(formatValue);\n }\n\n // Handle objects\n if (typeof value === 'object') {\n const formatted: Record<string, any> = {};\n for (const [key, val] of Object.entries(value)) {\n formatted[key] = formatValue(val);\n }\n return formatted;\n }\n\n return value;\n}\n\n/**\n * Format a Neo4j Node to a plain object\n */\nexport function formatNode(node: Node): Neo4jNode {\n return {\n identity: formatInteger(node.identity),\n labels: node.labels,\n properties: formatValue(node.properties),\n };\n}\n\n/**\n * Format a Neo4j Relationship to a plain object\n */\nexport function formatRelationship(rel: Relationship): Neo4jRelationship {\n return {\n identity: formatInteger(rel.identity),\n type: rel.type,\n start: formatInteger(rel.start),\n end: formatInteger(rel.end),\n properties: formatValue(rel.properties),\n };\n}\n\n/**\n * Format a Neo4j Path to a plain object\n */\nexport function formatPath(path: Path): Neo4jPath {\n return {\n start: formatNode(path.start),\n end: formatNode(path.end),\n segments: path.segments.map((segment) => ({\n start: formatNode(segment.start),\n relationship: formatRelationship(segment.relationship),\n end: formatNode(segment.end),\n })),\n length: path.length,\n };\n}\n\n/**\n * Format query results to JSON-serializable format\n */\nexport function formatResults(records: any[]): any[] {\n return records.map((record) => {\n const formatted: Record<string, any> = {};\n for (const key of record.keys) {\n formatted[key] = formatValue(record.get(key));\n }\n return formatted;\n });\n}\n\n","/**\n * Neo4j Query Tool\n *\n * Execute arbitrary Cypher queries against Neo4j database.\n */\n\nimport { toolBuilder, ToolCategory, createLogger } from '@agentforge/core';\nimport { neo4jQuerySchema } from '../types.js';\nimport { neo4jPool } from '../connection.js';\nimport { formatResults } from '../utils/result-formatter.js';\n\nconst logger = createLogger('agentforge:tools:neo4j:query');\n\n/**\n * Create Neo4j query tool\n */\nexport function createNeo4jQueryTool() {\n return toolBuilder()\n .name('neo4j-query')\n .description(\n 'Execute a Cypher query against the Neo4j graph database. ' +\n 'Supports parameterized queries for safety. Use this for complex queries, ' +\n 'graph traversals, and custom operations.'\n )\n .category(ToolCategory.DATABASE)\n .tags(['neo4j', 'graph', 'database', 'cypher', 'query'])\n .schema(neo4jQuerySchema)\n .implement(async (input) => {\n if (!neo4jPool.isInitialized()) {\n logger.warn('Neo4j query attempted but connection not initialized');\n return {\n success: false,\n error: 'Neo4j connection not initialized. Please configure Neo4j connection first.',\n };\n }\n\n const startTime = Date.now();\n\n logger.debug('Executing Neo4j query', {\n cypherPreview: input.cypher.substring(0, 100),\n parameterCount: Object.keys(input.parameters || {}).length,\n database: input.database,\n });\n\n try {\n const session = neo4jPool.getSession(input.database);\n\n try {\n const result = await session.run(input.cypher, input.parameters || {});\n const formattedResults = formatResults(result.records);\n const duration = Date.now() - startTime;\n\n logger.info('Neo4j query executed successfully', {\n recordCount: result.records.length,\n nodesCreated: result.summary.counters.updates().nodesCreated,\n nodesDeleted: result.summary.counters.updates().nodesDeleted,\n relationshipsCreated: result.summary.counters.updates().relationshipsCreated,\n relationshipsDeleted: result.summary.counters.updates().relationshipsDeleted,\n propertiesSet: result.summary.counters.updates().propertiesSet,\n duration,\n });\n\n return {\n success: true,\n data: formattedResults,\n recordCount: result.records.length,\n summary: {\n query: input.cypher,\n parameters: input.parameters,\n counters: {\n nodesCreated: result.summary.counters.updates().nodesCreated,\n nodesDeleted: result.summary.counters.updates().nodesDeleted,\n relationshipsCreated: result.summary.counters.updates().relationshipsCreated,\n relationshipsDeleted: result.summary.counters.updates().relationshipsDeleted,\n propertiesSet: result.summary.counters.updates().propertiesSet,\n },\n },\n };\n } finally {\n await session.close();\n }\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : 'Failed to execute query';\n\n logger.error('Neo4j query execution failed', {\n error: errorMessage,\n cypherPreview: input.cypher.substring(0, 100),\n duration,\n });\n\n return {\n success: false,\n error: errorMessage,\n query: input.cypher,\n };\n }\n })\n .build();\n}\n\n","/**\n * Neo4j Get Schema Tool\n * \n * Introspect the Neo4j graph schema to understand structure.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { neo4jGetSchemaSchema } from '../types.js';\nimport { neo4jPool } from '../connection.js';\n\n/**\n * Create Neo4j get schema tool\n */\nexport function createNeo4jGetSchemaTool() {\n return toolBuilder()\n .name('neo4j-get-schema')\n .description(\n 'Get the schema of the Neo4j graph database including node labels, ' +\n 'relationship types, property keys, constraints, and indexes. ' +\n 'This helps understand the structure of the graph before querying.'\n )\n .category(ToolCategory.DATABASE)\n .tags(['neo4j', 'graph', 'database', 'schema', 'introspection'])\n .schema(neo4jGetSchemaSchema)\n .implement(async (input) => {\n if (!neo4jPool.isInitialized()) {\n return {\n success: false,\n error: 'Neo4j connection not initialized. Please configure Neo4j connection first.',\n };\n }\n\n try {\n const session = neo4jPool.getSession(input.database);\n \n try {\n // Get node labels\n const labelsResult = await session.run('CALL db.labels()');\n const nodeLabels = labelsResult.records.map((r) => r.get('label'));\n\n // Get relationship types\n const relTypesResult = await session.run('CALL db.relationshipTypes()');\n const relationshipTypes = relTypesResult.records.map((r) => r.get('relationshipType'));\n\n // Get property keys\n const propsResult = await session.run('CALL db.propertyKeys()');\n const propertyKeys = propsResult.records.map((r) => r.get('propertyKey'));\n\n // Get constraints\n const constraintsResult = await session.run('SHOW CONSTRAINTS');\n const constraints = constraintsResult.records.map((r) => ({\n name: r.get('name'),\n type: r.get('type'),\n entityType: r.get('entityType'),\n labelsOrTypes: r.get('labelsOrTypes'),\n properties: r.get('properties'),\n }));\n\n // Get indexes\n const indexesResult = await session.run('SHOW INDEXES');\n const indexes = indexesResult.records.map((r) => ({\n name: r.get('name'),\n type: r.get('type'),\n entityType: r.get('entityType'),\n labelsOrTypes: r.get('labelsOrTypes'),\n properties: r.get('properties'),\n }));\n\n return {\n success: true,\n schema: {\n nodeLabels,\n relationshipTypes,\n propertyKeys,\n constraints,\n indexes,\n },\n summary: {\n totalLabels: nodeLabels.length,\n totalRelationshipTypes: relationshipTypes.length,\n totalPropertyKeys: propertyKeys.length,\n totalConstraints: constraints.length,\n totalIndexes: indexes.length,\n },\n };\n } finally {\n await session.close();\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get schema',\n };\n }\n })\n .build();\n}\n\n","/**\n * Cypher Sanitization Utilities\n * \n * Provides safe escaping and validation for Cypher identifiers to prevent injection attacks.\n */\n\n/**\n * Validate and escape a Cypher identifier (label, property key, relationship type)\n * \n * Cypher identifiers must:\n * - Start with a letter or underscore\n * - Contain only letters, numbers, and underscores\n * - Be backtick-escaped if they contain special characters\n * \n * @param identifier - The identifier to validate and escape\n * @param type - Type of identifier for error messages\n * @returns Safely escaped identifier\n * @throws Error if identifier is invalid\n */\nexport function escapeCypherIdentifier(identifier: string, type: string = 'identifier'): string {\n if (!identifier || typeof identifier !== 'string') {\n throw new Error(`Invalid ${type}: must be a non-empty string`);\n }\n\n // Remove leading/trailing whitespace\n const trimmed = identifier.trim();\n \n if (trimmed.length === 0) {\n throw new Error(`Invalid ${type}: cannot be empty or whitespace`);\n }\n\n // Check for null bytes (security risk)\n if (trimmed.includes('\\0')) {\n throw new Error(`Invalid ${type}: cannot contain null bytes`);\n }\n\n // Simple alphanumeric + underscore pattern (safe without escaping)\n const simplePattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n \n if (simplePattern.test(trimmed)) {\n // Safe to use without backticks\n return trimmed;\n }\n\n // For complex identifiers, use backtick escaping\n // Escape any backticks in the identifier by doubling them\n const escaped = trimmed.replace(/`/g, '``');\n \n return `\\`${escaped}\\``;\n}\n\n/**\n * Validate a label name\n */\nexport function validateLabel(label: string): string {\n return escapeCypherIdentifier(label, 'label');\n}\n\n/**\n * Validate a property key\n */\nexport function validatePropertyKey(key: string): string {\n return escapeCypherIdentifier(key, 'property key');\n}\n\n/**\n * Validate a relationship type\n */\nexport function validateRelationshipType(type: string): string {\n return escapeCypherIdentifier(type, 'relationship type');\n}\n\n/**\n * Validate an array of relationship types\n */\nexport function validateRelationshipTypes(types: string[]): string[] {\n if (!Array.isArray(types)) {\n throw new Error('Relationship types must be an array');\n }\n \n return types.map(type => validateRelationshipType(type));\n}\n\n/**\n * Validate direction parameter\n */\nexport function validateDirection(direction: string): 'OUTGOING' | 'INCOMING' | 'BOTH' {\n const normalized = direction.toUpperCase();\n \n if (normalized !== 'OUTGOING' && normalized !== 'INCOMING' && normalized !== 'BOTH') {\n throw new Error(`Invalid direction: must be 'OUTGOING', 'INCOMING', or 'BOTH'`);\n }\n \n return normalized as 'OUTGOING' | 'INCOMING' | 'BOTH';\n}\n\n/**\n * Build a safe property filter clause\n * \n * @param properties - Object with property key-value pairs\n * @param nodeVar - Variable name for the node (e.g., 'n')\n * @returns Object with WHERE clause and parameters\n */\nexport function buildPropertyFilter(\n properties: Record<string, any>,\n nodeVar: string = 'n'\n): { whereClause: string; parameters: Record<string, any> } {\n const keys = Object.keys(properties);\n \n if (keys.length === 0) {\n return { whereClause: '', parameters: {} };\n }\n\n // Validate node variable name\n const safeNodeVar = escapeCypherIdentifier(nodeVar, 'node variable');\n \n // Build WHERE conditions using parameters (safe from injection)\n const conditions = keys.map((key, index) => {\n const safeKey = validatePropertyKey(key);\n const paramName = `prop_${index}`;\n return `${safeNodeVar}.${safeKey} = $${paramName}`;\n });\n\n const parameters: Record<string, any> = {};\n keys.forEach((key, index) => {\n parameters[`prop_${index}`] = properties[key];\n });\n\n return {\n whereClause: `WHERE ${conditions.join(' AND ')}`,\n parameters,\n };\n}\n\n","/**\n * Neo4j Find Nodes Tool\n *\n * Find nodes by label and properties.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { neo4jFindNodesSchema } from '../types.js';\nimport { neo4jPool } from '../connection.js';\nimport { formatResults } from '../utils/result-formatter.js';\nimport { validateLabel, buildPropertyFilter } from '../utils/cypher-sanitizer.js';\n\n/**\n * Create Neo4j find nodes tool\n */\nexport function createNeo4jFindNodesTool() {\n return toolBuilder()\n .name('neo4j-find-nodes')\n .description(\n 'Find nodes in the Neo4j graph by label and optional property filters. ' +\n 'This is a simplified interface for common node lookup operations. ' +\n 'Returns nodes matching the specified criteria.'\n )\n .category(ToolCategory.DATABASE)\n .tags(['neo4j', 'graph', 'database', 'nodes', 'search'])\n .schema(neo4jFindNodesSchema)\n .implement(async (input) => {\n if (!neo4jPool.isInitialized()) {\n return {\n success: false,\n error: 'Neo4j connection not initialized. Please configure Neo4j connection first.',\n };\n }\n\n try {\n // Validate and escape the label to prevent injection\n const safeLabel = validateLabel(input.label);\n\n const session = neo4jPool.getSession(input.database);\n\n try {\n // Build the Cypher query with safe identifiers\n let cypher = `MATCH (n:${safeLabel})`;\n let parameters: Record<string, any> = {};\n\n // Add property filters if provided (using safe parameter binding)\n if (input.properties && Object.keys(input.properties).length > 0) {\n const { whereClause, parameters: filterParams } = buildPropertyFilter(input.properties, 'n');\n cypher += ` ${whereClause}`;\n parameters = { ...parameters, ...filterParams };\n }\n\n // Use parameter for limit to be extra safe\n cypher += ` RETURN n LIMIT $limit`;\n parameters.limit = input.limit;\n\n const result = await session.run(cypher, parameters);\n const formattedResults = formatResults(result.records);\n\n return {\n success: true,\n nodes: formattedResults.map((r) => r.n),\n count: result.records.length,\n query: {\n label: input.label,\n properties: input.properties,\n limit: input.limit,\n },\n };\n } finally {\n await session.close();\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to find nodes',\n query: {\n label: input.label,\n properties: input.properties,\n },\n };\n }\n })\n .build();\n}\n\n","/**\n * Neo4j Traverse Tool\n *\n * Traverse the graph from a starting node following relationships.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { neo4jTraverseSchema } from '../types.js';\nimport { neo4jPool } from '../connection.js';\nimport { formatResults } from '../utils/result-formatter.js';\nimport { validateRelationshipType, validateDirection } from '../utils/cypher-sanitizer.js';\n\n/**\n * Create Neo4j traverse tool\n */\nexport function createNeo4jTraverseTool() {\n return toolBuilder()\n .name('neo4j-traverse')\n .description(\n 'Traverse the Neo4j graph from a starting node by following relationships. ' +\n 'Supports filtering by relationship type, direction, and maximum depth. ' +\n 'Returns connected nodes and their relationships.'\n )\n .category(ToolCategory.DATABASE)\n .tags(['neo4j', 'graph', 'database', 'traverse', 'relationships'])\n .schema(neo4jTraverseSchema)\n .implement(async (input) => {\n if (!neo4jPool.isInitialized()) {\n return {\n success: false,\n error: 'Neo4j connection not initialized. Please configure Neo4j connection first.',\n };\n }\n\n try {\n // Validate direction (with default fallback)\n const safeDirection = validateDirection(input.direction || 'outgoing');\n\n // Validate relationship type if provided\n const safeRelType = input.relationshipType\n ? validateRelationshipType(input.relationshipType)\n : null;\n\n const session = neo4jPool.getSession(input.database);\n\n try {\n // Build relationship pattern based on direction with safe identifiers\n let relPattern = '';\n if (safeDirection === 'OUTGOING') {\n relPattern = safeRelType\n ? `-[r:${safeRelType}*1..${input.maxDepth}]->`\n : `-[r*1..${input.maxDepth}]->`;\n } else if (safeDirection === 'INCOMING') {\n relPattern = safeRelType\n ? `<-[r:${safeRelType}*1..${input.maxDepth}]-`\n : `<-[r*1..${input.maxDepth}]-`;\n } else {\n relPattern = safeRelType\n ? `-[r:${safeRelType}*1..${input.maxDepth}]-`\n : `-[r*1..${input.maxDepth}]-`;\n }\n\n // Build the Cypher query\n const cypher = `\n MATCH path = (start)${relPattern}(end)\n WHERE id(start) = $startNodeId\n RETURN start, end, relationships(path) as rels, length(path) as depth\n LIMIT $limit\n `;\n\n const parameters = {\n startNodeId: typeof input.startNodeId === 'string' \n ? parseInt(input.startNodeId, 10) \n : input.startNodeId,\n limit: input.limit,\n };\n\n const result = await session.run(cypher, parameters);\n const formattedResults = formatResults(result.records);\n\n return {\n success: true,\n paths: formattedResults.map((r) => ({\n start: r.start,\n end: r.end,\n relationships: r.rels,\n depth: r.depth,\n })),\n count: result.records.length,\n query: {\n startNodeId: input.startNodeId,\n relationshipType: input.relationshipType,\n direction: input.direction,\n maxDepth: input.maxDepth,\n },\n };\n } finally {\n await session.close();\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to traverse graph',\n query: {\n startNodeId: input.startNodeId,\n relationshipType: input.relationshipType,\n direction: input.direction,\n },\n };\n }\n })\n .build();\n}\n\n","/**\n * Neo4j Vector Search Tool\n * \n * Perform semantic search using vector indexes for GraphRAG applications.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { neo4jVectorSearchSchema } from '../types.js';\nimport { neo4jPool } from '../connection.js';\nimport { formatResults } from '../utils/result-formatter.js';\n\n/**\n * Create Neo4j vector search tool\n */\nexport function createNeo4jVectorSearchTool() {\n return toolBuilder()\n .name('neo4j-vector-search')\n .description(\n 'Perform semantic similarity search using vector indexes in Neo4j. ' +\n 'Essential for GraphRAG applications - finds nodes with similar embeddings. ' +\n 'Requires a vector index to be created in advance.'\n )\n .category(ToolCategory.DATABASE)\n .tags(['neo4j', 'graph', 'database', 'vector', 'search', 'semantic', 'graphrag'])\n .schema(neo4jVectorSearchSchema)\n .implement(async (input) => {\n if (!neo4jPool.isInitialized()) {\n return {\n success: false,\n error: 'Neo4j connection not initialized. Please configure Neo4j connection first.',\n };\n }\n\n try {\n const session = neo4jPool.getSession(input.database);\n \n try {\n // Use db.index.vector.queryNodes for vector similarity search\n const cypher = `\n CALL db.index.vector.queryNodes($indexName, $limit, $queryVector)\n YIELD node, score\n RETURN node, score\n ORDER BY score DESC\n `;\n\n const parameters = {\n indexName: input.indexName,\n limit: input.limit,\n queryVector: input.queryVector,\n };\n\n const result = await session.run(cypher, parameters);\n const formattedResults = formatResults(result.records);\n\n return {\n success: true,\n results: formattedResults.map((r) => ({\n node: r.node,\n score: r.score,\n })),\n count: result.records.length,\n query: {\n indexName: input.indexName,\n vectorDimension: input.queryVector.length,\n limit: input.limit,\n },\n };\n } finally {\n await session.close();\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to perform vector search';\n \n // Provide helpful error messages for common issues\n let helpText = '';\n if (errorMessage.includes('index') || errorMessage.includes('not found')) {\n helpText = ' Make sure the vector index exists. Create one with: CREATE VECTOR INDEX <name> FOR (n:Label) ON (n.embedding)';\n }\n\n return {\n success: false,\n error: errorMessage + helpText,\n query: {\n indexName: input.indexName,\n vectorDimension: input.queryVector.length,\n },\n };\n }\n })\n .build();\n}\n\n","/**\n * Neo4j Vector Search with Embedding Tool\n *\n * Perform semantic search by automatically generating embeddings from text.\n * This tool combines embedding generation with vector search for easier GraphRAG.\n */\n\nimport { toolBuilder, ToolCategory, createLogger } from '@agentforge/core';\nimport { neo4jVectorSearchWithEmbeddingSchema } from '../types.js';\nimport { neo4jPool } from '../connection.js';\nimport { formatResults } from '../utils/result-formatter.js';\nimport { embeddingManager } from '../embeddings/embedding-manager.js';\n\nconst logger = createLogger('agentforge:tools:neo4j:vector-search');\n\n/**\n * Create Neo4j vector search with embedding tool\n */\nexport function createNeo4jVectorSearchWithEmbeddingTool() {\n return toolBuilder()\n .name('neo4j-vector-search-with-embedding')\n .description(\n 'Perform semantic similarity search in Neo4j by automatically generating embeddings from text. ' +\n 'This tool takes text input, generates an embedding vector, and searches for similar nodes. ' +\n 'Essential for GraphRAG applications - no need to manually generate embeddings. ' +\n 'Requires a vector index and embedding provider (OpenAI) to be configured.'\n )\n .category(ToolCategory.DATABASE)\n .tags(['neo4j', 'graph', 'database', 'vector', 'search', 'semantic', 'graphrag', 'embedding', 'ai'])\n .schema(neo4jVectorSearchWithEmbeddingSchema)\n .implement(async (input) => {\n // Check Neo4j connection\n if (!neo4jPool.isInitialized()) {\n logger.warn('Vector search attempted but Neo4j connection not initialized');\n return {\n success: false,\n error: 'Neo4j connection not initialized. Please configure Neo4j connection first.',\n };\n }\n\n // Check embedding manager\n if (!embeddingManager.isInitialized()) {\n logger.warn('Vector search attempted but embedding manager not initialized');\n return {\n success: false,\n error: 'Embedding manager not initialized. Please configure embedding provider (set OPENAI_API_KEY and optionally EMBEDDING_MODEL).',\n };\n }\n\n const startTime = Date.now();\n\n logger.debug('Performing vector search with embedding', {\n queryTextLength: input.queryText.length,\n indexName: input.indexName,\n limit: input.limit,\n model: input.model,\n });\n\n try {\n // Generate embedding from text\n const embeddingResult = await embeddingManager.generateEmbedding(input.queryText, input.model);\n\n // Perform vector search\n const session = neo4jPool.getSession(input.database);\n\n try {\n // Use db.index.vector.queryNodes for vector similarity search\n const cypher = `\n CALL db.index.vector.queryNodes($indexName, $limit, $queryVector)\n YIELD node, score\n RETURN node, score\n ORDER BY score DESC\n `;\n\n const parameters = {\n indexName: input.indexName,\n limit: input.limit,\n queryVector: embeddingResult.embedding,\n };\n\n const result = await session.run(cypher, parameters);\n const formattedResults = formatResults(result.records);\n const duration = Date.now() - startTime;\n\n logger.info('Vector search completed successfully', {\n resultCount: result.records.length,\n indexName: input.indexName,\n embeddingModel: embeddingResult.model,\n embeddingDimensions: embeddingResult.dimensions,\n duration,\n });\n\n return {\n success: true,\n results: formattedResults.map((r) => ({\n node: r.node,\n score: r.score,\n })),\n count: result.records.length,\n query: {\n text: input.queryText,\n indexName: input.indexName,\n embeddingModel: embeddingResult.model,\n vectorDimension: embeddingResult.dimensions,\n limit: input.limit,\n },\n embedding: {\n model: embeddingResult.model,\n dimensions: embeddingResult.dimensions,\n usage: embeddingResult.usage,\n },\n };\n } finally {\n await session.close();\n }\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : 'Failed to perform vector search with embedding';\n\n // Provide helpful error messages for common issues\n let helpText = '';\n if (errorMessage.includes('index') || errorMessage.includes('not found')) {\n helpText = ' Make sure the vector index exists. Create one with: CREATE VECTOR INDEX <name> FOR (n:Label) ON (n.embedding)';\n } else if (errorMessage.includes('API key') || errorMessage.includes('not initialized')) {\n helpText = ' Make sure OPENAI_API_KEY is set in your environment variables.';\n } else if (errorMessage.includes('dimension')) {\n helpText = ' Make sure the vector index dimensions match your embedding model dimensions.';\n }\n\n logger.error('Vector search failed', {\n error: errorMessage,\n indexName: input.indexName,\n queryTextLength: input.queryText.length,\n duration,\n });\n\n return {\n success: false,\n error: errorMessage + helpText,\n query: {\n text: input.queryText,\n indexName: input.indexName,\n },\n };\n }\n })\n .build();\n}\n\n","/**\n * Neo4j Create Node with Embedding Tool\n *\n * Create a node with automatic embedding generation from text content.\n * This tool simplifies GraphRAG setup by handling embedding generation automatically.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { neo4jCreateNodeWithEmbeddingSchema } from '../types.js';\nimport { neo4jPool } from '../connection.js';\nimport { formatResults } from '../utils/result-formatter.js';\nimport { embeddingManager } from '../embeddings/embedding-manager.js';\nimport { validateLabel, validatePropertyKey } from '../utils/cypher-sanitizer.js';\n\n/**\n * Create Neo4j create node with embedding tool\n */\nexport function createNeo4jCreateNodeWithEmbeddingTool() {\n return toolBuilder()\n .name('neo4j-create-node-with-embedding')\n .description(\n 'Create a Neo4j node with automatic embedding generation from text content. ' +\n 'This tool extracts text from a specified property, generates an embedding vector, ' +\n 'and stores both the original properties and the embedding in the node. ' +\n 'Perfect for building GraphRAG knowledge bases. ' +\n 'Requires embedding provider (OpenAI) to be configured.'\n )\n .category(ToolCategory.DATABASE)\n .tags(['neo4j', 'graph', 'database', 'create', 'node', 'embedding', 'graphrag', 'ai'])\n .schema(neo4jCreateNodeWithEmbeddingSchema)\n .implement(async (input) => {\n // Check Neo4j connection\n if (!neo4jPool.isInitialized()) {\n return {\n success: false,\n error: 'Neo4j connection not initialized. Please configure Neo4j connection first.',\n };\n }\n\n // Check embedding manager\n if (!embeddingManager.isInitialized()) {\n return {\n success: false,\n error: 'Embedding manager not initialized. Please configure embedding provider (set OPENAI_API_KEY and optionally EMBEDDING_MODEL).',\n };\n }\n\n try {\n // Extract text from properties\n const textToEmbed = input.properties[input.textProperty];\n \n if (!textToEmbed || typeof textToEmbed !== 'string') {\n return {\n success: false,\n error: `Property '${input.textProperty}' not found or is not a string in the provided properties.`,\n };\n }\n\n // Generate embedding from text\n const embeddingResult = await embeddingManager.generateEmbedding(textToEmbed, input.model);\n\n // Validate label and property names to prevent injection\n const safeLabel = validateLabel(input.label);\n const safeEmbeddingProp = validatePropertyKey(input.embeddingProperty || 'embedding');\n\n // Create node with properties and embedding\n const session = neo4jPool.getSession(input.database);\n\n try {\n // Build properties object with embedding\n const allProperties: Record<string, any> = {\n ...input.properties,\n };\n allProperties[input.embeddingProperty || 'embedding'] = embeddingResult.embedding;\n\n // Create the node with safe label\n const cypher = `\n CREATE (n:${safeLabel})\n SET n = $properties\n RETURN n, id(n) as nodeId\n `;\n\n const parameters = {\n properties: allProperties,\n };\n\n const result = await session.run(cypher, parameters);\n const formattedResults = formatResults(result.records);\n\n if (formattedResults.length === 0) {\n return {\n success: false,\n error: 'Failed to create node',\n };\n }\n\n const createdNode = formattedResults[0];\n\n return {\n success: true,\n node: createdNode.n,\n nodeId: createdNode.nodeId,\n embedding: {\n model: embeddingResult.model,\n dimensions: embeddingResult.dimensions,\n property: safeEmbeddingProp,\n usage: embeddingResult.usage,\n },\n message: `Created node with label '${input.label}' and ${embeddingResult.dimensions}-dimensional embedding`,\n };\n } finally {\n await session.close();\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to create node with embedding';\n \n // Provide helpful error messages for common issues\n let helpText = '';\n if (errorMessage.includes('API key') || errorMessage.includes('not initialized')) {\n helpText = ' Make sure OPENAI_API_KEY is set in your environment variables.';\n } else if (errorMessage.includes('Syntax error') || errorMessage.includes('Invalid')) {\n helpText = ' Check that the label and property names are valid.';\n }\n\n return {\n success: false,\n error: errorMessage + helpText,\n };\n }\n })\n .build();\n}\n\n","/**\n * Neo4j Tools\n *\n * Tools for interacting with Neo4j graph database.\n * Supports knowledge graphs, GraphRAG, and graph analytics.\n */\n\nexport * from './types.js';\nexport * from './connection.js';\nexport * from './embeddings/index.js';\nexport { createNeo4jQueryTool } from './tools/neo4j-query.js';\nexport { createNeo4jGetSchemaTool } from './tools/neo4j-get-schema.js';\nexport { createNeo4jFindNodesTool } from './tools/neo4j-find-nodes.js';\nexport { createNeo4jTraverseTool } from './tools/neo4j-traverse.js';\nexport { createNeo4jVectorSearchTool } from './tools/neo4j-vector-search.js';\nexport { createNeo4jVectorSearchWithEmbeddingTool } from './tools/neo4j-vector-search-with-embedding.js';\nexport { createNeo4jCreateNodeWithEmbeddingTool } from './tools/neo4j-create-node-with-embedding.js';\n\nimport { createNeo4jQueryTool } from './tools/neo4j-query.js';\nimport { createNeo4jGetSchemaTool } from './tools/neo4j-get-schema.js';\nimport { createNeo4jFindNodesTool } from './tools/neo4j-find-nodes.js';\nimport { createNeo4jTraverseTool } from './tools/neo4j-traverse.js';\nimport { createNeo4jVectorSearchTool } from './tools/neo4j-vector-search.js';\nimport { createNeo4jVectorSearchWithEmbeddingTool } from './tools/neo4j-vector-search-with-embedding.js';\nimport { createNeo4jCreateNodeWithEmbeddingTool } from './tools/neo4j-create-node-with-embedding.js';\nimport type { Neo4jToolsConfig } from './types.js';\nimport { neo4jPool, initializeFromEnv } from './connection.js';\nimport { embeddingManager } from './embeddings/embedding-manager.js';\n\n/**\n * Default Neo4j query tool instance\n */\nexport const neo4jQuery = createNeo4jQueryTool();\n\n/**\n * Default Neo4j get schema tool instance\n */\nexport const neo4jGetSchema = createNeo4jGetSchemaTool();\n\n/**\n * Default Neo4j find nodes tool instance\n */\nexport const neo4jFindNodes = createNeo4jFindNodesTool();\n\n/**\n * Default Neo4j traverse tool instance\n */\nexport const neo4jTraverse = createNeo4jTraverseTool();\n\n/**\n * Default Neo4j vector search tool instance\n */\nexport const neo4jVectorSearch = createNeo4jVectorSearchTool();\n\n/**\n * Default Neo4j vector search with embedding tool instance\n */\nexport const neo4jVectorSearchWithEmbedding = createNeo4jVectorSearchWithEmbeddingTool();\n\n/**\n * Default Neo4j create node with embedding tool instance\n */\nexport const neo4jCreateNodeWithEmbedding = createNeo4jCreateNodeWithEmbeddingTool();\n\n/**\n * All Neo4j tools (including embedding-enabled tools)\n */\nexport const neo4jTools = [\n neo4jQuery,\n neo4jGetSchema,\n neo4jFindNodes,\n neo4jTraverse,\n neo4jVectorSearch,\n neo4jVectorSearchWithEmbedding,\n neo4jCreateNodeWithEmbedding,\n];\n\n/**\n * Core Neo4j tools (without embedding features)\n */\nexport const neo4jCoreTools = [\n neo4jQuery,\n neo4jGetSchema,\n neo4jFindNodes,\n neo4jTraverse,\n neo4jVectorSearch,\n];\n\n/**\n * Create Neo4j tools with custom configuration\n */\nexport function createNeo4jTools(config: Neo4jToolsConfig = {}, includeEmbeddingTools: boolean = true) {\n // Initialize connection if config provided\n if (config.uri && config.username && config.password) {\n neo4jPool.initialize({\n uri: config.uri,\n username: config.username,\n password: config.password,\n database: config.database,\n maxConnectionPoolSize: config.maxConnectionPoolSize,\n connectionTimeout: config.connectionTimeout,\n }).catch((error) => {\n console.error('Failed to initialize Neo4j connection:', error);\n });\n }\n\n const coreTools = [\n createNeo4jQueryTool(),\n createNeo4jGetSchemaTool(),\n createNeo4jFindNodesTool(),\n createNeo4jTraverseTool(),\n createNeo4jVectorSearchTool(),\n ];\n\n if (includeEmbeddingTools) {\n return [\n ...coreTools,\n createNeo4jVectorSearchWithEmbeddingTool(),\n createNeo4jCreateNodeWithEmbeddingTool(),\n ];\n }\n\n return coreTools;\n}\n\n/**\n * Initialize Neo4j tools from environment variables\n *\n * Required environment variables:\n * - NEO4J_URI: Neo4j connection URI (e.g., bolt://localhost:7687)\n * - NEO4J_USER: Neo4j username\n * - NEO4J_PASSWORD: Neo4j password\n *\n * Optional environment variables:\n * - NEO4J_DATABASE: Database name (defaults to 'neo4j')\n *\n * For embedding-enabled tools, also set:\n * - OPENAI_API_KEY: OpenAI API key for embedding generation\n * - EMBEDDING_MODEL: Embedding model to use (defaults to 'text-embedding-3-small')\n * - EMBEDDING_PROVIDER: Embedding provider (defaults to 'openai')\n */\nexport async function initializeNeo4jTools(): Promise<void> {\n await initializeFromEnv();\n\n // Try to initialize embeddings (optional - will only work if API key is set)\n try {\n embeddingManager.initializeFromEnv();\n } catch (error) {\n // Embedding initialization is optional - tools will work without it\n // Only the embedding-enabled tools will fail if embeddings aren't configured\n }\n}\n\n","/**\n * File Operations Types\n * \n * Type definitions and schemas for file operation tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * File reader schema\n */\nexport const fileReaderSchema = z.object({\n path: z.string().describe('Path to the file to read'),\n encoding: z.enum(['utf8', 'utf-8', 'ascii', 'base64', 'hex', 'binary']).default('utf8').describe('File encoding'),\n});\n\n/**\n * File writer schema\n */\nexport const fileWriterSchema = z.object({\n path: z.string().describe('Path to the file to write'),\n content: z.string().describe('Content to write to the file'),\n encoding: z.enum(['utf8', 'utf-8', 'ascii', 'base64', 'hex']).default('utf8').describe('File encoding'),\n createDirs: z.boolean().default(false).describe('Create parent directories if they don\\'t exist'),\n});\n\n/**\n * File append schema\n */\nexport const fileAppendSchema = z.object({\n path: z.string().describe('Path to the file to append to'),\n content: z.string().describe('Content to append to the file'),\n encoding: z.enum(['utf8', 'utf-8', 'ascii']).default('utf8').describe('File encoding'),\n});\n\n/**\n * File delete schema\n */\nexport const fileDeleteSchema = z.object({\n path: z.string().describe('Path to the file to delete'),\n});\n\n/**\n * File exists schema\n */\nexport const fileExistsSchema = z.object({\n path: z.string().describe('Path to check'),\n});\n\n/**\n * File operations configuration\n */\nexport interface FileOperationsConfig {\n defaultEncoding?: 'utf8' | 'utf-8' | 'ascii' | 'base64' | 'hex';\n createDirsDefault?: boolean;\n}\n\n","/**\n * File Reader Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { fileReaderSchema } from '../types.js';\nimport { promises as fs } from 'fs';\n\n/**\n * Create file reader tool\n */\nexport function createFileReaderTool(defaultEncoding: string = 'utf8') {\n return toolBuilder()\n .name('file-reader')\n .description('Read the contents of a file from the file system. Supports text and binary files with various encodings.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['file', 'read', 'io', 'filesystem'])\n .schema(fileReaderSchema)\n .implementSafe(async (input) => {\n const encoding = input.encoding || defaultEncoding;\n const content = await fs.readFile(input.path, encoding as BufferEncoding);\n const stats = await fs.stat(input.path);\n\n return {\n content,\n size: stats.size,\n path: input.path,\n encoding,\n };\n })\n .build();\n}\n\n","/**\n * File Writer Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { fileWriterSchema } from '../types.js';\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\n\n/**\n * Create file writer tool\n */\nexport function createFileWriterTool(defaultEncoding: string = 'utf8', createDirsDefault: boolean = false) {\n return toolBuilder()\n .name('file-writer')\n .description('Write content to a file. Creates the file if it doesn\\'t exist, or overwrites it if it does.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['file', 'write', 'io', 'filesystem'])\n .schema(fileWriterSchema)\n .implementSafe(async (input) => {\n const encoding = input.encoding || defaultEncoding;\n const createDirs = input.createDirs ?? createDirsDefault;\n\n // Create parent directories if requested\n if (createDirs) {\n const dir = path.dirname(input.path);\n await fs.mkdir(dir, { recursive: true });\n }\n\n await fs.writeFile(input.path, input.content, encoding as BufferEncoding);\n const stats = await fs.stat(input.path);\n\n return {\n path: input.path,\n size: stats.size,\n encoding,\n };\n })\n .build();\n}\n\n","/**\n * File Append Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { fileAppendSchema } from '../types.js';\nimport { promises as fs } from 'fs';\n\n/**\n * Create file append tool\n */\nexport function createFileAppendTool(defaultEncoding: string = 'utf8') {\n return toolBuilder()\n .name('file-append')\n .description('Append content to the end of a file. Creates the file if it doesn\\'t exist.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['file', 'append', 'io', 'filesystem'])\n .schema(fileAppendSchema)\n .implementSafe(async (input) => {\n const encoding = input.encoding || defaultEncoding;\n await fs.appendFile(input.path, input.content, encoding as BufferEncoding);\n const stats = await fs.stat(input.path);\n\n return {\n path: input.path,\n size: stats.size,\n };\n })\n .build();\n}\n\n","/**\n * File Delete Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { fileDeleteSchema } from '../types.js';\nimport { promises as fs } from 'fs';\n\n/**\n * Create file delete tool\n */\nexport function createFileDeleteTool() {\n return toolBuilder()\n .name('file-delete')\n .description('Delete a file from the file system. Returns an error if the file doesn\\'t exist.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['file', 'delete', 'remove', 'filesystem'])\n .schema(fileDeleteSchema)\n .implementSafe(async (input) => {\n await fs.unlink(input.path);\n\n return {\n path: input.path,\n message: 'File deleted successfully',\n };\n })\n .build();\n}\n\n","/**\n * File Exists Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { fileExistsSchema } from '../types.js';\nimport { promises as fs } from 'fs';\n\n/**\n * Create file exists tool\n */\nexport function createFileExistsTool() {\n return toolBuilder()\n .name('file-exists')\n .description('Check if a file or directory exists at the specified path.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['file', 'exists', 'check', 'filesystem'])\n .schema(fileExistsSchema)\n .implement(async (input) => {\n try {\n await fs.access(input.path);\n const stats = await fs.stat(input.path);\n \n return {\n exists: true,\n path: input.path,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n size: stats.size,\n modified: stats.mtime.toISOString(),\n };\n } catch {\n return {\n exists: false,\n path: input.path,\n };\n }\n })\n .build();\n}\n\n","/**\n * File Operations Tools\n * \n * Tools for reading, writing, and manipulating files.\n */\n\nexport * from './types.js';\nexport * from './tools/file-reader.js';\nexport * from './tools/file-writer.js';\nexport * from './tools/file-append.js';\nexport * from './tools/file-delete.js';\nexport * from './tools/file-exists.js';\n\nimport { createFileReaderTool } from './tools/file-reader.js';\nimport { createFileWriterTool } from './tools/file-writer.js';\nimport { createFileAppendTool } from './tools/file-append.js';\nimport { createFileDeleteTool } from './tools/file-delete.js';\nimport { createFileExistsTool } from './tools/file-exists.js';\nimport type { FileOperationsConfig } from './types.js';\n\n/**\n * Default file operation tool instances\n */\nexport const fileReader = createFileReaderTool();\nexport const fileWriter = createFileWriterTool();\nexport const fileAppend = createFileAppendTool();\nexport const fileDelete = createFileDeleteTool();\nexport const fileExists = createFileExistsTool();\n\n/**\n * Array of all file operation tools\n */\nexport const fileOperationTools = [\n fileReader,\n fileWriter,\n fileAppend,\n fileDelete,\n fileExists,\n];\n\n/**\n * Create file operation tools with custom configuration\n */\nexport function createFileOperationTools(config: FileOperationsConfig = {}) {\n const {\n defaultEncoding = 'utf8',\n createDirsDefault = false,\n } = config;\n\n return [\n createFileReaderTool(defaultEncoding),\n createFileWriterTool(defaultEncoding, createDirsDefault),\n createFileAppendTool(defaultEncoding),\n createFileDeleteTool(),\n createFileExistsTool(),\n ];\n}\n\n","/**\n * Directory Operations Types\n * \n * Type definitions and schemas for directory operation tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * Directory list schema\n */\nexport const directoryListSchema = z.object({\n path: z.string().describe('Path to the directory to list'),\n recursive: z.boolean().default(false).describe('List files recursively in subdirectories'),\n includeDetails: z.boolean().default(false).describe('Include file size, type, and modification date'),\n extension: z.string().optional().describe('Optional file extension filter (e.g., \".txt\", \".js\")'),\n});\n\n/**\n * Directory create schema\n */\nexport const directoryCreateSchema = z.object({\n path: z.string().describe('Path to the directory to create'),\n recursive: z.boolean().default(true).describe('Create parent directories if they don\\'t exist'),\n});\n\n/**\n * Directory delete schema\n */\nexport const directoryDeleteSchema = z.object({\n path: z.string().describe('Path to the directory to delete'),\n recursive: z.boolean().default(false).describe('Delete directory and all its contents'),\n});\n\n/**\n * File search schema\n */\nexport const fileSearchSchema = z.object({\n directory: z.string().describe('Directory to search in'),\n pattern: z.string().describe('File name pattern to search for (supports * wildcard)'),\n recursive: z.boolean().default(true).describe('Search in subdirectories'),\n caseSensitive: z.boolean().default(false).describe('Case-sensitive pattern matching'),\n});\n\n/**\n * Directory operations configuration\n */\nexport interface DirectoryOperationsConfig {\n defaultRecursive?: boolean;\n defaultIncludeDetails?: boolean;\n defaultCaseSensitive?: boolean;\n}\n\n","/**\n * Directory List Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { directoryListSchema } from '../types.js';\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\n\n/**\n * Create directory list tool\n */\nexport function createDirectoryListTool(defaultRecursive: boolean = false, defaultIncludeDetails: boolean = false) {\n return toolBuilder()\n .name('directory-list')\n .description('List all files and directories in a directory. Can optionally include file details and filter by extension.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['directory', 'list', 'files', 'filesystem'])\n .schema(directoryListSchema)\n .implementSafe(async (input) => {\n const listFiles = async (dir: string, recursive: boolean): Promise<any[]> => {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const files: any[] = [];\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(input.path, fullPath);\n\n // Apply extension filter if specified\n if (input.extension && !entry.name.endsWith(input.extension)) {\n if (!entry.isDirectory() || !recursive) {\n continue;\n }\n }\n\n if (input.includeDetails) {\n const stats = await fs.stat(fullPath);\n files.push({\n name: entry.name,\n path: relativePath,\n fullPath,\n isFile: entry.isFile(),\n isDirectory: entry.isDirectory(),\n size: stats.size,\n modified: stats.mtime.toISOString(),\n });\n } else {\n files.push({\n name: entry.name,\n path: relativePath,\n isFile: entry.isFile(),\n isDirectory: entry.isDirectory(),\n });\n }\n\n // Recurse into subdirectories if requested\n if (recursive && entry.isDirectory()) {\n const subFiles = await listFiles(fullPath, true);\n files.push(...subFiles);\n }\n }\n\n return files;\n };\n\n const recursive = input.recursive ?? defaultRecursive;\n const files = await listFiles(input.path, recursive);\n\n return {\n path: input.path,\n files,\n count: files.length,\n };\n })\n .build();\n}\n\n","/**\n * Directory Create Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { directoryCreateSchema } from '../types.js';\nimport { promises as fs } from 'fs';\n\n/**\n * Create directory create tool\n */\nexport function createDirectoryCreateTool(defaultRecursive: boolean = true) {\n return toolBuilder()\n .name('directory-create')\n .description('Create a new directory. Can optionally create parent directories if they don\\'t exist.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['directory', 'create', 'mkdir', 'filesystem'])\n .schema(directoryCreateSchema)\n .implementSafe(async (input) => {\n const recursive = input.recursive ?? defaultRecursive;\n await fs.mkdir(input.path, { recursive });\n\n return {\n path: input.path,\n message: 'Directory created successfully',\n };\n })\n .build();\n}\n\n","/**\n * Directory Delete Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { directoryDeleteSchema } from '../types.js';\nimport { promises as fs } from 'fs';\n\n/**\n * Create directory delete tool\n */\nexport function createDirectoryDeleteTool(defaultRecursive: boolean = false) {\n return toolBuilder()\n .name('directory-delete')\n .description('Delete a directory. Can optionally delete non-empty directories recursively.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['directory', 'delete', 'remove', 'filesystem'])\n .schema(directoryDeleteSchema)\n .implementSafe(async (input) => {\n const recursive = input.recursive ?? defaultRecursive;\n await fs.rm(input.path, { recursive, force: false });\n\n return {\n path: input.path,\n message: 'Directory deleted successfully',\n };\n })\n .build();\n}\n\n","/**\n * File Search Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { fileSearchSchema } from '../types.js';\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\n\n/**\n * Create file search tool\n */\nexport function createFileSearchTool(defaultRecursive: boolean = true, defaultCaseSensitive: boolean = false) {\n return toolBuilder()\n .name('file-search')\n .description('Search for files by name pattern in a directory. Supports wildcards and recursive search.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['file', 'search', 'find', 'filesystem'])\n .schema(fileSearchSchema)\n .implementSafe(async (input) => {\n const recursive = input.recursive ?? defaultRecursive;\n const caseSensitive = input.caseSensitive ?? defaultCaseSensitive;\n\n const searchFiles = async (dir: string): Promise<string[]> => {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const matches: string[] = [];\n\n // Convert pattern to regex\n const regexPattern = input.pattern\n .replace(/\\./g, '\\\\.')\n .replace(/\\*/g, '.*');\n const regex = new RegExp(`^${regexPattern}$`, caseSensitive ? '' : 'i');\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isFile() && regex.test(entry.name)) {\n matches.push(fullPath);\n }\n\n if (recursive && entry.isDirectory()) {\n const subMatches = await searchFiles(fullPath);\n matches.push(...subMatches);\n }\n }\n\n return matches;\n };\n\n const matches = await searchFiles(input.directory);\n\n return {\n directory: input.directory,\n pattern: input.pattern,\n matches,\n count: matches.length,\n };\n })\n .build();\n}\n\n","/**\n * Directory Operations Tools\n * \n * Tools for working with directories and file listings.\n */\n\nexport * from './types.js';\nexport * from './tools/directory-list.js';\nexport * from './tools/directory-create.js';\nexport * from './tools/directory-delete.js';\nexport * from './tools/file-search.js';\n\nimport { createDirectoryListTool } from './tools/directory-list.js';\nimport { createDirectoryCreateTool } from './tools/directory-create.js';\nimport { createDirectoryDeleteTool } from './tools/directory-delete.js';\nimport { createFileSearchTool } from './tools/file-search.js';\nimport type { DirectoryOperationsConfig } from './types.js';\n\n/**\n * Default directory operation tool instances\n */\nexport const directoryList = createDirectoryListTool();\nexport const directoryCreate = createDirectoryCreateTool();\nexport const directoryDelete = createDirectoryDeleteTool();\nexport const fileSearch = createFileSearchTool();\n\n/**\n * Array of all directory operation tools\n */\nexport const directoryOperationTools = [\n directoryList,\n directoryCreate,\n directoryDelete,\n fileSearch,\n];\n\n/**\n * Create directory operation tools with custom configuration\n */\nexport function createDirectoryOperationTools(config: DirectoryOperationsConfig = {}) {\n const {\n defaultRecursive = false,\n defaultIncludeDetails = false,\n defaultCaseSensitive = false,\n } = config;\n\n return [\n createDirectoryListTool(defaultRecursive, defaultIncludeDetails),\n createDirectoryCreateTool(true), // Always default to true for create\n createDirectoryDeleteTool(false), // Always default to false for delete (safety)\n createFileSearchTool(defaultRecursive, defaultCaseSensitive),\n ];\n}\n\n","/**\n * Path Utilities Types\n * \n * Type definitions and schemas for path utility tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * Path join schema\n */\nexport const pathJoinSchema = z.object({\n segments: z.array(z.string().describe(\"String value\")).describe('Path segments to join'),\n});\n\n/**\n * Path resolve schema\n */\nexport const pathResolveSchema = z.object({\n paths: z.array(z.string().describe(\"String value\")).describe('Paths to resolve'),\n});\n\n/**\n * Path parse schema\n */\nexport const pathParseSchema = z.object({\n path: z.string().describe('File path to parse'),\n});\n\n/**\n * Path basename schema\n */\nexport const pathBasenameSchema = z.object({\n path: z.string().describe('File path'),\n removeExtension: z.boolean().default(false).describe('Remove the file extension'),\n});\n\n/**\n * Path dirname schema\n */\nexport const pathDirnameSchema = z.object({\n path: z.string().describe('File path'),\n});\n\n/**\n * Path extension schema\n */\nexport const pathExtensionSchema = z.object({\n path: z.string().describe('File path'),\n});\n\n/**\n * Path relative schema\n */\nexport const pathRelativeSchema = z.object({\n from: z.string().describe('Source path'),\n to: z.string().describe('Destination path'),\n});\n\n/**\n * Path normalize schema\n */\nexport const pathNormalizeSchema = z.object({\n path: z.string().describe('Path to normalize'),\n});\n\n/**\n * Path utilities configuration\n */\nexport interface PathUtilitiesConfig {\n // No specific configuration needed for path utilities\n}\n\n","/**\n * Path Join Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathJoinSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path join tool\n */\nexport function createPathJoinTool() {\n return toolBuilder()\n .name('path-join')\n .description('Join multiple path segments into a single path. Handles platform-specific separators.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'join', 'filesystem'])\n .schema(pathJoinSchema)\n .implement(async (input) => {\n const joined = path.join(...input.segments);\n \n return {\n path: joined,\n segments: input.segments,\n };\n })\n .build();\n}\n\n","/**\n * Path Resolve Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathResolveSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path resolve tool\n */\nexport function createPathResolveTool() {\n return toolBuilder()\n .name('path-resolve')\n .description('Resolve a sequence of paths into an absolute path. Resolves relative paths from the current working directory.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'resolve', 'absolute', 'filesystem'])\n .schema(pathResolveSchema)\n .implement(async (input) => {\n const resolved = path.resolve(...input.paths);\n \n return {\n path: resolved,\n isAbsolute: path.isAbsolute(resolved),\n };\n })\n .build();\n}\n\n","/**\n * Path Parse Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathParseSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path parse tool\n */\nexport function createPathParseTool() {\n return toolBuilder()\n .name('path-parse')\n .description('Parse a file path into its components (directory, filename, extension, etc.).')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'parse', 'filesystem'])\n .schema(pathParseSchema)\n .implement(async (input) => {\n const parsed = path.parse(input.path);\n \n return {\n root: parsed.root,\n dir: parsed.dir,\n base: parsed.base,\n name: parsed.name,\n ext: parsed.ext,\n isAbsolute: path.isAbsolute(input.path),\n };\n })\n .build();\n}\n\n","/**\n * Path Basename Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathBasenameSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path basename tool\n */\nexport function createPathBasenameTool() {\n return toolBuilder()\n .name('path-basename')\n .description('Get the last portion of a path (filename with extension). Optionally remove the extension.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'basename', 'filename', 'filesystem'])\n .schema(pathBasenameSchema)\n .implement(async (input) => {\n const basename = input.removeExtension \n ? path.basename(input.path, path.extname(input.path))\n : path.basename(input.path);\n \n return {\n basename,\n extension: path.extname(input.path),\n };\n })\n .build();\n}\n\n","/**\n * Path Dirname Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathDirnameSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path dirname tool\n */\nexport function createPathDirnameTool() {\n return toolBuilder()\n .name('path-dirname')\n .description('Get the directory name of a path (everything except the last portion).')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'dirname', 'directory', 'filesystem'])\n .schema(pathDirnameSchema)\n .implement(async (input) => {\n const dirname = path.dirname(input.path);\n \n return {\n dirname,\n basename: path.basename(input.path),\n };\n })\n .build();\n}\n\n","/**\n * Path Extension Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathExtensionSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path extension tool\n */\nexport function createPathExtensionTool() {\n return toolBuilder()\n .name('path-extension')\n .description('Get the file extension from a path (including the dot, e.g., \".txt\").')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'extension', 'ext', 'filesystem'])\n .schema(pathExtensionSchema)\n .implement(async (input) => {\n const ext = path.extname(input.path);\n \n return {\n extension: ext,\n hasExtension: ext.length > 0,\n filename: path.basename(input.path, ext),\n };\n })\n .build();\n}\n\n","/**\n * Path Relative Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathRelativeSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path relative tool\n */\nexport function createPathRelativeTool() {\n return toolBuilder()\n .name('path-relative')\n .description('Get the relative path from one path to another.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'relative', 'filesystem'])\n .schema(pathRelativeSchema)\n .implement(async (input) => {\n const relative = path.relative(input.from, input.to);\n \n return {\n relativePath: relative,\n from: input.from,\n to: input.to,\n };\n })\n .build();\n}\n\n","/**\n * Path Normalize Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathNormalizeSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path normalize tool\n */\nexport function createPathNormalizeTool() {\n return toolBuilder()\n .name('path-normalize')\n .description('Normalize a path by resolving \"..\" and \".\" segments and removing duplicate separators.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'normalize', 'filesystem'])\n .schema(pathNormalizeSchema)\n .implement(async (input) => {\n const normalized = path.normalize(input.path);\n \n return {\n normalized,\n original: input.path,\n };\n })\n .build();\n}\n\n","/**\n * Path Utilities Tools\n * \n * Tools for working with file paths.\n */\n\nexport * from './types.js';\nexport * from './tools/path-join.js';\nexport * from './tools/path-resolve.js';\nexport * from './tools/path-parse.js';\nexport * from './tools/path-basename.js';\nexport * from './tools/path-dirname.js';\nexport * from './tools/path-extension.js';\nexport * from './tools/path-relative.js';\nexport * from './tools/path-normalize.js';\n\nimport { createPathJoinTool } from './tools/path-join.js';\nimport { createPathResolveTool } from './tools/path-resolve.js';\nimport { createPathParseTool } from './tools/path-parse.js';\nimport { createPathBasenameTool } from './tools/path-basename.js';\nimport { createPathDirnameTool } from './tools/path-dirname.js';\nimport { createPathExtensionTool } from './tools/path-extension.js';\nimport { createPathRelativeTool } from './tools/path-relative.js';\nimport { createPathNormalizeTool } from './tools/path-normalize.js';\nimport type { PathUtilitiesConfig } from './types.js';\n\n/**\n * Default path utility tool instances\n */\nexport const pathJoin = createPathJoinTool();\nexport const pathResolve = createPathResolveTool();\nexport const pathParse = createPathParseTool();\nexport const pathBasename = createPathBasenameTool();\nexport const pathDirname = createPathDirnameTool();\nexport const pathExtension = createPathExtensionTool();\nexport const pathRelative = createPathRelativeTool();\nexport const pathNormalize = createPathNormalizeTool();\n\n/**\n * Array of all path utility tools\n */\nexport const pathUtilityTools = [\n pathJoin,\n pathResolve,\n pathParse,\n pathBasename,\n pathDirname,\n pathExtension,\n pathRelative,\n pathNormalize,\n];\n\n/**\n * Create path utility tools with custom configuration\n */\nexport function createPathUtilityTools(config: PathUtilitiesConfig = {}) {\n return [\n createPathJoinTool(),\n createPathResolveTool(),\n createPathParseTool(),\n createPathBasenameTool(),\n createPathDirnameTool(),\n createPathExtensionTool(),\n createPathRelativeTool(),\n createPathNormalizeTool(),\n ];\n}\n\n","/**\n * Date and Time Tools - Type Definitions\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema for current date/time tool\n */\nexport const CurrentDateTimeSchema = z.object({\n format: z.enum(['iso', 'unix', 'custom']).default('iso').describe('Output format'),\n customFormat: z.string().optional().describe('Custom format string (e.g., \"yyyy-MM-dd HH:mm:ss\") when format is \"custom\"'),\n timezone: z.string().optional().describe('Timezone (e.g., \"America/New_York\")'),\n});\n\n/**\n * Schema for date formatter tool\n */\nexport const DateFormatterSchema = z.object({\n date: z.string().describe('Date string or Unix timestamp to format'),\n outputFormat: z.string().describe('Output format string (e.g., \"yyyy-MM-dd\", \"MMM dd, yyyy\")'),\n inputFormat: z.string().optional().describe('Input format string (optional, auto-detected if not provided)'),\n});\n\n/**\n * Schema for date arithmetic tool\n */\nexport const DateArithmeticSchema = z.object({\n date: z.string().describe('Starting date (ISO string or Unix timestamp)'),\n operation: z.enum(['add', 'subtract']).describe('Operation to perform'),\n amount: z.number().describe('Amount to add or subtract'),\n unit: z.enum(['years', 'months', 'weeks', 'days', 'hours', 'minutes', 'seconds']).describe('Time unit'),\n});\n\n/**\n * Schema for date difference tool\n */\nexport const DateDifferenceSchema = z.object({\n startDate: z.string().describe('Start date (ISO string or Unix timestamp)'),\n endDate: z.string().describe('End date (ISO string or Unix timestamp)'),\n unit: z.enum(['days', 'hours', 'minutes']).default('days').describe('Unit for the difference'),\n});\n\n/**\n * Schema for date comparison tool\n */\nexport const DateComparisonSchema = z.object({\n date1: z.string().describe('First date to compare'),\n date2: z.string().describe('Second date to compare'),\n});\n\n/**\n * Configuration for date/time tools\n */\nexport interface DateTimeConfig {\n // Future: Add configuration options if needed\n}\n\nexport type CurrentDateTimeInput = z.infer<typeof CurrentDateTimeSchema>;\nexport type DateFormatterInput = z.infer<typeof DateFormatterSchema>;\nexport type DateArithmeticInput = z.infer<typeof DateArithmeticSchema>;\nexport type DateDifferenceInput = z.infer<typeof DateDifferenceSchema>;\nexport type DateComparisonInput = z.infer<typeof DateComparisonSchema>;\n\n","/**\n * Current Date/Time Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { format } from 'date-fns';\nimport { CurrentDateTimeSchema } from '../types.js';\n\n/**\n * Create current date/time tool\n */\nexport function createCurrentDateTimeTool() {\n return toolBuilder()\n .name('current-date-time')\n .description('Get the current date and time in various formats (ISO, Unix timestamp, formatted string).')\n .category(ToolCategory.UTILITY)\n .tags(['date', 'time', 'now', 'current'])\n .schema(CurrentDateTimeSchema)\n .implement(async (input) => {\n const now = new Date();\n \n let formatted: string | number;\n if (input.format === 'iso') {\n formatted = now.toISOString();\n } else if (input.format === 'unix') {\n formatted = Math.floor(now.getTime() / 1000);\n } else if (input.format === 'custom' && input.customFormat) {\n formatted = format(now, input.customFormat);\n } else {\n formatted = now.toISOString();\n }\n \n return {\n formatted,\n iso: now.toISOString(),\n unix: Math.floor(now.getTime() / 1000),\n year: now.getFullYear(),\n month: now.getMonth() + 1,\n day: now.getDate(),\n hour: now.getHours(),\n minute: now.getMinutes(),\n second: now.getSeconds(),\n };\n })\n .build();\n}\n\n","/**\n * Date Formatter Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { format, parse, isValid } from 'date-fns';\nimport { DateFormatterSchema } from '../types.js';\n\n/**\n * Create date formatter tool\n */\nexport function createDateFormatterTool() {\n return toolBuilder()\n .name('date-formatter')\n .description('Format a date string or timestamp into a different format. Supports ISO, Unix timestamps, and custom formats.')\n .category(ToolCategory.UTILITY)\n .tags(['date', 'format', 'time'])\n .schema(DateFormatterSchema)\n .implement(async (input) => {\n try {\n let date: Date;\n \n // Try to parse the input\n if (input.inputFormat) {\n date = parse(input.date, input.inputFormat, new Date());\n } else if (!isNaN(Number(input.date))) {\n // Unix timestamp\n date = new Date(Number(input.date) * 1000);\n } else {\n // ISO or other standard format\n date = new Date(input.date);\n }\n \n if (!isValid(date)) {\n return {\n success: false,\n error: 'Invalid date',\n };\n }\n \n const formatted = format(date, input.outputFormat);\n \n return {\n success: true,\n formatted,\n iso: date.toISOString(),\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to format date',\n };\n }\n })\n .build();\n}\n\n","/**\n * Date Arithmetic Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { add, sub, isValid } from 'date-fns';\nimport { DateArithmeticSchema } from '../types.js';\n\n/**\n * Create date arithmetic tool\n */\nexport function createDateArithmeticTool() {\n return toolBuilder()\n .name('date-arithmetic')\n .description('Add or subtract time from a date. Supports years, months, weeks, days, hours, minutes, and seconds.')\n .category(ToolCategory.UTILITY)\n .tags(['date', 'time', 'add', 'subtract', 'arithmetic'])\n .schema(DateArithmeticSchema)\n .implement(async (input) => {\n try {\n const date = new Date(input.date);\n \n if (!isValid(date)) {\n return {\n success: false,\n error: 'Invalid date',\n };\n }\n \n const duration = { [input.unit]: input.amount };\n const result = input.operation === 'add' \n ? add(date, duration)\n : sub(date, duration);\n \n return {\n success: true,\n result: result.toISOString(),\n unix: Math.floor(result.getTime() / 1000),\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to perform date arithmetic',\n };\n }\n })\n .build();\n}\n\n","/**\n * Date Difference Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { differenceInDays, differenceInHours, differenceInMinutes, isValid } from 'date-fns';\nimport { DateDifferenceSchema } from '../types.js';\n\n/**\n * Create date difference tool\n */\nexport function createDateDifferenceTool() {\n return toolBuilder()\n .name('date-difference')\n .description('Calculate the difference between two dates in various units (days, hours, minutes).')\n .category(ToolCategory.UTILITY)\n .tags(['date', 'time', 'difference', 'duration'])\n .schema(DateDifferenceSchema)\n .implement(async (input) => {\n try {\n const start = new Date(input.startDate);\n const end = new Date(input.endDate);\n \n if (!isValid(start) || !isValid(end)) {\n return {\n success: false,\n error: 'Invalid date(s)',\n };\n }\n \n let difference: number;\n if (input.unit === 'days') {\n difference = differenceInDays(end, start);\n } else if (input.unit === 'hours') {\n difference = differenceInHours(end, start);\n } else {\n difference = differenceInMinutes(end, start);\n }\n \n return {\n success: true,\n difference,\n unit: input.unit,\n startDate: start.toISOString(),\n endDate: end.toISOString(),\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to calculate date difference',\n };\n }\n })\n .build();\n}\n\n","/**\n * Date Comparison Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { isAfter, isBefore, isValid } from 'date-fns';\nimport { DateComparisonSchema } from '../types.js';\n\n/**\n * Create date comparison tool\n */\nexport function createDateComparisonTool() {\n return toolBuilder()\n .name('date-comparison')\n .description('Compare two dates to determine if one is before, after, or equal to the other.')\n .category(ToolCategory.UTILITY)\n .tags(['date', 'time', 'compare', 'comparison'])\n .schema(DateComparisonSchema)\n .implement(async (input) => {\n try {\n const d1 = new Date(input.date1);\n const d2 = new Date(input.date2);\n \n if (!isValid(d1) || !isValid(d2)) {\n return {\n success: false,\n error: 'Invalid date(s)',\n };\n }\n \n return {\n success: true,\n date1IsBefore: isBefore(d1, d2),\n date1IsAfter: isAfter(d1, d2),\n datesAreEqual: d1.getTime() === d2.getTime(),\n date1: d1.toISOString(),\n date2: d2.toISOString(),\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to compare dates',\n };\n }\n })\n .build();\n}\n\n","/**\n * Date and Time Utility Tools\n * \n * Tools for working with dates, times, and timestamps.\n */\n\nimport { createCurrentDateTimeTool } from './tools/current-date-time.js';\nimport { createDateFormatterTool } from './tools/date-formatter.js';\nimport { createDateArithmeticTool } from './tools/date-arithmetic.js';\nimport { createDateDifferenceTool } from './tools/date-difference.js';\nimport { createDateComparisonTool } from './tools/date-comparison.js';\nimport type { DateTimeConfig } from './types.js';\n\n// Default tool instances\nexport const currentDateTime = createCurrentDateTimeTool();\nexport const dateFormatter = createDateFormatterTool();\nexport const dateArithmetic = createDateArithmeticTool();\nexport const dateDifference = createDateDifferenceTool();\nexport const dateComparison = createDateComparisonTool();\n\n// Tools array\nexport const dateTimeTools = [\n currentDateTime,\n dateFormatter,\n dateArithmetic,\n dateDifference,\n dateComparison,\n];\n\n/**\n * Create date/time tools with optional configuration\n */\nexport function createDateTimeTools(config: DateTimeConfig = {}) {\n return [\n createCurrentDateTimeTool(),\n createDateFormatterTool(),\n createDateArithmeticTool(),\n createDateDifferenceTool(),\n createDateComparisonTool(),\n ];\n}\n\n// Re-export types\nexport * from './types.js';\n\n// Re-export tool factory functions\nexport { createCurrentDateTimeTool } from './tools/current-date-time.js';\nexport { createDateFormatterTool } from './tools/date-formatter.js';\nexport { createDateArithmeticTool } from './tools/date-arithmetic.js';\nexport { createDateDifferenceTool } from './tools/date-difference.js';\nexport { createDateComparisonTool } from './tools/date-comparison.js';\n\n","/**\n * String Utility Tools - Type Definitions\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema for string case converter tool\n */\nexport const StringCaseConverterSchema = z.object({\n text: z.string().describe('Text to convert'),\n targetCase: z.enum(['lowercase', 'uppercase', 'title', 'camel', 'snake', 'kebab', 'pascal']).describe('Target case format'),\n});\n\n/**\n * Schema for string trim tool\n */\nexport const StringTrimSchema = z.object({\n text: z.string().describe('Text to trim'),\n mode: z.enum(['both', 'start', 'end']).default('both').describe('Which side to trim'),\n characters: z.string().optional().describe('Optional custom characters to trim (default: whitespace)'),\n});\n\n/**\n * Schema for string replace tool\n */\nexport const StringReplaceSchema = z.object({\n text: z.string().describe('Text to search in'),\n search: z.string().describe('String or regex pattern to search for'),\n replace: z.string().describe('Replacement string'),\n global: z.boolean().default(true).describe('Replace all occurrences (true) or just the first (false)'),\n caseInsensitive: z.boolean().default(false).describe('Case-insensitive search'),\n});\n\n/**\n * Schema for string split tool\n */\nexport const StringSplitSchema = z.object({\n text: z.string().describe('Text to split'),\n delimiter: z.string().describe('Delimiter to split on (can be a regex pattern)'),\n limit: z.number().optional().describe('Maximum number of splits'),\n});\n\n/**\n * Schema for string join tool\n */\nexport const StringJoinSchema = z.object({\n parts: z.array(z.string().describe(\"String value\")).describe('Array of strings to join'),\n separator: z.string().default('').describe('Separator to use between parts'),\n});\n\n/**\n * Schema for string substring tool\n */\nexport const StringSubstringSchema = z.object({\n text: z.string().describe('Source text'),\n start: z.number().describe('Start position (0-based)'),\n end: z.number().optional().describe('End position (optional, defaults to end of string)'),\n});\n\n/**\n * Schema for string length tool\n */\nexport const StringLengthSchema = z.object({\n text: z.string().describe('Text to measure'),\n});\n\n/**\n * Configuration for string utility tools\n */\nexport interface StringUtilitiesConfig {\n // Future: Add configuration options if needed\n}\n\nexport type StringCaseConverterInput = z.infer<typeof StringCaseConverterSchema>;\nexport type StringTrimInput = z.infer<typeof StringTrimSchema>;\nexport type StringReplaceInput = z.infer<typeof StringReplaceSchema>;\nexport type StringSplitInput = z.infer<typeof StringSplitSchema>;\nexport type StringJoinInput = z.infer<typeof StringJoinSchema>;\nexport type StringSubstringInput = z.infer<typeof StringSubstringSchema>;\nexport type StringLengthInput = z.infer<typeof StringLengthSchema>;\n\n","/**\n * String Case Converter Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StringCaseConverterSchema } from '../types.js';\n\n/**\n * Create string case converter tool\n */\nexport function createStringCaseConverterTool() {\n return toolBuilder()\n .name('string-case-converter')\n .description('Convert string to different cases: lowercase, uppercase, title case, camel case, snake case, kebab case.')\n .category(ToolCategory.UTILITY)\n .tags(['string', 'case', 'convert', 'transform'])\n .schema(StringCaseConverterSchema)\n .implement(async (input) => {\n let result: string;\n \n switch (input.targetCase) {\n case 'lowercase':\n result = input.text.toLowerCase();\n break;\n case 'uppercase':\n result = input.text.toUpperCase();\n break;\n case 'title':\n result = input.text.toLowerCase().replace(/\\b\\w/g, (char) => char.toUpperCase());\n break;\n case 'camel':\n result = input.text\n .toLowerCase()\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, char) => char.toUpperCase());\n break;\n case 'snake':\n result = input.text\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_|_$/g, '');\n break;\n case 'kebab':\n result = input.text\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n break;\n case 'pascal':\n result = input.text\n .toLowerCase()\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, char) => char.toUpperCase())\n .replace(/^./, (char) => char.toUpperCase());\n break;\n default:\n result = input.text;\n }\n \n return {\n original: input.text,\n converted: result,\n targetCase: input.targetCase,\n };\n })\n .build();\n}\n\n","/**\n * String Trim Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StringTrimSchema } from '../types.js';\n\n/**\n * Create string trim tool\n */\nexport function createStringTrimTool() {\n return toolBuilder()\n .name('string-trim')\n .description('Remove whitespace from the beginning and/or end of a string. Supports trim, trim start, and trim end.')\n .category(ToolCategory.UTILITY)\n .tags(['string', 'trim', 'whitespace'])\n .schema(StringTrimSchema)\n .implement(async (input) => {\n let result: string;\n \n if (input.characters) {\n const chars = input.characters.split('').map(c => c.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('');\n const regex = input.mode === 'both' \n ? new RegExp(`^[${chars}]+|[${chars}]+$`, 'g')\n : input.mode === 'start'\n ? new RegExp(`^[${chars}]+`, 'g')\n : new RegExp(`[${chars}]+$`, 'g');\n result = input.text.replace(regex, '');\n } else {\n result = input.mode === 'both' \n ? input.text.trim()\n : input.mode === 'start'\n ? input.text.trimStart()\n : input.text.trimEnd();\n }\n \n return {\n original: input.text,\n trimmed: result,\n removed: input.text.length - result.length,\n };\n })\n .build();\n}\n\n","/**\n * String Replace Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StringReplaceSchema } from '../types.js';\n\n/**\n * Create string replace tool\n */\nexport function createStringReplaceTool() {\n return toolBuilder()\n .name('string-replace')\n .description('Replace occurrences of a substring or pattern in a string. Supports regex patterns and global replacement.')\n .category(ToolCategory.UTILITY)\n .tags(['string', 'replace', 'substitute'])\n .schema(StringReplaceSchema)\n .implement(async (input) => {\n const flags = (input.global ? 'g' : '') + (input.caseInsensitive ? 'i' : '');\n const regex = new RegExp(input.search, flags);\n const result = input.text.replace(regex, input.replace);\n \n // Count replacements\n const matches = input.text.match(regex);\n const count = matches ? matches.length : 0;\n \n return {\n original: input.text,\n result,\n replacements: count,\n };\n })\n .build();\n}\n\n","/**\n * String Split Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StringSplitSchema } from '../types.js';\n\n/**\n * Create string split tool\n */\nexport function createStringSplitTool() {\n return toolBuilder()\n .name('string-split')\n .description('Split a string into an array of substrings using a delimiter. Supports regex delimiters and limit.')\n .category(ToolCategory.UTILITY)\n .tags(['string', 'split', 'array'])\n .schema(StringSplitSchema)\n .implement(async (input) => {\n const parts = input.text.split(input.delimiter, input.limit);\n \n return {\n parts,\n count: parts.length,\n };\n })\n .build();\n}\n\n","/**\n * String Join Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StringJoinSchema } from '../types.js';\n\n/**\n * Create string join tool\n */\nexport function createStringJoinTool() {\n return toolBuilder()\n .name('string-join')\n .description('Join an array of strings into a single string with a separator.')\n .category(ToolCategory.UTILITY)\n .tags(['string', 'join', 'array'])\n .schema(StringJoinSchema)\n .implement(async (input) => {\n const result = input.parts.join(input.separator);\n \n return {\n result,\n partCount: input.parts.length,\n length: result.length,\n };\n })\n .build();\n}\n\n","/**\n * String Substring Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StringSubstringSchema } from '../types.js';\n\n/**\n * Create string substring tool\n */\nexport function createStringSubstringTool() {\n return toolBuilder()\n .name('string-substring')\n .description('Extract a substring from a string using start and end positions.')\n .category(ToolCategory.UTILITY)\n .tags(['string', 'substring', 'slice'])\n .schema(StringSubstringSchema)\n .implement(async (input) => {\n const result = input.text.substring(input.start, input.end);\n \n return {\n result,\n length: result.length,\n start: input.start,\n end: input.end ?? input.text.length,\n };\n })\n .build();\n}\n\n","/**\n * String Length Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StringLengthSchema } from '../types.js';\n\n/**\n * Create string length tool\n */\nexport function createStringLengthTool() {\n return toolBuilder()\n .name('string-length')\n .description('Get the length of a string in characters, words, or lines.')\n .category(ToolCategory.UTILITY)\n .tags(['string', 'length', 'count'])\n .schema(StringLengthSchema)\n .implement(async (input) => {\n const words = input.text.trim().split(/\\s+/).filter(w => w.length > 0);\n const lines = input.text.split('\\n');\n \n return {\n characters: input.text.length,\n words: words.length,\n lines: lines.length,\n };\n })\n .build();\n}\n\n","/**\n * String Utility Tools\n * \n * Tools for string manipulation and transformation.\n */\n\nimport { createStringCaseConverterTool } from './tools/string-case-converter.js';\nimport { createStringTrimTool } from './tools/string-trim.js';\nimport { createStringReplaceTool } from './tools/string-replace.js';\nimport { createStringSplitTool } from './tools/string-split.js';\nimport { createStringJoinTool } from './tools/string-join.js';\nimport { createStringSubstringTool } from './tools/string-substring.js';\nimport { createStringLengthTool } from './tools/string-length.js';\nimport type { StringUtilitiesConfig } from './types.js';\n\n// Default tool instances\nexport const stringCaseConverter = createStringCaseConverterTool();\nexport const stringTrim = createStringTrimTool();\nexport const stringReplace = createStringReplaceTool();\nexport const stringSplit = createStringSplitTool();\nexport const stringJoin = createStringJoinTool();\nexport const stringSubstring = createStringSubstringTool();\nexport const stringLength = createStringLengthTool();\n\n// Tools array\nexport const stringUtilityTools = [\n stringCaseConverter,\n stringTrim,\n stringReplace,\n stringSplit,\n stringJoin,\n stringSubstring,\n stringLength,\n];\n\n/**\n * Create string utility tools with optional configuration\n */\nexport function createStringUtilityTools(config: StringUtilitiesConfig = {}) {\n return [\n createStringCaseConverterTool(),\n createStringTrimTool(),\n createStringReplaceTool(),\n createStringSplitTool(),\n createStringJoinTool(),\n createStringSubstringTool(),\n createStringLengthTool(),\n ];\n}\n\n// Re-export types\nexport * from './types.js';\n\n// Re-export tool factory functions\nexport { createStringCaseConverterTool } from './tools/string-case-converter.js';\nexport { createStringTrimTool } from './tools/string-trim.js';\nexport { createStringReplaceTool } from './tools/string-replace.js';\nexport { createStringSplitTool } from './tools/string-split.js';\nexport { createStringJoinTool } from './tools/string-join.js';\nexport { createStringSubstringTool } from './tools/string-substring.js';\nexport { createStringLengthTool } from './tools/string-length.js';\n\n","/**\n * Math Operations Tools - Type Definitions\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema for calculator tool\n */\nexport const CalculatorSchema = z.object({\n operation: z.enum(['add', 'subtract', 'multiply', 'divide', 'power', 'modulo']).describe('Mathematical operation to perform'),\n a: z.number().describe('First number'),\n b: z.number().describe('Second number'),\n});\n\n/**\n * Schema for math functions tool\n */\nexport const MathFunctionsSchema = z.object({\n function: z.enum(['sqrt', 'abs', 'round', 'floor', 'ceil', 'sin', 'cos', 'tan', 'log', 'exp']).describe('Mathematical function to apply'),\n value: z.number().describe('Input value'),\n});\n\n/**\n * Schema for random number tool\n */\nexport const RandomNumberSchema = z.object({\n min: z.number().default(0).describe('Minimum value (inclusive)'),\n max: z.number().default(1).describe('Maximum value (exclusive for decimals, inclusive for integers)'),\n integer: z.boolean().default(false).describe('Generate an integer (true) or decimal (false)'),\n});\n\n/**\n * Schema for statistics tool\n */\nexport const StatisticsSchema = z.object({\n numbers: z.array(z.number().describe(\"Number value\")).describe('Array of numbers to analyze'),\n});\n\n/**\n * Configuration for math operations tools\n */\nexport interface MathOperationsConfig {\n // Future: Add configuration options if needed\n}\n\nexport type CalculatorInput = z.infer<typeof CalculatorSchema>;\nexport type MathFunctionsInput = z.infer<typeof MathFunctionsSchema>;\nexport type RandomNumberInput = z.infer<typeof RandomNumberSchema>;\nexport type StatisticsInput = z.infer<typeof StatisticsSchema>;\n\n","/**\n * Calculator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { CalculatorSchema } from '../types.js';\n\n/**\n * Create calculator tool\n */\nexport function createCalculatorTool() {\n return toolBuilder()\n .name('calculator')\n .description('Perform basic arithmetic operations: add, subtract, multiply, divide, power, modulo.')\n .category(ToolCategory.UTILITY)\n .tags(['math', 'calculator', 'arithmetic'])\n .schema(CalculatorSchema)\n .implement(async (input) => {\n let result: number;\n \n switch (input.operation) {\n case 'add':\n result = input.a + input.b;\n break;\n case 'subtract':\n result = input.a - input.b;\n break;\n case 'multiply':\n result = input.a * input.b;\n break;\n case 'divide':\n if (input.b === 0) {\n return {\n success: false,\n error: 'Division by zero',\n };\n }\n result = input.a / input.b;\n break;\n case 'power':\n result = Math.pow(input.a, input.b);\n break;\n case 'modulo':\n result = input.a % input.b;\n break;\n default:\n return {\n success: false,\n error: 'Unknown operation',\n };\n }\n \n return {\n success: true,\n result,\n operation: input.operation,\n a: input.a,\n b: input.b,\n };\n })\n .build();\n}\n\n","/**\n * Math Functions Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { MathFunctionsSchema } from '../types.js';\n\n/**\n * Create math functions tool\n */\nexport function createMathFunctionsTool() {\n return toolBuilder()\n .name('math-functions')\n .description('Apply mathematical functions: sqrt, abs, round, floor, ceil, sin, cos, tan, log, exp.')\n .category(ToolCategory.UTILITY)\n .tags(['math', 'functions', 'trigonometry'])\n .schema(MathFunctionsSchema)\n .implement(async (input) => {\n let result: number;\n \n try {\n switch (input.function) {\n case 'sqrt':\n result = Math.sqrt(input.value);\n break;\n case 'abs':\n result = Math.abs(input.value);\n break;\n case 'round':\n result = Math.round(input.value);\n break;\n case 'floor':\n result = Math.floor(input.value);\n break;\n case 'ceil':\n result = Math.ceil(input.value);\n break;\n case 'sin':\n result = Math.sin(input.value);\n break;\n case 'cos':\n result = Math.cos(input.value);\n break;\n case 'tan':\n result = Math.tan(input.value);\n break;\n case 'log':\n result = Math.log(input.value);\n break;\n case 'exp':\n result = Math.exp(input.value);\n break;\n default:\n return {\n success: false,\n error: 'Unknown function',\n };\n }\n \n if (isNaN(result) || !isFinite(result)) {\n return {\n success: false,\n error: 'Invalid result (NaN or Infinity)',\n };\n }\n \n return {\n success: true,\n result,\n function: input.function,\n input: input.value,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Math operation failed',\n };\n }\n })\n .build();\n}\n\n","/**\n * Random Number Generator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { RandomNumberSchema } from '../types.js';\n\n/**\n * Create random number tool\n */\nexport function createRandomNumberTool() {\n return toolBuilder()\n .name('random-number')\n .description('Generate a random number within a specified range. Supports integers and decimals.')\n .category(ToolCategory.UTILITY)\n .tags(['random', 'number', 'generator'])\n .schema(RandomNumberSchema)\n .implement(async (input) => {\n const min = input.min ?? 0;\n const max = input.max ?? 1;\n const integer = input.integer ?? false;\n\n let result: number;\n\n if (integer) {\n result = Math.floor(Math.random() * (max - min + 1)) + min;\n } else {\n result = Math.random() * (max - min) + min;\n }\n\n return {\n result,\n min,\n max,\n integer,\n };\n })\n .build();\n}\n\n","/**\n * Statistics Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StatisticsSchema } from '../types.js';\n\n/**\n * Create statistics tool\n */\nexport function createStatisticsTool() {\n return toolBuilder()\n .name('statistics')\n .description('Calculate statistics for an array of numbers: sum, average, min, max, median, standard deviation.')\n .category(ToolCategory.UTILITY)\n .tags(['math', 'statistics', 'average', 'sum'])\n .schema(StatisticsSchema)\n .implement(async (input) => {\n if (input.numbers.length === 0) {\n return {\n success: false,\n error: 'Empty array',\n };\n }\n \n const sorted = [...input.numbers].sort((a, b) => a - b);\n const sum = input.numbers.reduce((acc, n) => acc + n, 0);\n const average = sum / input.numbers.length;\n const min = sorted[0];\n const max = sorted[sorted.length - 1];\n \n // Median\n const mid = Math.floor(sorted.length / 2);\n const median = sorted.length % 2 === 0\n ? (sorted[mid - 1] + sorted[mid]) / 2\n : sorted[mid];\n \n // Standard deviation\n const variance = input.numbers.reduce((acc, n) => acc + Math.pow(n - average, 2), 0) / input.numbers.length;\n const stdDev = Math.sqrt(variance);\n \n return {\n success: true,\n count: input.numbers.length,\n sum,\n average,\n min,\n max,\n median,\n standardDeviation: stdDev,\n variance,\n };\n })\n .build();\n}\n\n","/**\n * Math Operations Tools\n * \n * Tools for mathematical calculations and operations.\n */\n\nimport { createCalculatorTool } from './tools/calculator.js';\nimport { createMathFunctionsTool } from './tools/math-functions.js';\nimport { createRandomNumberTool } from './tools/random-number.js';\nimport { createStatisticsTool } from './tools/statistics.js';\nimport type { MathOperationsConfig } from './types.js';\n\n// Default tool instances\nexport const calculator = createCalculatorTool();\nexport const mathFunctions = createMathFunctionsTool();\nexport const randomNumber = createRandomNumberTool();\nexport const statistics = createStatisticsTool();\n\n// Tools array\nexport const mathOperationTools = [\n calculator,\n mathFunctions,\n randomNumber,\n statistics,\n];\n\n/**\n * Create math operation tools with optional configuration\n */\nexport function createMathOperationTools(config: MathOperationsConfig = {}) {\n return [\n createCalculatorTool(),\n createMathFunctionsTool(),\n createRandomNumberTool(),\n createStatisticsTool(),\n ];\n}\n\n// Re-export types\nexport * from './types.js';\n\n// Re-export tool factory functions\nexport { createCalculatorTool } from './tools/calculator.js';\nexport { createMathFunctionsTool } from './tools/math-functions.js';\nexport { createRandomNumberTool } from './tools/random-number.js';\nexport { createStatisticsTool } from './tools/statistics.js';\n\n","/**\n * Validation Tools - Type Definitions\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema for email validator tool\n */\nexport const EmailValidatorSchema = z.object({\n email: z.string().describe('Email address to validate'),\n});\n\n/**\n * Schema for URL validator tool\n */\nexport const UrlValidatorSimpleSchema = z.object({\n url: z.string().describe('URL to validate'),\n});\n\n/**\n * Schema for phone validator tool\n */\nexport const PhoneValidatorSchema = z.object({\n phone: z.string().describe('Phone number to validate'),\n strict: z.boolean().default(false).describe('Use strict validation (requires country code)'),\n});\n\n/**\n * Schema for credit card validator tool\n */\nexport const CreditCardValidatorSchema = z.object({\n cardNumber: z.string().describe('Credit card number to validate'),\n});\n\n/**\n * Schema for IP validator tool\n */\nexport const IpValidatorSchema = z.object({\n ip: z.string().describe('IP address to validate'),\n version: z.enum(['v4', 'v6', 'any']).default('any').describe('IP version to validate against'),\n});\n\n/**\n * Schema for UUID validator tool\n */\nexport const UuidValidatorSchema = z.object({\n uuid: z.string().describe('UUID to validate'),\n});\n\n/**\n * Configuration for validation tools\n */\nexport interface ValidationConfig {\n // Future: Add configuration options if needed\n}\n\nexport type EmailValidatorInput = z.infer<typeof EmailValidatorSchema>;\nexport type UrlValidatorSimpleInput = z.infer<typeof UrlValidatorSimpleSchema>;\nexport type PhoneValidatorInput = z.infer<typeof PhoneValidatorSchema>;\nexport type CreditCardValidatorInput = z.infer<typeof CreditCardValidatorSchema>;\nexport type IpValidatorInput = z.infer<typeof IpValidatorSchema>;\nexport type UuidValidatorInput = z.infer<typeof UuidValidatorSchema>;\n\n","/**\n * Email Validator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { EmailValidatorSchema } from '../types.js';\n\n/**\n * Create email validator tool\n */\nexport function createEmailValidatorTool() {\n return toolBuilder()\n .name('email-validator')\n .description('Validate if a string is a valid email address format.')\n .category(ToolCategory.UTILITY)\n .tags(['validation', 'email', 'validate'])\n .schema(EmailValidatorSchema)\n .implement(async (input) => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n const valid = emailRegex.test(input.email);\n \n return {\n valid,\n email: input.email,\n message: valid ? 'Valid email address' : 'Invalid email address format',\n };\n })\n .build();\n}\n\n","/**\n * URL Validator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { UrlValidatorSimpleSchema } from '../types.js';\n\n/**\n * Create URL validator tool\n */\nexport function createUrlValidatorSimpleTool() {\n return toolBuilder()\n .name('url-validator-simple')\n .description('Validate if a string is a valid URL format.')\n .category(ToolCategory.UTILITY)\n .tags(['validation', 'url', 'validate'])\n .schema(UrlValidatorSimpleSchema)\n .implement(async (input) => {\n try {\n new URL(input.url);\n return {\n valid: true,\n url: input.url,\n message: 'Valid URL',\n };\n } catch {\n return {\n valid: false,\n url: input.url,\n message: 'Invalid URL format',\n };\n }\n })\n .build();\n}\n\n","/**\n * Phone Validator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { PhoneValidatorSchema } from '../types.js';\n\n/**\n * Create phone validator tool\n */\nexport function createPhoneValidatorTool() {\n return toolBuilder()\n .name('phone-validator')\n .description('Validate if a string is a valid phone number format. Supports various international formats.')\n .category(ToolCategory.UTILITY)\n .tags(['validation', 'phone', 'validate'])\n .schema(PhoneValidatorSchema)\n .implement(async (input) => {\n // Basic phone validation - matches common formats\n // eslint-disable-next-line no-useless-escape\n const basicRegex = /^[\\d\\s\\-\\+\\(\\)]+$/;\n const strictRegex = /^\\+?[1-9]\\d{1,14}$/; // E.164 format\n \n const regex = input.strict ? strictRegex : basicRegex;\n const valid = regex.test(input.phone.replace(/\\s/g, ''));\n \n return {\n valid,\n phone: input.phone,\n message: valid ? 'Valid phone number format' : 'Invalid phone number format',\n };\n })\n .build();\n}\n\n","/**\n * Credit Card Validator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { CreditCardValidatorSchema } from '../types.js';\n\n/**\n * Create credit card validator tool\n */\nexport function createCreditCardValidatorTool() {\n return toolBuilder()\n .name('credit-card-validator')\n .description('Validate if a string is a valid credit card number using the Luhn algorithm.')\n .category(ToolCategory.UTILITY)\n .tags(['validation', 'credit-card', 'validate', 'luhn'])\n .schema(CreditCardValidatorSchema)\n .implement(async (input) => {\n // Remove spaces and dashes\n // eslint-disable-next-line no-useless-escape\n const cleaned = input.cardNumber.replace(/[\\s\\-]/g, '');\n \n // Check if it's all digits\n if (!/^\\d+$/.test(cleaned)) {\n return {\n valid: false,\n message: 'Card number must contain only digits',\n };\n }\n \n // Luhn algorithm\n let sum = 0;\n let isEven = false;\n \n for (let i = cleaned.length - 1; i >= 0; i--) {\n let digit = parseInt(cleaned[i], 10);\n \n if (isEven) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n \n sum += digit;\n isEven = !isEven;\n }\n \n const valid = sum % 10 === 0;\n \n return {\n valid,\n cardNumber: input.cardNumber,\n message: valid ? 'Valid credit card number' : 'Invalid credit card number (failed Luhn check)',\n };\n })\n .build();\n}\n\n","/**\n * IP Address Validator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { IpValidatorSchema } from '../types.js';\n\n/**\n * Create IP validator tool\n */\nexport function createIpValidatorTool() {\n return toolBuilder()\n .name('ip-validator')\n .description('Validate if a string is a valid IPv4 or IPv6 address.')\n .category(ToolCategory.UTILITY)\n .tags(['validation', 'ip', 'validate', 'network'])\n .schema(IpValidatorSchema)\n .implement(async (input) => {\n const ipv4Regex = /^(\\d{1,3}\\.){3}\\d{1,3}$/;\n const ipv6Regex = /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/;\n \n let valid = false;\n let detectedVersion: string | undefined;\n \n if (input.version === 'v4' || input.version === 'any') {\n if (ipv4Regex.test(input.ip)) {\n // Additional check for valid ranges (0-255)\n const parts = input.ip.split('.');\n valid = parts.every(part => {\n const num = parseInt(part, 10);\n return num >= 0 && num <= 255;\n });\n if (valid) detectedVersion = 'IPv4';\n }\n }\n \n if (!valid && (input.version === 'v6' || input.version === 'any')) {\n if (ipv6Regex.test(input.ip)) {\n valid = true;\n detectedVersion = 'IPv6';\n }\n }\n \n return {\n valid,\n ip: input.ip,\n version: detectedVersion,\n message: valid ? `Valid ${detectedVersion} address` : 'Invalid IP address format',\n };\n })\n .build();\n}\n\n","/**\n * UUID Validator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { UuidValidatorSchema } from '../types.js';\n\n/**\n * Create UUID validator tool\n */\nexport function createUuidValidatorTool() {\n return toolBuilder()\n .name('uuid-validator')\n .description('Validate if a string is a valid UUID (v1, v3, v4, or v5).')\n .category(ToolCategory.UTILITY)\n .tags(['validation', 'uuid', 'validate', 'guid'])\n .schema(UuidValidatorSchema)\n .implement(async (input) => {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n const valid = uuidRegex.test(input.uuid);\n \n let version: number | undefined;\n if (valid) {\n version = parseInt(input.uuid[14], 10);\n }\n \n return {\n valid,\n uuid: input.uuid,\n version,\n message: valid ? `Valid UUID v${version}` : 'Invalid UUID format',\n };\n })\n .build();\n}\n\n","/**\n * Validation Utility Tools\n * \n * Tools for validating data formats and types.\n */\n\nimport { createEmailValidatorTool } from './tools/email-validator.js';\nimport { createUrlValidatorSimpleTool } from './tools/url-validator-simple.js';\nimport { createPhoneValidatorTool } from './tools/phone-validator.js';\nimport { createCreditCardValidatorTool } from './tools/credit-card-validator.js';\nimport { createIpValidatorTool } from './tools/ip-validator.js';\nimport { createUuidValidatorTool } from './tools/uuid-validator.js';\nimport type { ValidationConfig } from './types.js';\n\n// Default tool instances\nexport const emailValidator = createEmailValidatorTool();\nexport const urlValidatorSimple = createUrlValidatorSimpleTool();\nexport const phoneValidator = createPhoneValidatorTool();\nexport const creditCardValidator = createCreditCardValidatorTool();\nexport const ipValidator = createIpValidatorTool();\nexport const uuidValidator = createUuidValidatorTool();\n\n// Tools array\nexport const validationTools = [\n emailValidator,\n urlValidatorSimple,\n phoneValidator,\n creditCardValidator,\n ipValidator,\n uuidValidator,\n];\n\n/**\n * Create validation tools with optional configuration\n */\nexport function createValidationTools(config: ValidationConfig = {}) {\n return [\n createEmailValidatorTool(),\n createUrlValidatorSimpleTool(),\n createPhoneValidatorTool(),\n createCreditCardValidatorTool(),\n createIpValidatorTool(),\n createUuidValidatorTool(),\n ];\n}\n\n// Re-export types\nexport * from './types.js';\n\n// Re-export tool factory functions\nexport { createEmailValidatorTool } from './tools/email-validator.js';\nexport { createUrlValidatorSimpleTool } from './tools/url-validator-simple.js';\nexport { createPhoneValidatorTool } from './tools/phone-validator.js';\nexport { createCreditCardValidatorTool } from './tools/credit-card-validator.js';\nexport { createIpValidatorTool } from './tools/ip-validator.js';\nexport { createUuidValidatorTool } from './tools/uuid-validator.js';\n\n","/**\n * Types for askHuman tool and human-in-the-loop workflows\n * @module tools/agent/ask-human/types\n */\n\nimport { z } from 'zod';\nimport type { HumanRequest, HumanRequestPriority, HumanRequestStatus } from '@agentforge/core';\n\n/**\n * Input schema for askHuman tool\n */\nexport const AskHumanInputSchema = z.object({\n /**\n * The question to ask the human\n */\n question: z.string().min(1).describe('The question to ask the human'),\n\n /**\n * Optional context to help the human understand the question\n */\n context: z.record(z.any()).optional().describe('Additional context for the question'),\n\n /**\n * Priority level for this request\n */\n priority: z.enum(['low', 'normal', 'high', 'critical']).default('normal').describe('Priority level for this request'),\n\n /**\n * Timeout in milliseconds (0 = no timeout)\n */\n timeout: z.number().min(0).default(0).describe('Timeout in milliseconds (0 = no timeout)'),\n\n /**\n * Default response if timeout occurs\n */\n defaultResponse: z.string().optional().describe('Default response if timeout occurs'),\n\n /**\n * Suggested responses (for UI to show as options)\n */\n suggestions: z.array(z.string()).optional().describe('Suggested responses for the human'),\n});\n\n/**\n * Input type for askHuman tool\n */\nexport type AskHumanInput = z.infer<typeof AskHumanInputSchema>;\n\n/**\n * Output from askHuman tool\n */\nexport interface AskHumanOutput {\n /**\n * The human's response\n */\n response: string;\n\n /**\n * Metadata about the interaction\n */\n metadata: {\n /**\n * Unique ID for this request\n */\n requestId: string;\n\n /**\n * When the request was created\n */\n requestedAt: number;\n\n /**\n * When the response was received\n */\n respondedAt: number;\n\n /**\n * How long it took to get a response (ms)\n */\n duration: number;\n\n /**\n * Whether this was a timeout response\n */\n timedOut: boolean;\n\n /**\n * Priority level\n */\n priority: HumanRequestPriority;\n };\n}\n\n// HumanRequest, HumanRequestPriority, and HumanRequestStatus are now imported from @agentforge/core\n// They are defined in packages/core/src/langgraph/interrupts/types.ts\n\n","/**\n * askHuman tool implementation\n * @module tools/agent/ask-human/tool\n */\n\nimport { toolBuilder, ToolCategory, createLogger, LogLevel } from '@agentforge/core';\nimport { AskHumanInputSchema, type AskHumanInput, type AskHumanOutput } from './types.js';\nimport { randomUUID } from 'crypto';\n\n// Create logger for askHuman tool\n// Log level can be controlled via LOG_LEVEL environment variable\nconst logLevel = (process.env.LOG_LEVEL?.toLowerCase() as LogLevel) || LogLevel.INFO;\nconst logger = createLogger('askHuman', { level: logLevel });\n\n/**\n * Create the askHuman tool\n * \n * This tool enables human-in-the-loop workflows by pausing agent execution\n * and waiting for human input. It uses LangGraph's interrupt mechanism.\n * \n * @example\n * ```typescript\n * import { createAskHumanTool } from '@agentforge/tools';\n *\n * const askHuman = createAskHumanTool();\n *\n * // In your agent\n * const tools = [askHuman, ...otherTools];\n *\n * // The agent can call this tool to ask for human input\n * // When called, it will pause execution and wait for a response\n * ```\n * \n * @returns The askHuman tool\n */\nexport function createAskHumanTool() {\n return toolBuilder()\n .name('ask-human')\n .description(\n 'Ask a human for input or approval. Use this when you need human guidance, ' +\n 'approval for a critical action, or clarification on ambiguous requirements. ' +\n 'The agent execution will pause until the human responds.'\n )\n .category(ToolCategory.UTILITY)\n .schema(AskHumanInputSchema)\n .implement(async (input): Promise<AskHumanOutput> => {\n // Type assertion after Zod validation\n const validatedInput = input as AskHumanInput;\n const requestId = randomUUID();\n const requestedAt = Date.now();\n\n // Import interrupt dynamically to avoid circular dependencies\n // and to allow this tool to work even if LangGraph is not installed\n let interrupt: ((value: any) => any) | undefined;\n \n try {\n const langgraph = await import('@langchain/langgraph');\n interrupt = (langgraph as any).interrupt;\n } catch (error) {\n throw new Error(\n 'askHuman tool requires @langchain/langgraph to be installed. ' +\n 'Install it with: npm install @langchain/langgraph'\n );\n }\n\n if (!interrupt) {\n throw new Error(\n 'interrupt function not found in @langchain/langgraph. ' +\n 'Make sure you are using a compatible version of LangGraph.'\n );\n }\n\n // Create the human request object\n const humanRequest = {\n id: requestId,\n question: validatedInput.question,\n context: validatedInput.context,\n priority: validatedInput.priority,\n createdAt: requestedAt,\n timeout: validatedInput.timeout,\n defaultResponse: validatedInput.defaultResponse,\n suggestions: validatedInput.suggestions,\n status: 'pending' as const,\n };\n\n // Use LangGraph's interrupt to pause execution\n // This will save the request to the checkpoint and pause the graph\n // The application can then resume with the human's response\n logger.debug('About to call interrupt()', { humanRequest });\n\n let response;\n try {\n response = interrupt(humanRequest);\n logger.debug('interrupt() returned successfully', { response, responseType: typeof response });\n } catch (error) {\n logger.debug('interrupt() threw error (expected for GraphInterrupt)', {\n errorType: error?.constructor?.name,\n error: error instanceof Error ? error.message : String(error)\n });\n throw error; // Re-throw to let the node handle it\n }\n\n const respondedAt = Date.now();\n const duration = respondedAt - requestedAt;\n\n // Check if we got a timeout response\n const timedOut = validatedInput.timeout > 0 && duration >= validatedInput.timeout;\n\n // If timeout occurred and we have a default response, use it\n const finalResponse = timedOut && validatedInput.defaultResponse\n ? validatedInput.defaultResponse\n : (response || '');\n\n return {\n response: finalResponse,\n metadata: {\n requestId,\n requestedAt,\n respondedAt,\n duration,\n timedOut,\n priority: validatedInput.priority,\n },\n };\n })\n .build();\n}\n\n/**\n * Default instance of the askHuman tool\n * \n * @example\n * ```typescript\n * import { askHumanTool } from '@agentforge/core';\n * \n * const agent = createReActAgent({\n * llm,\n * tools: [askHumanTool, ...otherTools],\n * });\n * ```\n */\nexport const askHumanTool = createAskHumanTool();\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/web/http/types.ts","../src/web/http/tools/http-client.ts","../src/web/http/tools/http-get.ts","../src/web/http/tools/http-post.ts","../src/web/http/index.ts","../src/web/scraper/types.ts","../src/web/scraper/tools/web-scraper.ts","../src/web/scraper/index.ts","../src/web/html-parser/types.ts","../src/web/html-parser/tools/html-parser.ts","../src/web/html-parser/tools/extract-links.ts","../src/web/html-parser/tools/extract-images.ts","../src/web/html-parser/index.ts","../src/web/url-validator/types.ts","../src/web/url-validator/tools/url-validator.ts","../src/web/url-validator/tools/url-builder.ts","../src/web/url-validator/tools/url-query-parser.ts","../src/web/url-validator/index.ts","../src/web/web-search/schemas.ts","../src/web/web-search/utils.ts","../src/web/web-search/providers/duckduckgo.ts","../src/web/web-search/providers/serper.ts","../src/web/web-search/index.ts","../src/web/slack/auth.ts","../src/web/slack/tools/send-slack-message.ts","../src/web/slack/tools/notify-slack.ts","../src/web/slack/tools/get-slack-channels.ts","../src/web/slack/tools/get-slack-messages.ts","../src/web/slack/index.ts","../src/web/confluence/auth.ts","../src/web/confluence/tools/search-confluence.ts","../src/web/confluence/tools/get-confluence-page.ts","../src/web/confluence/tools/list-confluence-spaces.ts","../src/web/confluence/tools/get-space-pages.ts","../src/web/confluence/tools/create-confluence-page.ts","../src/web/confluence/tools/update-confluence-page.ts","../src/web/confluence/tools/archive-confluence-page.ts","../src/web/confluence/index.ts","../src/data/csv/types.ts","../src/data/csv/tools/csv-parser.ts","../src/data/csv/tools/csv-generator.ts","../src/data/csv/tools/csv-to-json.ts","../src/data/csv/tools/json-to-csv.ts","../src/data/csv/index.ts","../src/data/json/types.ts","../src/data/json/tools/json-parser.ts","../src/data/json/tools/json-stringify.ts","../src/data/json/tools/json-query.ts","../src/data/json/tools/json-validator.ts","../src/data/json/tools/json-merge.ts","../src/data/json/index.ts","../src/data/xml/types.ts","../src/data/xml/tools/xml-parser.ts","../src/data/xml/tools/xml-generator.ts","../src/data/xml/tools/xml-to-json.ts","../src/data/xml/tools/json-to-xml.ts","../src/data/xml/index.ts","../src/data/transformer/types.ts","../src/data/transformer/tools/array-filter.ts","../src/data/transformer/tools/array-map.ts","../src/data/transformer/tools/array-sort.ts","../src/data/transformer/tools/array-group-by.ts","../src/data/transformer/tools/object-pick.ts","../src/data/transformer/tools/object-omit.ts","../src/data/transformer/index.ts","../src/data/neo4j/types.ts","../src/data/neo4j/connection.ts","../src/data/neo4j/embeddings/utils.ts","../src/data/neo4j/embeddings/providers/openai.ts","../src/data/neo4j/embeddings/providers/cohere.ts","../src/data/neo4j/embeddings/providers/huggingface.ts","../src/data/neo4j/embeddings/providers/voyage.ts","../src/data/neo4j/embeddings/providers/ollama.ts","../src/data/neo4j/embeddings/embedding-manager.ts","../src/data/neo4j/utils/result-formatter.ts","../src/data/neo4j/tools/neo4j-query.ts","../src/data/neo4j/tools/neo4j-get-schema.ts","../src/data/neo4j/utils/cypher-sanitizer.ts","../src/data/neo4j/tools/neo4j-find-nodes.ts","../src/data/neo4j/tools/neo4j-traverse.ts","../src/data/neo4j/tools/neo4j-vector-search.ts","../src/data/neo4j/tools/neo4j-vector-search-with-embedding.ts","../src/data/neo4j/tools/neo4j-create-node-with-embedding.ts","../src/data/neo4j/index.ts","../src/data/relational/utils/peer-dependency-checker.ts","../src/data/relational/utils/sql-sanitizer.ts","../src/data/relational/utils/identifier-utils.ts","../src/data/relational/connection/connection-manager.ts","../src/data/relational/query/query-executor.ts","../src/data/relational/query/query-builder.ts","../src/data/relational/query/batch-executor.ts","../src/data/relational/query/stream-executor.ts","../src/data/relational/query/transaction.ts","../src/data/relational/schema/validation.ts","../src/data/relational/schema/schema-inspector.ts","../src/data/relational/schema/schema-validator.ts","../src/data/relational/schema/type-mapper.ts","../src/data/relational/schema/schema-diff.ts","../src/data/relational/tools/relational-query.ts","../src/data/relational/tools/relational-select/schemas.ts","../src/data/relational/tools/relational-select/query-builder.ts","../src/data/relational/tools/relational-select/error-utils.ts","../src/data/relational/tools/relational-select/executor.ts","../src/data/relational/tools/relational-select/index.ts","../src/data/relational/tools/relational-insert/schemas.ts","../src/data/relational/tools/relational-insert/error-utils.ts","../src/data/relational/tools/relational-insert/executor.ts","../src/data/relational/tools/relational-insert/index.ts","../src/data/relational/tools/relational-update/schemas.ts","../src/data/relational/tools/relational-update/error-utils.ts","../src/data/relational/tools/relational-update/executor.ts","../src/data/relational/tools/relational-update/index.ts","../src/data/relational/tools/relational-delete/schemas.ts","../src/data/relational/tools/relational-delete/error-utils.ts","../src/data/relational/tools/relational-delete/executor.ts","../src/data/relational/tools/relational-delete/index.ts","../src/data/relational/tools/relational-get-schema-error-utils.ts","../src/data/relational/tools/relational-get-schema.ts","../src/file/operations/types.ts","../src/file/operations/tools/file-reader.ts","../src/file/operations/tools/file-writer.ts","../src/file/operations/tools/file-append.ts","../src/file/operations/tools/file-delete.ts","../src/file/operations/tools/file-exists.ts","../src/file/operations/index.ts","../src/file/directory/types.ts","../src/file/directory/tools/directory-list.ts","../src/file/directory/tools/directory-create.ts","../src/file/directory/tools/directory-delete.ts","../src/file/directory/tools/file-search.ts","../src/file/directory/index.ts","../src/file/path/types.ts","../src/file/path/tools/path-join.ts","../src/file/path/tools/path-resolve.ts","../src/file/path/tools/path-parse.ts","../src/file/path/tools/path-basename.ts","../src/file/path/tools/path-dirname.ts","../src/file/path/tools/path-extension.ts","../src/file/path/tools/path-relative.ts","../src/file/path/tools/path-normalize.ts","../src/file/path/index.ts","../src/utility/date-time/types.ts","../src/utility/date-time/tools/current-date-time.ts","../src/utility/date-time/tools/date-formatter.ts","../src/utility/date-time/tools/date-arithmetic.ts","../src/utility/date-time/tools/date-difference.ts","../src/utility/date-time/tools/date-comparison.ts","../src/utility/date-time/index.ts","../src/utility/string/types.ts","../src/utility/string/tools/string-case-converter.ts","../src/utility/string/tools/string-trim.ts","../src/utility/string/tools/string-replace.ts","../src/utility/string/tools/string-split.ts","../src/utility/string/tools/string-join.ts","../src/utility/string/tools/string-substring.ts","../src/utility/string/tools/string-length.ts","../src/utility/string/index.ts","../src/utility/math/types.ts","../src/utility/math/tools/calculator.ts","../src/utility/math/tools/math-functions.ts","../src/utility/math/tools/random-number.ts","../src/utility/math/tools/statistics.ts","../src/utility/math/index.ts","../src/utility/validation/types.ts","../src/utility/validation/tools/email-validator.ts","../src/utility/validation/tools/url-validator-simple.ts","../src/utility/validation/tools/phone-validator.ts","../src/utility/validation/tools/credit-card-validator.ts","../src/utility/validation/tools/ip-validator.ts","../src/utility/validation/tools/uuid-validator.ts","../src/utility/validation/index.ts","../src/agent/ask-human/types.ts","../src/agent/ask-human/tool.ts"],"names":["z","toolBuilder","ToolCategory","axios","cheerio","cheerio2","cheerio3","cheerio4","resolve","delay","WebClient","logger","LogLevel","createLogger","auth","getAuthHeader","logLevel","searchConfluence","getConfluencePage","listConfluenceSpaces","getSpacePages","createConfluencePage","updateConfluencePage","archiveConfluencePage","parse","stringify","XMLParser","format","XMLBuilder","path","neo4j","DEFAULT_RETRY_CONFIG","isRetryableError","sleep","retryWithBackoff","Integer","Node","Relationship","Path","ConnectionState","EventEmitter","sql","quotedTable","normalizePositiveInt","Readable","resolveOptions","executeQuery","tableMap","buildSelectQuery","executionTime","rawResult","normalized","rows","CONSTRAINT_VIOLATION_PATTERNS","toNumber","toErrorMessage","resolveBatchOptions","rowCount","normalizeAffectedRows","SAFE_VALIDATION_ERROR_PATTERNS","createHash","fs","recursive","files","path2","matches","path3","path4","path5","path6","basename","path7","dirname","path8","path9","relative","path10","path11","isValid","add","sub","differenceInDays","differenceInHours","differenceInMinutes","isBefore","isAfter","randomUUID"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * HTTP Tools Types\n * \n * Type definitions for HTTP client tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * HTTP method enum\n */\nexport const HttpMethod = z.enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS']);\n\n/**\n * HTTP request schema\n */\nexport const httpRequestSchema = z.object({\n url: z.string().url().describe('The URL to make the request to'),\n method: HttpMethod.default('GET').describe('HTTP method to use'),\n headers: z.record(z.string()).optional().describe('Optional HTTP headers'),\n body: z.any().optional().describe('Optional request body (for POST, PUT, PATCH)'),\n timeout: z.number().default(30000).describe('Request timeout in milliseconds'),\n params: z.record(z.string()).optional().describe('Optional URL query parameters'),\n});\n\n/**\n * HTTP response type\n */\nexport interface HttpResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n data: any;\n url: string;\n method: string;\n}\n\n/**\n * HTTP GET request schema\n */\nexport const httpGetSchema = z.object({\n url: z.string().url().describe('The URL to fetch'),\n headers: z.record(z.string()).optional().describe('Optional HTTP headers'),\n params: z.record(z.string()).optional().describe('Optional URL query parameters'),\n});\n\n/**\n * HTTP POST request schema\n */\nexport const httpPostSchema = z.object({\n url: z.string().url().describe('The URL to post to'),\n body: z.any().describe('The request body (will be sent as JSON)'),\n headers: z.record(z.string()).optional().describe('Optional HTTP headers'),\n});\n\n/**\n * HTTP tools configuration\n */\nexport interface HttpToolsConfig {\n defaultTimeout?: number;\n defaultHeaders?: Record<string, string>;\n}\n\n","/**\n * HTTP Client Tool\n * \n * Make HTTP requests with support for GET, POST, PUT, DELETE, PATCH methods.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport axios, { AxiosRequestConfig } from 'axios';\nimport { httpRequestSchema, HttpResponse } from '../types.js';\n\n/**\n * Create HTTP client tool\n * \n * @param defaultTimeout - Default timeout in milliseconds\n * @param defaultHeaders - Default headers to include in all requests\n * \n * @example\n * ```ts\n * const result = await httpClient.execute({\n * url: 'https://api.example.com/data',\n * method: 'GET',\n * headers: { 'Authorization': 'Bearer token' }\n * });\n * ```\n */\nexport function createHttpClientTool(\n defaultTimeout: number = 30000,\n defaultHeaders: Record<string, string> = {}\n) {\n return toolBuilder()\n .name('http-client')\n .description('Make HTTP requests to web APIs and services. Supports GET, POST, PUT, DELETE, PATCH methods with custom headers and body.')\n .category(ToolCategory.WEB)\n .tags(['http', 'api', 'request', 'web'])\n .schema(httpRequestSchema)\n .implement(async (input): Promise<HttpResponse> => {\n const config: AxiosRequestConfig = {\n method: input.method,\n url: input.url,\n headers: { ...defaultHeaders, ...input.headers },\n data: input.body,\n timeout: input.timeout ?? defaultTimeout,\n params: input.params,\n validateStatus: () => true, // Don't throw on any status code\n };\n\n const response = await axios(config);\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers as Record<string, string>,\n data: response.data,\n url: input.url,\n method: input.method ?? 'GET',\n };\n })\n .build();\n}\n\n","/**\n * HTTP GET Tool\n * \n * Make simple HTTP GET requests.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport axios from 'axios';\nimport { httpGetSchema } from '../types.js';\n\n/**\n * Create HTTP GET tool\n * \n * @param defaultTimeout - Default timeout in milliseconds\n * @param defaultHeaders - Default headers to include in all requests\n */\nexport function createHttpGetTool(\n defaultTimeout: number = 30000,\n defaultHeaders: Record<string, string> = {}\n) {\n return toolBuilder()\n .name('http-get')\n .description('Make a simple HTTP GET request to a URL and return the response data.')\n .category(ToolCategory.WEB)\n .tags(['http', 'get', 'fetch', 'web'])\n .schema(httpGetSchema)\n .implement(async (input) => {\n const response = await axios.get(input.url, {\n headers: { ...defaultHeaders, ...input.headers },\n params: input.params,\n timeout: defaultTimeout,\n });\n return response.data;\n })\n .build();\n}\n\n","/**\n * HTTP POST Tool\n * \n * Make simple HTTP POST requests with JSON body.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport axios from 'axios';\nimport { httpPostSchema } from '../types.js';\n\n/**\n * Create HTTP POST tool\n * \n * @param defaultTimeout - Default timeout in milliseconds\n * @param defaultHeaders - Default headers to include in all requests\n */\nexport function createHttpPostTool(\n defaultTimeout: number = 30000,\n defaultHeaders: Record<string, string> = {}\n) {\n return toolBuilder()\n .name('http-post')\n .description('Make a simple HTTP POST request with JSON body and return the response data.')\n .category(ToolCategory.WEB)\n .tags(['http', 'post', 'api', 'web'])\n .schema(httpPostSchema)\n .implement(async (input) => {\n const response = await axios.post(input.url, input.body, {\n headers: {\n 'Content-Type': 'application/json',\n ...defaultHeaders,\n ...input.headers,\n },\n timeout: defaultTimeout,\n });\n return response.data;\n })\n .build();\n}\n\n","/**\n * HTTP Tools\n * \n * Tools for making HTTP requests to web APIs and services.\n */\n\nimport { createHttpClientTool } from './tools/http-client.js';\nimport { createHttpGetTool } from './tools/http-get.js';\nimport { createHttpPostTool } from './tools/http-post.js';\nimport type { HttpToolsConfig } from './types.js';\n\n// Export types\nexport * from './types.js';\n\n// Default tool instances\nexport const httpClient = createHttpClientTool();\nexport const httpGet = createHttpGetTool();\nexport const httpPost = createHttpPostTool();\n\n// Tools array\nexport const httpTools = [httpClient, httpGet, httpPost];\n\n/**\n * Create HTTP tools with custom configuration\n * \n * @param config - Configuration options for HTTP tools\n * @returns Array of configured HTTP tools\n * \n * @example\n * ```ts\n * const tools = createHttpTools({\n * defaultTimeout: 60000,\n * defaultHeaders: { 'User-Agent': 'MyApp/1.0' }\n * });\n * ```\n */\nexport function createHttpTools(config: HttpToolsConfig = {}) {\n const { defaultTimeout = 30000, defaultHeaders = {} } = config;\n\n return [\n createHttpClientTool(defaultTimeout, defaultHeaders),\n createHttpGetTool(defaultTimeout, defaultHeaders),\n createHttpPostTool(defaultTimeout, defaultHeaders),\n ];\n}\n\n","/**\n * Web Scraper Types\n * \n * Type definitions for web scraping tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * Scraper result type\n */\nexport interface ScraperResult {\n url: string;\n title?: string;\n text?: string;\n html?: string;\n links?: string[];\n images?: string[];\n metadata?: Record<string, string>;\n selected?: any;\n}\n\n/**\n * Scraper tools configuration\n */\nexport interface ScraperToolsConfig {\n defaultTimeout?: number;\n userAgent?: string;\n}\n\n/**\n * Web scraper input schema\n */\nexport const webScraperSchema = z.object({\n url: z.string().url().describe('The URL of the web page to scrape'),\n selector: z.string().optional().describe('Optional CSS selector to extract specific elements'),\n extractText: z.boolean().default(true).describe('Extract text content from the page'),\n extractHtml: z.boolean().default(false).describe('Extract raw HTML content'),\n extractLinks: z.boolean().default(false).describe('Extract all links from the page'),\n extractImages: z.boolean().default(false).describe('Extract all image URLs from the page'),\n extractMetadata: z.boolean().default(false).describe('Extract meta tags (title, description, etc.)'),\n timeout: z.number().default(30000).describe('Request timeout in milliseconds'),\n});\n\n","/**\n * Web Scraper Tool\n * \n * Scrape and extract data from web pages using CSS selectors.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport axios from 'axios';\nimport * as cheerio from 'cheerio';\nimport { webScraperSchema, type ScraperResult } from '../types.js';\n\n/**\n * Create a web scraper tool\n * \n * @param defaultTimeout - Default timeout in milliseconds\n * @param userAgent - User agent string for requests\n * @returns Web scraper tool\n * \n * @example\n * ```ts\n * const scraper = createWebScraperTool(60000, 'MyBot/1.0');\n * const result = await scraper.execute({\n * url: 'https://example.com',\n * selector: 'article h1',\n * extractText: true\n * });\n * ```\n */\nexport function createWebScraperTool(\n defaultTimeout: number = 30000,\n userAgent: string = 'Mozilla/5.0 (compatible; AgentForge/1.0; +https://agentforge.dev)'\n) {\n return toolBuilder()\n .name('web-scraper')\n .description('Scrape and extract data from web pages. Can extract text, HTML, links, images, and use CSS selectors to target specific elements.')\n .category(ToolCategory.WEB)\n .tags(['scraper', 'web', 'html', 'extract', 'parse'])\n .schema(webScraperSchema)\n .implement(async (input): Promise<ScraperResult> => {\n // Fetch the page\n const response = await axios.get(input.url, {\n timeout: input.timeout || defaultTimeout,\n headers: {\n 'User-Agent': userAgent,\n },\n });\n\n const html = response.data;\n const $ = cheerio.load(html);\n\n const result: ScraperResult = {\n url: input.url,\n };\n\n // Apply selector if provided\n const $selected = input.selector ? $(input.selector) : $('body');\n\n // Extract text\n if (input.extractText) {\n result.text = $selected.text().trim();\n }\n\n // Extract HTML\n if (input.extractHtml) {\n result.html = $selected.html() || '';\n }\n\n // Extract links\n if (input.extractLinks) {\n result.links = [];\n $('a[href]').each((_, el) => {\n const href = $(el).attr('href');\n if (href) {\n // Convert relative URLs to absolute\n try {\n const absoluteUrl = new URL(href, input.url).href;\n result.links!.push(absoluteUrl);\n } catch {\n result.links!.push(href);\n }\n }\n });\n }\n\n // Extract images\n if (input.extractImages) {\n result.images = [];\n $('img[src]').each((_, el) => {\n const src = $(el).attr('src');\n if (src) {\n // Convert relative URLs to absolute\n try {\n const absoluteUrl = new URL(src, input.url).href;\n result.images!.push(absoluteUrl);\n } catch {\n result.images!.push(src);\n }\n }\n });\n }\n\n // Extract metadata\n if (input.extractMetadata) {\n result.metadata = {};\n \n // Title\n const title = $('title').text() || $('meta[property=\"og:title\"]').attr('content');\n if (title) result.metadata.title = title;\n\n // Description\n const description = $('meta[name=\"description\"]').attr('content') || \n $('meta[property=\"og:description\"]').attr('content');\n if (description) result.metadata.description = description;\n\n // Other meta tags\n $('meta[name], meta[property]').each((_, el) => {\n const name = $(el).attr('name') || $(el).attr('property');\n const content = $(el).attr('content');\n if (name && content) {\n result.metadata![name] = content;\n }\n });\n }\n\n // If selector was provided, return the selected elements\n if (input.selector) {\n result.selected = $selected.map((_, el) => ({\n text: $(el).text().trim(),\n html: $(el).html(),\n })).get();\n }\n\n return result;\n })\n .build();\n}\n\n","/**\n * Web Scraper Tools\n * \n * Tools for scraping and extracting data from web pages.\n */\n\n// Export types\nexport type { ScraperResult, ScraperToolsConfig } from './types.js';\nexport { webScraperSchema } from './types.js';\n\n// Export tool factory\nexport { createWebScraperTool } from './tools/web-scraper.js';\nimport { createWebScraperTool } from './tools/web-scraper.js';\n\n// Default tool instance\nexport const webScraper = createWebScraperTool();\n\n// Tools array\nexport const scraperTools = [webScraper];\n\n/**\n * Create scraper tools with custom configuration\n * \n * @param config - Configuration options\n * @returns Array of scraper tools\n * \n * @example\n * ```ts\n * const tools = createScraperTools({\n * defaultTimeout: 60000,\n * userAgent: 'MyBot/1.0'\n * });\n * ```\n */\nexport function createScraperTools(config: import('./types.js').ScraperToolsConfig = {}) {\n const { defaultTimeout = 30000, userAgent = 'Mozilla/5.0 (compatible; AgentForge/1.0; +https://agentforge.dev)' } = config;\n return [createWebScraperTool(defaultTimeout, userAgent)];\n}\n\n","/**\n * HTML Parser Types\n * \n * Type definitions for HTML parsing tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * HTML parser tools configuration\n */\nexport type HtmlParserToolsConfig = Record<string, never>;\n\n/**\n * HTML parser input schema\n */\nexport const htmlParserSchema = z.object({\n html: z.string().describe('The HTML content to parse'),\n selector: z.string().describe('CSS selector to find elements'),\n extractText: z.boolean().default(true).describe('Extract text content from selected elements'),\n extractHtml: z.boolean().default(false).describe('Extract inner HTML of selected elements'),\n extractAttributes: z.array(z.string().describe(\"String value\")).optional().describe('List of attributes to extract (e.g., [\"href\", \"src\", \"class\"])'),\n});\n\n/**\n * Extract links input schema\n */\nexport const extractLinksSchema = z.object({\n html: z.string().describe('The HTML content to extract links from'),\n baseUrl: z.string().url().optional().describe('Optional base URL to resolve relative links'),\n});\n\n/**\n * Extract images input schema\n */\nexport const extractImagesSchema = z.object({\n html: z.string().describe('The HTML content to extract images from'),\n baseUrl: z.string().url().optional().describe('Optional base URL to resolve relative image URLs'),\n});\n","/**\n * HTML Parser Tool\n * \n * Parse HTML content and extract data using CSS selectors.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport * as cheerio from 'cheerio';\nimport { htmlParserSchema } from '../types.js';\n\n/**\n * Create an HTML parser tool\n * \n * @returns HTML parser tool\n * \n * @example\n * ```ts\n * const parser = createHtmlParserTool();\n * const result = await parser.execute({\n * html: '<div class=\"content\"><h1>Title</h1><p>Text</p></div>',\n * selector: '.content h1'\n * });\n * ```\n */\nexport function createHtmlParserTool() {\n return toolBuilder()\n .name('html-parser')\n .description('Parse HTML content and extract data using CSS selectors. Returns text, attributes, and structure of selected elements.')\n .category(ToolCategory.WEB)\n .tags(['html', 'parser', 'css', 'selector', 'extract'])\n .schema(htmlParserSchema)\n .implement(async (input) => {\n const $ = cheerio.load(input.html);\n const $selected = $(input.selector);\n\n const results = $selected.map((_, el) => {\n const $el = $(el);\n const item: any = {};\n\n if (input.extractText) {\n item.text = $el.text().trim();\n }\n\n if (input.extractHtml) {\n item.html = $el.html();\n }\n\n if (input.extractAttributes && input.extractAttributes.length > 0) {\n item.attributes = {};\n for (const attr of input.extractAttributes) {\n const value = $el.attr(attr);\n if (value !== undefined) {\n item.attributes[attr] = value;\n }\n }\n }\n\n return item;\n }).get();\n\n return {\n count: results.length,\n results,\n };\n })\n .build();\n}\n\n","/**\n * Extract Links Tool\n * \n * Extract all links from HTML content.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport * as cheerio from 'cheerio';\nimport { extractLinksSchema } from '../types.js';\n\n/**\n * Create an extract links tool\n * \n * @returns Extract links tool\n * \n * @example\n * ```ts\n * const extractor = createExtractLinksTool();\n * const result = await extractor.execute({\n * html: '<a href=\"/page\">Link</a>',\n * baseUrl: 'https://example.com'\n * });\n * ```\n */\nexport function createExtractLinksTool() {\n return toolBuilder()\n .name('extract-links')\n .description('Extract all links (anchor tags) from HTML content with their text and href attributes.')\n .category(ToolCategory.WEB)\n .tags(['html', 'links', 'extract', 'anchor'])\n .schema(extractLinksSchema)\n .implement(async (input) => {\n const $ = cheerio.load(input.html);\n const links: Array<{ text: string; href: string; title?: string }> = [];\n\n $('a[href]').each((_, el) => {\n const $el = $(el);\n let href = $el.attr('href') || '';\n \n // Resolve relative URLs if baseUrl is provided\n if (input.baseUrl && href) {\n try {\n href = new URL(href, input.baseUrl).href;\n } catch {\n // Keep original href if URL parsing fails\n }\n }\n\n links.push({\n text: $el.text().trim(),\n href,\n title: $el.attr('title'),\n });\n });\n\n return {\n count: links.length,\n links,\n };\n })\n .build();\n}\n\n","/**\n * Extract Images Tool\n * \n * Extract all images from HTML content.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport * as cheerio from 'cheerio';\nimport { extractImagesSchema } from '../types.js';\n\n/**\n * Create an extract images tool\n * \n * @returns Extract images tool\n * \n * @example\n * ```ts\n * const extractor = createExtractImagesTool();\n * const result = await extractor.execute({\n * html: '<img src=\"/image.jpg\" alt=\"Image\">',\n * baseUrl: 'https://example.com'\n * });\n * ```\n */\nexport function createExtractImagesTool() {\n return toolBuilder()\n .name('extract-images')\n .description('Extract all images from HTML content with their src, alt, and other attributes.')\n .category(ToolCategory.WEB)\n .tags(['html', 'images', 'extract', 'img'])\n .schema(extractImagesSchema)\n .implement(async (input) => {\n const $ = cheerio.load(input.html);\n const images: Array<{ src: string; alt?: string; title?: string; width?: string; height?: string }> = [];\n\n $('img[src]').each((_, el) => {\n const $el = $(el);\n let src = $el.attr('src') || '';\n \n // Resolve relative URLs if baseUrl is provided\n if (input.baseUrl && src) {\n try {\n src = new URL(src, input.baseUrl).href;\n } catch {\n // Keep original src if URL parsing fails\n }\n }\n\n images.push({\n src,\n alt: $el.attr('alt'),\n title: $el.attr('title'),\n width: $el.attr('width'),\n height: $el.attr('height'),\n });\n });\n\n return {\n count: images.length,\n images,\n };\n })\n .build();\n}\n\n","/**\n * HTML Parser Tools\n * \n * Tools for parsing HTML content and extracting data.\n */\n\n// Export types\nexport type { HtmlParserToolsConfig } from './types.js';\nexport { htmlParserSchema, extractLinksSchema, extractImagesSchema } from './types.js';\n\n// Export tool factories\nexport { createHtmlParserTool } from './tools/html-parser.js';\nexport { createExtractLinksTool } from './tools/extract-links.js';\nexport { createExtractImagesTool } from './tools/extract-images.js';\n\n// Import for default instances\nimport { createHtmlParserTool } from './tools/html-parser.js';\nimport { createExtractLinksTool } from './tools/extract-links.js';\nimport { createExtractImagesTool } from './tools/extract-images.js';\n\n// Default tool instances\nexport const htmlParser = createHtmlParserTool();\nexport const extractLinks = createExtractLinksTool();\nexport const extractImages = createExtractImagesTool();\n\n// Tools array\nexport const htmlParserTools = [htmlParser, extractLinks, extractImages];\n\n/**\n * Create HTML parser tools with custom configuration\n * \n * @param config - Configuration options\n * @returns Array of HTML parser tools\n * \n * @example\n * ```ts\n * const tools = createHtmlParserTools();\n * ```\n */\nexport function createHtmlParserTools(config: import('./types.js').HtmlParserToolsConfig = {}) {\n return [\n createHtmlParserTool(),\n createExtractLinksTool(),\n createExtractImagesTool(),\n ];\n}\n\n","/**\n * URL Validator Types\n * \n * Type definitions for URL validation and manipulation tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * URL validation result\n */\nexport interface UrlValidationResult {\n url: string;\n protocol: string;\n hostname: string;\n port: string;\n pathname: string;\n search: string;\n hash: string;\n origin: string;\n}\n\n/**\n * URL validator tools configuration\n */\nexport type UrlValidatorToolsConfig = Record<string, never>;\n\n/**\n * URL validator input schema\n */\nexport const urlValidatorSchema = z.object({\n url: z.string().describe('The URL to validate and parse'),\n});\n\n/**\n * URL builder input schema\n */\nexport const urlBuilderSchema = z.object({\n protocol: z.string().default('https').describe('Protocol (http, https, etc.)'),\n hostname: z.string().describe('Hostname or domain name'),\n port: z.string().optional().describe('Optional port number'),\n pathname: z.string().default('/').describe('URL path'),\n query: z.record(z.string()).optional().describe('Query parameters as key-value pairs'),\n hash: z.string().optional().describe('URL hash/fragment'),\n});\n\n/**\n * URL query parser input schema\n */\nexport const urlQueryParserSchema = z.object({\n input: z.string().describe('URL or query string to parse (e.g., \"?foo=bar&baz=qux\" or full URL)'),\n});\n","/**\n * URL Validator Tool\n * \n * Validate and parse URLs.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { urlValidatorSchema, type UrlValidationResult } from '../types.js';\n\n/**\n * Create a URL validator tool\n * \n * @returns URL validator tool\n * \n * @example\n * ```ts\n * const validator = createUrlValidatorTool();\n * const result = await validator.execute({\n * url: 'https://example.com/path?query=value#hash'\n * });\n * ```\n */\nexport function createUrlValidatorTool() {\n return toolBuilder()\n .name('url-validator')\n .description('Validate and parse URLs. Returns detailed information about the URL structure including protocol, hostname, path, query parameters, and hash.')\n .category(ToolCategory.WEB)\n .tags(['url', 'validator', 'parse', 'validate'])\n .schema(urlValidatorSchema)\n .implementSafe(async (input): Promise<UrlValidationResult> => {\n const parsed = new URL(input.url);\n\n return {\n url: parsed.href,\n protocol: parsed.protocol,\n hostname: parsed.hostname,\n port: parsed.port,\n pathname: parsed.pathname,\n search: parsed.search,\n hash: parsed.hash,\n origin: parsed.origin,\n };\n })\n .build();\n}\n\n","/**\n * URL Builder Tool\n * \n * Build URLs from components.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { urlBuilderSchema } from '../types.js';\n\n/**\n * Create a URL builder tool\n * \n * @returns URL builder tool\n * \n * @example\n * ```ts\n * const builder = createUrlBuilderTool();\n * const result = await builder.execute({\n * protocol: 'https',\n * hostname: 'example.com',\n * pathname: '/path',\n * query: { foo: 'bar' }\n * });\n * ```\n */\nexport function createUrlBuilderTool() {\n return toolBuilder()\n .name('url-builder')\n .description('Build a URL from components (protocol, hostname, path, query parameters, hash).')\n .category(ToolCategory.WEB)\n .tags(['url', 'builder', 'construct'])\n .schema(urlBuilderSchema)\n .implement(async (input) => {\n const url = new URL(`${input.protocol}://${input.hostname}`);\n\n if (input.port) {\n url.port = input.port;\n }\n\n url.pathname = input.pathname ?? '/';\n \n if (input.query) {\n Object.entries(input.query).forEach(([key, value]) => {\n url.searchParams.append(key, value);\n });\n }\n \n if (input.hash) {\n url.hash = input.hash;\n }\n \n return {\n url: url.href,\n components: {\n protocol: url.protocol,\n hostname: url.hostname,\n port: url.port,\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n origin: url.origin,\n },\n };\n })\n .build();\n}\n\n","/**\n * URL Query Parser Tool\n * \n * Parse query parameters from URLs.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { urlQueryParserSchema } from '../types.js';\n\n/**\n * Create a URL query parser tool\n * \n * @returns URL query parser tool\n * \n * @example\n * ```ts\n * const parser = createUrlQueryParserTool();\n * const result = await parser.execute({\n * input: 'https://example.com?foo=bar&baz=qux'\n * });\n * ```\n */\nexport function createUrlQueryParserTool() {\n return toolBuilder()\n .name('url-query-parser')\n .description('Parse query parameters from a URL or query string into a key-value object.')\n .category(ToolCategory.WEB)\n .tags(['url', 'query', 'parse', 'params'])\n .schema(urlQueryParserSchema)\n .implement(async (input) => {\n let searchParams: URLSearchParams;\n \n try {\n // Try to parse as full URL first\n const url = new URL(input.input);\n searchParams = url.searchParams;\n } catch {\n // If that fails, treat as query string\n const queryString = input.input.startsWith('?') ? input.input.slice(1) : input.input;\n searchParams = new URLSearchParams(queryString);\n }\n \n const params: Record<string, string | string[]> = {};\n \n searchParams.forEach((value, key) => {\n if (params[key]) {\n // Handle multiple values for same key\n if (Array.isArray(params[key])) {\n (params[key] as string[]).push(value);\n } else {\n params[key] = [params[key] as string, value];\n }\n } else {\n params[key] = value;\n }\n });\n \n return {\n params,\n count: Object.keys(params).length,\n };\n })\n .build();\n}\n\n","/**\n * URL Validator Tools\n * \n * Tools for validating, parsing, and manipulating URLs.\n */\n\n// Export types\nexport type { UrlValidationResult, UrlValidatorToolsConfig } from './types.js';\nexport { urlValidatorSchema, urlBuilderSchema, urlQueryParserSchema } from './types.js';\n\n// Export tool factories\nexport { createUrlValidatorTool } from './tools/url-validator.js';\nexport { createUrlBuilderTool } from './tools/url-builder.js';\nexport { createUrlQueryParserTool } from './tools/url-query-parser.js';\n\n// Import for default instances\nimport { createUrlValidatorTool } from './tools/url-validator.js';\nimport { createUrlBuilderTool } from './tools/url-builder.js';\nimport { createUrlQueryParserTool } from './tools/url-query-parser.js';\n\n// Default tool instances\nexport const urlValidator = createUrlValidatorTool();\nexport const urlBuilder = createUrlBuilderTool();\nexport const urlQueryParser = createUrlQueryParserTool();\n\n// Tools array\nexport const urlValidatorTools = [urlValidator, urlBuilder, urlQueryParser];\n\n/**\n * Create URL validator tools with custom configuration\n * \n * @param config - Configuration options\n * @returns Array of URL validator tools\n * \n * @example\n * ```ts\n * const tools = createUrlValidatorTools();\n * ```\n */\nexport function createUrlValidatorTools(config: import('./types.js').UrlValidatorToolsConfig = {}) {\n return [\n createUrlValidatorTool(),\n createUrlBuilderTool(),\n createUrlQueryParserTool(),\n ];\n}\n\n","/**\n * Web Search Tool - Zod Schemas\n */\n\nimport { z } from 'zod';\n\n/**\n * Web search input schema\n */\nexport const webSearchSchema = z.object({\n query: z.string().min(1).describe('The search query'),\n maxResults: z\n .number()\n .min(1)\n .max(50)\n .default(10)\n .describe('Maximum number of results to return (1-50)'),\n preferSerper: z\n .boolean()\n .default(false)\n .describe('Prefer Serper API if available (requires SERPER_API_KEY)'),\n timeout: z\n .number()\n .min(1000)\n .max(60000)\n .default(30000)\n .describe('Request timeout in milliseconds (1000-60000, default: 30000)'),\n});\n\n/**\n * Search result schema\n */\nexport const searchResultSchema = z.object({\n title: z.string(),\n link: z.string().url(),\n snippet: z.string(),\n position: z.number().optional(),\n});\n\n/**\n * Web search output schema\n */\nexport const webSearchOutputSchema = z.object({\n success: z.boolean(),\n source: z.enum(['duckduckgo', 'serper']),\n query: z.string(),\n results: z.array(searchResultSchema),\n totalResults: z.number().optional(),\n error: z.string().optional(),\n metadata: z\n .object({\n responseTime: z.number().optional(),\n fallbackUsed: z.boolean().optional(),\n })\n .optional(),\n});\n\n","/**\n * Web Search Tool - Utility Functions\n */\n\nimport type { RetryConfig } from './types.js';\n\n/**\n * Get Serper API key from environment\n */\nexport function getSerperApiKey(): string | undefined {\n return process.env.SERPER_API_KEY;\n}\n\n/**\n * Check if Serper API is available\n */\nexport function isSerperAvailable(): boolean {\n return !!getSerperApiKey();\n}\n\n/**\n * Measure execution time of an async function\n */\nexport async function measureTime<T>(\n fn: () => Promise<T>\n): Promise<{ result: T; duration: number }> {\n const start = Date.now();\n const result = await fn();\n const duration = Date.now() - start;\n return { result, duration };\n}\n\n/**\n * Sanitize search query\n */\nexport function sanitizeQuery(query: string): string {\n return query.trim().replace(/\\s+/g, ' ');\n}\n\n/**\n * Default retry configuration\n */\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n initialDelay: 1000, // 1 second\n maxDelay: 10000, // 10 seconds\n backoffMultiplier: 2,\n};\n\n/**\n * Default timeout for search requests (30 seconds)\n */\nexport const DEFAULT_TIMEOUT = 30000;\n\n/**\n * Check if error is retryable (network errors, timeouts, 5xx errors)\n */\nexport function isRetryableError(error: any): boolean {\n // Network errors\n if (error.code === 'ECONNRESET' || error.code === 'ETIMEDOUT' || error.code === 'ENOTFOUND') {\n return true;\n }\n\n // Timeout errors\n if (error.code === 'ECONNABORTED' || error.message?.includes('timeout')) {\n return true;\n }\n\n // 5xx server errors (but not 4xx client errors)\n if (error.response?.status >= 500 && error.response?.status < 600) {\n return true;\n }\n\n // Rate limiting (429) - retryable with backoff\n if (error.response?.status === 429) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Sleep for specified milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry an async function with exponential backoff\n */\nexport async function retryWithBackoff<T>(\n fn: () => Promise<T>,\n config: RetryConfig = DEFAULT_RETRY_CONFIG\n): Promise<T> {\n let lastError: any;\n let delay = config.initialDelay;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error: any) {\n lastError = error;\n\n // Don't retry if error is not retryable\n if (!isRetryableError(error)) {\n throw error;\n }\n\n // Don't retry if we've exhausted all attempts\n if (attempt === config.maxRetries) {\n break;\n }\n\n // Wait before retrying\n await sleep(delay);\n\n // Increase delay for next attempt (exponential backoff)\n delay = Math.min(delay * config.backoffMultiplier, config.maxDelay);\n }\n }\n\n // All retries exhausted\n throw lastError;\n}\n\n","/**\n * DuckDuckGo Search Provider\n * \n * Free search provider using DuckDuckGo's Instant Answer API.\n * No API key required.\n */\n\nimport axios from 'axios';\nimport type { SearchProvider, SearchResult } from '../types.js';\nimport { retryWithBackoff, DEFAULT_TIMEOUT } from '../utils.js';\n\n/**\n * DuckDuckGo API response structure\n */\ninterface DuckDuckGoResponse {\n Abstract?: string;\n AbstractText?: string;\n AbstractSource?: string;\n AbstractURL?: string;\n Heading?: string;\n RelatedTopics?: Array<{\n Text?: string;\n FirstURL?: string;\n }>;\n Results?: Array<{\n Text?: string;\n FirstURL?: string;\n }>;\n}\n\n/**\n * DuckDuckGo search provider implementation\n */\nexport class DuckDuckGoProvider implements SearchProvider {\n name = 'duckduckgo' as const;\n\n /**\n * DuckDuckGo is always available (no API key required)\n */\n isAvailable(): boolean {\n return true;\n }\n\n /**\n * Search using DuckDuckGo Instant Answer API\n * @param query - Search query\n * @param maxResults - Maximum number of results to return\n * @param timeout - Request timeout in milliseconds (default: 30000)\n */\n async search(\n query: string,\n maxResults: number,\n timeout: number = DEFAULT_TIMEOUT\n ): Promise<SearchResult[]> {\n return retryWithBackoff(async () => {\n try {\n const response = await axios.get<DuckDuckGoResponse>(\n 'https://api.duckduckgo.com/',\n {\n params: {\n q: query,\n format: 'json',\n },\n headers: {\n 'User-Agent':\n 'Mozilla/5.0 (compatible; AgentForge/1.0; +https://github.com/agentforge)',\n },\n timeout,\n }\n );\n\n return this.normalizeResults(response.data, maxResults);\n } catch (error: any) {\n throw new Error(`DuckDuckGo search failed: ${error.message}`);\n }\n });\n }\n\n /**\n * Normalize DuckDuckGo response to SearchResult[]\n * Optimized for performance with large result sets\n */\n private normalizeResults(\n data: DuckDuckGoResponse,\n maxResults: number\n ): SearchResult[] {\n const results: SearchResult[] = [];\n\n // Early return if maxResults is 0\n if (maxResults <= 0) {\n return results;\n }\n\n // Add abstract as first result if available\n if (data.Abstract && data.AbstractURL) {\n results.push({\n title: data.Heading || 'Result',\n link: data.AbstractURL,\n snippet: data.Abstract,\n position: 1,\n });\n\n // Early return if we've reached maxResults\n if (results.length >= maxResults) {\n return results;\n }\n }\n\n // Add related topics (optimized: only process what we need)\n if (data.RelatedTopics && data.RelatedTopics.length > 0) {\n const remaining = maxResults - results.length;\n const topicsToProcess = data.RelatedTopics.slice(0, remaining);\n\n for (const topic of topicsToProcess) {\n if (topic.Text && topic.FirstURL) {\n // Cache split result to avoid redundant operations\n const titleParts = topic.Text.split(' - ');\n results.push({\n title: titleParts[0] || topic.Text,\n link: topic.FirstURL,\n snippet: topic.Text,\n position: results.length + 1,\n });\n }\n }\n\n // Early return if we've reached maxResults\n if (results.length >= maxResults) {\n return results;\n }\n }\n\n // Add regular results (optimized: only process what we need)\n if (data.Results && data.Results.length > 0) {\n const remaining = maxResults - results.length;\n const resultsToProcess = data.Results.slice(0, remaining);\n\n for (const result of resultsToProcess) {\n if (result.Text && result.FirstURL) {\n // Cache split result to avoid redundant operations\n const titleParts = result.Text.split(' - ');\n results.push({\n title: titleParts[0] || result.Text,\n link: result.FirstURL,\n snippet: result.Text,\n position: results.length + 1,\n });\n }\n }\n }\n\n return results;\n }\n}\n\n/**\n * Create a new DuckDuckGo provider instance\n */\nexport function createDuckDuckGoProvider(): DuckDuckGoProvider {\n return new DuckDuckGoProvider();\n}\n\n","/**\n * Serper Search Provider\n * \n * Premium search provider using Serper API (Google results).\n * Requires SERPER_API_KEY environment variable.\n * Get your API key at: https://serper.dev\n */\n\nimport axios from 'axios';\nimport type { SearchProvider, SearchResult } from '../types.js';\nimport { getSerperApiKey, retryWithBackoff, DEFAULT_TIMEOUT } from '../utils.js';\n\n/**\n * Serper API response structure\n */\ninterface SerperResponse {\n organic?: Array<{\n title?: string;\n link?: string;\n snippet?: string;\n position?: number;\n }>;\n searchParameters?: {\n q?: string;\n num?: number;\n };\n}\n\n/**\n * Serper search provider implementation\n */\nexport class SerperProvider implements SearchProvider {\n name = 'serper' as const;\n private apiKey: string | undefined;\n\n constructor() {\n this.apiKey = getSerperApiKey();\n }\n\n /**\n * Serper is available if API key is set\n */\n isAvailable(): boolean {\n return !!this.apiKey;\n }\n\n /**\n * Search using Serper API\n * @param query - Search query\n * @param maxResults - Maximum number of results to return\n * @param timeout - Request timeout in milliseconds (default: 30000)\n */\n async search(\n query: string,\n maxResults: number,\n timeout: number = DEFAULT_TIMEOUT\n ): Promise<SearchResult[]> {\n if (!this.apiKey) {\n throw new Error(\n 'Serper API key not found. Set SERPER_API_KEY environment variable. Get your key at https://serper.dev'\n );\n }\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post<SerperResponse>(\n 'https://google.serper.dev/search',\n {\n q: query,\n num: maxResults,\n },\n {\n headers: {\n 'X-API-KEY': this.apiKey,\n 'Content-Type': 'application/json',\n },\n timeout,\n }\n );\n\n return this.normalizeResults(response.data, maxResults);\n } catch (error: any) {\n if (error.response?.status === 401) {\n throw new Error(\n 'Invalid Serper API key. Get your key at https://serper.dev'\n );\n }\n if (error.response?.status === 429) {\n throw new Error(\n 'Serper API rate limit exceeded. Please try again later or upgrade your plan at https://serper.dev'\n );\n }\n throw new Error(`Serper search failed: ${error.message}`);\n }\n });\n }\n\n /**\n * Normalize Serper response to SearchResult[]\n * Optimized for performance with large result sets\n */\n private normalizeResults(\n data: SerperResponse,\n maxResults: number\n ): SearchResult[] {\n // Early return for empty results\n if (!data.organic || data.organic.length === 0 || maxResults <= 0) {\n return [];\n }\n\n // Pre-allocate array with expected size for better performance\n const results: SearchResult[] = [];\n\n // Only process the number of items we need (avoid processing entire array)\n const itemsToProcess = Math.min(data.organic.length, maxResults);\n\n for (let i = 0; i < itemsToProcess; i++) {\n const item = data.organic[i];\n\n // Skip items with missing required fields\n if (!item.title || !item.link || !item.snippet) {\n continue;\n }\n\n results.push({\n title: item.title,\n link: item.link,\n snippet: item.snippet,\n position: item.position ?? i + 1,\n });\n\n // Stop if we've collected enough results\n if (results.length >= maxResults) {\n break;\n }\n }\n\n return results;\n }\n}\n\n/**\n * Create a new Serper provider instance\n */\nexport function createSerperProvider(): SerperProvider {\n return new SerperProvider();\n}\n\n","/**\n * Web Search Tool\n * \n * Search the web using DuckDuckGo (free) or Serper (optional upgrade).\n * Provides smart fallback and normalized results.\n * \n * @example\n * ```ts\n * // Basic usage (no API key needed)\n * const result = await webSearch.invoke({\n * query: 'What is TypeScript?'\n * });\n * \n * // With Serper API key (set SERPER_API_KEY env var)\n * const result = await webSearch.invoke({\n * query: 'Best restaurants in SF 2026',\n * preferSerper: true\n * });\n * ```\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { webSearchSchema } from './schemas.js';\nimport { createDuckDuckGoProvider } from './providers/duckduckgo.js';\nimport { createSerperProvider } from './providers/serper.js';\nimport { measureTime, sanitizeQuery, DEFAULT_TIMEOUT } from './utils.js';\nimport type { WebSearchInput, WebSearchOutput, SearchProvider } from './types.js';\n\n/**\n * Web search tool implementation\n */\nexport const webSearch = toolBuilder()\n .name('web-search')\n .description(\n 'Search the web for information using DuckDuckGo (free) or Serper API (optional). ' +\n 'Returns structured search results with titles, links, and snippets. ' +\n 'Automatically falls back to Serper if DuckDuckGo returns no results and API key is available.'\n )\n .category(ToolCategory.WEB)\n .tags(['search', 'web', 'google', 'duckduckgo', 'serper', 'internet'])\n .schema(webSearchSchema)\n .implement(async (input: WebSearchInput): Promise<WebSearchOutput> => {\n const {\n query,\n maxResults = 10,\n preferSerper = false,\n timeout = DEFAULT_TIMEOUT\n } = input;\n\n // Sanitize query\n const sanitizedQuery = sanitizeQuery(query);\n\n // Initialize providers\n const duckduckgo = createDuckDuckGoProvider();\n const serper = createSerperProvider();\n\n // Determine which provider to use\n let primaryProvider: SearchProvider;\n let fallbackProvider: SearchProvider | null = null;\n\n if (preferSerper && serper.isAvailable()) {\n primaryProvider = serper;\n fallbackProvider = duckduckgo;\n } else {\n primaryProvider = duckduckgo;\n fallbackProvider = serper.isAvailable() ? serper : null;\n }\n\n try {\n // Try primary provider\n const { result: results, duration } = await measureTime(() =>\n primaryProvider.search(sanitizedQuery, maxResults, timeout)\n );\n\n // If primary provider returns results, return them\n if (results.length > 0) {\n return {\n success: true,\n source: primaryProvider.name,\n query: sanitizedQuery,\n results,\n totalResults: results.length,\n metadata: {\n responseTime: duration,\n fallbackUsed: false,\n },\n };\n }\n\n // If no results and fallback is available, try fallback\n if (fallbackProvider) {\n const { result: fallbackResults, duration: fallbackDuration } =\n await measureTime(() =>\n fallbackProvider!.search(sanitizedQuery, maxResults, timeout)\n );\n\n return {\n success: true,\n source: fallbackProvider.name,\n query: sanitizedQuery,\n results: fallbackResults,\n totalResults: fallbackResults.length,\n metadata: {\n responseTime: fallbackDuration,\n fallbackUsed: true,\n },\n };\n }\n\n // No results from either provider\n return {\n success: true,\n source: primaryProvider.name,\n query: sanitizedQuery,\n results: [],\n totalResults: 0,\n metadata: {\n responseTime: duration,\n fallbackUsed: false,\n },\n };\n } catch (error: any) {\n // Error occurred\n return {\n success: false,\n source: primaryProvider.name,\n query: sanitizedQuery,\n results: [],\n error: error.message,\n };\n }\n })\n .build();\n\n// Export types and schemas for external use\nexport * from './types.js';\nexport * from './schemas.js';\nexport * from './providers/duckduckgo.js';\nexport * from './providers/serper.js';\n\n","/**\n * Authentication helpers for Slack tools\n */\n\nimport { WebClient } from '@slack/web-api';\nimport type { SlackClientConfig } from './types.js';\n\n/**\n * Create a function to get configured Slack client\n * This is used by the factory function to create closures\n */\nexport function createGetConfiguredSlackClient(\n token?: string,\n botName: string = 'AgentForge Bot',\n botIcon: string = ':robot_face:'\n): () => { client: WebClient; config: SlackClientConfig } {\n let configuredClient: WebClient | null = null;\n\n return function getConfiguredSlackClient(): { client: WebClient; config: SlackClientConfig } {\n if (!configuredClient) {\n const slackToken = token || process.env.SLACK_USER_TOKEN || process.env.SLACK_BOT_TOKEN;\n if (!slackToken) {\n throw new Error(\n 'Slack token not configured. Please provide a token in config or set SLACK_USER_TOKEN or SLACK_BOT_TOKEN environment variable.'\n );\n }\n configuredClient = new WebClient(slackToken);\n }\n\n return {\n client: configuredClient,\n config: {\n token: token || process.env.SLACK_USER_TOKEN || process.env.SLACK_BOT_TOKEN || '',\n botName,\n botIcon,\n },\n };\n };\n}\n\n/**\n * Helper function to get default Slack client (for default tools)\n */\nlet defaultSlackClient: WebClient | null = null;\n\nexport function getDefaultSlackClient(): { client: WebClient; config: SlackClientConfig } {\n if (!defaultSlackClient) {\n const token = process.env.SLACK_USER_TOKEN || process.env.SLACK_BOT_TOKEN;\n if (!token) {\n throw new Error(\n 'Slack token not configured. Please set SLACK_USER_TOKEN or SLACK_BOT_TOKEN environment variable.'\n );\n }\n defaultSlackClient = new WebClient(token);\n }\n\n return {\n client: defaultSlackClient,\n config: {\n token: process.env.SLACK_USER_TOKEN || process.env.SLACK_BOT_TOKEN || '',\n botName: 'AgentForge Bot',\n botIcon: ':robot_face:',\n },\n };\n}\n\n","/**\n * Send a message to a Slack channel\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from '@agentforge/core';\nimport { z } from 'zod';\nimport type { WebClient } from '@slack/web-api';\nimport type { SlackClientConfig } from '../types.js';\n\n/**\n * Create the sendSlackMessage tool with the provided client and logger\n */\nexport function createSendSlackMessageTool(\n getSlackClient: () => { client: WebClient; config: SlackClientConfig },\n logger: Logger\n) {\n return toolBuilder()\n .name('send-slack-message')\n .description('Send a message to a Slack channel for team communication and notifications')\n .category(ToolCategory.WEB)\n .tags(['slack', 'messaging', 'communication'])\n .usageNotes(\n 'Use this for general team communication. For notifications with @mentions, consider using notify-slack instead. ' +\n 'Use get-slack-channels first if you need to find the right channel.'\n )\n .suggests(['get-slack-channels'])\n .schema(\n z.object({\n channel: z.string().describe(\"Channel name (e.g., 'general') or ID (e.g., 'C123456')\"),\n message: z.string().describe('Message content to send'),\n })\n )\n .implementSafe(async ({ channel, message }) => {\n logger.info('send-slack-message called', { channel, messageLength: message.length });\n\n try {\n const { client: slack, config } = getSlackClient();\n\n // Send message using Slack API\n const result = await slack.chat.postMessage({\n channel,\n text: message,\n username: config.botName,\n icon_emoji: config.botIcon,\n });\n\n logger.info('send-slack-message result', {\n channel: result.channel,\n timestamp: result.ts,\n messageLength: message.length,\n success: true,\n });\n\n return {\n channel: result.channel,\n message,\n timestamp: result.ts,\n message_id: result.ts,\n };\n } catch (error: any) {\n logger.error('send-slack-message failed', {\n channel,\n error: error.message,\n data: error.data,\n });\n throw error;\n }\n })\n .build();\n}\n\n","/**\n * Send a notification to a Slack channel (with @mention support)\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from '@agentforge/core';\nimport { z } from 'zod';\nimport type { WebClient } from '@slack/web-api';\nimport type { SlackClientConfig } from '../types.js';\n\n/**\n * Create the notifySlack tool with the provided client and logger\n */\nexport function createNotifySlackTool(\n getSlackClient: () => { client: WebClient; config: SlackClientConfig },\n logger: Logger\n) {\n return toolBuilder()\n .name('notify-slack')\n .description('Send a notification to a Slack channel with optional @mentions for urgent alerts')\n .category(ToolCategory.WEB)\n .tags(['slack', 'notification', 'alert'])\n .usageNotes(\n 'Use this for urgent notifications that require @mentions. For general messages without mentions, ' +\n 'use send-slack-message instead.'\n )\n .suggests(['get-slack-channels'])\n .schema(\n z.object({\n channel: z.string().describe('Channel name or ID'),\n message: z.string().describe('Notification message'),\n mentions: z.array(z.string()).optional().describe('List of usernames to mention (without @)'),\n })\n )\n .implementSafe(async ({ channel, message, mentions = [] }) => {\n logger.info('notify-slack called', {\n channel,\n messageLength: message.length,\n mentionCount: mentions.length,\n });\n\n const { client: slack, config } = getSlackClient();\n\n // Build message with mentions\n const mentionText = mentions.length > 0 ? mentions.map((m) => `<@${m}>`).join(' ') + ' ' : '';\n const fullMessage = `${mentionText}${message}`;\n\n // Send notification using Slack API\n const result = await slack.chat.postMessage({\n channel,\n text: fullMessage,\n username: config.botName,\n icon_emoji: config.botIcon,\n });\n\n logger.info('notify-slack result', {\n channel: result.channel,\n timestamp: result.ts,\n mentions: mentions.length,\n });\n\n return {\n channel: result.channel,\n message: fullMessage,\n mentions,\n timestamp: result.ts,\n notification_id: result.ts,\n };\n })\n .build();\n}\n\n","/**\n * Get list of available Slack channels\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from '@agentforge/core';\nimport { z } from 'zod';\nimport type { WebClient } from '@slack/web-api';\nimport type { SlackClientConfig } from '../types.js';\n\n/**\n * Create the getSlackChannels tool with the provided client and logger\n */\nexport function createGetSlackChannelsTool(\n getSlackClient: () => { client: WebClient; config: SlackClientConfig },\n logger: Logger\n) {\n return toolBuilder()\n .name('get-slack-channels')\n .description('Get a list of available Slack channels to find the right channel for messaging')\n .category(ToolCategory.WEB)\n .tags(['slack', 'channels', 'list'])\n .usageNotes(\n 'Use this first to discover available channels before sending messages. ' +\n 'Helps ensure you are sending to the correct channel.'\n )\n .follows(['send-slack-message', 'notify-slack'])\n .schema(\n z.object({\n include_private: z.boolean().optional().describe('Include private channels (default: false)'),\n })\n )\n .implementSafe(async ({ include_private = false }) => {\n logger.info('get-slack-channels called', { include_private });\n\n const { client: slack } = getSlackClient();\n\n // Get public channels\n const publicChannels = await slack.conversations.list({\n types: 'public_channel',\n exclude_archived: true,\n });\n\n let allChannels = publicChannels.channels || [];\n\n // Get private channels if requested\n if (include_private) {\n const privateChannels = await slack.conversations.list({\n types: 'private_channel',\n exclude_archived: true,\n });\n allChannels = [...allChannels, ...(privateChannels.channels || [])];\n }\n\n logger.info('get-slack-channels result', {\n channelCount: allChannels.length,\n includePrivate: include_private,\n });\n\n return {\n count: allChannels.length,\n channels: allChannels.map((c) => ({\n id: c.id,\n name: c.name,\n is_private: c.is_private || false,\n num_members: c.num_members || 0,\n })),\n };\n })\n .build();\n}\n\n","/**\n * Get message history from a Slack channel\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from '@agentforge/core';\nimport { z } from 'zod';\nimport type { WebClient } from '@slack/web-api';\nimport type { SlackClientConfig } from '../types.js';\n\n/**\n * Create the getSlackMessages tool with the provided client and logger\n */\nexport function createGetSlackMessagesTool(\n getSlackClient: () => { client: WebClient; config: SlackClientConfig },\n logger: Logger\n) {\n return toolBuilder()\n .name('get-slack-messages')\n .description('Retrieve message history from a Slack channel to read recent conversations')\n .category(ToolCategory.WEB)\n .tags(['slack', 'messages', 'history', 'read'])\n .usageNotes(\n 'Use this to read recent messages from a channel. Use get-slack-channels first if you need to find the channel ID. ' +\n 'Returns messages in reverse chronological order (newest first).'\n )\n .suggests(['get-slack-channels'])\n .schema(\n z.object({\n channel: z.string().describe(\"Channel name (e.g., 'general') or ID (e.g., 'C123456')\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe('Number of messages to retrieve (default: 20, max: 100)'),\n })\n )\n .implementSafe(async ({ channel, limit = 20 }) => {\n logger.info('get-slack-messages called', { channel, limit });\n\n try {\n const { client: slack } = getSlackClient();\n\n // Get channel ID if name was provided\n let channelId = channel;\n if (!channel.startsWith('C') && !channel.startsWith('D')) {\n const channels = await slack.conversations.list({\n types: 'public_channel,private_channel',\n exclude_archived: true,\n });\n const found = channels.channels?.find((c) => c.name === channel);\n if (!found) {\n logger.error('get-slack-messages: channel not found', { channel });\n throw new Error(\n `Channel '${channel}' not found. Use get-slack-channels to see available channels.`\n );\n }\n channelId = found.id!;\n }\n\n // Retrieve message history\n const result = await slack.conversations.history({\n channel: channelId,\n limit: Math.min(limit, 100), // Cap at 100 for performance\n });\n\n logger.info('get-slack-messages result', {\n channel: channelId,\n messageCount: result.messages?.length || 0,\n limit,\n });\n\n return {\n channel: channelId,\n count: result.messages?.length || 0,\n messages:\n result.messages?.map((m) => ({\n user: m.user || 'unknown',\n text: m.text || '',\n timestamp: m.ts,\n thread_ts: m.thread_ts,\n type: m.type,\n subtype: m.subtype,\n })) || [],\n };\n } catch (error: any) {\n logger.error('get-slack-messages failed', {\n channel,\n error: error.message,\n data: error.data,\n });\n throw error;\n }\n })\n .build();\n}\n\n","/**\n * Slack Integration Tools\n *\n * Tools for interacting with Slack workspaces - send messages, notifications,\n * list channels, and read message history.\n *\n * @packageDocumentation\n *\n * @example\n * ```ts\n * // Using default tools (reads from env vars)\n * import { sendSlackMessage } from '@agentforge/tools';\n *\n * const result = await sendSlackMessage.execute({\n * channel: 'general',\n * message: 'Hello from AgentForge!'\n * });\n *\n * // Using factory function with custom config\n * import { createSlackTools } from '@agentforge/tools';\n *\n * const slackTools = createSlackTools({\n * token: 'xoxb-your-bot-token',\n * botName: 'My Custom Bot'\n * });\n *\n * const result = await slackTools.sendMessage.execute({\n * channel: 'general',\n * message: 'Hello!'\n * });\n * ```\n */\n\nimport { createLogger, LogLevel } from \"@agentforge/core\";\nimport { getDefaultSlackClient, createGetConfiguredSlackClient } from \"./auth.js\";\nimport { createSendSlackMessageTool } from \"./tools/send-slack-message.js\";\nimport { createNotifySlackTool } from \"./tools/notify-slack.js\";\nimport { createGetSlackChannelsTool } from \"./tools/get-slack-channels.js\";\nimport { createGetSlackMessagesTool } from \"./tools/get-slack-messages.js\";\n\n// Export types\nexport type { SlackToolsConfig, SlackClientConfig } from \"./types.js\";\n\n// Create logger for default Slack tools\nconst logLevel = (process.env.LOG_LEVEL?.toLowerCase() as LogLevel) || LogLevel.INFO;\nconst logger = createLogger('[tools:slack]', { level: logLevel });\n\n/**\n * Default Slack tools using environment variables\n */\nexport const sendSlackMessage = createSendSlackMessageTool(getDefaultSlackClient, logger);\nexport const notifySlack = createNotifySlackTool(getDefaultSlackClient, logger);\nexport const getSlackChannels = createGetSlackChannelsTool(getDefaultSlackClient, logger);\nexport const getSlackMessages = createGetSlackMessagesTool(getDefaultSlackClient, logger);\n\n/**\n * Export all Slack tools\n *\n * Includes 4 tools for Slack integration:\n * - 2 write tools: send-slack-message, notify-slack\n * - 2 read tools: get-slack-channels, get-slack-messages\n */\nexport const slackTools = [\n // Write tools\n sendSlackMessage,\n notifySlack,\n // Read tools\n getSlackChannels,\n getSlackMessages,\n];\n\n/**\n * Create Slack tools with custom configuration\n *\n * This factory function allows you to create Slack tools with custom configuration,\n * such as providing a token programmatically instead of using environment variables.\n *\n * @param config - Configuration options for Slack tools\n * @returns Object containing all 4 Slack tools configured with the provided options\n *\n * @example\n * ```ts\n * // Create tools with custom token\n * const slackTools = createSlackTools({\n * token: 'xoxb-your-bot-token',\n * botName: 'My Custom Bot',\n * botIcon: ':rocket:'\n * });\n *\n * // Use the tools\n * await slackTools.sendMessage.execute({\n * channel: 'general',\n * message: 'Hello!'\n * });\n *\n * // Or use with an agent\n * const agent = createReActAgent({\n * llm,\n * tools: [\n * slackTools.sendMessage,\n * slackTools.notify,\n * slackTools.getChannels,\n * slackTools.getMessages\n * ]\n * });\n * ```\n */\nexport function createSlackTools(config: import(\"./types.js\").SlackToolsConfig = {}) {\n const {\n token,\n botName = 'AgentForge Bot',\n botIcon = ':robot_face:',\n logLevel: customLogLevel,\n } = config;\n\n // Create closures for getting configured Slack client\n const getConfiguredSlackClient = createGetConfiguredSlackClient(token, botName, botIcon);\n\n // Create logger with custom log level if provided\n const toolLogger = customLogLevel\n ? createLogger('[tools:slack]', { level: customLogLevel })\n : logger;\n\n // Build all 4 tools with configured client/logger\n const sendMessage = createSendSlackMessageTool(getConfiguredSlackClient, toolLogger);\n const notify = createNotifySlackTool(getConfiguredSlackClient, toolLogger);\n const getChannels = createGetSlackChannelsTool(getConfiguredSlackClient, toolLogger);\n const getMessages = createGetSlackMessagesTool(getConfiguredSlackClient, toolLogger);\n\n // Return all configured tools\n return {\n sendMessage,\n notify,\n getChannels,\n getMessages,\n };\n}\n\n","/**\n * Authentication helpers for Confluence tools\n */\n\nimport type { ConfluenceAuth } from \"./types.js\";\n\n/**\n * Create a function to get configured auth credentials\n * This is used by the factory function to create closures\n */\nexport function createGetConfiguredAuth(\n apiKey?: string,\n email?: string,\n siteUrl?: string\n): () => ConfluenceAuth {\n return function getConfiguredAuth(): ConfluenceAuth {\n const ATLASSIAN_API_KEY = apiKey || process.env.ATLASSIAN_API_KEY || \"\";\n const ATLASSIAN_EMAIL = email || process.env.ATLASSIAN_EMAIL || \"\";\n const ATLASSIAN_SITE_URL = (siteUrl || process.env.ATLASSIAN_SITE_URL || \"\").replace(/\\/$/, \"\");\n\n if (!ATLASSIAN_API_KEY || !ATLASSIAN_EMAIL || !ATLASSIAN_SITE_URL) {\n throw new Error(\n \"Confluence credentials not configured. Set ATLASSIAN_API_KEY, ATLASSIAN_EMAIL, and ATLASSIAN_SITE_URL in config or environment variables.\"\n );\n }\n\n return { ATLASSIAN_API_KEY, ATLASSIAN_EMAIL, ATLASSIAN_SITE_URL };\n };\n}\n\n/**\n * Create a function to get configured auth header\n * This is used by the factory function to create closures\n */\nexport function createGetConfiguredAuthHeader(\n getConfiguredAuth: () => ConfluenceAuth\n): () => string {\n return function getConfiguredAuthHeader(): string {\n const { ATLASSIAN_API_KEY, ATLASSIAN_EMAIL } = getConfiguredAuth();\n const auth = Buffer.from(`${ATLASSIAN_EMAIL}:${ATLASSIAN_API_KEY}`).toString(\"base64\");\n return `Basic ${auth}`;\n };\n}\n\n/**\n * Helper function to get configuration from environment (for default tools)\n */\nexport function getConfig(): ConfluenceAuth {\n const ATLASSIAN_API_KEY = process.env.ATLASSIAN_API_KEY || \"\";\n const ATLASSIAN_EMAIL = process.env.ATLASSIAN_EMAIL || \"\";\n const ATLASSIAN_SITE_URL = (process.env.ATLASSIAN_SITE_URL || \"\").replace(/\\/$/, \"\");\n\n if (!ATLASSIAN_API_KEY || !ATLASSIAN_EMAIL || !ATLASSIAN_SITE_URL) {\n throw new Error(\"Confluence credentials not configured. Set ATLASSIAN_API_KEY, ATLASSIAN_EMAIL, and ATLASSIAN_SITE_URL in .env\");\n }\n\n return { ATLASSIAN_API_KEY, ATLASSIAN_EMAIL, ATLASSIAN_SITE_URL };\n}\n\n/**\n * Helper function to create auth header (for default tools)\n */\nexport function getAuthHeader(): string {\n const { ATLASSIAN_API_KEY, ATLASSIAN_EMAIL } = getConfig();\n const auth = Buffer.from(`${ATLASSIAN_EMAIL}:${ATLASSIAN_API_KEY}`).toString(\"base64\");\n return `Basic ${auth}`;\n}\n\n","/**\n * Search Confluence pages using CQL (Confluence Query Language)\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from \"@agentforge/core\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport type { ConfluenceAuth } from \"../types.js\";\n\n/**\n * Create the searchConfluence tool with the provided auth and logger\n */\nexport function createSearchConfluenceTool(\n getAuth: () => ConfluenceAuth,\n getAuthHeader: () => string,\n logger: Logger\n) {\n return toolBuilder()\n .name(\"search-confluence\")\n .description(\"Search for pages in Confluence using keywords or CQL (Confluence Query Language). Returns matching pages with titles, IDs, and excerpts.\")\n .category(ToolCategory.WEB)\n .tag(\"confluence\")\n .tag(\"search\")\n .tag(\"knowledge-base\")\n .usageNotes(\"Use this to find relevant documentation, policies, or information in Confluence. You can search by keywords or use CQL for advanced queries (e.g., 'space=AI AND type=page'). Use get-confluence-page to retrieve full content of specific pages.\")\n .suggests([\"get-confluence-page\"])\n .schema(z.object({\n query: z.string().describe(\"Search query or CQL expression (e.g., 'payment processing' or 'space=BL3 AND title~payment')\"),\n limit: z.number().optional().describe(\"Maximum number of results to return (default: 10, max: 25)\"),\n }))\n .implement(async ({ query, limit = 10 }) => {\n logger.info('search-confluence called', { query, limit });\n\n try {\n const { ATLASSIAN_SITE_URL } = getAuth();\n const response = await axios.get(`${ATLASSIAN_SITE_URL}/wiki/rest/api/content/search`, {\n headers: {\n Authorization: getAuthHeader(),\n Accept: \"application/json\",\n },\n params: {\n cql: query,\n limit: Math.min(limit, 25),\n expand: \"space,version\",\n },\n });\n\n const { ATLASSIAN_SITE_URL: siteUrl } = getAuth();\n const results = response.data.results.map((page: any) => ({\n id: page.id,\n title: page.title,\n type: page.type,\n space: page.space?.name || \"Unknown\",\n spaceKey: page.space?.key || \"\",\n url: `${siteUrl}/wiki${page._links.webui}`,\n lastModified: page.version?.when || \"\",\n }));\n\n // IMPORTANT: Log when search returns no results - this is a valid outcome!\n if (results.length === 0) {\n logger.warn('search-confluence returned NO RESULTS - this is a valid outcome, agent should not retry', {\n query,\n limit,\n totalSize: response.data.totalSize\n });\n } else {\n logger.info('search-confluence result', {\n query,\n resultCount: results.length,\n totalSize: response.data.totalSize,\n titles: results.map((r: any) => r.title).slice(0, 3) // Log first 3 titles\n });\n }\n\n return JSON.stringify({\n success: true,\n count: results.length,\n total: response.data.totalSize,\n results,\n });\n } catch (error: any) {\n logger.error('search-confluence error', {\n query,\n error: error.response?.data?.message || error.message,\n status: error.response?.status\n });\n\n return JSON.stringify({\n success: false,\n error: error.response?.data?.message || error.message,\n });\n }\n })\n .build();\n}\n\n","/**\n * Get full content of a Confluence page by ID\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from \"@agentforge/core\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport type { ConfluenceAuth } from \"../types.js\";\n\n/**\n * Create the getConfluencePage tool with the provided auth and logger\n */\nexport function createGetConfluencePageTool(\n getAuth: () => ConfluenceAuth,\n getAuthHeader: () => string,\n logger: Logger\n) {\n return toolBuilder()\n .name(\"get-confluence-page\")\n .description(\"Get the full content of a specific Confluence page by its ID. Returns the page title, content (in storage format), space, and metadata.\")\n .category(ToolCategory.WEB)\n .tag(\"confluence\")\n .tag(\"page\")\n .tag(\"content\")\n .usageNotes(\"Use this after search-confluence to retrieve the full content of a specific page. The page ID can be found in search results.\")\n .requires([\"search-confluence\"])\n .schema(z.object({\n page_id: z.string().describe(\"The Confluence page ID (from search results)\"),\n }))\n .implement(async ({ page_id }) => {\n logger.info('get-confluence-page called', { page_id });\n\n try {\n const { ATLASSIAN_SITE_URL } = getAuth();\n const response = await axios.get(`${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`, {\n headers: {\n Authorization: getAuthHeader(),\n Accept: \"application/json\",\n },\n params: {\n expand: \"body.storage,space,version,history\",\n },\n });\n\n const page = response.data;\n\n logger.info('get-confluence-page result', {\n page_id,\n title: page.title,\n space: page.space?.name,\n contentLength: page.body?.storage?.value?.length || 0\n });\n\n return JSON.stringify({\n success: true,\n page: {\n id: page.id,\n title: page.title,\n type: page.type,\n space: page.space?.name || \"Unknown\",\n spaceKey: page.space?.key || \"\",\n content: page.body?.storage?.value || \"\",\n url: `${ATLASSIAN_SITE_URL}/wiki${page._links.webui}`,\n created: page.history?.createdDate || \"\",\n lastModified: page.version?.when || \"\",\n version: page.version?.number || 1,\n },\n });\n } catch (error: any) {\n logger.error('get-confluence-page error', {\n page_id,\n error: error.response?.data?.message || error.message,\n status: error.response?.status\n });\n\n return JSON.stringify({\n success: false,\n error: error.response?.data?.message || error.message,\n });\n }\n })\n .build();\n}\n\n","/**\n * List all Confluence spaces\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from \"@agentforge/core\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport type { ConfluenceAuth } from \"../types.js\";\n\n/**\n * Create the listConfluenceSpaces tool with the provided auth and logger\n */\nexport function createListConfluenceSpacesTool(\n getAuth: () => ConfluenceAuth,\n getAuthHeader: () => string,\n logger: Logger\n) {\n return toolBuilder()\n .name(\"list-confluence-spaces\")\n .description(\"List all available Confluence spaces. Returns space names, keys, types, and descriptions to help identify where to search for information.\")\n .category(ToolCategory.WEB)\n .tag(\"confluence\")\n .tag(\"spaces\")\n .tag(\"list\")\n .usageNotes(\"Use this first to discover available spaces before searching. Helps narrow down searches to specific areas (e.g., 'AI', 'BL3', 'Finance').\")\n .follows([\"search-confluence\"])\n .schema(z.object({\n limit: z.number().optional().describe(\"Maximum number of spaces to return (default: 25)\"),\n }))\n .implement(async ({ limit = 25 }) => {\n logger.info('list-confluence-spaces called', { limit });\n\n try {\n const { ATLASSIAN_SITE_URL } = getAuth();\n const response = await axios.get(`${ATLASSIAN_SITE_URL}/wiki/rest/api/space`, {\n headers: {\n Authorization: getAuthHeader(),\n Accept: \"application/json\",\n },\n params: {\n limit,\n },\n });\n\n const spaces = response.data.results.map((space: any) => ({\n key: space.key,\n name: space.name,\n type: space.type,\n description: space.description?.plain?.value || \"\",\n url: `${ATLASSIAN_SITE_URL}/wiki${space._links.webui}`,\n }));\n\n logger.info('list-confluence-spaces result', {\n spaceCount: spaces.length,\n spaceKeys: spaces.map((s: any) => s.key).slice(0, 5) // Log first 5 space keys\n });\n\n return JSON.stringify({\n success: true,\n count: spaces.length,\n spaces,\n });\n } catch (error: any) {\n logger.error('list-confluence-spaces error', {\n error: error.response?.data?.message || error.message,\n status: error.response?.status\n });\n\n return JSON.stringify({\n success: false,\n error: error.response?.data?.message || error.message,\n });\n }\n })\n .build();\n}\n\n","/**\n * Get pages from a specific Confluence space\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from \"@agentforge/core\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport type { ConfluenceAuth } from \"../types.js\";\n\n/**\n * Create the getSpacePages tool with the provided auth and logger\n */\nexport function createGetSpacePagesTool(\n getAuth: () => ConfluenceAuth,\n getAuthHeader: () => string,\n logger: Logger\n) {\n return toolBuilder()\n .name(\"get-space-pages\")\n .description(\"Get all pages from a specific Confluence space by space key. Useful for browsing content in a particular area.\")\n .category(ToolCategory.WEB)\n .tag(\"confluence\")\n .tag(\"space\")\n .tag(\"pages\")\n .usageNotes(\"Use this to explore all pages in a specific space. Get the space key from list-confluence-spaces first.\")\n .requires([\"list-confluence-spaces\"])\n .schema(z.object({\n space_key: z.string().describe(\"The space key (e.g., 'AI', 'BL3', 'FIN')\"),\n limit: z.number().optional().describe(\"Maximum number of pages to return (default: 25)\"),\n }))\n .implement(async ({ space_key, limit = 25 }) => {\n logger.info('get-space-pages called', { space_key, limit });\n\n try {\n const { ATLASSIAN_SITE_URL } = getAuth();\n const response = await axios.get(`${ATLASSIAN_SITE_URL}/wiki/rest/api/content`, {\n headers: {\n Authorization: getAuthHeader(),\n Accept: \"application/json\",\n },\n params: {\n spaceKey: space_key,\n type: \"page\",\n limit,\n expand: \"version\",\n },\n });\n\n const pages = response.data.results.map((page: any) => ({\n id: page.id,\n title: page.title,\n url: `${ATLASSIAN_SITE_URL}/wiki${page._links.webui}`,\n lastModified: page.version?.when || \"\",\n }));\n\n // Log when no pages found - this is a valid outcome!\n if (pages.length === 0) {\n logger.warn('get-space-pages returned NO PAGES - this is a valid outcome, agent should not retry', {\n space_key,\n limit\n });\n } else {\n logger.info('get-space-pages result', {\n space_key,\n pageCount: pages.length,\n titles: pages.map((p: any) => p.title).slice(0, 3) // Log first 3 titles\n });\n }\n\n return JSON.stringify({\n success: true,\n space: space_key,\n count: pages.length,\n pages,\n });\n } catch (error: any) {\n logger.error('get-space-pages error', {\n space_key,\n error: error.response?.data?.message || error.message,\n status: error.response?.status\n });\n\n return JSON.stringify({\n success: false,\n error: error.response?.data?.message || error.message,\n });\n }\n })\n .build();\n}\n\n","/**\n * Create a new Confluence page\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from \"@agentforge/core\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport type { ConfluenceAuth } from \"../types.js\";\n\n/**\n * Create the createConfluencePage tool with the provided auth and logger\n */\nexport function createCreateConfluencePageTool(\n getAuth: () => ConfluenceAuth,\n getAuthHeader: () => string,\n logger: Logger\n) {\n return toolBuilder()\n .name(\"create-confluence-page\")\n .description(\"Create a new page in a Confluence space. Requires space key, page title, and content (in HTML storage format).\")\n .category(ToolCategory.WEB)\n .tag(\"confluence\")\n .tag(\"create\")\n .tag(\"write\")\n .usageNotes(\"Use this to create new documentation pages. Content should be in Confluence storage format (HTML). Get the space key from list-confluence-spaces first. Be mindful of creating duplicate pages.\")\n .requires([\"list-confluence-spaces\"])\n .schema(z.object({\n space_key: z.string().describe(\"The space key where the page will be created (e.g., 'AI', 'BL3')\"),\n title: z.string().describe(\"The title of the new page\"),\n content: z.string().describe(\"The page content in HTML format (Confluence storage format)\"),\n parent_page_id: z.string().optional().describe(\"Optional parent page ID to create this as a child page\"),\n }))\n .implement(async ({ space_key, title, content, parent_page_id }) => {\n logger.info('create-confluence-page called', { space_key, title, hasParent: !!parent_page_id });\n\n try {\n const { ATLASSIAN_SITE_URL } = getAuth();\n\n const pageData: any = {\n type: \"page\",\n title: title,\n space: { key: space_key },\n body: {\n storage: {\n value: content,\n representation: \"storage\",\n },\n },\n };\n\n // Add parent if specified\n if (parent_page_id) {\n pageData.ancestors = [{ id: parent_page_id }];\n }\n\n const response = await axios.post(\n `${ATLASSIAN_SITE_URL}/wiki/rest/api/content`,\n pageData,\n {\n headers: {\n Authorization: getAuthHeader(),\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n logger.info('create-confluence-page result', {\n page_id: response.data.id,\n title: response.data.title,\n space: space_key\n });\n\n return JSON.stringify({\n success: true,\n page: {\n id: response.data.id,\n title: response.data.title,\n space: space_key,\n url: `${ATLASSIAN_SITE_URL}/wiki${response.data._links.webui}`,\n version: response.data.version?.number || 1,\n },\n });\n } catch (error: any) {\n logger.error('create-confluence-page error', {\n space_key,\n title,\n error: error.response?.data?.message || error.message,\n status: error.response?.status\n });\n\n return JSON.stringify({\n success: false,\n error: error.response?.data?.message || error.message,\n });\n }\n })\n .build();\n}\n\n","/**\n * Update an existing Confluence page\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from \"@agentforge/core\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport type { ConfluenceAuth } from \"../types.js\";\n\n/**\n * Create the updateConfluencePage tool with the provided auth and logger\n */\nexport function createUpdateConfluencePageTool(\n getAuth: () => ConfluenceAuth,\n getAuthHeader: () => string,\n logger: Logger\n) {\n return toolBuilder()\n .name(\"update-confluence-page\")\n .description(\"Update an existing Confluence page's content. Requires page ID, new title, and new content.\")\n .category(ToolCategory.WEB)\n .tag(\"confluence\")\n .tag(\"update\")\n .tag(\"write\")\n .usageNotes(\"Use this to update existing documentation. You must provide the page ID (from search results). The tool will automatically handle version incrementing. Always get the current page content first to avoid overwriting important information.\")\n .requires([\"get-confluence-page\"])\n .schema(z.object({\n page_id: z.string().describe(\"The ID of the page to update\"),\n title: z.string().describe(\"The new title for the page\"),\n content: z.string().describe(\"The new content in HTML format (Confluence storage format)\"),\n }))\n .implement(async ({ page_id, title, content }) => {\n logger.info('update-confluence-page called', { page_id, title });\n\n try {\n const { ATLASSIAN_SITE_URL } = getAuth();\n\n // First, get the current version\n const getResponse = await axios.get(\n `${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`,\n {\n headers: {\n Authorization: getAuthHeader(),\n },\n params: { expand: \"version\" },\n }\n );\n\n const currentVersion = getResponse.data.version.number;\n\n // Update the page\n const updateResponse = await axios.put(\n `${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`,\n {\n type: \"page\",\n title: title,\n version: { number: currentVersion + 1 },\n body: {\n storage: {\n value: content,\n representation: \"storage\",\n },\n },\n },\n {\n headers: {\n Authorization: getAuthHeader(),\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n logger.info('update-confluence-page result', {\n page_id,\n title: updateResponse.data.title,\n previousVersion: currentVersion,\n newVersion: updateResponse.data.version.number\n });\n\n return JSON.stringify({\n success: true,\n page: {\n id: updateResponse.data.id,\n title: updateResponse.data.title,\n url: `${ATLASSIAN_SITE_URL}/wiki${updateResponse.data._links.webui}`,\n version: updateResponse.data.version.number,\n previousVersion: currentVersion,\n },\n });\n } catch (error: any) {\n logger.error('update-confluence-page error', {\n page_id,\n title,\n error: error.response?.data?.message || error.message,\n status: error.response?.status\n });\n\n return JSON.stringify({\n success: false,\n error: error.response?.data?.message || error.message,\n });\n }\n })\n .build();\n}\n\n","/**\n * Archive a Confluence page (move to trash)\n */\n\nimport { toolBuilder, ToolCategory, type Tool, type Logger } from \"@agentforge/core\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport type { ConfluenceAuth } from \"../types.js\";\n\n/**\n * Create the archiveConfluencePage tool with the provided auth and logger\n */\nexport function createArchiveConfluencePageTool(\n getAuth: () => ConfluenceAuth,\n getAuthHeader: () => string,\n logger: Logger\n) {\n return toolBuilder()\n .name(\"archive-confluence-page\")\n .description(\"Archive a Confluence page by moving it to trash. The page can be restored by space admins. Note: UI may require a note explaining why the page was archived.\")\n .category(ToolCategory.WEB)\n .tag(\"confluence\")\n .tag(\"archive\")\n .tag(\"delete\")\n .usageNotes(\"Use this to archive outdated or obsolete documentation. The page is moved to trash, not permanently deleted. Space admins can restore it if needed. Be very careful - only archive pages that are truly obsolete.\")\n .conflicts([\"create-confluence-page\"])\n .schema(z.object({\n page_id: z.string().describe(\"The ID of the page to archive\"),\n reason: z.string().optional().describe(\"Optional reason for archiving (for audit trail)\"),\n }))\n .implement(async ({ page_id, reason }) => {\n logger.info('archive-confluence-page called', { page_id, reason });\n\n try {\n const { ATLASSIAN_SITE_URL } = getAuth();\n\n // Get current page data\n const getResponse = await axios.get(\n `${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`,\n {\n headers: {\n Authorization: getAuthHeader(),\n },\n params: { expand: \"version,body.storage,space\" },\n }\n );\n\n const currentVersion = getResponse.data.version.number;\n const pageData = getResponse.data;\n\n // Archive by updating status to 'trashed'\n await axios.put(\n `${ATLASSIAN_SITE_URL}/wiki/rest/api/content/${page_id}`,\n {\n version: { number: currentVersion + 1 },\n title: pageData.title,\n type: \"page\",\n status: \"trashed\",\n body: pageData.body,\n space: { key: pageData.space.key },\n },\n {\n headers: {\n Authorization: getAuthHeader(),\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n logger.info('archive-confluence-page result', {\n page_id,\n title: pageData.title,\n previousVersion: currentVersion,\n newVersion: currentVersion + 1\n });\n\n return JSON.stringify({\n success: true,\n archived: {\n id: page_id,\n title: pageData.title,\n previousVersion: currentVersion,\n newVersion: currentVersion + 1,\n reason: reason || \"Archived via API\",\n note: \"Page moved to trash. Space admins can restore it from the Confluence UI.\",\n },\n });\n } catch (error: any) {\n logger.error('archive-confluence-page error', {\n page_id,\n error: error.response?.data?.message || error.message,\n status: error.response?.status\n });\n\n return JSON.stringify({\n success: false,\n error: error.response?.data?.message || error.message,\n });\n }\n })\n .build();\n}\n\n","/**\n * Confluence Integration Tools\n * Real integration with Atlassian Confluence for knowledge base access\n *\n * @packageDocumentation\n *\n * @example\n * ```ts\n * // Using environment variables\n * import { confluenceTools } from '@agentforge/tools';\n *\n * // ATLASSIAN_API_KEY, ATLASSIAN_EMAIL, ATLASSIAN_SITE_URL must be set\n * const result = await confluenceTools[0].execute({\n * query: 'space=AI AND type=page'\n * });\n *\n * // Using factory function with custom config\n * import { createConfluenceTools } from '@agentforge/tools';\n *\n * const tools = createConfluenceTools({\n * apiKey: 'your-api-key',\n * email: 'your-email@example.com',\n * siteUrl: 'https://your-domain.atlassian.net'\n * });\n *\n * const result = await tools.searchConfluence.execute({\n * query: 'payment processing'\n * });\n * ```\n */\n\nimport { createLogger, LogLevel } from \"@agentforge/core\";\nimport { getConfig, getAuthHeader, createGetConfiguredAuth, createGetConfiguredAuthHeader } from \"./auth.js\";\nimport { createSearchConfluenceTool } from \"./tools/search-confluence.js\";\nimport { createGetConfluencePageTool } from \"./tools/get-confluence-page.js\";\nimport { createListConfluenceSpacesTool } from \"./tools/list-confluence-spaces.js\";\nimport { createGetSpacePagesTool } from \"./tools/get-space-pages.js\";\nimport { createCreateConfluencePageTool } from \"./tools/create-confluence-page.js\";\nimport { createUpdateConfluencePageTool } from \"./tools/update-confluence-page.js\";\nimport { createArchiveConfluencePageTool } from \"./tools/archive-confluence-page.js\";\n\n// Export types\nexport type { ConfluenceToolsConfig, ConfluenceAuth } from \"./types.js\";\n\n// Create logger for default Confluence tools\nconst logLevel = (process.env.LOG_LEVEL?.toLowerCase() as LogLevel) || LogLevel.INFO;\nconst logger = createLogger('[tools:confluence]', { level: logLevel });\n\n/**\n * Default Confluence tools using environment variables\n */\nexport const searchConfluence = createSearchConfluenceTool(getConfig, getAuthHeader, logger);\nexport const getConfluencePage = createGetConfluencePageTool(getConfig, getAuthHeader, logger);\nexport const listConfluenceSpaces = createListConfluenceSpacesTool(getConfig, getAuthHeader, logger);\nexport const getSpacePages = createGetSpacePagesTool(getConfig, getAuthHeader, logger);\nexport const createConfluencePage = createCreateConfluencePageTool(getConfig, getAuthHeader, logger);\nexport const updateConfluencePage = createUpdateConfluencePageTool(getConfig, getAuthHeader, logger);\nexport const archiveConfluencePage = createArchiveConfluencePageTool(getConfig, getAuthHeader, logger);\n\n/**\n * Export all Confluence tools\n *\n * Includes 7 tools for Confluence integration:\n * - 4 read tools: search, get-page, list-spaces, get-space-pages\n * - 3 write tools: create-page, update-page, archive-page\n */\nexport const confluenceTools = [\n // Read tools\n searchConfluence,\n getConfluencePage,\n listConfluenceSpaces,\n getSpacePages,\n // Write tools\n createConfluencePage,\n updateConfluencePage,\n archiveConfluencePage,\n];\n\n/**\n * Create Confluence tools with custom configuration\n *\n * This factory function allows you to create Confluence tools with programmatic configuration\n * instead of relying solely on environment variables.\n *\n * @param config - Optional configuration for Confluence tools\n * @returns Object containing all 7 Confluence tools configured with the provided settings\n *\n * @example\n * ```ts\n * // Create tools with custom credentials\n * const tools = createConfluenceTools({\n * apiKey: 'your-api-key',\n * email: 'your-email@example.com',\n * siteUrl: 'https://your-domain.atlassian.net'\n * });\n *\n * // Use the tools\n * const result = await tools.searchConfluence.execute({\n * query: 'payment processing'\n * });\n * ```\n *\n * @example\n * ```ts\n * // Create tools with custom log level\n * const tools = createConfluenceTools({\n * logLevel: LogLevel.DEBUG\n * });\n * ```\n */\nexport function createConfluenceTools(config: import(\"./types.js\").ConfluenceToolsConfig = {}) {\n const {\n apiKey,\n email,\n siteUrl,\n logLevel: customLogLevel,\n } = config;\n\n // Create closures for getting configured auth credentials\n const getConfiguredAuth = createGetConfiguredAuth(apiKey, email, siteUrl);\n const getConfiguredAuthHeader = createGetConfiguredAuthHeader(getConfiguredAuth);\n\n // Create logger with custom log level if provided\n const toolLogger = customLogLevel\n ? createLogger('tools:confluence', { level: customLogLevel })\n : logger;\n\n // Build all 7 tools with configured auth/logger\n const searchConfluence = createSearchConfluenceTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);\n const getConfluencePage = createGetConfluencePageTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);\n const listConfluenceSpaces = createListConfluenceSpacesTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);\n const getSpacePages = createGetSpacePagesTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);\n const createConfluencePage = createCreateConfluencePageTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);\n const updateConfluencePage = createUpdateConfluencePageTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);\n const archiveConfluencePage = createArchiveConfluencePageTool(getConfiguredAuth, getConfiguredAuthHeader, toolLogger);\n\n // Return all configured tools\n return {\n searchConfluence,\n getConfluencePage,\n listConfluenceSpaces,\n getSpacePages,\n createConfluencePage,\n updateConfluencePage,\n archiveConfluencePage,\n };\n}\n\n","/**\n * CSV Tools Types\n * \n * Type definitions and schemas for CSV tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * CSV parser schema\n */\nexport const csvParserSchema = z.object({\n csv: z.string().describe('CSV string to parse'),\n delimiter: z.string().default(',').describe('Column delimiter character'),\n hasHeaders: z.boolean().default(true).describe('First row contains column headers'),\n skipEmptyLines: z.boolean().default(true).describe('Skip empty lines in the CSV'),\n trim: z.boolean().default(true).describe('Trim whitespace from values'),\n});\n\n/**\n * CSV generator schema\n */\nexport const csvGeneratorSchema = z.object({\n data: z.array(z.record(z.any().describe('Column value'))).describe('Array of objects to convert to CSV'),\n delimiter: z.string().default(',').describe('Column delimiter character'),\n includeHeaders: z.boolean().default(true).describe('Include header row with column names'),\n columns: z.array(z.string().describe(\"String value\")).optional().describe('Optional list of columns to include (in order)'),\n});\n\n/**\n * CSV to JSON schema\n */\nexport const csvToJsonSchema = z.object({\n csv: z.string().describe('CSV string to convert'),\n delimiter: z.string().default(',').describe('Column delimiter character'),\n pretty: z.boolean().default(false).describe('Format JSON with indentation'),\n});\n\n/**\n * JSON to CSV schema\n */\nexport const jsonToCsvSchema = z.object({\n json: z.string().describe('JSON array string to convert'),\n delimiter: z.string().default(',').describe('Column delimiter character'),\n});\n\n/**\n * CSV tools configuration\n */\nexport interface CsvToolsConfig {\n defaultDelimiter?: string;\n defaultHasHeaders?: boolean;\n defaultSkipEmptyLines?: boolean;\n defaultTrim?: boolean;\n}\n\n","/**\n * CSV Parser Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { parse } from 'csv-parse/sync';\nimport { csvParserSchema } from '../types.js';\n\n/**\n * Create CSV parser tool\n */\nexport function createCsvParserTool(\n defaultDelimiter = ',',\n defaultHasHeaders = true,\n defaultSkipEmptyLines = true,\n defaultTrim = true\n) {\n return toolBuilder()\n .name('csv-parser')\n .description('Parse CSV string into an array of objects. Supports custom delimiters, headers, and options.')\n .category(ToolCategory.UTILITY)\n .tags(['csv', 'parse', 'data', 'table'])\n .schema(csvParserSchema)\n .implement(async (input) => {\n try {\n const records = parse(input.csv, {\n delimiter: input.delimiter ?? defaultDelimiter,\n columns: input.hasHeaders ?? defaultHasHeaders,\n skip_empty_lines: input.skipEmptyLines ?? defaultSkipEmptyLines,\n trim: input.trim ?? defaultTrim,\n relax_column_count: true,\n });\n\n return {\n success: true,\n data: records,\n rowCount: records.length,\n columnCount: records.length > 0 ? Object.keys(records[0]).length : 0,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to parse CSV',\n };\n }\n })\n .build();\n}\n\n","/**\n * CSV Generator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { stringify } from 'csv-stringify/sync';\nimport { csvGeneratorSchema } from '../types.js';\n\n/**\n * Create CSV generator tool\n */\nexport function createCsvGeneratorTool(defaultDelimiter = ',') {\n return toolBuilder()\n .name('csv-generator')\n .description('Convert an array of objects to CSV string. Automatically extracts headers from object keys.')\n .category(ToolCategory.UTILITY)\n .tags(['csv', 'generate', 'stringify', 'data'])\n .schema(csvGeneratorSchema)\n .implement(async (input) => {\n try {\n const csv = stringify(input.data, {\n delimiter: input.delimiter ?? defaultDelimiter,\n header: input.includeHeaders,\n columns: input.columns,\n });\n\n return {\n success: true,\n csv,\n rowCount: input.data.length,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to generate CSV',\n };\n }\n })\n .build();\n}\n\n","/**\n * CSV to JSON Converter Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { parse } from 'csv-parse/sync';\nimport { csvToJsonSchema } from '../types.js';\n\n/**\n * Create CSV to JSON converter tool\n */\nexport function createCsvToJsonTool(defaultDelimiter = ',') {\n return toolBuilder()\n .name('csv-to-json')\n .description('Convert CSV string to JSON array. Each row becomes an object with column headers as keys.')\n .category(ToolCategory.UTILITY)\n .tags(['csv', 'json', 'convert', 'data'])\n .schema(csvToJsonSchema)\n .implement(async (input) => {\n try {\n const records = parse(input.csv, {\n delimiter: input.delimiter ?? defaultDelimiter,\n columns: true,\n skip_empty_lines: true,\n trim: true,\n });\n\n const json = input.pretty \n ? JSON.stringify(records, null, 2)\n : JSON.stringify(records);\n\n return {\n success: true,\n json,\n recordCount: records.length,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to convert CSV to JSON',\n };\n }\n })\n .build();\n}\n\n","/**\n * JSON to CSV Converter Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { stringify } from 'csv-stringify/sync';\nimport { jsonToCsvSchema } from '../types.js';\n\n/**\n * Create JSON to CSV converter tool\n */\nexport function createJsonToCsvTool(defaultDelimiter = ',') {\n return toolBuilder()\n .name('json-to-csv')\n .description('Convert JSON array to CSV string. Each object becomes a row with keys as column headers.')\n .category(ToolCategory.UTILITY)\n .tags(['json', 'csv', 'convert', 'data'])\n .schema(jsonToCsvSchema)\n .implement(async (input) => {\n try {\n const data = JSON.parse(input.json);\n \n if (!Array.isArray(data)) {\n return {\n success: false,\n error: 'Input must be a JSON array',\n };\n }\n\n const csv = stringify(data, {\n delimiter: input.delimiter ?? defaultDelimiter,\n header: true,\n });\n\n return {\n success: true,\n csv,\n rowCount: data.length,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to convert JSON to CSV',\n };\n }\n })\n .build();\n}\n\n","/**\n * CSV Tools\n * \n * Tools for parsing and generating CSV data.\n */\n\nexport * from './types.js';\nexport { createCsvParserTool } from './tools/csv-parser.js';\nexport { createCsvGeneratorTool } from './tools/csv-generator.js';\nexport { createCsvToJsonTool } from './tools/csv-to-json.js';\nexport { createJsonToCsvTool } from './tools/json-to-csv.js';\n\nimport { createCsvParserTool } from './tools/csv-parser.js';\nimport { createCsvGeneratorTool } from './tools/csv-generator.js';\nimport { createCsvToJsonTool } from './tools/csv-to-json.js';\nimport { createJsonToCsvTool } from './tools/json-to-csv.js';\nimport type { CsvToolsConfig } from './types.js';\n\n/**\n * Default CSV parser tool instance\n */\nexport const csvParser = createCsvParserTool();\n\n/**\n * Default CSV generator tool instance\n */\nexport const csvGenerator = createCsvGeneratorTool();\n\n/**\n * Default CSV to JSON converter tool instance\n */\nexport const csvToJson = createCsvToJsonTool();\n\n/**\n * Default JSON to CSV converter tool instance\n */\nexport const jsonToCsv = createJsonToCsvTool();\n\n/**\n * All CSV tools\n */\nexport const csvTools = [csvParser, csvGenerator, csvToJson, jsonToCsv];\n\n/**\n * Create CSV tools with custom configuration\n */\nexport function createCsvTools(config: CsvToolsConfig = {}) {\n const {\n defaultDelimiter = ',',\n defaultHasHeaders = true,\n defaultSkipEmptyLines = true,\n defaultTrim = true,\n } = config;\n\n return [\n createCsvParserTool(defaultDelimiter, defaultHasHeaders, defaultSkipEmptyLines, defaultTrim),\n createCsvGeneratorTool(defaultDelimiter),\n createCsvToJsonTool(defaultDelimiter),\n createJsonToCsvTool(defaultDelimiter),\n ];\n}\n\n","/**\n * JSON Tools Types\n * \n * Type definitions and schemas for JSON tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * JSON parser schema\n */\nexport const jsonParserSchema = z.object({\n json: z.string().describe('JSON string to parse'),\n strict: z.boolean().default(true).describe('Use strict JSON parsing (no trailing commas, etc.)'),\n});\n\n/**\n * JSON stringify schema\n */\nexport const jsonStringifySchema = z.object({\n data: z.any().describe('Data to convert to JSON string'),\n pretty: z.boolean().default(false).describe('Format with indentation for readability'),\n indent: z.number().default(2).describe('Number of spaces for indentation (when pretty is true)'),\n});\n\n/**\n * JSON query schema\n */\nexport const jsonQuerySchema = z.object({\n data: z.any().describe('JSON data to query'),\n path: z.string().describe('Dot notation path to query (e.g., \"user.name\" or \"items[0].id\")'),\n});\n\n/**\n * JSON validator schema\n */\nexport const jsonValidatorSchema = z.object({\n json: z.string().describe('JSON string to validate'),\n});\n\n/**\n * JSON merge schema\n */\nexport const jsonMergeSchema = z.object({\n objects: z.array(z.any().describe('Object to merge')).describe('Array of objects to merge'),\n deep: z.boolean().default(false).describe('Perform deep merge (nested objects)'),\n});\n\n/**\n * JSON tools configuration\n */\nexport interface JsonToolsConfig {\n defaultIndent?: number;\n defaultPretty?: boolean;\n}\n\n","/**\n * JSON Parser Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { jsonParserSchema } from '../types.js';\n\n/**\n * Create JSON parser tool\n */\nexport function createJsonParserTool() {\n return toolBuilder()\n .name('json-parser')\n .description('Parse JSON string into an object. Validates JSON syntax and returns parsed data or error details.')\n .category(ToolCategory.UTILITY)\n .tags(['json', 'parse', 'data'])\n .schema(jsonParserSchema)\n .implementSafe(async (input) => {\n const parsed = JSON.parse(input.json);\n return {\n data: parsed,\n type: Array.isArray(parsed) ? 'array' : typeof parsed,\n };\n })\n .build();\n}\n\n","/**\n * JSON Stringify Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { jsonStringifySchema } from '../types.js';\n\n/**\n * Create JSON stringify tool\n */\nexport function createJsonStringifyTool(defaultIndent = 2, defaultPretty = false) {\n return toolBuilder()\n .name('json-stringify')\n .description('Convert an object to a JSON string with optional formatting (pretty print).')\n .category(ToolCategory.UTILITY)\n .tags(['json', 'stringify', 'format', 'data'])\n .schema(jsonStringifySchema)\n .implementSafe(async (input) => {\n const pretty = input.pretty ?? defaultPretty;\n const indent = input.indent ?? defaultIndent;\n \n const json = pretty\n ? JSON.stringify(input.data, null, indent)\n : JSON.stringify(input.data);\n\n return {\n json,\n length: json.length,\n };\n })\n .build();\n}\n\n","/**\n * JSON Query Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { jsonQuerySchema } from '../types.js';\n\n/**\n * Create JSON query tool\n */\nexport function createJsonQueryTool() {\n return toolBuilder()\n .name('json-query')\n .description('Query JSON data using dot notation path (e.g., \"user.address.city\"). Supports array indexing.')\n .category(ToolCategory.UTILITY)\n .tags(['json', 'query', 'path', 'data'])\n .schema(jsonQuerySchema)\n .implementSafe(async (input) => {\n const parts = input.path.split('.');\n let current = input.data;\n\n for (const part of parts) {\n // Handle array indexing: items[0]\n const arrayMatch = part.match(/^(\\w+)\\[(\\d+)\\]$/);\n if (arrayMatch) {\n const [, key, index] = arrayMatch;\n current = current[key][parseInt(index, 10)];\n } else {\n current = current[part];\n }\n\n if (current === undefined) {\n throw new Error(`Path not found: ${input.path}`);\n }\n }\n\n return {\n value: current,\n type: Array.isArray(current) ? 'array' : typeof current,\n };\n })\n .build();\n}\n\n","/**\n * JSON Validator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { jsonValidatorSchema } from '../types.js';\n\n/**\n * Create JSON validator tool\n */\nexport function createJsonValidatorTool() {\n return toolBuilder()\n .name('json-validator')\n .description('Validate JSON string syntax without parsing. Returns whether the JSON is valid and any error details.')\n .category(ToolCategory.UTILITY)\n .tags(['json', 'validate', 'check', 'data'])\n .schema(jsonValidatorSchema)\n .implementSafe(async (input) => {\n JSON.parse(input.json);\n return {\n valid: true,\n message: 'Valid JSON',\n };\n })\n .build();\n}\n\n","/**\n * JSON Merge Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { jsonMergeSchema } from '../types.js';\n\n/**\n * Create JSON merge tool\n */\nexport function createJsonMergeTool() {\n return toolBuilder()\n .name('json-merge')\n .description('Merge two or more JSON objects. Later objects override earlier ones for conflicting keys.')\n .category(ToolCategory.UTILITY)\n .tags(['json', 'merge', 'combine', 'data'])\n .schema(jsonMergeSchema)\n .implement(async (input) => {\n if (input.deep) {\n // Deep merge\n const deepMerge = (target: any, source: any): any => {\n const output = { ...target };\n for (const key in source) {\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n output[key] = deepMerge(output[key] || {}, source[key]);\n } else {\n output[key] = source[key];\n }\n }\n return output;\n };\n \n return input.objects.reduce((acc, obj) => deepMerge(acc, obj), {});\n } else {\n // Shallow merge\n return Object.assign({}, ...input.objects);\n }\n })\n .build();\n}\n\n","/**\n * JSON Tools\n * \n * Tools for parsing, validating, transforming, and querying JSON data.\n */\n\nexport * from './types.js';\nexport { createJsonParserTool } from './tools/json-parser.js';\nexport { createJsonStringifyTool } from './tools/json-stringify.js';\nexport { createJsonQueryTool } from './tools/json-query.js';\nexport { createJsonValidatorTool } from './tools/json-validator.js';\nexport { createJsonMergeTool } from './tools/json-merge.js';\n\nimport { createJsonParserTool } from './tools/json-parser.js';\nimport { createJsonStringifyTool } from './tools/json-stringify.js';\nimport { createJsonQueryTool } from './tools/json-query.js';\nimport { createJsonValidatorTool } from './tools/json-validator.js';\nimport { createJsonMergeTool } from './tools/json-merge.js';\nimport type { JsonToolsConfig } from './types.js';\n\n/**\n * Default JSON parser tool instance\n */\nexport const jsonParser = createJsonParserTool();\n\n/**\n * Default JSON stringify tool instance\n */\nexport const jsonStringify = createJsonStringifyTool();\n\n/**\n * Default JSON query tool instance\n */\nexport const jsonQuery = createJsonQueryTool();\n\n/**\n * Default JSON validator tool instance\n */\nexport const jsonValidator = createJsonValidatorTool();\n\n/**\n * Default JSON merge tool instance\n */\nexport const jsonMerge = createJsonMergeTool();\n\n/**\n * All JSON tools\n */\nexport const jsonTools = [jsonParser, jsonStringify, jsonQuery, jsonValidator, jsonMerge];\n\n/**\n * Create JSON tools with custom configuration\n */\nexport function createJsonTools(config: JsonToolsConfig = {}) {\n const {\n defaultIndent = 2,\n defaultPretty = false,\n } = config;\n\n return [\n createJsonParserTool(),\n createJsonStringifyTool(defaultIndent, defaultPretty),\n createJsonQueryTool(),\n createJsonValidatorTool(),\n createJsonMergeTool(),\n ];\n}\n\n","/**\n * XML Tools Types\n * \n * Type definitions and schemas for XML tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * XML parser schema\n */\nexport const xmlParserSchema = z.object({\n xml: z.string().describe('XML string to parse'),\n ignoreAttributes: z.boolean().default(false).describe('Ignore XML attributes'),\n parseAttributeValue: z.boolean().default(true).describe('Parse attribute values (numbers, booleans)'),\n trimValues: z.boolean().default(true).describe('Trim whitespace from text values'),\n});\n\n/**\n * XML generator schema\n */\nexport const xmlGeneratorSchema = z.object({\n data: z.any().describe('Object to convert to XML'),\n rootName: z.string().default('root').describe('Name of the root XML element'),\n format: z.boolean().default(false).describe('Format XML with indentation'),\n indentSize: z.number().default(2).describe('Number of spaces for indentation (when format is true)'),\n});\n\n/**\n * XML to JSON schema\n */\nexport const xmlToJsonSchema = z.object({\n xml: z.string().describe('XML string to convert'),\n ignoreAttributes: z.boolean().default(false).describe('Ignore XML attributes in conversion'),\n pretty: z.boolean().default(false).describe('Format JSON with indentation'),\n});\n\n/**\n * JSON to XML schema\n */\nexport const jsonToXmlSchema = z.object({\n json: z.string().describe('JSON string to convert'),\n rootName: z.string().default('root').describe('Name of the root XML element'),\n format: z.boolean().default(false).describe('Format XML with indentation'),\n});\n\n/**\n * XML tools configuration\n */\nexport interface XmlToolsConfig {\n defaultRootName?: string;\n defaultFormat?: boolean;\n defaultIndentSize?: number;\n}\n\n","/**\n * XML Parser Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { XMLParser } from 'fast-xml-parser';\nimport { xmlParserSchema } from '../types.js';\n\n/**\n * Create XML parser tool\n */\nexport function createXmlParserTool() {\n return toolBuilder()\n .name('xml-parser')\n .description('Parse XML string into a JavaScript object. Supports attributes, CDATA, and nested elements.')\n .category(ToolCategory.UTILITY)\n .tags(['xml', 'parse', 'data'])\n .schema(xmlParserSchema)\n .implement(async (input) => {\n try {\n const parser = new XMLParser({\n ignoreAttributes: input.ignoreAttributes,\n parseAttributeValue: input.parseAttributeValue,\n trimValues: input.trimValues,\n parseTagValue: true,\n });\n\n const result = parser.parse(input.xml);\n\n return {\n success: true,\n data: result,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to parse XML',\n };\n }\n })\n .build();\n}\n\n","/**\n * XML Generator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { XMLBuilder } from 'fast-xml-parser';\nimport { xmlGeneratorSchema } from '../types.js';\n\n/**\n * Create XML generator tool\n */\nexport function createXmlGeneratorTool(defaultRootName = 'root', defaultFormat = false, defaultIndentSize = 2) {\n return toolBuilder()\n .name('xml-generator')\n .description('Convert a JavaScript object to XML string. Supports attributes, CDATA, and nested elements.')\n .category(ToolCategory.UTILITY)\n .tags(['xml', 'generate', 'stringify', 'data'])\n .schema(xmlGeneratorSchema)\n .implement(async (input) => {\n try {\n const indentSize = input.indentSize ?? defaultIndentSize;\n const rootName = input.rootName ?? defaultRootName;\n const format = input.format ?? defaultFormat;\n\n const builder = new XMLBuilder({\n format,\n indentBy: ' '.repeat(indentSize),\n ignoreAttributes: false,\n });\n\n // Wrap data in root element if not already wrapped\n const dataToConvert = input.data[rootName] ? input.data : { [rootName]: input.data };\n const xml = builder.build(dataToConvert);\n\n return {\n success: true,\n xml,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to generate XML',\n };\n }\n })\n .build();\n}\n\n","/**\n * XML to JSON Converter Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { XMLParser } from 'fast-xml-parser';\nimport { xmlToJsonSchema } from '../types.js';\n\n/**\n * Create XML to JSON converter tool\n */\nexport function createXmlToJsonTool() {\n return toolBuilder()\n .name('xml-to-json')\n .description('Convert XML string to JSON. Preserves structure and can include or exclude attributes.')\n .category(ToolCategory.UTILITY)\n .tags(['xml', 'json', 'convert', 'data'])\n .schema(xmlToJsonSchema)\n .implement(async (input) => {\n try {\n const parser = new XMLParser({\n ignoreAttributes: input.ignoreAttributes,\n parseAttributeValue: true,\n trimValues: true,\n });\n\n const result = parser.parse(input.xml);\n const json = input.pretty \n ? JSON.stringify(result, null, 2)\n : JSON.stringify(result);\n\n return {\n success: true,\n json,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to convert XML to JSON',\n };\n }\n })\n .build();\n}\n\n","/**\n * JSON to XML Converter Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { XMLBuilder } from 'fast-xml-parser';\nimport { jsonToXmlSchema } from '../types.js';\n\n/**\n * Create JSON to XML converter tool\n */\nexport function createJsonToXmlTool(defaultRootName = 'root', defaultFormat = false) {\n return toolBuilder()\n .name('json-to-xml')\n .description('Convert JSON string to XML. Each object key becomes an XML element.')\n .category(ToolCategory.UTILITY)\n .tags(['json', 'xml', 'convert', 'data'])\n .schema(jsonToXmlSchema)\n .implement(async (input) => {\n try {\n const data = JSON.parse(input.json);\n const rootName = input.rootName ?? defaultRootName;\n const format = input.format ?? defaultFormat;\n\n const builder = new XMLBuilder({\n format,\n indentBy: ' ',\n ignoreAttributes: false,\n });\n\n const dataToConvert = data[rootName] ? data : { [rootName]: data };\n const xml = builder.build(dataToConvert);\n\n return {\n success: true,\n xml,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to convert JSON to XML',\n };\n }\n })\n .build();\n}\n\n","/**\n * XML Tools\n * \n * Tools for parsing and generating XML data.\n */\n\nexport * from './types.js';\nexport { createXmlParserTool } from './tools/xml-parser.js';\nexport { createXmlGeneratorTool } from './tools/xml-generator.js';\nexport { createXmlToJsonTool } from './tools/xml-to-json.js';\nexport { createJsonToXmlTool } from './tools/json-to-xml.js';\n\nimport { createXmlParserTool } from './tools/xml-parser.js';\nimport { createXmlGeneratorTool } from './tools/xml-generator.js';\nimport { createXmlToJsonTool } from './tools/xml-to-json.js';\nimport { createJsonToXmlTool } from './tools/json-to-xml.js';\nimport type { XmlToolsConfig } from './types.js';\n\n/**\n * Default XML parser tool instance\n */\nexport const xmlParser = createXmlParserTool();\n\n/**\n * Default XML generator tool instance\n */\nexport const xmlGenerator = createXmlGeneratorTool();\n\n/**\n * Default XML to JSON converter tool instance\n */\nexport const xmlToJson = createXmlToJsonTool();\n\n/**\n * Default JSON to XML converter tool instance\n */\nexport const jsonToXml = createJsonToXmlTool();\n\n/**\n * All XML tools\n */\nexport const xmlTools = [xmlParser, xmlGenerator, xmlToJson, jsonToXml];\n\n/**\n * Create XML tools with custom configuration\n */\nexport function createXmlTools(config: XmlToolsConfig = {}) {\n const {\n defaultRootName = 'root',\n defaultFormat = false,\n defaultIndentSize = 2,\n } = config;\n\n return [\n createXmlParserTool(),\n createXmlGeneratorTool(defaultRootName, defaultFormat, defaultIndentSize),\n createXmlToJsonTool(),\n createJsonToXmlTool(defaultRootName, defaultFormat),\n ];\n}\n\n","/**\n * Data Transformer Tools Types\n * \n * Type definitions and schemas for data transformation tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * Array filter schema\n */\nexport const arrayFilterSchema = z.object({\n array: z.array(z.any().describe('Array element')).describe('Array to filter'),\n property: z.string().describe('Property name to filter by (use dot notation for nested properties)'),\n operator: z.enum(['equals', 'not-equals', 'greater-than', 'less-than', 'contains', 'starts-with', 'ends-with']).describe('Comparison operator'),\n value: z.any().describe('Value to compare against'),\n});\n\n/**\n * Array map schema\n */\nexport const arrayMapSchema = z.object({\n array: z.array(z.any().describe('Array element')).describe('Array to map'),\n properties: z.array(z.string().describe(\"String value\")).describe('List of property names to extract from each object'),\n});\n\n/**\n * Array sort schema\n */\nexport const arraySortSchema = z.object({\n array: z.array(z.any().describe('Array element')).describe('Array to sort'),\n property: z.string().describe('Property name to sort by (use dot notation for nested properties)'),\n order: z.enum(['asc', 'desc']).default('asc').describe('Sort order: ascending or descending'),\n});\n\n/**\n * Array group by schema\n */\nexport const arrayGroupBySchema = z.object({\n array: z.array(z.any().describe('Array element')).describe('Array to group'),\n property: z.string().describe('Property name to group by'),\n});\n\n/**\n * Object pick schema\n */\nexport const objectPickSchema = z.object({\n object: z.record(z.any().describe('Property value')).describe('Source object'),\n properties: z.array(z.string().describe(\"String value\")).describe('List of property names to pick'),\n});\n\n/**\n * Object omit schema\n */\nexport const objectOmitSchema = z.object({\n object: z.record(z.any().describe('Property value')).describe('Source object'),\n properties: z.array(z.string().describe(\"String value\")).describe('List of property names to omit'),\n});\n\n/**\n * Transformer tools configuration\n */\nexport type TransformerToolsConfig = Record<string, never>;\n","/**\n * Array Filter Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { arrayFilterSchema } from '../types.js';\n\n/**\n * Create array filter tool\n */\nexport function createArrayFilterTool() {\n return toolBuilder()\n .name('array-filter')\n .description('Filter an array based on a property value. Supports equality, comparison, and contains operations.')\n .category(ToolCategory.UTILITY)\n .tags(['array', 'filter', 'data', 'transform'])\n .schema(arrayFilterSchema)\n .implement(async (input) => {\n const getNestedValue = (obj: any, path: string): any => {\n return path.split('.').reduce((current, key) => current?.[key], obj);\n };\n\n const filtered = input.array.filter((item) => {\n const itemValue = getNestedValue(item, input.property);\n \n switch (input.operator) {\n case 'equals':\n return itemValue === input.value;\n case 'not-equals':\n return itemValue !== input.value;\n case 'greater-than':\n return itemValue > input.value;\n case 'less-than':\n return itemValue < input.value;\n case 'contains':\n return String(itemValue).includes(String(input.value));\n case 'starts-with':\n return String(itemValue).startsWith(String(input.value));\n case 'ends-with':\n return String(itemValue).endsWith(String(input.value));\n default:\n return false;\n }\n });\n\n return {\n filtered,\n originalCount: input.array.length,\n filteredCount: filtered.length,\n };\n })\n .build();\n}\n\n","/**\n * Array Map Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { arrayMapSchema } from '../types.js';\n\n/**\n * Create array map tool\n */\nexport function createArrayMapTool() {\n return toolBuilder()\n .name('array-map')\n .description('Extract specific properties from each object in an array. Creates a new array with only the selected properties.')\n .category(ToolCategory.UTILITY)\n .tags(['array', 'map', 'data', 'transform'])\n .schema(arrayMapSchema)\n .implement(async (input) => {\n const mapped = input.array.map((item) => {\n const result: any = {};\n for (const prop of input.properties) {\n // Support dot notation\n const value = prop.split('.').reduce((current, key) => current?.[key], item);\n result[prop] = value;\n }\n return result;\n });\n\n return {\n mapped,\n count: mapped.length,\n };\n })\n .build();\n}\n\n","/**\n * Array Sort Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { arraySortSchema } from '../types.js';\n\n/**\n * Create array sort tool\n */\nexport function createArraySortTool() {\n return toolBuilder()\n .name('array-sort')\n .description('Sort an array by a property value. Supports ascending and descending order.')\n .category(ToolCategory.UTILITY)\n .tags(['array', 'sort', 'data', 'transform'])\n .schema(arraySortSchema)\n .implement(async (input) => {\n const getNestedValue = (obj: any, path: string): any => {\n return path.split('.').reduce((current, key) => current?.[key], obj);\n };\n\n const sorted = [...input.array].sort((a, b) => {\n const aValue = getNestedValue(a, input.property);\n const bValue = getNestedValue(b, input.property);\n \n if (aValue < bValue) return input.order === 'asc' ? -1 : 1;\n if (aValue > bValue) return input.order === 'asc' ? 1 : -1;\n return 0;\n });\n\n return {\n sorted,\n count: sorted.length,\n };\n })\n .build();\n}\n\n","/**\n * Array Group By Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { arrayGroupBySchema } from '../types.js';\n\n/**\n * Create array group by tool\n */\nexport function createArrayGroupByTool() {\n return toolBuilder()\n .name('array-group-by')\n .description('Group an array of objects by a property value. Returns an object with groups as keys.')\n .category(ToolCategory.UTILITY)\n .tags(['array', 'group', 'data', 'transform'])\n .schema(arrayGroupBySchema)\n .implement(async (input) => {\n const groups: Record<string, any[]> = {};\n \n for (const item of input.array) {\n const key = String(item[input.property]);\n if (!groups[key]) {\n groups[key] = [];\n }\n groups[key].push(item);\n }\n\n return {\n groups,\n groupCount: Object.keys(groups).length,\n totalItems: input.array.length,\n };\n })\n .build();\n}\n\n","/**\n * Object Pick Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { objectPickSchema } from '../types.js';\n\n/**\n * Create object pick tool\n */\nexport function createObjectPickTool() {\n return toolBuilder()\n .name('object-pick')\n .description('Create a new object with only the specified properties from the source object.')\n .category(ToolCategory.UTILITY)\n .tags(['object', 'pick', 'data', 'transform'])\n .schema(objectPickSchema)\n .implement(async (input) => {\n const picked: Record<string, any> = {};\n \n for (const prop of input.properties) {\n if (prop in input.object) {\n picked[prop] = input.object[prop];\n }\n }\n\n return picked;\n })\n .build();\n}\n\n","/**\n * Object Omit Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { objectOmitSchema } from '../types.js';\n\n/**\n * Create object omit tool\n */\nexport function createObjectOmitTool() {\n return toolBuilder()\n .name('object-omit')\n .description('Create a new object excluding the specified properties from the source object.')\n .category(ToolCategory.UTILITY)\n .tags(['object', 'omit', 'data', 'transform'])\n .schema(objectOmitSchema)\n .implement(async (input) => {\n const omitted: Record<string, any> = { ...input.object };\n \n for (const prop of input.properties) {\n delete omitted[prop];\n }\n\n return omitted;\n })\n .build();\n}\n\n","/**\n * Data Transformer Tools\n * \n * Tools for transforming, filtering, mapping, and manipulating data structures.\n */\n\nexport * from './types.js';\nexport { createArrayFilterTool } from './tools/array-filter.js';\nexport { createArrayMapTool } from './tools/array-map.js';\nexport { createArraySortTool } from './tools/array-sort.js';\nexport { createArrayGroupByTool } from './tools/array-group-by.js';\nexport { createObjectPickTool } from './tools/object-pick.js';\nexport { createObjectOmitTool } from './tools/object-omit.js';\n\nimport { createArrayFilterTool } from './tools/array-filter.js';\nimport { createArrayMapTool } from './tools/array-map.js';\nimport { createArraySortTool } from './tools/array-sort.js';\nimport { createArrayGroupByTool } from './tools/array-group-by.js';\nimport { createObjectPickTool } from './tools/object-pick.js';\nimport { createObjectOmitTool } from './tools/object-omit.js';\nimport type { TransformerToolsConfig } from './types.js';\n\n/**\n * Default array filter tool instance\n */\nexport const arrayFilter = createArrayFilterTool();\n\n/**\n * Default array map tool instance\n */\nexport const arrayMap = createArrayMapTool();\n\n/**\n * Default array sort tool instance\n */\nexport const arraySort = createArraySortTool();\n\n/**\n * Default array group by tool instance\n */\nexport const arrayGroupBy = createArrayGroupByTool();\n\n/**\n * Default object pick tool instance\n */\nexport const objectPick = createObjectPickTool();\n\n/**\n * Default object omit tool instance\n */\nexport const objectOmit = createObjectOmitTool();\n\n/**\n * All transformer tools\n */\nexport const transformerTools = [arrayFilter, arrayMap, arraySort, arrayGroupBy, objectPick, objectOmit];\n\n/**\n * Create transformer tools with custom configuration\n */\nexport function createTransformerTools(config: TransformerToolsConfig = {}) {\n return [\n createArrayFilterTool(),\n createArrayMapTool(),\n createArraySortTool(),\n createArrayGroupByTool(),\n createObjectPickTool(),\n createObjectOmitTool(),\n ];\n}\n\n","/**\n * Neo4j Tools Types\n * \n * Type definitions and schemas for Neo4j graph database tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * Neo4j connection configuration\n */\nexport interface Neo4jConfig {\n uri: string;\n username: string;\n password: string;\n database?: string;\n maxConnectionPoolSize?: number;\n connectionTimeout?: number;\n}\n\n/**\n * Neo4j query schema\n */\nexport const neo4jQuerySchema = z.object({\n cypher: z.string().describe('Cypher query to execute'),\n parameters: z.record(z.any()).optional().describe('Query parameters for parameterized queries'),\n database: z.string().optional().describe('Database name (defaults to configured database)'),\n});\n\n/**\n * Neo4j get schema input schema\n */\nexport const neo4jGetSchemaSchema = z.object({\n database: z.string().optional().describe('Database name (defaults to configured database)'),\n});\n\n/**\n * Neo4j find nodes schema\n */\nexport const neo4jFindNodesSchema = z.object({\n label: z.string().describe('Node label to search for'),\n properties: z.record(z.any()).optional().describe('Properties to match (key-value pairs)'),\n limit: z.number().default(100).describe('Maximum number of nodes to return'),\n database: z.string().optional().describe('Database name (defaults to configured database)'),\n});\n\n/**\n * Neo4j traverse schema\n */\nexport const neo4jTraverseSchema = z.object({\n startNodeId: z.union([\n z.string().describe('Node ID as string'),\n z.number().describe('Node ID as number')\n ]).describe('ID of the starting node'),\n relationshipType: z.string().optional().describe('Type of relationship to follow (optional, follows all if not specified)'),\n direction: z.enum(['outgoing', 'incoming', 'both']).default('outgoing').describe('Direction to traverse'),\n maxDepth: z.number().default(1).describe('Maximum depth to traverse'),\n limit: z.number().default(100).describe('Maximum number of nodes to return'),\n database: z.string().optional().describe('Database name (defaults to configured database)'),\n});\n\n/**\n * Neo4j vector search schema\n */\nexport const neo4jVectorSearchSchema = z.object({\n indexName: z.string().describe('Name of the vector index to search'),\n queryVector: z.array(z.number().describe('Vector dimension value')).describe('Query vector for similarity search'),\n limit: z.number().default(10).describe('Maximum number of results to return'),\n database: z.string().optional().describe('Database name (defaults to configured database)'),\n});\n\n/**\n * Neo4j vector search with embedding schema\n */\nexport const neo4jVectorSearchWithEmbeddingSchema = z.object({\n indexName: z.string().describe('Name of the vector index to search'),\n queryText: z.string().describe('Text to generate embedding from for similarity search'),\n limit: z.number().default(10).describe('Maximum number of results to return'),\n model: z.string().optional().describe('Embedding model to use (defaults to configured model)'),\n database: z.string().optional().describe('Database name (defaults to configured database)'),\n});\n\n/**\n * Neo4j create node with embedding schema\n */\nexport const neo4jCreateNodeWithEmbeddingSchema = z.object({\n label: z.string().describe('Node label'),\n properties: z.record(z.string(), z.any().describe('Property value')).describe('Node properties (key-value pairs)'),\n textProperty: z.string().describe('Name of the property containing text to embed'),\n embeddingProperty: z.string().default('embedding').describe('Name of the property to store the embedding vector'),\n model: z.string().optional().describe('Embedding model to use (defaults to configured model)'),\n database: z.string().optional().describe('Database name (defaults to configured database)'),\n});\n\n/**\n * Neo4j node result\n */\nexport interface Neo4jNode {\n identity: string | number;\n labels: string[];\n properties: Record<string, any>;\n}\n\n/**\n * Neo4j relationship result\n */\nexport interface Neo4jRelationship {\n identity: string | number;\n type: string;\n start: string | number;\n end: string | number;\n properties: Record<string, any>;\n}\n\n/**\n * Neo4j path result\n */\nexport interface Neo4jPath {\n start: Neo4jNode;\n end: Neo4jNode;\n segments: Array<{\n start: Neo4jNode;\n relationship: Neo4jRelationship;\n end: Neo4jNode;\n }>;\n length: number;\n}\n\n/**\n * Neo4j schema information\n */\nexport interface Neo4jSchema {\n nodeLabels: string[];\n relationshipTypes: string[];\n propertyKeys: string[];\n constraints: Array<{\n label?: string;\n type: string;\n properties: string[];\n }>;\n indexes: Array<{\n label?: string;\n type: string;\n properties: string[];\n }>;\n}\n\n/**\n * Neo4j tools configuration\n */\nexport interface Neo4jToolsConfig {\n uri?: string;\n username?: string;\n password?: string;\n database?: string;\n maxConnectionPoolSize?: number;\n connectionTimeout?: number;\n}\n\n","/**\n * Neo4j Connection Pool Management\n *\n * Manages Neo4j driver connections with pooling and health checks.\n */\n\nimport neo4j, { Driver, Session, auth } from 'neo4j-driver';\nimport { createLogger } from '@agentforge/core';\nimport type { Neo4jConfig } from './types.js';\n\nconst logger = createLogger('agentforge:tools:neo4j:pool');\n\n/**\n * Neo4j connection pool singleton\n */\nclass Neo4jConnectionPool {\n private driver: Driver | null = null;\n private config: Neo4jConfig | null = null;\n\n /**\n * Initialize the connection pool\n */\n async initialize(config: Neo4jConfig): Promise<void> {\n const startTime = Date.now();\n\n logger.debug('Initializing Neo4j connection pool', {\n uri: config.uri,\n username: config.username,\n database: config.database || 'neo4j',\n maxConnectionPoolSize: config.maxConnectionPoolSize || 50,\n connectionTimeout: config.connectionTimeout || 30000,\n });\n\n if (this.driver) {\n logger.debug('Closing existing connection before reinitializing');\n await this.close();\n }\n\n this.config = config;\n this.driver = neo4j.driver(\n config.uri,\n auth.basic(config.username, config.password),\n {\n maxConnectionPoolSize: config.maxConnectionPoolSize || 50,\n connectionTimeout: config.connectionTimeout || 30000,\n }\n );\n\n // Verify connectivity\n await this.verifyConnectivity();\n\n logger.info('Neo4j connection pool initialized', {\n uri: config.uri,\n database: config.database || 'neo4j',\n duration: Date.now() - startTime,\n });\n }\n\n /**\n * Verify connectivity to Neo4j\n */\n async verifyConnectivity(): Promise<void> {\n if (!this.driver) {\n const error = 'Neo4j driver not initialized';\n logger.error(error);\n throw new Error(error);\n }\n\n logger.debug('Verifying Neo4j connectivity');\n\n try {\n await this.driver.verifyConnectivity();\n logger.debug('Neo4j connectivity verified');\n } catch (error) {\n const errorMessage = `Failed to connect to Neo4j: ${error instanceof Error ? error.message : 'Unknown error'}`;\n logger.error('Neo4j connectivity verification failed', {\n error: error instanceof Error ? error.message : 'Unknown error',\n uri: this.config?.uri,\n });\n throw new Error(errorMessage);\n }\n }\n\n /**\n * Get a session for executing queries\n */\n getSession(database?: string): Session {\n if (!this.driver) {\n throw new Error('Neo4j driver not initialized. Call initialize() first.');\n }\n\n return this.driver.session({\n database: database || this.config?.database || 'neo4j',\n });\n }\n\n /**\n * Execute a query with automatic session management\n */\n async executeQuery<T = any>(\n cypher: string,\n parameters?: Record<string, any>,\n database?: string\n ): Promise<T[]> {\n const session = this.getSession(database);\n try {\n const result = await session.run(cypher, parameters);\n return result.records.map((record) => record.toObject() as T);\n } finally {\n await session.close();\n }\n }\n\n /**\n * Execute a read query\n */\n async executeReadQuery<T = any>(\n cypher: string,\n parameters?: Record<string, any>,\n database?: string\n ): Promise<T[]> {\n const session = this.getSession(database);\n try {\n const result = await session.executeRead((tx) => tx.run(cypher, parameters));\n return result.records.map((record) => record.toObject() as T);\n } finally {\n await session.close();\n }\n }\n\n /**\n * Execute a write query\n */\n async executeWriteQuery<T = any>(\n cypher: string,\n parameters?: Record<string, any>,\n database?: string\n ): Promise<T[]> {\n const session = this.getSession(database);\n try {\n const result = await session.executeWrite((tx) => tx.run(cypher, parameters));\n return result.records.map((record) => record.toObject() as T);\n } finally {\n await session.close();\n }\n }\n\n /**\n * Check if driver is initialized\n */\n isInitialized(): boolean {\n return this.driver !== null;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): Neo4jConfig | null {\n return this.config;\n }\n\n /**\n * Close the connection pool\n */\n async close(): Promise<void> {\n if (this.driver) {\n logger.debug('Closing Neo4j connection pool');\n await this.driver.close();\n this.driver = null;\n this.config = null;\n logger.info('Neo4j connection pool closed');\n }\n }\n}\n\n/**\n * Global connection pool instance\n */\nexport const neo4jPool = new Neo4jConnectionPool();\n\n/**\n * Initialize Neo4j connection from environment variables\n */\nexport async function initializeFromEnv(): Promise<void> {\n // Warn about missing environment variables\n if (!process.env.NEO4J_URI) {\n logger.warn('NEO4J_URI environment variable not set, using default', {\n default: 'bolt://localhost:7687',\n });\n }\n\n if (!process.env.NEO4J_USER) {\n logger.warn('NEO4J_USER environment variable not set, using default', {\n default: 'neo4j',\n });\n }\n\n if (!process.env.NEO4J_PASSWORD) {\n logger.warn('NEO4J_PASSWORD environment variable not set, using default', {\n default: 'password',\n });\n }\n\n if (!process.env.NEO4J_DATABASE) {\n logger.debug('NEO4J_DATABASE environment variable not set, using default', {\n default: 'neo4j',\n });\n }\n\n const config: Neo4jConfig = {\n uri: process.env.NEO4J_URI || 'bolt://localhost:7687',\n username: process.env.NEO4J_USER || 'neo4j',\n password: process.env.NEO4J_PASSWORD || 'password',\n database: process.env.NEO4J_DATABASE,\n };\n\n await neo4jPool.initialize(config);\n}\n\n","/**\n * Embedding Utilities\n *\n * Utility functions for embedding generation\n */\n\nimport type { EmbeddingRetryConfig } from './types.js';\n\n/**\n * Default retry configuration for embedding API calls\n */\nexport const DEFAULT_RETRY_CONFIG: EmbeddingRetryConfig = {\n maxRetries: 3,\n initialDelay: 1000, // 1 second\n maxDelay: 10000, // 10 seconds\n backoffMultiplier: 2,\n};\n\n/**\n * Check if error is retryable (network errors, timeouts, 5xx errors, rate limits)\n */\nexport function isRetryableError(error: any): boolean {\n // Network errors\n if (error.code === 'ECONNRESET' || error.code === 'ETIMEDOUT' || error.code === 'ENOTFOUND') {\n return true;\n }\n\n // Timeout errors\n if (error.code === 'ECONNABORTED' || error.message?.includes('timeout')) {\n return true;\n }\n\n // 5xx server errors (but not 4xx client errors)\n if (error.response?.status >= 500 && error.response?.status < 600) {\n return true;\n }\n\n // Rate limiting (429) - retryable with backoff\n if (error.response?.status === 429) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Sleep for specified milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry an async function with exponential backoff\n */\nexport async function retryWithBackoff<T>(\n fn: () => Promise<T>,\n config: EmbeddingRetryConfig = DEFAULT_RETRY_CONFIG\n): Promise<T> {\n let lastError: any;\n let delay = config.initialDelay;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error: any) {\n lastError = error;\n\n // Don't retry if error is not retryable\n if (!isRetryableError(error)) {\n throw error;\n }\n\n // Don't retry if we've exhausted all attempts\n if (attempt === config.maxRetries) {\n break;\n }\n\n // Wait before retrying\n await sleep(delay);\n\n // Increase delay for next attempt (exponential backoff)\n delay = Math.min(delay * config.backoffMultiplier, config.maxDelay);\n }\n }\n\n // All retries exhausted\n throw lastError;\n}\n\n/**\n * Get OpenAI API key from environment\n */\nexport function getOpenAIApiKey(): string | undefined {\n return process.env.OPENAI_API_KEY;\n}\n\n/**\n * Get Cohere API key from environment\n */\nexport function getCohereApiKey(): string | undefined {\n return process.env.COHERE_API_KEY;\n}\n\n/**\n * Get HuggingFace API key from environment\n */\nexport function getHuggingFaceApiKey(): string | undefined {\n return process.env.HUGGINGFACE_API_KEY;\n}\n\n/**\n * Get Voyage AI API key from environment\n */\nexport function getVoyageApiKey(): string | undefined {\n return process.env.VOYAGE_API_KEY;\n}\n\n/**\n * Get Ollama base URL from environment (defaults to localhost)\n */\nexport function getOllamaBaseUrl(): string {\n return process.env.OLLAMA_BASE_URL || 'http://localhost:11434';\n}\n\n/**\n * Get embedding provider from environment (defaults to 'openai')\n */\nexport function getEmbeddingProvider(): string {\n return process.env.EMBEDDING_PROVIDER || 'openai';\n}\n\n/**\n * Get embedding model from environment\n */\nexport function getEmbeddingModel(): string | undefined {\n return process.env.EMBEDDING_MODEL;\n}\n\n/**\n * Validate text for embedding generation\n */\nexport function validateText(text: string): void {\n if (!text || text.trim().length === 0) {\n throw new Error('Text cannot be empty');\n }\n \n // Most embedding models have token limits (e.g., 8191 for OpenAI)\n // This is a rough character limit check\n if (text.length > 50000) {\n throw new Error('Text is too long for embedding generation (max ~50,000 characters)');\n }\n}\n\n/**\n * Validate batch of texts\n */\nexport function validateBatch(texts: string[]): void {\n if (!texts || texts.length === 0) {\n throw new Error('Batch cannot be empty');\n }\n \n if (texts.length > 2048) {\n throw new Error('Batch size too large (max 2048 texts)');\n }\n \n texts.forEach((text, index) => {\n try {\n validateText(text);\n } catch (error) {\n throw new Error(`Invalid text at index ${index}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n });\n}\n\n","/**\n * OpenAI Embedding Provider\n * \n * Generate embeddings using OpenAI's embedding models.\n * Requires OPENAI_API_KEY environment variable.\n * Get your API key at: https://platform.openai.com/api-keys\n */\n\nimport axios from 'axios';\nimport type { IEmbeddingProvider, EmbeddingResult, BatchEmbeddingResult } from '../types.js';\nimport { getOpenAIApiKey, retryWithBackoff, validateText, validateBatch } from '../utils.js';\n\n/**\n * OpenAI API response structure for embeddings\n */\ninterface OpenAIEmbeddingResponse {\n object: 'list';\n data: Array<{\n object: 'embedding';\n embedding: number[];\n index: number;\n }>;\n model: string;\n usage: {\n prompt_tokens: number;\n total_tokens: number;\n };\n}\n\n/**\n * OpenAI embedding provider implementation\n */\nexport class OpenAIEmbeddingProvider implements IEmbeddingProvider {\n readonly name = 'openai' as const;\n readonly defaultModel = 'text-embedding-3-small';\n \n private apiKey: string | undefined;\n private readonly baseURL = 'https://api.openai.com/v1';\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || getOpenAIApiKey();\n }\n\n /**\n * Check if OpenAI is available (API key is set)\n */\n isAvailable(): boolean {\n return !!this.apiKey;\n }\n\n /**\n * Generate embedding for a single text\n */\n async generateEmbedding(text: string, model?: string): Promise<EmbeddingResult> {\n if (!this.apiKey) {\n throw new Error(\n 'OpenAI API key not found. Set OPENAI_API_KEY environment variable. ' +\n 'Get your key at https://platform.openai.com/api-keys'\n );\n }\n\n validateText(text);\n\n const modelToUse = model || this.defaultModel;\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post<OpenAIEmbeddingResponse>(\n `${this.baseURL}/embeddings`,\n {\n input: text,\n model: modelToUse,\n },\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n timeout: 30000, // 30 seconds\n }\n );\n\n const data = response.data;\n \n if (!data.data || data.data.length === 0) {\n throw new Error('No embedding returned from OpenAI');\n }\n\n return {\n embedding: data.data[0].embedding,\n model: data.model,\n dimensions: data.data[0].embedding.length,\n usage: {\n promptTokens: data.usage.prompt_tokens,\n totalTokens: data.usage.total_tokens,\n },\n };\n } catch (error: any) {\n // Create error with helpful message while preserving metadata for retry logic\n let wrappedError: any;\n\n if (error.response?.status === 401) {\n wrappedError = new Error(\n 'Invalid OpenAI API key. Get your key at https://platform.openai.com/api-keys'\n );\n } else if (error.response?.status === 429) {\n wrappedError = new Error(\n 'OpenAI API rate limit exceeded. Please try again later or upgrade your plan.'\n );\n } else if (error.response?.status === 400) {\n wrappedError = new Error(\n `OpenAI API error: ${error.response.data?.error?.message || 'Bad request'}`\n );\n } else {\n wrappedError = new Error(`OpenAI embedding generation failed: ${error.message}`);\n }\n\n // Preserve error metadata for retry logic\n if (error.code) wrappedError.code = error.code;\n if (error.response) wrappedError.response = error.response;\n\n throw wrappedError;\n }\n });\n }\n\n /**\n * Generate embeddings for multiple texts (batch)\n */\n async generateBatchEmbeddings(texts: string[], model?: string): Promise<BatchEmbeddingResult> {\n if (!this.apiKey) {\n throw new Error(\n 'OpenAI API key not found. Set OPENAI_API_KEY environment variable. ' +\n 'Get your key at https://platform.openai.com/api-keys'\n );\n }\n\n validateBatch(texts);\n\n const modelToUse = model || this.defaultModel;\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post<OpenAIEmbeddingResponse>(\n `${this.baseURL}/embeddings`,\n {\n input: texts,\n model: modelToUse,\n },\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n timeout: 60000, // 60 seconds for batch\n }\n );\n\n const data = response.data;\n \n if (!data.data || data.data.length === 0) {\n throw new Error('No embeddings returned from OpenAI');\n }\n\n // Sort by index to ensure correct order\n const sortedData = data.data.sort((a, b) => a.index - b.index);\n\n return {\n embeddings: sortedData.map(item => item.embedding),\n model: data.model,\n dimensions: sortedData[0].embedding.length,\n usage: {\n promptTokens: data.usage.prompt_tokens,\n totalTokens: data.usage.total_tokens,\n },\n };\n } catch (error: any) {\n // Create error with helpful message while preserving metadata for retry logic\n let wrappedError: any;\n\n if (error.response?.status === 401) {\n wrappedError = new Error(\n 'Invalid OpenAI API key. Get your key at https://platform.openai.com/api-keys'\n );\n } else if (error.response?.status === 429) {\n wrappedError = new Error(\n 'OpenAI API rate limit exceeded. Please try again later or upgrade your plan.'\n );\n } else if (error.response?.status === 400) {\n wrappedError = new Error(\n `OpenAI API error: ${error.response.data?.error?.message || 'Bad request'}`\n );\n } else {\n wrappedError = new Error(`OpenAI batch embedding generation failed: ${error.message}`);\n }\n\n // Preserve error metadata for retry logic\n if (error.code) wrappedError.code = error.code;\n if (error.response) wrappedError.response = error.response;\n\n throw wrappedError;\n }\n });\n }\n}\n\n","/**\n * Cohere Embedding Provider\n * \n * Implementation of embedding generation using Cohere's API\n * https://docs.cohere.com/reference/embed\n */\n\nimport axios from 'axios';\nimport type { IEmbeddingProvider, EmbeddingResult, BatchEmbeddingResult } from '../types.js';\nimport { retryWithBackoff } from '../utils.js';\n\n/**\n * Cohere embedding provider\n */\nexport class CohereEmbeddingProvider implements IEmbeddingProvider {\n readonly name = 'cohere' as const;\n readonly defaultModel = 'embed-english-v3.0';\n\n private apiKey: string | undefined;\n private baseUrl = 'https://api.cohere.ai/v1';\n\n constructor(apiKey?: string, model?: string) {\n this.apiKey = apiKey;\n }\n\n /**\n * Check if Cohere is available (API key is set)\n */\n isAvailable(): boolean {\n return !!this.apiKey;\n }\n\n async generateEmbedding(text: string, model?: string): Promise<EmbeddingResult> {\n // Forward model parameter to batch method\n const result = await this.generateBatchEmbeddings([text], model);\n return {\n embedding: result.embeddings[0],\n model: result.model,\n dimensions: result.dimensions,\n usage: result.usage,\n };\n }\n\n async generateBatchEmbeddings(texts: string[], model?: string): Promise<BatchEmbeddingResult> {\n const modelToUse = model || this.defaultModel;\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post(\n `${this.baseUrl}/embed`,\n {\n texts,\n model: modelToUse,\n input_type: 'search_document', // For storing in vector DB\n embedding_types: ['float'],\n },\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n const embeddings = response.data.embeddings.float;\n const dimensions = embeddings[0]?.length || 0;\n\n return {\n embeddings,\n model: modelToUse,\n dimensions,\n usage: response.data.meta?.billed_units ? {\n promptTokens: response.data.meta.billed_units.input_tokens || 0,\n totalTokens: response.data.meta.billed_units.input_tokens || 0,\n } : undefined,\n };\n } catch (error: any) {\n if (axios.isAxiosError(error)) {\n const status = error.response?.status;\n const message = error.response?.data?.message || error.message;\n let wrappedError: any;\n\n if (status === 401) {\n wrappedError = new Error(`Cohere API authentication failed. Please check your COHERE_API_KEY. ${message}`);\n } else if (status === 429) {\n wrappedError = new Error(`Cohere API rate limit exceeded. ${message}`);\n } else if (status === 400) {\n wrappedError = new Error(`Cohere API request invalid: ${message}`);\n } else {\n wrappedError = new Error(`Cohere API error (${status}): ${message}`);\n }\n\n // Preserve error metadata for retry logic\n if (error.code) wrappedError.code = error.code;\n if (error.response) wrappedError.response = error.response;\n\n throw wrappedError;\n }\n\n throw error;\n }\n });\n }\n}\n\n","/**\n * HuggingFace Embedding Provider\n * \n * Implementation of embedding generation using HuggingFace Inference API\n * https://huggingface.co/docs/api-inference/detailed_parameters#feature-extraction-task\n */\n\nimport axios from 'axios';\nimport type { IEmbeddingProvider, EmbeddingResult, BatchEmbeddingResult } from '../types.js';\nimport { retryWithBackoff } from '../utils.js';\n\n/**\n * HuggingFace embedding provider\n */\nexport class HuggingFaceEmbeddingProvider implements IEmbeddingProvider {\n readonly name = 'huggingface' as const;\n readonly defaultModel = 'sentence-transformers/all-MiniLM-L6-v2';\n\n private apiKey: string | undefined;\n private baseUrl = 'https://api-inference.huggingface.co/pipeline/feature-extraction';\n\n constructor(apiKey?: string, model?: string) {\n this.apiKey = apiKey;\n }\n\n /**\n * Check if HuggingFace is available (API key is set)\n */\n isAvailable(): boolean {\n return !!this.apiKey;\n }\n\n async generateEmbedding(text: string, model?: string): Promise<EmbeddingResult> {\n const modelToUse = model || this.defaultModel;\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post(\n `${this.baseUrl}/${modelToUse}`,\n {\n inputs: text,\n options: {\n wait_for_model: true,\n },\n },\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n // HuggingFace returns the embedding directly as an array\n const embedding = Array.isArray(response.data) ? response.data : response.data[0];\n\n return {\n embedding,\n model: modelToUse,\n dimensions: embedding.length,\n };\n } catch (error: any) {\n if (axios.isAxiosError(error)) {\n const status = error.response?.status;\n const message = error.response?.data?.error || error.message;\n let wrappedError: any;\n\n if (status === 401) {\n wrappedError = new Error(`HuggingFace API authentication failed. Please check your HUGGINGFACE_API_KEY. ${message}`);\n } else if (status === 429) {\n wrappedError = new Error(`HuggingFace API rate limit exceeded. ${message}`);\n } else if (status === 400) {\n wrappedError = new Error(`HuggingFace API request invalid: ${message}`);\n } else if (status === 503) {\n wrappedError = new Error(`HuggingFace model is loading. Please retry in a moment. ${message}`);\n } else {\n wrappedError = new Error(`HuggingFace API error (${status}): ${message}`);\n }\n\n // Preserve error metadata for retry logic\n if (error.code) wrappedError.code = error.code;\n if (error.response) wrappedError.response = error.response;\n\n throw wrappedError;\n }\n\n throw error;\n }\n });\n }\n\n async generateBatchEmbeddings(texts: string[], model?: string): Promise<BatchEmbeddingResult> {\n const modelToUse = model || this.defaultModel;\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post(\n `${this.baseUrl}/${modelToUse}`,\n {\n inputs: texts,\n options: {\n wait_for_model: true,\n },\n },\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n const embeddings = response.data;\n const dimensions = embeddings[0]?.length || 0;\n\n return {\n embeddings,\n model: modelToUse,\n dimensions,\n };\n } catch (error: any) {\n if (axios.isAxiosError(error)) {\n const status = error.response?.status;\n const message = error.response?.data?.error || error.message;\n let wrappedError: any;\n\n if (status === 401) {\n wrappedError = new Error(`HuggingFace API authentication failed. Please check your HUGGINGFACE_API_KEY. ${message}`);\n } else if (status === 429) {\n wrappedError = new Error(`HuggingFace API rate limit exceeded. ${message}`);\n } else if (status === 400) {\n wrappedError = new Error(`HuggingFace API request invalid: ${message}`);\n } else if (status === 503) {\n wrappedError = new Error(`HuggingFace model is loading. Please retry in a moment. ${message}`);\n } else {\n wrappedError = new Error(`HuggingFace API error (${status}): ${message}`);\n }\n\n // Preserve error metadata for retry logic\n if (error.code) wrappedError.code = error.code;\n if (error.response) wrappedError.response = error.response;\n\n throw wrappedError;\n }\n\n throw error;\n }\n });\n }\n}\n\n","/**\n * Voyage AI Embedding Provider\n * \n * Implementation of embedding generation using Voyage AI's API\n * https://docs.voyageai.com/docs/embeddings\n */\n\nimport axios from 'axios';\nimport type { IEmbeddingProvider, EmbeddingResult, BatchEmbeddingResult } from '../types.js';\nimport { retryWithBackoff } from '../utils.js';\n\n/**\n * Voyage AI embedding provider\n */\nexport class VoyageEmbeddingProvider implements IEmbeddingProvider {\n readonly name = 'voyage' as const;\n readonly defaultModel = 'voyage-2';\n\n private apiKey: string | undefined;\n private baseUrl = 'https://api.voyageai.com/v1';\n\n constructor(apiKey?: string, model?: string) {\n this.apiKey = apiKey;\n }\n\n /**\n * Check if Voyage AI is available (API key is set)\n */\n isAvailable(): boolean {\n return !!this.apiKey;\n }\n\n async generateEmbedding(text: string, model?: string): Promise<EmbeddingResult> {\n const result = await this.generateBatchEmbeddings([text], model);\n return {\n embedding: result.embeddings[0],\n model: result.model,\n dimensions: result.dimensions,\n usage: result.usage,\n };\n }\n\n async generateBatchEmbeddings(texts: string[], model?: string): Promise<BatchEmbeddingResult> {\n const modelToUse = model || this.defaultModel;\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post(\n `${this.baseUrl}/embeddings`,\n {\n input: texts,\n model: modelToUse,\n input_type: 'document', // For storing in vector DB\n },\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n const embeddings = response.data.data.map((item: any) => item.embedding);\n const dimensions = embeddings[0]?.length || 0;\n\n return {\n embeddings,\n model: modelToUse,\n dimensions,\n usage: response.data.usage ? {\n promptTokens: response.data.usage.total_tokens || 0,\n totalTokens: response.data.usage.total_tokens || 0,\n } : undefined,\n };\n } catch (error: any) {\n if (axios.isAxiosError(error)) {\n const status = error.response?.status;\n const message = error.response?.data?.message || error.message;\n let wrappedError: any;\n\n if (status === 401) {\n wrappedError = new Error(`Voyage AI API authentication failed. Please check your VOYAGE_API_KEY. ${message}`);\n } else if (status === 429) {\n wrappedError = new Error(`Voyage AI API rate limit exceeded. ${message}`);\n } else if (status === 400) {\n wrappedError = new Error(`Voyage AI API request invalid: ${message}`);\n } else {\n wrappedError = new Error(`Voyage AI API error (${status}): ${message}`);\n }\n\n // Preserve error metadata for retry logic\n if (error.code) wrappedError.code = error.code;\n if (error.response) wrappedError.response = error.response;\n\n throw wrappedError;\n }\n\n throw error;\n }\n });\n }\n}\n\n","/**\n * Ollama Embedding Provider\n * \n * Implementation of embedding generation using Ollama (local embeddings)\n * https://github.com/ollama/ollama/blob/main/docs/api.md#generate-embeddings\n */\n\nimport axios from 'axios';\nimport type { IEmbeddingProvider, EmbeddingResult, BatchEmbeddingResult } from '../types.js';\nimport { retryWithBackoff } from '../utils.js';\n\n/**\n * Ollama embedding provider (local, privacy-focused)\n */\nexport class OllamaEmbeddingProvider implements IEmbeddingProvider {\n readonly name = 'ollama' as const;\n readonly defaultModel = 'nomic-embed-text';\n\n private baseUrl: string;\n\n constructor(model?: string, baseUrl: string = 'http://localhost:11434') {\n this.baseUrl = baseUrl;\n }\n\n /**\n * Check if Ollama is available (always true for local service)\n */\n isAvailable(): boolean {\n return true; // Ollama is local, no API key needed\n }\n\n async generateEmbedding(text: string, model?: string): Promise<EmbeddingResult> {\n const modelToUse = model || this.defaultModel;\n\n return retryWithBackoff(async () => {\n try {\n const response = await axios.post(\n `${this.baseUrl}/api/embeddings`,\n {\n model: modelToUse,\n prompt: text,\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n );\n\n const embedding = response.data.embedding;\n\n return {\n embedding,\n model: modelToUse,\n dimensions: embedding.length,\n };\n } catch (error: any) {\n if (axios.isAxiosError(error)) {\n const status = error.response?.status;\n const message = error.response?.data?.error || error.message;\n let wrappedError: any;\n\n if (error.code === 'ECONNREFUSED') {\n wrappedError = new Error(`Cannot connect to Ollama at ${this.baseUrl}. Make sure Ollama is running locally.`);\n } else if (status === 404) {\n wrappedError = new Error(`Ollama model not found. Pull it with: ollama pull <model-name>`);\n } else if (status === 400) {\n wrappedError = new Error(`Ollama API request invalid: ${message}`);\n } else {\n wrappedError = new Error(`Ollama API error (${status}): ${message}`);\n }\n\n // Preserve error metadata for retry logic\n if (error.code) wrappedError.code = error.code;\n if (error.response) wrappedError.response = error.response;\n\n throw wrappedError;\n }\n\n throw error;\n }\n });\n }\n\n async generateBatchEmbeddings(texts: string[], model?: string): Promise<BatchEmbeddingResult> {\n const modelToUse = model || this.defaultModel;\n\n // Ollama doesn't support batch embeddings, so we'll call individually\n const embeddings: number[][] = [];\n\n for (const text of texts) {\n const result = await this.generateEmbedding(text, modelToUse);\n embeddings.push(result.embedding);\n }\n\n const dimensions = embeddings[0]?.length || 0;\n\n return {\n embeddings,\n model: modelToUse,\n dimensions,\n };\n }\n}\n\n","/**\n * Embedding Manager\n *\n * Manages embedding generation across different providers\n */\n\nimport { createLogger } from '@agentforge/core';\nimport type { IEmbeddingProvider, EmbeddingProvider, EmbeddingConfig, EmbeddingResult, BatchEmbeddingResult } from './types.js';\nimport { OpenAIEmbeddingProvider } from './providers/openai.js';\nimport { CohereEmbeddingProvider } from './providers/cohere.js';\nimport { HuggingFaceEmbeddingProvider } from './providers/huggingface.js';\nimport { VoyageEmbeddingProvider } from './providers/voyage.js';\nimport { OllamaEmbeddingProvider } from './providers/ollama.js';\nimport {\n getEmbeddingProvider,\n getEmbeddingModel,\n getOpenAIApiKey,\n getCohereApiKey,\n getHuggingFaceApiKey,\n getVoyageApiKey,\n getOllamaBaseUrl,\n} from './utils.js';\n\nconst logger = createLogger('agentforge:tools:neo4j:embeddings');\n\n/**\n * Singleton embedding manager\n */\nexport class EmbeddingManager {\n private provider: IEmbeddingProvider | null = null;\n private config: EmbeddingConfig | null = null;\n\n /**\n * Initialize with configuration\n */\n initialize(config: EmbeddingConfig): void {\n logger.debug('Initializing embedding manager', {\n provider: config.provider,\n model: config.model,\n });\n\n this.config = config;\n this.provider = this.createProvider(config.provider, config.apiKey);\n\n logger.info('Embedding manager initialized', {\n provider: config.provider,\n model: config.model || this.getDefaultModel(config.provider),\n });\n }\n\n /**\n * Initialize from environment variables\n */\n initializeFromEnv(): void {\n const providerName = getEmbeddingProvider() as EmbeddingProvider;\n const model = getEmbeddingModel();\n\n logger.debug('Initializing embedding manager from environment', {\n provider: providerName,\n model: model || this.getDefaultModel(providerName),\n });\n\n // Get API key based on provider\n let apiKey = '';\n let baseUrl = '';\n\n switch (providerName) {\n case 'openai': {\n const key = getOpenAIApiKey();\n if (!key) {\n logger.error('OPENAI_API_KEY environment variable not set', {\n provider: 'openai',\n required: true,\n });\n throw new Error('OPENAI_API_KEY environment variable is required for OpenAI embeddings');\n }\n apiKey = key;\n logger.debug('OpenAI API key found');\n break;\n }\n\n case 'cohere': {\n const key = getCohereApiKey();\n if (!key) {\n logger.error('COHERE_API_KEY environment variable not set', {\n provider: 'cohere',\n required: true,\n });\n throw new Error('COHERE_API_KEY environment variable is required for Cohere embeddings');\n }\n apiKey = key;\n logger.debug('Cohere API key found');\n break;\n }\n\n case 'huggingface': {\n const key = getHuggingFaceApiKey();\n if (!key) {\n logger.error('HUGGINGFACE_API_KEY environment variable not set', {\n provider: 'huggingface',\n required: true,\n });\n throw new Error('HUGGINGFACE_API_KEY environment variable is required for HuggingFace embeddings');\n }\n apiKey = key;\n logger.debug('HuggingFace API key found');\n break;\n }\n\n case 'voyage': {\n const key = getVoyageApiKey();\n if (!key) {\n logger.error('VOYAGE_API_KEY environment variable not set', {\n provider: 'voyage',\n required: true,\n });\n throw new Error('VOYAGE_API_KEY environment variable is required for Voyage AI embeddings');\n }\n apiKey = key;\n logger.debug('Voyage API key found');\n break;\n }\n\n case 'ollama':\n baseUrl = getOllamaBaseUrl();\n logger.debug('Using Ollama (local, no API key required)', {\n baseUrl: baseUrl || 'http://localhost:11434',\n });\n // Ollama doesn't require an API key (local)\n break;\n\n default:\n logger.error('Unknown embedding provider', {\n provider: providerName,\n });\n throw new Error(`Unknown embedding provider: ${providerName}`);\n }\n\n // Create provider\n this.provider = this.createProvider(providerName, apiKey, model, baseUrl);\n this.config = {\n provider: providerName,\n model: model || this.getDefaultModel(providerName),\n apiKey: '', // Not stored when using env\n };\n\n logger.info('Embedding manager initialized from environment', {\n provider: providerName,\n model: this.config.model,\n });\n }\n\n /**\n * Check if manager is initialized\n */\n isInitialized(): boolean {\n return this.provider !== null && this.config !== null;\n }\n\n /**\n * Get current provider\n */\n getProvider(): IEmbeddingProvider {\n if (!this.provider) {\n throw new Error('Embedding manager not initialized. Call initialize() or initializeFromEnv() first.');\n }\n return this.provider;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): EmbeddingConfig {\n if (!this.config) {\n throw new Error('Embedding manager not initialized. Call initialize() or initializeFromEnv() first.');\n }\n return this.config;\n }\n\n /**\n * Generate embedding for a single text\n */\n async generateEmbedding(text: string, model?: string): Promise<EmbeddingResult> {\n const startTime = Date.now();\n const provider = this.getProvider();\n const config = this.getConfig();\n\n // Use provided model, fall back to configured model, then provider default\n const modelToUse = model || config.model;\n\n logger.debug('Generating embedding', {\n provider: provider.name,\n model: modelToUse,\n textLength: text.length,\n });\n\n // Pass model parameter to provider\n const result = await provider.generateEmbedding(text, modelToUse);\n\n logger.info('Embedding generated', {\n provider: provider.name,\n model: result.model,\n dimensions: result.dimensions,\n duration: Date.now() - startTime,\n });\n\n return result;\n }\n\n /**\n * Generate embeddings for multiple texts (batch)\n */\n async generateBatchEmbeddings(texts: string[], model?: string): Promise<BatchEmbeddingResult> {\n const startTime = Date.now();\n const provider = this.getProvider();\n const config = this.getConfig();\n\n // Use provided model, fall back to configured model, then provider default\n const modelToUse = model || config.model;\n\n logger.debug('Generating batch embeddings', {\n provider: provider.name,\n model: modelToUse,\n count: texts.length,\n });\n\n // Pass model parameter to provider\n const result = await provider.generateBatchEmbeddings(texts, modelToUse);\n\n logger.info('Batch embeddings generated', {\n provider: provider.name,\n model: result.model,\n dimensions: result.dimensions,\n count: texts.length,\n duration: Date.now() - startTime,\n });\n\n return result;\n }\n\n /**\n * Get default model for a provider\n */\n private getDefaultModel(provider: EmbeddingProvider): string {\n switch (provider) {\n case 'openai':\n return 'text-embedding-3-small';\n case 'cohere':\n return 'embed-english-v3.0';\n case 'huggingface':\n return 'sentence-transformers/all-MiniLM-L6-v2';\n case 'voyage':\n return 'voyage-2';\n case 'ollama':\n return 'nomic-embed-text';\n default:\n return 'text-embedding-3-small';\n }\n }\n\n /**\n * Create a provider instance\n */\n private createProvider(\n providerName: EmbeddingProvider,\n apiKey?: string,\n model?: string,\n baseUrl?: string\n ): IEmbeddingProvider {\n switch (providerName) {\n case 'openai':\n return new OpenAIEmbeddingProvider(apiKey);\n\n case 'cohere':\n return new CohereEmbeddingProvider(apiKey);\n\n case 'huggingface':\n return new HuggingFaceEmbeddingProvider(apiKey);\n\n case 'voyage':\n return new VoyageEmbeddingProvider(apiKey);\n\n case 'ollama':\n return new OllamaEmbeddingProvider(model, baseUrl || 'http://localhost:11434');\n\n default:\n throw new Error(`Unknown embedding provider: ${providerName}`);\n }\n }\n\n /**\n * Reset the manager (for testing)\n */\n reset(): void {\n this.provider = null;\n this.config = null;\n }\n}\n\n/**\n * Singleton instance\n */\nexport const embeddingManager = new EmbeddingManager();\n\n/**\n * Initialize embedding manager from environment variables\n */\nexport function initializeEmbeddings(): void {\n embeddingManager.initializeFromEnv();\n}\n\n/**\n * Initialize embedding manager with custom configuration\n */\nexport function initializeEmbeddingsWithConfig(config: EmbeddingConfig): void {\n embeddingManager.initialize(config);\n}\n\n/**\n * Generate embedding for a single text\n */\nexport async function generateEmbedding(text: string, model?: string): Promise<EmbeddingResult> {\n return embeddingManager.generateEmbedding(text, model);\n}\n\n/**\n * Generate embeddings for multiple texts (batch)\n */\nexport async function generateBatchEmbeddings(texts: string[], model?: string): Promise<BatchEmbeddingResult> {\n return embeddingManager.generateBatchEmbeddings(texts, model);\n}\n\n","/**\n * Neo4j Result Formatter\n * \n * Utilities for formatting Neo4j query results into JSON-serializable objects.\n */\n\nimport { Node, Relationship, Path, Integer } from 'neo4j-driver';\nimport type { Neo4jNode, Neo4jRelationship, Neo4jPath } from '../types.js';\n\n/**\n * Convert Neo4j Integer to JavaScript number or string\n */\nexport function formatInteger(value: Integer): number | string {\n if (value.inSafeRange()) {\n return value.toNumber();\n }\n return value.toString();\n}\n\n/**\n * Format any Neo4j value to JSON-serializable format\n */\nexport function formatValue(value: any): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n // Handle Neo4j Integer\n if (value instanceof Integer) {\n return formatInteger(value);\n }\n\n // Handle Neo4j Node\n if (value instanceof Node) {\n return formatNode(value);\n }\n\n // Handle Neo4j Relationship\n if (value instanceof Relationship) {\n return formatRelationship(value);\n }\n\n // Handle Neo4j Path\n if (value instanceof Path) {\n return formatPath(value);\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return value.map(formatValue);\n }\n\n // Handle objects\n if (typeof value === 'object') {\n const formatted: Record<string, any> = {};\n for (const [key, val] of Object.entries(value)) {\n formatted[key] = formatValue(val);\n }\n return formatted;\n }\n\n return value;\n}\n\n/**\n * Format a Neo4j Node to a plain object\n */\nexport function formatNode(node: Node): Neo4jNode {\n return {\n identity: formatInteger(node.identity),\n labels: node.labels,\n properties: formatValue(node.properties),\n };\n}\n\n/**\n * Format a Neo4j Relationship to a plain object\n */\nexport function formatRelationship(rel: Relationship): Neo4jRelationship {\n return {\n identity: formatInteger(rel.identity),\n type: rel.type,\n start: formatInteger(rel.start),\n end: formatInteger(rel.end),\n properties: formatValue(rel.properties),\n };\n}\n\n/**\n * Format a Neo4j Path to a plain object\n */\nexport function formatPath(path: Path): Neo4jPath {\n return {\n start: formatNode(path.start),\n end: formatNode(path.end),\n segments: path.segments.map((segment) => ({\n start: formatNode(segment.start),\n relationship: formatRelationship(segment.relationship),\n end: formatNode(segment.end),\n })),\n length: path.length,\n };\n}\n\n/**\n * Format query results to JSON-serializable format\n */\nexport function formatResults(records: any[]): any[] {\n return records.map((record) => {\n const formatted: Record<string, any> = {};\n for (const key of record.keys) {\n formatted[key] = formatValue(record.get(key));\n }\n return formatted;\n });\n}\n\n","/**\n * Neo4j Query Tool\n *\n * Execute arbitrary Cypher queries against Neo4j database.\n */\n\nimport { toolBuilder, ToolCategory, createLogger } from '@agentforge/core';\nimport { neo4jQuerySchema } from '../types.js';\nimport { neo4jPool } from '../connection.js';\nimport { formatResults } from '../utils/result-formatter.js';\n\nconst logger = createLogger('agentforge:tools:neo4j:query');\n\n/**\n * Create Neo4j query tool\n */\nexport function createNeo4jQueryTool() {\n return toolBuilder()\n .name('neo4j-query')\n .description(\n 'Execute a Cypher query against the Neo4j graph database. ' +\n 'Supports parameterized queries for safety. Use this for complex queries, ' +\n 'graph traversals, and custom operations.'\n )\n .category(ToolCategory.DATABASE)\n .tags(['neo4j', 'graph', 'database', 'cypher', 'query'])\n .schema(neo4jQuerySchema)\n .implement(async (input) => {\n if (!neo4jPool.isInitialized()) {\n logger.warn('Neo4j query attempted but connection not initialized');\n return {\n success: false,\n error: 'Neo4j connection not initialized. Please configure Neo4j connection first.',\n };\n }\n\n const startTime = Date.now();\n\n logger.debug('Executing Neo4j query', {\n cypherPreview: input.cypher.substring(0, 100),\n parameterCount: Object.keys(input.parameters || {}).length,\n database: input.database,\n });\n\n try {\n const session = neo4jPool.getSession(input.database);\n\n try {\n const result = await session.run(input.cypher, input.parameters || {});\n const formattedResults = formatResults(result.records);\n const duration = Date.now() - startTime;\n\n logger.info('Neo4j query executed successfully', {\n recordCount: result.records.length,\n nodesCreated: result.summary.counters.updates().nodesCreated,\n nodesDeleted: result.summary.counters.updates().nodesDeleted,\n relationshipsCreated: result.summary.counters.updates().relationshipsCreated,\n relationshipsDeleted: result.summary.counters.updates().relationshipsDeleted,\n propertiesSet: result.summary.counters.updates().propertiesSet,\n duration,\n });\n\n return {\n success: true,\n data: formattedResults,\n recordCount: result.records.length,\n summary: {\n query: input.cypher,\n parameters: input.parameters,\n counters: {\n nodesCreated: result.summary.counters.updates().nodesCreated,\n nodesDeleted: result.summary.counters.updates().nodesDeleted,\n relationshipsCreated: result.summary.counters.updates().relationshipsCreated,\n relationshipsDeleted: result.summary.counters.updates().relationshipsDeleted,\n propertiesSet: result.summary.counters.updates().propertiesSet,\n },\n },\n };\n } finally {\n await session.close();\n }\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : 'Failed to execute query';\n\n logger.error('Neo4j query execution failed', {\n error: errorMessage,\n cypherPreview: input.cypher.substring(0, 100),\n duration,\n });\n\n return {\n success: false,\n error: errorMessage,\n query: input.cypher,\n };\n }\n })\n .build();\n}\n\n","/**\n * Neo4j Get Schema Tool\n * \n * Introspect the Neo4j graph schema to understand structure.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { neo4jGetSchemaSchema } from '../types.js';\nimport { neo4jPool } from '../connection.js';\n\n/**\n * Create Neo4j get schema tool\n */\nexport function createNeo4jGetSchemaTool() {\n return toolBuilder()\n .name('neo4j-get-schema')\n .description(\n 'Get the schema of the Neo4j graph database including node labels, ' +\n 'relationship types, property keys, constraints, and indexes. ' +\n 'This helps understand the structure of the graph before querying.'\n )\n .category(ToolCategory.DATABASE)\n .tags(['neo4j', 'graph', 'database', 'schema', 'introspection'])\n .schema(neo4jGetSchemaSchema)\n .implement(async (input) => {\n if (!neo4jPool.isInitialized()) {\n return {\n success: false,\n error: 'Neo4j connection not initialized. Please configure Neo4j connection first.',\n };\n }\n\n try {\n const session = neo4jPool.getSession(input.database);\n \n try {\n // Get node labels\n const labelsResult = await session.run('CALL db.labels()');\n const nodeLabels = labelsResult.records.map((r) => r.get('label'));\n\n // Get relationship types\n const relTypesResult = await session.run('CALL db.relationshipTypes()');\n const relationshipTypes = relTypesResult.records.map((r) => r.get('relationshipType'));\n\n // Get property keys\n const propsResult = await session.run('CALL db.propertyKeys()');\n const propertyKeys = propsResult.records.map((r) => r.get('propertyKey'));\n\n // Get constraints\n const constraintsResult = await session.run('SHOW CONSTRAINTS');\n const constraints = constraintsResult.records.map((r) => ({\n name: r.get('name'),\n type: r.get('type'),\n entityType: r.get('entityType'),\n labelsOrTypes: r.get('labelsOrTypes'),\n properties: r.get('properties'),\n }));\n\n // Get indexes\n const indexesResult = await session.run('SHOW INDEXES');\n const indexes = indexesResult.records.map((r) => ({\n name: r.get('name'),\n type: r.get('type'),\n entityType: r.get('entityType'),\n labelsOrTypes: r.get('labelsOrTypes'),\n properties: r.get('properties'),\n }));\n\n return {\n success: true,\n schema: {\n nodeLabels,\n relationshipTypes,\n propertyKeys,\n constraints,\n indexes,\n },\n summary: {\n totalLabels: nodeLabels.length,\n totalRelationshipTypes: relationshipTypes.length,\n totalPropertyKeys: propertyKeys.length,\n totalConstraints: constraints.length,\n totalIndexes: indexes.length,\n },\n };\n } finally {\n await session.close();\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get schema',\n };\n }\n })\n .build();\n}\n\n","/**\n * Cypher Sanitization Utilities\n * \n * Provides safe escaping and validation for Cypher identifiers to prevent injection attacks.\n */\n\n/**\n * Validate and escape a Cypher identifier (label, property key, relationship type)\n * \n * Cypher identifiers must:\n * - Start with a letter or underscore\n * - Contain only letters, numbers, and underscores\n * - Be backtick-escaped if they contain special characters\n * \n * @param identifier - The identifier to validate and escape\n * @param type - Type of identifier for error messages\n * @returns Safely escaped identifier\n * @throws Error if identifier is invalid\n */\nexport function escapeCypherIdentifier(identifier: string, type: string = 'identifier'): string {\n if (!identifier || typeof identifier !== 'string') {\n throw new Error(`Invalid ${type}: must be a non-empty string`);\n }\n\n // Remove leading/trailing whitespace\n const trimmed = identifier.trim();\n \n if (trimmed.length === 0) {\n throw new Error(`Invalid ${type}: cannot be empty or whitespace`);\n }\n\n // Check for null bytes (security risk)\n if (trimmed.includes('\\0')) {\n throw new Error(`Invalid ${type}: cannot contain null bytes`);\n }\n\n // Simple alphanumeric + underscore pattern (safe without escaping)\n const simplePattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n \n if (simplePattern.test(trimmed)) {\n // Safe to use without backticks\n return trimmed;\n }\n\n // For complex identifiers, use backtick escaping\n // Escape any backticks in the identifier by doubling them\n const escaped = trimmed.replace(/`/g, '``');\n \n return `\\`${escaped}\\``;\n}\n\n/**\n * Validate a label name\n */\nexport function validateLabel(label: string): string {\n return escapeCypherIdentifier(label, 'label');\n}\n\n/**\n * Validate a property key\n */\nexport function validatePropertyKey(key: string): string {\n return escapeCypherIdentifier(key, 'property key');\n}\n\n/**\n * Validate a relationship type\n */\nexport function validateRelationshipType(type: string): string {\n return escapeCypherIdentifier(type, 'relationship type');\n}\n\n/**\n * Validate an array of relationship types\n */\nexport function validateRelationshipTypes(types: string[]): string[] {\n if (!Array.isArray(types)) {\n throw new Error('Relationship types must be an array');\n }\n \n return types.map(type => validateRelationshipType(type));\n}\n\n/**\n * Validate direction parameter\n */\nexport function validateDirection(direction: string): 'OUTGOING' | 'INCOMING' | 'BOTH' {\n const normalized = direction.toUpperCase();\n \n if (normalized !== 'OUTGOING' && normalized !== 'INCOMING' && normalized !== 'BOTH') {\n throw new Error(`Invalid direction: must be 'OUTGOING', 'INCOMING', or 'BOTH'`);\n }\n \n return normalized as 'OUTGOING' | 'INCOMING' | 'BOTH';\n}\n\n/**\n * Build a safe property filter clause\n * \n * @param properties - Object with property key-value pairs\n * @param nodeVar - Variable name for the node (e.g., 'n')\n * @returns Object with WHERE clause and parameters\n */\nexport function buildPropertyFilter(\n properties: Record<string, any>,\n nodeVar: string = 'n'\n): { whereClause: string; parameters: Record<string, any> } {\n const keys = Object.keys(properties);\n \n if (keys.length === 0) {\n return { whereClause: '', parameters: {} };\n }\n\n // Validate node variable name\n const safeNodeVar = escapeCypherIdentifier(nodeVar, 'node variable');\n \n // Build WHERE conditions using parameters (safe from injection)\n const conditions = keys.map((key, index) => {\n const safeKey = validatePropertyKey(key);\n const paramName = `prop_${index}`;\n return `${safeNodeVar}.${safeKey} = $${paramName}`;\n });\n\n const parameters: Record<string, any> = {};\n keys.forEach((key, index) => {\n parameters[`prop_${index}`] = properties[key];\n });\n\n return {\n whereClause: `WHERE ${conditions.join(' AND ')}`,\n parameters,\n };\n}\n\n","/**\n * Neo4j Find Nodes Tool\n *\n * Find nodes by label and properties.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { neo4jFindNodesSchema } from '../types.js';\nimport { neo4jPool } from '../connection.js';\nimport { formatResults } from '../utils/result-formatter.js';\nimport { validateLabel, buildPropertyFilter } from '../utils/cypher-sanitizer.js';\n\n/**\n * Create Neo4j find nodes tool\n */\nexport function createNeo4jFindNodesTool() {\n return toolBuilder()\n .name('neo4j-find-nodes')\n .description(\n 'Find nodes in the Neo4j graph by label and optional property filters. ' +\n 'This is a simplified interface for common node lookup operations. ' +\n 'Returns nodes matching the specified criteria.'\n )\n .category(ToolCategory.DATABASE)\n .tags(['neo4j', 'graph', 'database', 'nodes', 'search'])\n .schema(neo4jFindNodesSchema)\n .implement(async (input) => {\n if (!neo4jPool.isInitialized()) {\n return {\n success: false,\n error: 'Neo4j connection not initialized. Please configure Neo4j connection first.',\n };\n }\n\n try {\n // Validate and escape the label to prevent injection\n const safeLabel = validateLabel(input.label);\n\n const session = neo4jPool.getSession(input.database);\n\n try {\n // Build the Cypher query with safe identifiers\n let cypher = `MATCH (n:${safeLabel})`;\n let parameters: Record<string, any> = {};\n\n // Add property filters if provided (using safe parameter binding)\n if (input.properties && Object.keys(input.properties).length > 0) {\n const { whereClause, parameters: filterParams } = buildPropertyFilter(input.properties, 'n');\n cypher += ` ${whereClause}`;\n parameters = { ...parameters, ...filterParams };\n }\n\n // Use parameter for limit to be extra safe\n cypher += ` RETURN n LIMIT $limit`;\n parameters.limit = input.limit;\n\n const result = await session.run(cypher, parameters);\n const formattedResults = formatResults(result.records);\n\n return {\n success: true,\n nodes: formattedResults.map((r) => r.n),\n count: result.records.length,\n query: {\n label: input.label,\n properties: input.properties,\n limit: input.limit,\n },\n };\n } finally {\n await session.close();\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to find nodes',\n query: {\n label: input.label,\n properties: input.properties,\n },\n };\n }\n })\n .build();\n}\n\n","/**\n * Neo4j Traverse Tool\n *\n * Traverse the graph from a starting node following relationships.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { neo4jTraverseSchema } from '../types.js';\nimport { neo4jPool } from '../connection.js';\nimport { formatResults } from '../utils/result-formatter.js';\nimport { validateRelationshipType, validateDirection } from '../utils/cypher-sanitizer.js';\n\n/**\n * Create Neo4j traverse tool\n */\nexport function createNeo4jTraverseTool() {\n return toolBuilder()\n .name('neo4j-traverse')\n .description(\n 'Traverse the Neo4j graph from a starting node by following relationships. ' +\n 'Supports filtering by relationship type, direction, and maximum depth. ' +\n 'Returns connected nodes and their relationships.'\n )\n .category(ToolCategory.DATABASE)\n .tags(['neo4j', 'graph', 'database', 'traverse', 'relationships'])\n .schema(neo4jTraverseSchema)\n .implement(async (input) => {\n if (!neo4jPool.isInitialized()) {\n return {\n success: false,\n error: 'Neo4j connection not initialized. Please configure Neo4j connection first.',\n };\n }\n\n try {\n // Validate direction (with default fallback)\n const safeDirection = validateDirection(input.direction || 'outgoing');\n\n // Validate relationship type if provided\n const safeRelType = input.relationshipType\n ? validateRelationshipType(input.relationshipType)\n : null;\n\n const session = neo4jPool.getSession(input.database);\n\n try {\n // Build relationship pattern based on direction with safe identifiers\n let relPattern = '';\n if (safeDirection === 'OUTGOING') {\n relPattern = safeRelType\n ? `-[r:${safeRelType}*1..${input.maxDepth}]->`\n : `-[r*1..${input.maxDepth}]->`;\n } else if (safeDirection === 'INCOMING') {\n relPattern = safeRelType\n ? `<-[r:${safeRelType}*1..${input.maxDepth}]-`\n : `<-[r*1..${input.maxDepth}]-`;\n } else {\n relPattern = safeRelType\n ? `-[r:${safeRelType}*1..${input.maxDepth}]-`\n : `-[r*1..${input.maxDepth}]-`;\n }\n\n // Build the Cypher query\n const cypher = `\n MATCH path = (start)${relPattern}(end)\n WHERE id(start) = $startNodeId\n RETURN start, end, relationships(path) as rels, length(path) as depth\n LIMIT $limit\n `;\n\n const parameters = {\n startNodeId: typeof input.startNodeId === 'string' \n ? parseInt(input.startNodeId, 10) \n : input.startNodeId,\n limit: input.limit,\n };\n\n const result = await session.run(cypher, parameters);\n const formattedResults = formatResults(result.records);\n\n return {\n success: true,\n paths: formattedResults.map((r) => ({\n start: r.start,\n end: r.end,\n relationships: r.rels,\n depth: r.depth,\n })),\n count: result.records.length,\n query: {\n startNodeId: input.startNodeId,\n relationshipType: input.relationshipType,\n direction: input.direction,\n maxDepth: input.maxDepth,\n },\n };\n } finally {\n await session.close();\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to traverse graph',\n query: {\n startNodeId: input.startNodeId,\n relationshipType: input.relationshipType,\n direction: input.direction,\n },\n };\n }\n })\n .build();\n}\n\n","/**\n * Neo4j Vector Search Tool\n * \n * Perform semantic search using vector indexes for GraphRAG applications.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { neo4jVectorSearchSchema } from '../types.js';\nimport { neo4jPool } from '../connection.js';\nimport { formatResults } from '../utils/result-formatter.js';\n\n/**\n * Create Neo4j vector search tool\n */\nexport function createNeo4jVectorSearchTool() {\n return toolBuilder()\n .name('neo4j-vector-search')\n .description(\n 'Perform semantic similarity search using vector indexes in Neo4j. ' +\n 'Essential for GraphRAG applications - finds nodes with similar embeddings. ' +\n 'Requires a vector index to be created in advance.'\n )\n .category(ToolCategory.DATABASE)\n .tags(['neo4j', 'graph', 'database', 'vector', 'search', 'semantic', 'graphrag'])\n .schema(neo4jVectorSearchSchema)\n .implement(async (input) => {\n if (!neo4jPool.isInitialized()) {\n return {\n success: false,\n error: 'Neo4j connection not initialized. Please configure Neo4j connection first.',\n };\n }\n\n try {\n const session = neo4jPool.getSession(input.database);\n \n try {\n // Use db.index.vector.queryNodes for vector similarity search\n const cypher = `\n CALL db.index.vector.queryNodes($indexName, $limit, $queryVector)\n YIELD node, score\n RETURN node, score\n ORDER BY score DESC\n `;\n\n const parameters = {\n indexName: input.indexName,\n limit: input.limit,\n queryVector: input.queryVector,\n };\n\n const result = await session.run(cypher, parameters);\n const formattedResults = formatResults(result.records);\n\n return {\n success: true,\n results: formattedResults.map((r) => ({\n node: r.node,\n score: r.score,\n })),\n count: result.records.length,\n query: {\n indexName: input.indexName,\n vectorDimension: input.queryVector.length,\n limit: input.limit,\n },\n };\n } finally {\n await session.close();\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to perform vector search';\n \n // Provide helpful error messages for common issues\n let helpText = '';\n if (errorMessage.includes('index') || errorMessage.includes('not found')) {\n helpText = ' Make sure the vector index exists. Create one with: CREATE VECTOR INDEX <name> FOR (n:Label) ON (n.embedding)';\n }\n\n return {\n success: false,\n error: errorMessage + helpText,\n query: {\n indexName: input.indexName,\n vectorDimension: input.queryVector.length,\n },\n };\n }\n })\n .build();\n}\n\n","/**\n * Neo4j Vector Search with Embedding Tool\n *\n * Perform semantic search by automatically generating embeddings from text.\n * This tool combines embedding generation with vector search for easier GraphRAG.\n */\n\nimport { toolBuilder, ToolCategory, createLogger } from '@agentforge/core';\nimport { neo4jVectorSearchWithEmbeddingSchema } from '../types.js';\nimport { neo4jPool } from '../connection.js';\nimport { formatResults } from '../utils/result-formatter.js';\nimport { embeddingManager } from '../embeddings/embedding-manager.js';\n\nconst logger = createLogger('agentforge:tools:neo4j:vector-search');\n\n/**\n * Create Neo4j vector search with embedding tool\n */\nexport function createNeo4jVectorSearchWithEmbeddingTool() {\n return toolBuilder()\n .name('neo4j-vector-search-with-embedding')\n .description(\n 'Perform semantic similarity search in Neo4j by automatically generating embeddings from text. ' +\n 'This tool takes text input, generates an embedding vector, and searches for similar nodes. ' +\n 'Essential for GraphRAG applications - no need to manually generate embeddings. ' +\n 'Requires a vector index and embedding provider (OpenAI) to be configured.'\n )\n .category(ToolCategory.DATABASE)\n .tags(['neo4j', 'graph', 'database', 'vector', 'search', 'semantic', 'graphrag', 'embedding', 'ai'])\n .schema(neo4jVectorSearchWithEmbeddingSchema)\n .implement(async (input) => {\n // Check Neo4j connection\n if (!neo4jPool.isInitialized()) {\n logger.warn('Vector search attempted but Neo4j connection not initialized');\n return {\n success: false,\n error: 'Neo4j connection not initialized. Please configure Neo4j connection first.',\n };\n }\n\n // Check embedding manager\n if (!embeddingManager.isInitialized()) {\n logger.warn('Vector search attempted but embedding manager not initialized');\n return {\n success: false,\n error: 'Embedding manager not initialized. Please configure embedding provider (set OPENAI_API_KEY and optionally EMBEDDING_MODEL).',\n };\n }\n\n const startTime = Date.now();\n\n logger.debug('Performing vector search with embedding', {\n queryTextLength: input.queryText.length,\n indexName: input.indexName,\n limit: input.limit,\n model: input.model,\n });\n\n try {\n // Generate embedding from text\n const embeddingResult = await embeddingManager.generateEmbedding(input.queryText, input.model);\n\n // Perform vector search\n const session = neo4jPool.getSession(input.database);\n\n try {\n // Use db.index.vector.queryNodes for vector similarity search\n const cypher = `\n CALL db.index.vector.queryNodes($indexName, $limit, $queryVector)\n YIELD node, score\n RETURN node, score\n ORDER BY score DESC\n `;\n\n const parameters = {\n indexName: input.indexName,\n limit: input.limit,\n queryVector: embeddingResult.embedding,\n };\n\n const result = await session.run(cypher, parameters);\n const formattedResults = formatResults(result.records);\n const duration = Date.now() - startTime;\n\n logger.info('Vector search completed successfully', {\n resultCount: result.records.length,\n indexName: input.indexName,\n embeddingModel: embeddingResult.model,\n embeddingDimensions: embeddingResult.dimensions,\n duration,\n });\n\n return {\n success: true,\n results: formattedResults.map((r) => ({\n node: r.node,\n score: r.score,\n })),\n count: result.records.length,\n query: {\n text: input.queryText,\n indexName: input.indexName,\n embeddingModel: embeddingResult.model,\n vectorDimension: embeddingResult.dimensions,\n limit: input.limit,\n },\n embedding: {\n model: embeddingResult.model,\n dimensions: embeddingResult.dimensions,\n usage: embeddingResult.usage,\n },\n };\n } finally {\n await session.close();\n }\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : 'Failed to perform vector search with embedding';\n\n // Provide helpful error messages for common issues\n let helpText = '';\n if (errorMessage.includes('index') || errorMessage.includes('not found')) {\n helpText = ' Make sure the vector index exists. Create one with: CREATE VECTOR INDEX <name> FOR (n:Label) ON (n.embedding)';\n } else if (errorMessage.includes('API key') || errorMessage.includes('not initialized')) {\n helpText = ' Make sure OPENAI_API_KEY is set in your environment variables.';\n } else if (errorMessage.includes('dimension')) {\n helpText = ' Make sure the vector index dimensions match your embedding model dimensions.';\n }\n\n logger.error('Vector search failed', {\n error: errorMessage,\n indexName: input.indexName,\n queryTextLength: input.queryText.length,\n duration,\n });\n\n return {\n success: false,\n error: errorMessage + helpText,\n query: {\n text: input.queryText,\n indexName: input.indexName,\n },\n };\n }\n })\n .build();\n}\n\n","/**\n * Neo4j Create Node with Embedding Tool\n *\n * Create a node with automatic embedding generation from text content.\n * This tool simplifies GraphRAG setup by handling embedding generation automatically.\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { neo4jCreateNodeWithEmbeddingSchema } from '../types.js';\nimport { neo4jPool } from '../connection.js';\nimport { formatResults } from '../utils/result-formatter.js';\nimport { embeddingManager } from '../embeddings/embedding-manager.js';\nimport { validateLabel, validatePropertyKey } from '../utils/cypher-sanitizer.js';\n\n/**\n * Create Neo4j create node with embedding tool\n */\nexport function createNeo4jCreateNodeWithEmbeddingTool() {\n return toolBuilder()\n .name('neo4j-create-node-with-embedding')\n .description(\n 'Create a Neo4j node with automatic embedding generation from text content. ' +\n 'This tool extracts text from a specified property, generates an embedding vector, ' +\n 'and stores both the original properties and the embedding in the node. ' +\n 'Perfect for building GraphRAG knowledge bases. ' +\n 'Requires embedding provider (OpenAI) to be configured.'\n )\n .category(ToolCategory.DATABASE)\n .tags(['neo4j', 'graph', 'database', 'create', 'node', 'embedding', 'graphrag', 'ai'])\n .schema(neo4jCreateNodeWithEmbeddingSchema)\n .implement(async (input) => {\n // Check Neo4j connection\n if (!neo4jPool.isInitialized()) {\n return {\n success: false,\n error: 'Neo4j connection not initialized. Please configure Neo4j connection first.',\n };\n }\n\n // Check embedding manager\n if (!embeddingManager.isInitialized()) {\n return {\n success: false,\n error: 'Embedding manager not initialized. Please configure embedding provider (set OPENAI_API_KEY and optionally EMBEDDING_MODEL).',\n };\n }\n\n try {\n // Extract text from properties\n const textToEmbed = input.properties[input.textProperty];\n \n if (!textToEmbed || typeof textToEmbed !== 'string') {\n return {\n success: false,\n error: `Property '${input.textProperty}' not found or is not a string in the provided properties.`,\n };\n }\n\n // Generate embedding from text\n const embeddingResult = await embeddingManager.generateEmbedding(textToEmbed, input.model);\n\n // Validate label and property names to prevent injection\n const safeLabel = validateLabel(input.label);\n const safeEmbeddingProp = validatePropertyKey(input.embeddingProperty || 'embedding');\n\n // Create node with properties and embedding\n const session = neo4jPool.getSession(input.database);\n\n try {\n // Build properties object with embedding\n const allProperties: Record<string, any> = {\n ...input.properties,\n };\n allProperties[input.embeddingProperty || 'embedding'] = embeddingResult.embedding;\n\n // Create the node with safe label\n const cypher = `\n CREATE (n:${safeLabel})\n SET n = $properties\n RETURN n, id(n) as nodeId\n `;\n\n const parameters = {\n properties: allProperties,\n };\n\n const result = await session.run(cypher, parameters);\n const formattedResults = formatResults(result.records);\n\n if (formattedResults.length === 0) {\n return {\n success: false,\n error: 'Failed to create node',\n };\n }\n\n const createdNode = formattedResults[0];\n\n return {\n success: true,\n node: createdNode.n,\n nodeId: createdNode.nodeId,\n embedding: {\n model: embeddingResult.model,\n dimensions: embeddingResult.dimensions,\n property: safeEmbeddingProp,\n usage: embeddingResult.usage,\n },\n message: `Created node with label '${input.label}' and ${embeddingResult.dimensions}-dimensional embedding`,\n };\n } finally {\n await session.close();\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to create node with embedding';\n \n // Provide helpful error messages for common issues\n let helpText = '';\n if (errorMessage.includes('API key') || errorMessage.includes('not initialized')) {\n helpText = ' Make sure OPENAI_API_KEY is set in your environment variables.';\n } else if (errorMessage.includes('Syntax error') || errorMessage.includes('Invalid')) {\n helpText = ' Check that the label and property names are valid.';\n }\n\n return {\n success: false,\n error: errorMessage + helpText,\n };\n }\n })\n .build();\n}\n\n","/**\n * Neo4j Tools\n *\n * Tools for interacting with Neo4j graph database.\n * Supports knowledge graphs, GraphRAG, and graph analytics.\n */\n\nexport * from './types.js';\nexport * from './connection.js';\nexport * from './embeddings/index.js';\nexport { createNeo4jQueryTool } from './tools/neo4j-query.js';\nexport { createNeo4jGetSchemaTool } from './tools/neo4j-get-schema.js';\nexport { createNeo4jFindNodesTool } from './tools/neo4j-find-nodes.js';\nexport { createNeo4jTraverseTool } from './tools/neo4j-traverse.js';\nexport { createNeo4jVectorSearchTool } from './tools/neo4j-vector-search.js';\nexport { createNeo4jVectorSearchWithEmbeddingTool } from './tools/neo4j-vector-search-with-embedding.js';\nexport { createNeo4jCreateNodeWithEmbeddingTool } from './tools/neo4j-create-node-with-embedding.js';\n\nimport { createNeo4jQueryTool } from './tools/neo4j-query.js';\nimport { createNeo4jGetSchemaTool } from './tools/neo4j-get-schema.js';\nimport { createNeo4jFindNodesTool } from './tools/neo4j-find-nodes.js';\nimport { createNeo4jTraverseTool } from './tools/neo4j-traverse.js';\nimport { createNeo4jVectorSearchTool } from './tools/neo4j-vector-search.js';\nimport { createNeo4jVectorSearchWithEmbeddingTool } from './tools/neo4j-vector-search-with-embedding.js';\nimport { createNeo4jCreateNodeWithEmbeddingTool } from './tools/neo4j-create-node-with-embedding.js';\nimport type { Neo4jToolsConfig } from './types.js';\nimport { neo4jPool, initializeFromEnv } from './connection.js';\nimport { embeddingManager } from './embeddings/embedding-manager.js';\n\n/**\n * Default Neo4j query tool instance\n */\nexport const neo4jQuery = createNeo4jQueryTool();\n\n/**\n * Default Neo4j get schema tool instance\n */\nexport const neo4jGetSchema = createNeo4jGetSchemaTool();\n\n/**\n * Default Neo4j find nodes tool instance\n */\nexport const neo4jFindNodes = createNeo4jFindNodesTool();\n\n/**\n * Default Neo4j traverse tool instance\n */\nexport const neo4jTraverse = createNeo4jTraverseTool();\n\n/**\n * Default Neo4j vector search tool instance\n */\nexport const neo4jVectorSearch = createNeo4jVectorSearchTool();\n\n/**\n * Default Neo4j vector search with embedding tool instance\n */\nexport const neo4jVectorSearchWithEmbedding = createNeo4jVectorSearchWithEmbeddingTool();\n\n/**\n * Default Neo4j create node with embedding tool instance\n */\nexport const neo4jCreateNodeWithEmbedding = createNeo4jCreateNodeWithEmbeddingTool();\n\n/**\n * All Neo4j tools (including embedding-enabled tools)\n */\nexport const neo4jTools = [\n neo4jQuery,\n neo4jGetSchema,\n neo4jFindNodes,\n neo4jTraverse,\n neo4jVectorSearch,\n neo4jVectorSearchWithEmbedding,\n neo4jCreateNodeWithEmbedding,\n];\n\n/**\n * Core Neo4j tools (without embedding features)\n */\nexport const neo4jCoreTools = [\n neo4jQuery,\n neo4jGetSchema,\n neo4jFindNodes,\n neo4jTraverse,\n neo4jVectorSearch,\n];\n\n/**\n * Create Neo4j tools with custom configuration\n */\nexport function createNeo4jTools(config: Neo4jToolsConfig = {}, includeEmbeddingTools: boolean = true) {\n // Initialize connection if config provided\n if (config.uri && config.username && config.password) {\n neo4jPool.initialize({\n uri: config.uri,\n username: config.username,\n password: config.password,\n database: config.database,\n maxConnectionPoolSize: config.maxConnectionPoolSize,\n connectionTimeout: config.connectionTimeout,\n }).catch((error) => {\n console.error('Failed to initialize Neo4j connection:', error);\n });\n }\n\n const coreTools = [\n createNeo4jQueryTool(),\n createNeo4jGetSchemaTool(),\n createNeo4jFindNodesTool(),\n createNeo4jTraverseTool(),\n createNeo4jVectorSearchTool(),\n ];\n\n if (includeEmbeddingTools) {\n return [\n ...coreTools,\n createNeo4jVectorSearchWithEmbeddingTool(),\n createNeo4jCreateNodeWithEmbeddingTool(),\n ];\n }\n\n return coreTools;\n}\n\n/**\n * Initialize Neo4j tools from environment variables\n *\n * Required environment variables:\n * - NEO4J_URI: Neo4j connection URI (e.g., bolt://localhost:7687)\n * - NEO4J_USER: Neo4j username\n * - NEO4J_PASSWORD: Neo4j password\n *\n * Optional environment variables:\n * - NEO4J_DATABASE: Database name (defaults to 'neo4j')\n *\n * For embedding-enabled tools, also set:\n * - OPENAI_API_KEY: OpenAI API key for embedding generation\n * - EMBEDDING_MODEL: Embedding model to use (defaults to 'text-embedding-3-small')\n * - EMBEDDING_PROVIDER: Embedding provider (defaults to 'openai')\n */\nexport async function initializeNeo4jTools(): Promise<void> {\n await initializeFromEnv();\n\n // Try to initialize embeddings (optional - will only work if API key is set)\n try {\n embeddingManager.initializeFromEnv();\n } catch (error) {\n // Embedding initialization is optional - tools will work without it\n // Only the embedding-enabled tools will fail if embeddings aren't configured\n }\n}\n\n","/**\n * Runtime peer dependency checker for database drivers\n * @module utils/peer-dependency-checker\n */\n\nimport type { DatabaseVendor } from '../types.js';\n\n/**\n * Mapping of database vendors to their required peer dependencies\n */\nconst VENDOR_DEPENDENCIES: Record<DatabaseVendor, string> = {\n postgresql: 'pg',\n mysql: 'mysql2',\n sqlite: 'better-sqlite3',\n};\n\n/**\n * Installation instructions for each database driver\n */\nconst INSTALLATION_INSTRUCTIONS: Record<DatabaseVendor, string> = {\n postgresql: 'pnpm add pg @types/pg',\n mysql: 'pnpm add mysql2',\n sqlite: 'pnpm add better-sqlite3 @types/better-sqlite3',\n};\n\n/**\n * Error thrown when a required peer dependency is missing\n */\nexport class MissingPeerDependencyError extends Error {\n constructor(\n public readonly vendor: DatabaseVendor,\n public readonly packageName: string,\n ) {\n super(\n `Missing peer dependency for ${vendor} database.\\n\\n` +\n `The '${packageName}' package is required but not installed.\\n\\n` +\n `To fix this, install the required peer dependency:\\n` +\n ` ${INSTALLATION_INSTRUCTIONS[vendor]}\\n\\n` +\n `For more information, see the @agentforge/tools documentation.`,\n );\n this.name = 'MissingPeerDependencyError';\n Object.setPrototypeOf(this, MissingPeerDependencyError.prototype);\n }\n}\n\n/**\n * Check if a peer dependency is available\n * @param packageName - Name of the package to check\n * @returns true if the package is available, false otherwise\n */\nfunction isPeerDependencyAvailable(packageName: string): boolean {\n try {\n // Try to resolve the package\n require.resolve(packageName);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if the required peer dependency for a database vendor is installed\n * @param vendor - Database vendor to check\n * @throws {MissingPeerDependencyError} If the required peer dependency is not installed\n */\nexport function checkPeerDependency(vendor: DatabaseVendor): void {\n const packageName = VENDOR_DEPENDENCIES[vendor];\n\n if (!isPeerDependencyAvailable(packageName)) {\n throw new MissingPeerDependencyError(vendor, packageName);\n }\n}\n\n/**\n * Get the required peer dependency package name for a database vendor\n * @param vendor - Database vendor\n * @returns Package name of the required peer dependency\n */\nexport function getPeerDependencyName(vendor: DatabaseVendor): string {\n return VENDOR_DEPENDENCIES[vendor];\n}\n\n/**\n * Get installation instructions for a database vendor\n * @param vendor - Database vendor\n * @returns Installation command for the required peer dependency\n */\nexport function getInstallationInstructions(vendor: DatabaseVendor): string {\n return INSTALLATION_INSTRUCTIONS[vendor];\n}\n\n","/**\n * SQL sanitization and validation utilities for relational tools\n * @module utils/sql-sanitizer\n */\n\nimport type { QueryParams } from '../query/types.js';\nimport type { DatabaseVendor } from '../types.js';\n\nconst DANGEROUS_SQL_STATEMENT_PATTERN = /^(create|drop|truncate|alter)\\b/i;\nconst NUMBERED_PLACEHOLDER_PATTERN = /\\$(\\d+)/;\nconst QUESTION_PLACEHOLDER_PATTERN = /\\?/;\nconst NAMED_PLACEHOLDER_PATTERN = /(?<!:):[a-zA-Z_][a-zA-Z0-9_]*/;\nconst PARAMETER_REQUIRED_PATTERN = /^(insert|update|delete)\\b/i;\nconst MUTATION_PATTERN = /\\b(insert|update|delete)\\b/i;\n\ninterface SqlStripOptions {\n backslashEscapes: boolean;\n}\n\nfunction stripSqlCommentsAndStrings(sqlString: string, options: SqlStripOptions): string {\n const { backslashEscapes } = options;\n let result = '';\n let i = 0;\n const len = sqlString.length;\n\n while (i < len) {\n const ch = sqlString[i];\n const next = i + 1 < len ? sqlString[i + 1] : '';\n\n // Line comment: -- ...\n if (ch === '-' && next === '-') {\n result += ' ';\n i += 2;\n while (i < len && sqlString[i] !== '\\n') {\n i += 1;\n }\n continue;\n }\n\n // Block comment: /* ... */\n if (ch === '/' && next === '*') {\n result += ' ';\n i += 2;\n while (i < len) {\n if (sqlString[i] === '*' && i + 1 < len && sqlString[i + 1] === '/') {\n i += 2;\n break;\n }\n i += 1;\n }\n continue;\n }\n\n // Single-quoted string: '...'\n if (ch === '\\'') {\n result += \"''\";\n i += 1;\n while (i < len) {\n if (backslashEscapes && sqlString[i] === '\\\\' && i + 1 < len) {\n i += 2;\n continue;\n }\n\n if (sqlString[i] === '\\'') {\n if (i + 1 < len && sqlString[i + 1] === '\\'') {\n i += 2;\n continue;\n }\n i += 1;\n break;\n }\n i += 1;\n }\n continue;\n }\n\n // Double-quoted identifier: \"...\"\n if (ch === '\"') {\n result += '\"\"';\n i += 1;\n while (i < len) {\n if (backslashEscapes && sqlString[i] === '\\\\' && i + 1 < len) {\n i += 2;\n continue;\n }\n\n if (sqlString[i] === '\"') {\n if (i + 1 < len && sqlString[i + 1] === '\"') {\n i += 2;\n continue;\n }\n i += 1;\n break;\n }\n i += 1;\n }\n continue;\n }\n\n // PostgreSQL dollar-quoted string: $$...$$ or $tag$...$tag$\n if (ch === '$') {\n let j = i + 1;\n while (j < len && /[A-Za-z0-9_]/.test(sqlString[j])) {\n j += 1;\n }\n\n if (j < len && sqlString[j] === '$') {\n const tag = sqlString.slice(i, j + 1);\n result += '$$';\n i = j + 1;\n\n const endIndex = sqlString.indexOf(tag, i);\n if (endIndex === -1) {\n break;\n }\n\n i = endIndex + tag.length;\n continue;\n }\n }\n\n result += ch;\n i += 1;\n }\n\n return result;\n}\n\nfunction nextNonWhitespaceChar(sqlString: string, index: number): string | null {\n for (let i = index; i < sqlString.length; i += 1) {\n if (!/\\s/.test(sqlString[i])) {\n return sqlString[i];\n }\n }\n\n return null;\n}\n\nfunction hasPostgresQuestionMarkPlaceholder(sqlString: string): boolean {\n for (let i = 0; i < sqlString.length; i += 1) {\n if (sqlString[i] !== '?') {\n continue;\n }\n\n const immediateNext = i + 1 < sqlString.length ? sqlString[i + 1] : null;\n if (immediateNext === '|' || immediateNext === '&') {\n continue;\n }\n\n const nextToken = nextNonWhitespaceChar(sqlString, i + 1);\n if (nextToken === null || nextToken === ',' || nextToken === ')' || nextToken === ';' || nextToken === ':') {\n return true;\n }\n\n if (/[A-Za-z0-9_'\"$]/.test(nextToken) || nextToken === '[') {\n continue;\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction hasSqlPlaceholders(sqlString: string, vendor?: DatabaseVendor): boolean {\n if (NUMBERED_PLACEHOLDER_PATTERN.test(sqlString)) {\n return true;\n }\n\n if (NAMED_PLACEHOLDER_PATTERN.test(sqlString)) {\n return true;\n }\n\n // PostgreSQL frequently uses ? / ?| / ?& as JSONB operators.\n // Disambiguate these operators from bind placeholders.\n if (vendor === 'postgresql') {\n return hasPostgresQuestionMarkPlaceholder(sqlString);\n }\n\n return QUESTION_PLACEHOLDER_PATTERN.test(sqlString);\n}\n\nfunction hasParameters(params?: QueryParams): boolean {\n if (params === undefined) {\n return false;\n }\n\n if (Array.isArray(params)) {\n return params.length > 0;\n }\n\n return Object.keys(params).length > 0;\n}\n\n/**\n * Validate raw SQL string safety constraints.\n * Rejects empty input, null bytes, and dangerous DDL operations.\n */\nexport function validateSqlString(sqlString: string, vendor?: DatabaseVendor): void {\n if (typeof sqlString !== 'string' || sqlString.trim().length === 0) {\n throw new Error('SQL query must not be empty');\n }\n\n if (sqlString.includes('\\0')) {\n throw new Error('SQL query contains null bytes');\n }\n\n const normalizedForSafetyCheck = stripSqlCommentsAndStrings(sqlString, {\n backslashEscapes: vendor === 'mysql',\n });\n const statements = normalizedForSafetyCheck\n .split(';')\n .map((statement) => statement.trim())\n .filter((statement) => statement.length > 0);\n\n if (statements.some((statement) => DANGEROUS_SQL_STATEMENT_PATTERN.test(statement))) {\n throw new Error('Detected dangerous SQL operation. CREATE, DROP, TRUNCATE, and ALTER are not allowed.');\n }\n}\n\n/**\n * Enforce parameterized-query usage for mutation statements and placeholders.\n */\nexport function enforceParameterizedQueryUsage(\n sqlString: string,\n params?: QueryParams,\n vendor?: DatabaseVendor,\n): void {\n const normalizedForAnalysis = stripSqlCommentsAndStrings(sqlString, {\n backslashEscapes: vendor === 'mysql',\n });\n const normalized = normalizedForAnalysis.trim().toLowerCase();\n const hasPlaceholders = hasSqlPlaceholders(normalizedForAnalysis, vendor);\n const hasParams = hasParameters(params);\n\n if (hasPlaceholders && !hasParams) {\n throw new Error('Missing parameters: SQL query contains placeholders but no params were provided');\n }\n\n const startsWithWith = /^with\\b/.test(normalized);\n const parameterRequired = startsWithWith\n ? MUTATION_PATTERN.test(normalized)\n : PARAMETER_REQUIRED_PATTERN.test(normalized);\n\n if (parameterRequired && !hasParams) {\n throw new Error(\n 'Parameters are required for INSERT/UPDATE/DELETE queries. ' +\n 'Use parameterized placeholders instead of embedding values directly.'\n );\n }\n}\n","/**\n * SQL identifier validation and quoting utilities\n * @module utils/identifier-utils\n *\n * Provides vendor-aware identifier quoting and validation to prevent SQL injection\n * through column names, table names, and other identifiers.\n */\n\nimport type { DatabaseVendor } from '../types.js';\n\n/**\n * Valid SQL identifier pattern\n * Allows alphanumeric characters and underscores (no dots - use validateQualifiedIdentifier for schema-qualified names)\n * This prevents SQL injection through identifier names\n */\nconst VALID_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\n/**\n * Valid schema-qualified identifier pattern (e.g., \"public.users\")\n */\nexport const VALID_QUALIFIED_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)*$/;\n\n/**\n * Validate that a string is a safe SQL identifier\n * @param identifier - The identifier to validate\n * @param context - Description of what the identifier represents (for error messages)\n * @throws {Error} If the identifier contains unsafe characters\n */\nexport function validateIdentifier(identifier: string, context: string): void {\n if (!identifier || identifier.trim().length === 0) {\n throw new Error(`${context} must not be empty`);\n }\n\n if (!VALID_IDENTIFIER_PATTERN.test(identifier)) {\n throw new Error(\n `${context} \"${identifier}\" contains invalid characters. ` +\n 'Only alphanumeric characters and underscores are allowed, must start with a letter or underscore.'\n );\n }\n}\n\n/**\n * Validate that a string is a safe SQL identifier, allowing schema-qualified names (e.g., \"public.users\")\n * @param identifier - The identifier to validate\n * @param context - Description of what the identifier represents (for error messages)\n * @throws {Error} If the identifier contains unsafe characters\n */\nexport function validateQualifiedIdentifier(identifier: string, context: string): void {\n if (!identifier || identifier.trim().length === 0) {\n throw new Error(`${context} must not be empty`);\n }\n\n if (!VALID_QUALIFIED_IDENTIFIER_PATTERN.test(identifier)) {\n throw new Error(\n `${context} \"${identifier}\" contains invalid characters. ` +\n 'Only alphanumeric characters, underscores, and dots (for schema qualification) are allowed.'\n );\n }\n}\n\n/**\n * Quote an identifier using vendor-appropriate quoting\n * @param identifier - The validated identifier to quote\n * @param vendor - The database vendor\n * @returns The quoted identifier string\n */\nexport function quoteIdentifier(identifier: string, vendor?: DatabaseVendor): string {\n if (vendor === 'mysql') {\n // MySQL uses backticks for identifier quoting\n return `\\`${identifier}\\``;\n }\n // PostgreSQL and SQLite use double quotes (ANSI SQL standard)\n return `\"${identifier}\"`;\n}\n\n/**\n * Quote a potentially schema-qualified identifier (e.g., \"public.users\" → \"public\".\"users\")\n * @param qualifiedName - The validated qualified identifier to quote\n * @param vendor - The database vendor\n * @returns The quoted identifier string\n */\nexport function quoteQualifiedIdentifier(qualifiedName: string, vendor?: DatabaseVendor): string {\n const parts = qualifiedName.split('.');\n return parts.map((part) => quoteIdentifier(part, vendor)).join('.');\n}\n","/**\n * Connection manager for relational databases using Drizzle ORM\n * @module connection/connection-manager\n */\n\nimport type { DatabaseConnection, DatabaseVendor } from '../types.js';\nimport type { ConnectionConfig, PoolConfig } from './types.js';\nimport { checkPeerDependency } from '../utils/peer-dependency-checker.js';\nimport { sql, type SQL } from 'drizzle-orm';\nimport { createLogger } from '@agentforge/core';\nimport { EventEmitter } from 'events';\n\nconst logger = createLogger('agentforge:tools:data:relational:connection');\n\n/**\n * Connection state enum\n */\nexport enum ConnectionState {\n DISCONNECTED = 'disconnected',\n CONNECTING = 'connecting',\n CONNECTED = 'connected',\n RECONNECTING = 'reconnecting',\n ERROR = 'error',\n}\n\n/**\n * Connection lifecycle events\n */\nexport type ConnectionEvent = 'connected' | 'disconnected' | 'error' | 'reconnecting';\n\n/**\n * Reconnection configuration\n */\nexport interface ReconnectionConfig {\n /** Enable automatic reconnection on connection loss */\n enabled: boolean;\n /** Maximum number of reconnection attempts (0 = infinite) */\n maxAttempts: number;\n /** Base delay in milliseconds for exponential backoff */\n baseDelayMs: number;\n /** Maximum delay in milliseconds between reconnection attempts */\n maxDelayMs: number;\n}\n\n/**\n * Validate pool configuration\n * @param poolConfig - Pool configuration to validate\n * @throws {Error} If pool configuration is invalid\n */\nfunction validatePoolConfig(poolConfig: PoolConfig): void {\n if (poolConfig.max !== undefined && poolConfig.max < 1) {\n throw new Error('Pool max connections must be >= 1');\n }\n\n if (poolConfig.acquireTimeoutMillis !== undefined && poolConfig.acquireTimeoutMillis < 0) {\n throw new Error('Pool acquire timeout must be >= 0');\n }\n\n if (poolConfig.idleTimeoutMillis !== undefined && poolConfig.idleTimeoutMillis < 0) {\n throw new Error('Pool idle timeout must be >= 0');\n }\n}\n\n/**\n * Validation error patterns that should be re-thrown directly from initialize()\n * without wrapping in a generic \"Failed to initialize ... connection\" message.\n */\nconst SAFE_INITIALIZATION_PATTERNS = [\n 'Pool max connections must be',\n 'Pool acquire timeout must be',\n 'Pool idle timeout must be',\n 'connection requires a url property',\n 'Unsupported database vendor',\n] as const;\n\n/**\n * Connection manager that handles database connections for PostgreSQL, MySQL, and SQLite\n * using Drizzle ORM with lifecycle management and automatic reconnection\n */\nexport class ConnectionManager extends EventEmitter implements DatabaseConnection {\n private vendor: DatabaseVendor;\n private db: any; // Drizzle database instance\n private client: any; // Underlying database client (pg.Pool, mysql2.Pool, or better-sqlite3.Database)\n private config: ConnectionConfig;\n private state: ConnectionState = ConnectionState.DISCONNECTED;\n private reconnectionConfig: ReconnectionConfig;\n private reconnectionAttempts = 0;\n private reconnectionTimer: NodeJS.Timeout | null = null;\n private connectPromise: Promise<void> | null = null; // Track in-flight connection attempts\n private connectionGeneration = 0; // Cancellation token for disconnect\n\n /**\n * Create a new ConnectionManager instance\n * @param config - Connection configuration\n * @param reconnectionConfig - Optional reconnection configuration\n */\n constructor(\n config: ConnectionConfig,\n reconnectionConfig?: Partial<ReconnectionConfig>\n ) {\n super();\n this.config = config;\n this.vendor = config.vendor;\n\n // Default reconnection configuration\n this.reconnectionConfig = {\n enabled: reconnectionConfig?.enabled ?? false,\n maxAttempts: reconnectionConfig?.maxAttempts ?? 5,\n baseDelayMs: reconnectionConfig?.baseDelayMs ?? 1000,\n maxDelayMs: reconnectionConfig?.maxDelayMs ?? 30000,\n };\n\n // Check for required peer dependency before attempting connection\n checkPeerDependency(this.vendor);\n }\n\n /**\n * Connect to the database\n * Initializes the connection and sets up automatic reconnection if configured\n * @throws {Error} If connection fails or configuration is invalid\n */\n async connect(): Promise<void> {\n if (this.state === ConnectionState.CONNECTED) {\n logger.debug('Already connected', { vendor: this.vendor });\n return;\n }\n\n // If a connection is already in progress, wait for it to complete\n // This handles both manual connect() calls and automatic reconnection attempts\n if (this.connectPromise) {\n logger.debug('Connection already in progress, waiting for completion', {\n vendor: this.vendor,\n state: this.state,\n });\n return this.connectPromise;\n }\n\n // If a reconnection has been scheduled, cancel it before starting a new connection attempt\n if (this.reconnectionTimer) {\n logger.debug('Clearing pending reconnection timer before manual connect', {\n vendor: this.vendor,\n });\n clearTimeout(this.reconnectionTimer);\n this.reconnectionTimer = null;\n }\n\n // Track the connection promise so concurrent callers can await it\n this.connectPromise = this.initialize().finally(() => {\n this.connectPromise = null;\n });\n\n return this.connectPromise;\n }\n\n /**\n * Disconnect from the database\n * Closes the connection and cancels any pending reconnection attempts\n *\n * Note: Event listeners are NOT removed by this method. If you need to dispose\n * of the ConnectionManager instance entirely, call dispose() instead.\n */\n async disconnect(): Promise<void> {\n // Increment generation to cancel any in-flight initialize() operations\n this.connectionGeneration++;\n\n // Cancel any pending reconnection\n if (this.reconnectionTimer) {\n clearTimeout(this.reconnectionTimer);\n this.reconnectionTimer = null;\n }\n\n // Reset reconnection attempts\n this.reconnectionAttempts = 0;\n\n // Wait for any in-flight connection attempt to complete before closing\n // This prevents race conditions where initialize() completes after disconnect()\n if (this.connectPromise) {\n logger.debug('Waiting for in-flight connection attempt to complete before disconnect', {\n vendor: this.vendor,\n });\n try {\n await this.connectPromise;\n } catch {\n // Ignore errors from the connection attempt - we're disconnecting anyway\n }\n // Clear the promise reference\n this.connectPromise = null;\n }\n\n // Close the connection\n await this.close();\n }\n\n /**\n * Dispose of the ConnectionManager instance\n * Disconnects and removes all event listeners\n * Call this when you're done with the ConnectionManager and won't reuse it\n */\n async dispose(): Promise<void> {\n await this.disconnect();\n this.removeAllListeners();\n }\n\n /**\n * Check if the connection is currently connected\n * @returns true if connected, false otherwise\n */\n isConnected(): boolean {\n return this.state === ConnectionState.CONNECTED;\n }\n\n /**\n * Get the current connection state\n * @returns Current connection state\n */\n getState(): ConnectionState {\n return this.state;\n }\n\n /**\n * Get the configured database vendor.\n */\n getVendor(): DatabaseVendor {\n return this.vendor;\n }\n\n /**\n * Initialize the database connection\n *\n * This method is public to maintain compatibility with the DatabaseConnection interface\n * and existing code (e.g., relational-query.ts). For new code, prefer using connect()\n * which provides lifecycle management and automatic reconnection.\n *\n * @throws {Error} If connection fails or configuration is invalid\n */\n async initialize(): Promise<void> {\n const startTime = Date.now();\n const currentGeneration = this.connectionGeneration;\n\n // Guard: if already connected, clean up existing resources first to prevent leaks\n if (this.state === ConnectionState.CONNECTED && this.client) {\n logger.warn('Re-initializing an already connected manager; emitting disconnected before cleanup', {\n vendor: this.vendor,\n });\n // Ensure listeners see a full lifecycle: connected -> disconnected -> connected\n this.setState(ConnectionState.DISCONNECTED);\n this.emit('disconnected');\n await this.cleanupCancelledConnection();\n }\n\n // Set state to connecting\n this.setState(ConnectionState.CONNECTING);\n\n logger.info('Initializing database connection', {\n vendor: this.vendor,\n connectionType: typeof this.config.connection,\n state: this.state,\n });\n\n try {\n switch (this.vendor) {\n case 'postgresql':\n await this.initializePostgreSQL();\n break;\n case 'mysql':\n await this.initializeMySQL();\n break;\n case 'sqlite':\n await this.initializeSQLite();\n break;\n default:\n throw new Error(`Unsupported database vendor: ${this.vendor}`);\n }\n\n // Check if disconnect() was called during initialization\n if (currentGeneration !== this.connectionGeneration) {\n logger.debug('Connection cancelled during initialization', {\n vendor: this.vendor,\n currentGeneration,\n newGeneration: this.connectionGeneration,\n });\n // Clean up resources before throwing\n await this.cleanupCancelledConnection();\n // Set state to disconnected since we're cancelling\n this.setState(ConnectionState.DISCONNECTED);\n throw new Error('Connection cancelled during initialization');\n }\n\n // Validate connection after initialization\n logger.debug('Validating connection health', { vendor: this.vendor });\n const healthy = await this.isHealthy();\n if (!healthy) {\n throw new Error(`Failed to establish healthy connection to ${this.vendor} database`);\n }\n\n // Check again after async health check\n if (currentGeneration !== this.connectionGeneration) {\n logger.debug('Connection cancelled during health check', {\n vendor: this.vendor,\n currentGeneration,\n newGeneration: this.connectionGeneration,\n });\n // Clean up resources before throwing\n await this.cleanupCancelledConnection();\n // Set state to disconnected since we're cancelling\n this.setState(ConnectionState.DISCONNECTED);\n throw new Error('Connection cancelled during health check');\n }\n\n // Set state to connected and emit event\n this.setState(ConnectionState.CONNECTED);\n this.emit('connected');\n\n // Reset reconnection attempts on successful connection\n this.reconnectionAttempts = 0;\n\n logger.info('Database connection initialized successfully', {\n vendor: this.vendor,\n duration: Date.now() - startTime,\n state: this.state,\n });\n } catch (error) {\n const errorMessage = `Failed to initialize ${this.vendor} connection`;\n\n // Normalize error to Error object before emitting\n const normalizedError = error instanceof Error ? error : new Error(String(error));\n\n // Known validation errors (pool config, missing URL, unsupported vendor)\n // should surface their original message so callers can fix their input.\n const isValidationError = SAFE_INITIALIZATION_PATTERNS.some(\n (pattern) => normalizedError.message.includes(pattern)\n );\n if (isValidationError) {\n this.setState(ConnectionState.ERROR);\n throw normalizedError;\n }\n\n // Check if this is a cancellation error (disconnect() was called during initialization)\n const isCancellation = normalizedError.message.includes('Connection cancelled');\n\n // Only set error state and emit error event if this is NOT a cancellation\n // Cancellation errors already set state to DISCONNECTED before throwing\n if (!isCancellation) {\n // Set state to error and emit event.\n // Guard: only emit 'error' when there are listeners to avoid the\n // unhandled-error throw that Node.js EventEmitter enforces, which\n // would surface the raw driver error instead of our wrapped message.\n this.setState(ConnectionState.ERROR);\n if (this.listenerCount('error') > 0) {\n this.emit('error', normalizedError);\n }\n\n logger.error(errorMessage, {\n vendor: this.vendor,\n error: normalizedError.message,\n duration: Date.now() - startTime,\n state: this.state,\n });\n\n // Clean up any partially created resources to prevent connection leaks\n await this.cleanupCancelledConnection();\n\n // Attempt reconnection if configured and this initialize call is still current\n // This prevents scheduling reconnection after disconnect() has been called\n if (this.reconnectionConfig.enabled && currentGeneration === this.connectionGeneration) {\n this.scheduleReconnection();\n }\n } else {\n // For cancellation, just log debug info - state is already DISCONNECTED\n logger.debug('Connection initialization cancelled', {\n vendor: this.vendor,\n duration: Date.now() - startTime,\n state: this.state,\n });\n }\n\n if (error instanceof Error) {\n throw new Error(errorMessage, { cause: error });\n }\n throw new Error(`${errorMessage}: ${String(error)}`);\n }\n }\n\n /**\n * Set the connection state and log the change\n * @param newState - New connection state\n * @private\n */\n private setState(newState: ConnectionState): void {\n const oldState = this.state;\n this.state = newState;\n\n if (oldState !== newState) {\n logger.debug('Connection state changed', {\n vendor: this.vendor,\n oldState,\n newState,\n });\n }\n }\n\n /**\n * Schedule a reconnection attempt with exponential backoff\n * @private\n */\n private scheduleReconnection(): void {\n // Check if we've exceeded max attempts\n if (\n this.reconnectionConfig.maxAttempts > 0 &&\n this.reconnectionAttempts >= this.reconnectionConfig.maxAttempts\n ) {\n logger.error('Max reconnection attempts reached', {\n vendor: this.vendor,\n attempts: this.reconnectionAttempts,\n maxAttempts: this.reconnectionConfig.maxAttempts,\n });\n return;\n }\n\n // Calculate delay with exponential backoff\n const delay = Math.min(\n this.reconnectionConfig.baseDelayMs * Math.pow(2, this.reconnectionAttempts),\n this.reconnectionConfig.maxDelayMs\n );\n\n this.reconnectionAttempts++;\n\n // Set state to reconnecting\n this.setState(ConnectionState.RECONNECTING);\n\n logger.info('Scheduling reconnection attempt', {\n vendor: this.vendor,\n attempt: this.reconnectionAttempts,\n maxAttempts: this.reconnectionConfig.maxAttempts,\n delayMs: delay,\n });\n\n this.emit('reconnecting', {\n attempt: this.reconnectionAttempts,\n maxAttempts: this.reconnectionConfig.maxAttempts,\n delayMs: delay,\n });\n\n // Schedule reconnection\n this.reconnectionTimer = setTimeout(async () => {\n this.reconnectionTimer = null;\n\n try {\n logger.info('Attempting reconnection', {\n vendor: this.vendor,\n attempt: this.reconnectionAttempts,\n });\n\n // Track the reconnection promise so concurrent connect() calls can await it\n this.connectPromise = this.initialize().finally(() => {\n this.connectPromise = null;\n });\n\n await this.connectPromise;\n } catch (error) {\n logger.error('Reconnection attempt failed', {\n vendor: this.vendor,\n attempt: this.reconnectionAttempts,\n error: error instanceof Error ? error.message : String(error),\n });\n\n // The initialize() method will schedule another reconnection if needed\n }\n }, delay);\n }\n\n /**\n * Initialize PostgreSQL connection using Drizzle ORM with node-postgres\n *\n * Applies pool configuration options to pg.Pool for connection management.\n */\n private async initializePostgreSQL(): Promise<void> {\n const { drizzle } = await import('drizzle-orm/node-postgres');\n const { Pool } = await import('pg');\n\n // Extract pool config and base config separately to avoid passing unknown 'pool' property to pg.Pool\n const { pool: poolConfig, ...baseConfig } = typeof this.config.connection === 'string'\n ? { connectionString: this.config.connection }\n : this.config.connection;\n\n // Validate pool configuration\n if (poolConfig) {\n validatePoolConfig(poolConfig);\n }\n\n const connectionConfig = {\n ...baseConfig,\n // Map our PoolConfig to pg.Pool options\n // Note: pg.Pool does not support a `min` option\n ...(poolConfig?.max !== undefined && { max: poolConfig.max }),\n ...(poolConfig?.idleTimeoutMillis !== undefined && { idleTimeoutMillis: poolConfig.idleTimeoutMillis }),\n ...(poolConfig?.acquireTimeoutMillis !== undefined && { connectionTimeoutMillis: poolConfig.acquireTimeoutMillis }),\n };\n\n logger.debug('Creating PostgreSQL connection pool', {\n vendor: this.vendor,\n poolConfig: {\n max: connectionConfig.max,\n idleTimeoutMillis: connectionConfig.idleTimeoutMillis,\n connectionTimeoutMillis: connectionConfig.connectionTimeoutMillis,\n }\n });\n\n this.client = new Pool(connectionConfig);\n this.db = drizzle({ client: this.client });\n }\n\n /**\n * Initialize MySQL connection using Drizzle ORM with mysql2\n *\n * Applies pool configuration options to mysql2.createPool for connection management.\n */\n private async initializeMySQL(): Promise<void> {\n const { drizzle } = await import('drizzle-orm/mysql2');\n const mysql = await import('mysql2/promise');\n\n // mysql2.createPool accepts both connection strings directly and config objects\n // When a string is provided, we can't apply pool config (would need to parse URL)\n let connectionConfig: any;\n\n if (typeof this.config.connection === 'string') {\n connectionConfig = this.config.connection;\n logger.debug('Creating MySQL connection pool from connection string', {\n vendor: this.vendor,\n });\n } else {\n // Destructure to separate pool config from mysql2 config\n const { pool: poolConfig, ...baseConfig } = this.config.connection;\n\n // Validate pool configuration\n if (poolConfig) {\n validatePoolConfig(poolConfig);\n }\n\n connectionConfig = {\n ...baseConfig,\n // Map our PoolConfig to mysql2 pool options\n ...(poolConfig?.max !== undefined && { connectionLimit: poolConfig.max }),\n ...(poolConfig?.acquireTimeoutMillis !== undefined && { acquireTimeout: poolConfig.acquireTimeoutMillis }),\n ...(poolConfig?.idleTimeoutMillis !== undefined && { idleTimeout: poolConfig.idleTimeoutMillis }),\n };\n\n logger.debug('Creating MySQL connection pool', {\n vendor: this.vendor,\n poolConfig: {\n connectionLimit: connectionConfig.connectionLimit,\n acquireTimeout: connectionConfig.acquireTimeout,\n idleTimeout: connectionConfig.idleTimeout,\n }\n });\n }\n\n // createPool is synchronous and returns a Pool instance directly\n this.client = mysql.createPool(connectionConfig);\n this.db = drizzle({ client: this.client });\n }\n\n /**\n * Initialize SQLite connection using Drizzle ORM with better-sqlite3\n *\n * Note: SQLite uses a single connection. Pool configuration is logged but not applied\n * as SQLite handles concurrent access through its internal locking mechanism.\n */\n private async initializeSQLite(): Promise<void> {\n const { drizzle } = await import('drizzle-orm/better-sqlite3');\n const DatabaseModule = await import('better-sqlite3');\n\n // better-sqlite3 uses CommonJS module.exports, which becomes .default in ESM\n const Database = DatabaseModule.default;\n\n const url = typeof this.config.connection === 'string'\n ? this.config.connection\n : (this.config.connection as any).url;\n\n if (!url) {\n throw new Error('SQLite connection requires a url property');\n }\n\n // Validate and log pool config if provided (for awareness, but SQLite doesn't use traditional pooling)\n if (typeof this.config.connection === 'object' && this.config.connection.pool) {\n validatePoolConfig(this.config.connection.pool);\n logger.debug('SQLite pool configuration provided but not applied (SQLite uses single connection)', {\n vendor: this.vendor,\n poolConfig: this.config.connection.pool,\n });\n }\n\n logger.debug('Creating SQLite connection', {\n vendor: this.vendor,\n url: url === ':memory:' ? ':memory:' : 'file',\n });\n\n this.client = new Database(url);\n\n // Enable foreign key enforcement for every connection. SQLite disables\n // foreign keys by default and the PRAGMA is per-connection, so we must\n // set it immediately after opening.\n this.client.pragma('foreign_keys = ON');\n\n this.db = drizzle({ client: this.client });\n }\n\n /**\n * Determine whether an error thrown by drizzle-orm's better-sqlite3 adapter\n * `.all()` indicates the statement does not return data (i.e. it is DML/DDL,\n * not a SELECT).\n *\n * The adapter may surface this as either a native `SqliteError` or a\n * `TypeError` depending on the drizzle-orm / better-sqlite3 version, so we\n * accept both types while still requiring the distinctive message substring\n * to avoid false positives from unrelated errors.\n */\n private isSqliteNonQueryError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const isSqliteOrTypeError =\n error.constructor?.name === 'SqliteError' ||\n error.name === 'SqliteError' ||\n error instanceof TypeError;\n const hasNonQueryMessage = error.message.includes('does not return data');\n return isSqliteOrTypeError && hasNonQueryMessage;\n }\n\n /**\n * Execute a SQL query\n *\n * Executes a parameterized SQL query using Drizzle's SQL template objects.\n * This method provides safe parameter binding to prevent SQL injection.\n *\n * @param query - Drizzle SQL template object with parameter binding\n * @returns Query result\n *\n * @example\n * ```typescript\n * import { sql } from 'drizzle-orm';\n *\n * const result = await manager.execute(\n * sql`SELECT * FROM users WHERE id = ${userId}`\n * );\n * ```\n */\n async execute(query: SQL): Promise<unknown> {\n if (!this.db) {\n throw new Error('Database not initialized. Call initialize() first.');\n }\n\n logger.debug('Executing SQL query', {\n vendor: this.vendor\n });\n\n // drizzle-orm's better-sqlite3 adapter does not expose an .execute() method.\n // It uses .all() for SELECT (returns row arrays) and .run() for DML/DDL\n // (returns { changes, lastInsertRowid }). Try .all() first and fall back\n // to .run() when better-sqlite3 throws a SqliteError indicating the\n // statement does not return data.\n if (this.vendor === 'sqlite') {\n try {\n return this.db.all(query);\n } catch (error: unknown) {\n if (this.isSqliteNonQueryError(error)) {\n // .run() returns { changes, lastInsertRowid }. Normalize by mapping\n // `changes` to `affectedRows` so executeQuery() can derive rowCount\n // consistently across vendors.\n const runResult = this.db.run(query) as { changes?: number; lastInsertRowid?: number };\n return { ...runResult, affectedRows: runResult.changes ?? 0 };\n }\n throw error;\n }\n }\n\n // drizzle-orm's mysql2 adapter returns [rows, fields] from execute().\n // Normalize by extracting just the rows array so callers can treat the\n // result identically to PostgreSQL (which returns rows directly).\n if (this.vendor === 'mysql') {\n const raw = await this.db.execute(query);\n // mysql2 returns [rows, fields] for SELECTs and [ResultSetHeader, fields]\n // for INSERT/UPDATE/DELETE. Unwrap the first element in both cases so\n // callers get a consistent shape matching PostgreSQL / SQLite.\n if (Array.isArray(raw) && raw.length === 2) {\n return raw[0];\n }\n return raw;\n }\n\n return this.db.execute(query);\n }\n\n /**\n * Execute a callback with a single dedicated database connection/session.\n *\n * This is required for multi-statement transactions so all statements run on\n * the same underlying connection.\n */\n async executeInConnection<T>(\n callback: (execute: (query: SQL) => Promise<unknown>) => Promise<T>\n ): Promise<T> {\n if (!this.client || !this.db) {\n throw new Error('Database not initialized. Call connect() first.');\n }\n\n if (this.vendor === 'sqlite') {\n return callback(async (query) => {\n try {\n return this.db.all(query);\n } catch (error: unknown) {\n if (this.isSqliteNonQueryError(error)) {\n // Normalize .run() result — see execute() for details.\n const runResult = this.db.run(query) as { changes?: number; lastInsertRowid?: number };\n return { ...runResult, affectedRows: runResult.changes ?? 0 };\n }\n throw error;\n }\n });\n }\n\n if (this.vendor === 'postgresql') {\n const poolClient = await this.client.connect();\n try {\n const { drizzle } = await import('drizzle-orm/node-postgres');\n const sessionDb = drizzle({ client: poolClient });\n return await callback(async (query) => sessionDb.execute(query));\n } finally {\n poolClient.release();\n }\n }\n\n if (this.vendor === 'mysql') {\n const mysqlConnection = await this.client.getConnection();\n try {\n const { drizzle } = await import('drizzle-orm/mysql2');\n const sessionDb = drizzle({ client: mysqlConnection });\n return await callback(async (query) => {\n const raw = await sessionDb.execute(query);\n // mysql2 returns [rows, fields] for SELECTs and [ResultSetHeader, fields]\n // for INSERT/UPDATE/DELETE. Unwrap the first element in both cases.\n if (Array.isArray(raw) && raw.length === 2) {\n return raw[0];\n }\n return raw;\n });\n } finally {\n mysqlConnection.release();\n }\n }\n\n throw new Error(`Unsupported database vendor: ${this.vendor}`);\n }\n\n /**\n * Get connection pool metrics\n *\n * Returns information about the current state of the connection pool.\n * For SQLite, returns basic connection status since it uses a single connection.\n *\n * @returns Pool metrics including total, active, idle, and waiting connections\n */\n getPoolMetrics(): {\n totalCount: number;\n activeCount: number;\n idleCount: number;\n waitingCount: number;\n } {\n if (!this.client) {\n return { totalCount: 0, activeCount: 0, idleCount: 0, waitingCount: 0 };\n }\n\n if (this.vendor === 'postgresql') {\n // pg.Pool provides these properties via public API\n const totalCount = this.client.totalCount || 0;\n const idleCount = this.client.idleCount || 0;\n const waitingCount = this.client.waitingCount || 0;\n const activeCount = Math.max(totalCount - idleCount, 0);\n\n return {\n totalCount,\n activeCount,\n idleCount,\n waitingCount,\n };\n } else if (this.vendor === 'mysql') {\n // mysql2 does not expose a stable public API for pool metrics.\n // To avoid relying on private/internal fields (e.g. _allConnections),\n // we return neutral metrics here and treat MySQL pool stats as unavailable.\n return {\n totalCount: 0,\n activeCount: 0,\n idleCount: 0,\n waitingCount: 0,\n };\n } else {\n // SQLite uses a single connection\n const totalCount = this.client.open ? 1 : 0;\n const idleCount = 0;\n const waitingCount = 0;\n const activeCount = this.client.open ? 1 : 0;\n\n return {\n totalCount,\n activeCount,\n idleCount,\n waitingCount,\n };\n }\n }\n\n /**\n * Close the database connection\n *\n * This method is public to maintain compatibility with the DatabaseConnection interface\n * and existing code (e.g., relational-query.ts). For new code, prefer using disconnect()\n * for connection lifecycle management. Note that disconnect() does NOT clean up event\n * listeners; call dispose() if you need full cleanup including listener removal.\n *\n * Note: This method coordinates with in-flight connect()/initialize() operations\n * and cancels pending reconnection timers to prevent unexpected reconnections.\n */\n async close(): Promise<void> {\n // Increment generation to cancel any in-flight initialize() operations\n this.connectionGeneration++;\n\n // Cancel any pending reconnection to prevent unexpected reconnection after close\n if (this.reconnectionTimer) {\n logger.debug('Canceling pending reconnection timer during close', {\n vendor: this.vendor,\n });\n clearTimeout(this.reconnectionTimer);\n this.reconnectionTimer = null;\n }\n\n // Wait for any in-flight connection attempt to complete before closing\n if (this.connectPromise) {\n logger.debug('Waiting for in-flight connection attempt to complete before close', {\n vendor: this.vendor,\n });\n try {\n await this.connectPromise;\n } catch {\n // Ignore errors from the connection attempt - we're closing anyway\n }\n this.connectPromise = null;\n }\n\n // Now perform the actual close operation\n if (this.client) {\n logger.info('Closing database connection', {\n vendor: this.vendor,\n state: this.state,\n });\n\n try {\n if (this.vendor === 'postgresql' || this.vendor === 'mysql') {\n await this.client.end();\n } else if (this.vendor === 'sqlite') {\n this.client.close();\n }\n\n // Set state to disconnected and emit event\n this.setState(ConnectionState.DISCONNECTED);\n this.emit('disconnected');\n\n logger.debug('Database connection closed successfully', {\n vendor: this.vendor,\n state: this.state,\n });\n } catch (error) {\n logger.error('Error closing database connection', {\n vendor: this.vendor,\n error: error instanceof Error ? error.message : String(error),\n state: this.state,\n });\n\n // Normalize error to Error object before emitting\n const normalizedError = error instanceof Error ? error : new Error(String(error));\n\n // Set state to error even if close fails\n this.setState(ConnectionState.ERROR);\n this.emit('error', normalizedError);\n\n // Don't re-throw - we still want to clean up state\n } finally {\n this.client = null;\n this.db = null;\n }\n } else if (this.state !== ConnectionState.DISCONNECTED) {\n // No client but not disconnected - set state\n this.setState(ConnectionState.DISCONNECTED);\n this.emit('disconnected');\n }\n }\n\n /**\n * Clean up resources when a connection is cancelled during initialization\n * This prevents connection leaks when disconnect() is called while initialize() is in-flight\n */\n private async cleanupCancelledConnection(): Promise<void> {\n if (!this.client) {\n return;\n }\n\n logger.debug('Cleaning up cancelled connection', {\n vendor: this.vendor,\n });\n\n try {\n // Close the client connection\n if (this.vendor === 'postgresql' || this.vendor === 'mysql') {\n await this.client.end();\n } else if (this.vendor === 'sqlite') {\n this.client.close();\n }\n } catch (error) {\n // Log but don't throw - we're cleaning up a cancelled connection\n logger.debug('Error during cancelled connection cleanup', {\n vendor: this.vendor,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n // Always clear the references\n this.client = null;\n this.db = null;\n }\n }\n\n /**\n * Check if the connection is healthy\n * @returns true if connection is healthy, false otherwise\n */\n async isHealthy(): Promise<boolean> {\n if (!this.db || !this.client) {\n logger.debug('Health check failed: connection not initialized', { vendor: this.vendor });\n return false;\n }\n\n try {\n // Execute a simple query to check connection health\n await this.execute(sql`SELECT 1`);\n logger.debug('Health check passed', { vendor: this.vendor });\n return true;\n } catch (error) {\n logger.debug('Health check failed', {\n vendor: this.vendor,\n error: error instanceof Error ? error.message : String(error)\n });\n return false;\n }\n }\n}\n","/**\n * Query executor for relational databases using Drizzle ORM\n * @module query/query-executor\n */\n\nimport { sql, type SQL } from 'drizzle-orm';\nimport { createLogger } from '@agentforge/core';\nimport type { ConnectionManager } from '../connection/connection-manager.js';\nimport type { TransactionContext } from './transaction.js';\nimport type { QueryInput, QueryExecutionResult, QueryParams } from './types.js';\nimport {\n validateSqlString,\n enforceParameterizedQueryUsage,\n} from '../utils/sql-sanitizer.js';\n\nconst logger = createLogger('agentforge:tools:data:relational:query');\n\n/**\n * Execution context for raw SQL queries.\n *\n * @property transaction - Optional active transaction to execute within\n */\nexport interface QueryExecutionContext {\n transaction?: TransactionContext;\n}\n\n/**\n * Build a parameterized SQL query using Drizzle's sql template\n * \n * This function constructs a safe, parameterized SQL query from a raw SQL string\n * and parameters. It handles both positional (array) and named (object) parameters.\n * \n * @param sqlString - Raw SQL query string with placeholders\n * @param params - Query parameters (positional array or named object)\n * @returns Drizzle SQL object with proper parameter binding\n */\nfunction buildParameterizedQuery(sqlString: string, params?: QueryParams): SQL {\n if (!params) {\n // Placeholder validation happens in enforceParameterizedQueryUsage.\n // Keep this path as a raw static query builder to avoid duplicate parsing\n // and false positives for placeholder-like tokens inside comments/literals.\n return sql.raw(sqlString);\n }\n\n if (Array.isArray(params)) {\n // Positional parameters: replace $1, $2, etc. with actual values\n // We need to parse the SQL string and inject parameters using sql template\n const sqlChunks: SQL[] = [];\n let currentPos = 0;\n let paramIndex = 0;\n\n // Match $1, $2, etc. placeholders (PostgreSQL style)\n // Also match ? placeholders (MySQL/SQLite style)\n const placeholderRegex = /\\$(\\d+)|\\?/g;\n let match: RegExpExecArray | null;\n let hasNumberedPlaceholders = false;\n let hasQuestionMarkPlaceholders = false;\n let placeholderCount = 0;\n\n while ((match = placeholderRegex.exec(sqlString)) !== null) {\n placeholderCount++;\n\n // Detect mixed placeholder styles\n if (match[1]) {\n hasNumberedPlaceholders = true;\n } else {\n hasQuestionMarkPlaceholders = true;\n }\n\n if (hasNumberedPlaceholders && hasQuestionMarkPlaceholders) {\n throw new Error('Mixed parameter styles ($n and ?) are not supported in the same query');\n }\n // Add the SQL text before the placeholder\n if (match.index > currentPos) {\n sqlChunks.push(sql.raw(sqlString.substring(currentPos, match.index)));\n }\n\n // Add the parameter value\n const paramValue = match[1]\n ? params[parseInt(match[1], 10) - 1] // $1 -> params[0]\n : params[paramIndex]; // ? -> params[paramIndex]\n\n // Validate that the parameter exists\n if (paramValue === undefined) {\n const paramRef = match[1] ? `$${match[1]}` : `? (position ${paramIndex + 1})`;\n throw new Error(`Missing parameter: ${paramRef}`);\n }\n\n sqlChunks.push(sql`${paramValue}`);\n\n if (!match[1]) {\n // Only increment for ? placeholders\n paramIndex++;\n }\n\n currentPos = match.index + match[0].length;\n }\n\n // Validate that placeholders were found if params were provided\n if (placeholderCount === 0) {\n throw new Error('Parameters provided but no placeholders ($n or ?) found in SQL query');\n }\n\n // Add any remaining SQL text\n if (currentPos < sqlString.length) {\n sqlChunks.push(sql.raw(sqlString.substring(currentPos)));\n }\n\n return sqlChunks.length > 0 ? sql.join(sqlChunks, sql.raw('')) : sql.raw(sqlString);\n } else {\n // Named parameters: replace :name, :age, etc. with actual values\n const sqlChunks: SQL[] = [];\n let currentPos = 0;\n let placeholderCount = 0;\n\n // Match :paramName placeholders, but avoid PostgreSQL casts like ::int\n const namedParamRegex = /(?<!:):(\\w+)/g;\n let match: RegExpExecArray | null;\n\n while ((match = namedParamRegex.exec(sqlString)) !== null) {\n placeholderCount++;\n\n // Add the SQL text before the placeholder\n if (match.index > currentPos) {\n sqlChunks.push(sql.raw(sqlString.substring(currentPos, match.index)));\n }\n\n // Add the parameter value\n const paramName = match[1];\n const paramValue = params[paramName];\n\n if (paramValue === undefined) {\n throw new Error(`Missing parameter: ${paramName}`);\n }\n\n sqlChunks.push(sql`${paramValue}`);\n currentPos = match.index + match[0].length;\n }\n\n // Validate that placeholders were found if params were provided\n if (placeholderCount === 0) {\n throw new Error('Parameters provided but no placeholders (:name) found in SQL query');\n }\n\n // Add any remaining SQL text\n if (currentPos < sqlString.length) {\n sqlChunks.push(sql.raw(sqlString.substring(currentPos)));\n }\n\n return sqlChunks.length > 0 ? sql.join(sqlChunks, sql.raw('')) : sql.raw(sqlString);\n }\n}\n\n/**\n * Execute a parameterized SQL query\n * \n * This function executes a SQL query with proper parameter binding to prevent\n * SQL injection. It supports SELECT, INSERT, UPDATE, DELETE, and other SQL statements.\n * \n * @param manager - ConnectionManager instance with initialized database connection\n * @param input - Query input with SQL string, parameters, and options\n * @returns Query execution result with rows, row count, and execution time\n * @throws {Error} If database is not initialized or query execution fails\n */\nexport async function executeQuery(\n manager: ConnectionManager,\n input: QueryInput,\n context?: QueryExecutionContext\n): Promise<QueryExecutionResult> {\n const startTime = Date.now();\n\n logger.debug('Executing query', {\n vendor: input.vendor,\n hasParams: !!input.params,\n paramCount: input.params\n ? (Array.isArray(input.params) ? input.params.length : Object.keys(input.params).length)\n : 0\n });\n\n try {\n // Security validation before query construction/execution\n validateSqlString(input.sql, input.vendor);\n enforceParameterizedQueryUsage(input.sql, input.params, input.vendor);\n\n // Build parameterized query\n const parameterizedQuery = buildParameterizedQuery(input.sql, input.params);\n\n // Execute query through ConnectionManager's public execute method\n const executor = context?.transaction ?? manager;\n const result = await executor.execute(parameterizedQuery);\n\n const executionTime = Date.now() - startTime;\n\n // Format result based on database response\n const rows = Array.isArray(result) ? result : (result as unknown as { rows?: unknown[] }).rows || [];\n const rowCount = (result as unknown as { rowCount?: number; affectedRows?: number }).rowCount ||\n (result as unknown as { rowCount?: number; affectedRows?: number }).affectedRows ||\n rows.length;\n\n logger.debug('Query executed successfully', {\n vendor: input.vendor,\n rowCount,\n executionTime\n });\n\n return {\n rows,\n rowCount,\n executionTime\n };\n } catch (error) {\n const executionTime = Date.now() - startTime;\n\n logger.error('Query execution failed', {\n vendor: input.vendor,\n error: error instanceof Error ? error.message : String(error),\n executionTime\n });\n\n // Let parameter validation errors propagate (they're safe and helpful for callers)\n // Only sanitize database/driver errors that might leak sensitive information\n if (error instanceof Error) {\n const message = error.message;\n // Known safe validation errors from buildParameterizedQuery\n if (message.includes('Missing parameter') ||\n message.includes('Missing parameters') ||\n message.includes('Parameters provided but no placeholders') ||\n message.includes('Mixed parameter styles') ||\n message.includes('SQL query must not be empty') ||\n message.includes('SQL query contains null bytes') ||\n message.includes('Detected dangerous SQL operation') ||\n message.includes('Parameters are required for INSERT/UPDATE/DELETE queries')) {\n throw error;\n }\n }\n\n // Return a generic error message to avoid leaking sensitive information\n // (query fragments, values, schema names, credentials, etc.)\n // Full error details are logged server-side for debugging\n throw new Error('Query execution failed. See server logs for details.', { cause: error });\n }\n}\n","/**\n * Query builder helpers for relational CRUD operations.\n * @module query/query-builder\n */\n\nimport { sql, type SQL } from 'drizzle-orm';\nimport type { DatabaseVendor } from '../types.js';\nimport {\n quoteIdentifier,\n quoteQualifiedIdentifier,\n validateIdentifier,\n validateQualifiedIdentifier,\n} from '../utils/identifier-utils.js';\n\n/**\n * Supported scalar values for INSERT payloads.\n */\nexport type InsertValue = string | number | boolean | null;\n\n/**\n * One INSERT row payload.\n */\nexport type InsertRow = Record<string, InsertValue>;\n\n/**\n * INSERT payload input shape.\n */\nexport type InsertData = InsertRow | InsertRow[];\n\n/**\n * INSERT RETURNING behavior.\n */\nexport type InsertReturningMode = 'none' | 'id' | 'row';\n\n/**\n * INSERT RETURNING configuration.\n */\nexport interface InsertReturningOptions {\n mode?: InsertReturningMode;\n idColumn?: string;\n}\n\n/**\n * Builder input for INSERT queries.\n */\nexport interface InsertQueryInput {\n table: string;\n data: InsertData;\n returning?: InsertReturningOptions;\n vendor: DatabaseVendor;\n}\n\n/**\n * Built INSERT query with normalized metadata used by execution layer.\n */\nexport interface BuiltInsertQuery {\n query: SQL | SQL[];\n rows: InsertRow[];\n returningMode: InsertReturningMode;\n idColumn: string;\n supportsReturning: boolean;\n}\n\nconst DEFAULT_ID_COLUMN = 'id';\n\nfunction normalizeInsertRows(data: InsertData): InsertRow[] {\n const rows = Array.isArray(data) ? data : [data];\n\n if (rows.length === 0) {\n throw new Error('Insert data must not be an empty array');\n }\n\n rows.forEach((row, rowIndex) => {\n if (!row || typeof row !== 'object' || Array.isArray(row)) {\n throw new Error(`Insert row at index ${rowIndex} must be an object`);\n }\n });\n\n return rows;\n}\n\nfunction collectOrderedColumns(rows: InsertRow[]): string[] {\n const seen = new Set<string>();\n const orderedColumns: string[] = [];\n\n rows.forEach((row) => {\n Object.keys(row).forEach((column) => {\n if (!seen.has(column)) {\n seen.add(column);\n orderedColumns.push(column);\n }\n });\n });\n\n return orderedColumns;\n}\n\nfunction buildValuesTuple(columns: string[], row: InsertRow): SQL {\n const valueFragments = columns.map((column) => {\n if (!Object.prototype.hasOwnProperty.call(row, column)) {\n return sql.raw('DEFAULT');\n }\n\n const value = row[column];\n\n if (value === undefined) {\n throw new Error(`Insert value for column \"${column}\" must not be undefined`);\n }\n\n return sql`${value}`;\n });\n\n return sql.join(\n [sql.raw('('), sql.join(valueFragments, sql.raw(', ')), sql.raw(')')],\n sql.raw('')\n );\n}\n\n/**\n * Check whether the given rows all share the same set of keys.\n */\nfunction rowsHaveHomogeneousColumns(rows: InsertRow[]): boolean {\n if (rows.length <= 1) return true;\n const firstKeys = Object.keys(rows[0]).sort().join(',');\n return rows.every((row) => Object.keys(row).sort().join(',') === firstKeys);\n}\n\n/**\n * Build a single-row INSERT statement using only the columns present in that row.\n * This avoids the DEFAULT keyword which SQLite does not support in VALUES tuples.\n */\nfunction buildSingleRowInsert(\n table: string,\n row: InsertRow,\n vendor: DatabaseVendor\n): SQL {\n const columns = Object.keys(row);\n\n if (columns.length === 0) {\n // No explicit columns — use DEFAULT VALUES syntax\n const quotedTable = quoteQualifiedIdentifier(table, vendor);\n return sql.raw(`INSERT INTO ${quotedTable} DEFAULT VALUES`);\n }\n\n columns.forEach((column) => validateIdentifier(column, 'Insert column'));\n const quotedTable = quoteQualifiedIdentifier(table, vendor);\n const quotedColumns = columns.map((column) => quoteIdentifier(column, vendor)).join(', ');\n\n const valueFragments = columns.map((column) => {\n const value = row[column];\n if (value === undefined) {\n throw new Error(`Insert value for column \"${column}\" must not be undefined`);\n }\n return sql`${value}`;\n });\n\n return sql.join(\n [\n sql.raw(`INSERT INTO ${quotedTable} (${quotedColumns}) VALUES (`),\n sql.join(valueFragments, sql.raw(', ')),\n sql.raw(')'),\n ],\n sql.raw('')\n );\n}\n\nfunction buildInsertValuesQuery(\n table: string,\n columns: string[],\n rows: InsertRow[],\n vendor: DatabaseVendor\n): SQL | SQL[] {\n // SQLite does not support the DEFAULT keyword inside VALUES tuples.\n // When rows have heterogeneous column sets, return separate per-row\n // INSERT statements so each row only lists its own columns and the\n // omitted columns pick up their schema defaults.\n // We return SQL[] so the caller can execute each statement individually\n // (better-sqlite3 prepared statements do not support multi-statement SQL).\n if (vendor === 'sqlite' && !rowsHaveHomogeneousColumns(rows)) {\n return rows.map((row) => buildSingleRowInsert(table, row, vendor));\n }\n\n const quotedTable = quoteQualifiedIdentifier(table, vendor);\n const quotedColumns = columns.map((column) => quoteIdentifier(column, vendor)).join(', ');\n\n const rowTuples = rows.map((row) => buildValuesTuple(columns, row));\n\n return sql.join(\n [\n sql.raw(`INSERT INTO ${quotedTable} (${quotedColumns}) VALUES `),\n sql.join(rowTuples, sql.raw(', ')),\n ],\n sql.raw('')\n );\n}\n\nfunction buildInsertDefaultValuesQuery(\n table: string,\n rowCount: number,\n vendor: DatabaseVendor\n): SQL {\n if (rowCount > 1) {\n throw new Error('Batch INSERT with only DEFAULT VALUES is not supported');\n }\n\n const quotedTable = quoteQualifiedIdentifier(table, vendor);\n return sql.raw(`INSERT INTO ${quotedTable} DEFAULT VALUES`);\n}\n\n/**\n * Build a safe parameterized INSERT query from structured input.\n */\nexport function buildInsertQuery(input: InsertQueryInput): BuiltInsertQuery {\n validateQualifiedIdentifier(input.table, 'Table name');\n\n const rows = normalizeInsertRows(input.data);\n const columns = collectOrderedColumns(rows);\n\n const returningMode: InsertReturningMode = input.returning?.mode ?? 'none';\n const idColumn = input.returning?.idColumn ?? DEFAULT_ID_COLUMN;\n const supportsReturning = input.vendor === 'postgresql' || input.vendor === 'sqlite';\n\n if (returningMode === 'id') {\n validateIdentifier(idColumn, 'Returning id column');\n } else if (input.returning?.idColumn) {\n throw new Error('returning.idColumn can only be provided when returning.mode is \"id\"');\n }\n\n if (returningMode === 'row' && input.vendor === 'mysql') {\n throw new Error('Returning full rows is not supported for mysql. Use returning.mode \"id\" or \"none\".');\n }\n\n columns.forEach((column) => validateIdentifier(column, 'Insert column'));\n\n const valuesResult = columns.length > 0\n ? buildInsertValuesQuery(input.table, columns, rows, input.vendor)\n : buildInsertDefaultValuesQuery(input.table, rows.length, input.vendor);\n\n // When the values builder returns SQL[] (heterogeneous SQLite rows),\n // each element is an independent complete INSERT statement.\n // Append RETURNING clause to each and return as SQL[].\n if (Array.isArray(valuesResult)) {\n let queries: SQL[] = valuesResult;\n\n if (returningMode !== 'none' && supportsReturning) {\n const returningClause =\n returningMode === 'id'\n ? sql.raw(` RETURNING ${quoteIdentifier(idColumn, input.vendor)}`)\n : sql.raw(' RETURNING *');\n\n queries = queries.map((q) =>\n sql.join([q, returningClause], sql.raw(''))\n );\n }\n\n return {\n query: queries,\n rows,\n returningMode,\n idColumn,\n supportsReturning,\n };\n }\n\n let query: SQL = valuesResult;\n\n if (returningMode !== 'none' && supportsReturning) {\n if (returningMode === 'id') {\n query = sql.join(\n [query, sql.raw(` RETURNING ${quoteIdentifier(idColumn, input.vendor)}`)],\n sql.raw('')\n );\n } else {\n query = sql.join([query, sql.raw(' RETURNING *')], sql.raw(''));\n }\n }\n\n return {\n query,\n rows,\n returningMode,\n idColumn,\n supportsReturning,\n };\n}\n\n/**\n * Supported scalar values for UPDATE payloads.\n */\nexport type UpdateValue = InsertValue;\n\n/**\n * UPDATE payload shape.\n */\nexport type UpdateData = Record<string, UpdateValue>;\n\n/**\n * WHERE operator types for UPDATE conditions.\n */\nexport type UpdateWhereOperator =\n | 'eq'\n | 'ne'\n | 'gt'\n | 'lt'\n | 'gte'\n | 'lte'\n | 'like'\n | 'in'\n | 'notIn'\n | 'isNull'\n | 'isNotNull';\n\n/**\n * WHERE condition for UPDATE queries.\n */\nexport interface UpdateWhereCondition {\n column: string;\n operator: UpdateWhereOperator;\n value?: string | number | boolean | null | Array<string | number>;\n}\n\n/**\n * Optional optimistic lock condition appended to WHERE.\n */\nexport interface UpdateOptimisticLock {\n column: string;\n expectedValue: string | number;\n}\n\n/**\n * Builder input for UPDATE queries.\n */\nexport interface UpdateQueryInput {\n table: string;\n data: UpdateData;\n where?: UpdateWhereCondition[];\n allowFullTableUpdate?: boolean;\n optimisticLock?: UpdateOptimisticLock;\n vendor: DatabaseVendor;\n}\n\n/**\n * Built UPDATE query with normalized metadata used by execution layer.\n */\nexport interface BuiltUpdateQuery {\n query: SQL;\n whereApplied: boolean;\n usesOptimisticLock: boolean;\n}\n\n/**\n * WHERE condition for DELETE queries.\n */\nexport interface DeleteWhereCondition {\n column: string;\n operator: UpdateWhereOperator;\n value?: string | number | boolean | null | Array<string | number>;\n}\n\n/**\n * Soft-delete configuration.\n */\nexport interface DeleteSoftDeleteOptions {\n column?: string;\n value?: string | number;\n}\n\n/**\n * Builder input for DELETE queries.\n */\nexport interface DeleteQueryInput {\n table: string;\n where?: DeleteWhereCondition[];\n allowFullTableDelete?: boolean;\n softDelete?: DeleteSoftDeleteOptions;\n vendor: DatabaseVendor;\n}\n\n/**\n * Built DELETE query with normalized metadata used by execution layer.\n */\nexport interface BuiltDeleteQuery {\n query: SQL;\n whereApplied: boolean;\n usesSoftDelete: boolean;\n softDeleteColumn?: string;\n}\n\nfunction normalizeUpdateData(data: UpdateData): UpdateData {\n if (!data || typeof data !== 'object' || Array.isArray(data)) {\n throw new Error('Update data must be an object');\n }\n\n const keys = Object.keys(data);\n if (keys.length === 0) {\n throw new Error('Update data must not be empty');\n }\n\n keys.forEach((column) => {\n validateIdentifier(column, 'Update column');\n\n if (data[column] === undefined) {\n throw new Error(`Update value for column \"${column}\" must not be undefined`);\n }\n });\n\n return data;\n}\n\nfunction buildUpdateWhereCondition(condition: UpdateWhereCondition, vendor?: DatabaseVendor): SQL {\n validateIdentifier(condition.column, 'WHERE column');\n const column = sql.raw(quoteIdentifier(condition.column, vendor));\n\n switch (condition.operator) {\n case 'eq':\n if (condition.value === undefined) {\n throw new Error(`EQ operator requires a value for column ${condition.column}`);\n }\n if (condition.value === null) {\n throw new Error('null is only allowed with isNull/isNotNull operators');\n }\n return sql`${column} = ${condition.value}`;\n case 'ne':\n if (condition.value === undefined) {\n throw new Error(`NE operator requires a value for column ${condition.column}`);\n }\n if (condition.value === null) {\n throw new Error('null is only allowed with isNull/isNotNull operators');\n }\n return sql`${column} != ${condition.value}`;\n case 'gt':\n if (typeof condition.value !== 'string' && typeof condition.value !== 'number') {\n throw new Error(`GT operator requires a string or number value for column ${condition.column}`);\n }\n return sql`${column} > ${condition.value}`;\n case 'lt':\n if (typeof condition.value !== 'string' && typeof condition.value !== 'number') {\n throw new Error(`LT operator requires a string or number value for column ${condition.column}`);\n }\n return sql`${column} < ${condition.value}`;\n case 'gte':\n if (typeof condition.value !== 'string' && typeof condition.value !== 'number') {\n throw new Error(`GTE operator requires a string or number value for column ${condition.column}`);\n }\n return sql`${column} >= ${condition.value}`;\n case 'lte':\n if (typeof condition.value !== 'string' && typeof condition.value !== 'number') {\n throw new Error(`LTE operator requires a string or number value for column ${condition.column}`);\n }\n return sql`${column} <= ${condition.value}`;\n case 'like':\n if (typeof condition.value !== 'string') {\n throw new Error(`LIKE operator requires a string value for column ${condition.column}`);\n }\n return sql`${column} LIKE ${condition.value}`;\n case 'in':\n if (!Array.isArray(condition.value) || condition.value.length === 0) {\n throw new Error(`IN operator requires a non-empty array value for column ${condition.column}`);\n }\n return sql`${column} IN (${sql.join(condition.value.map((v) => sql`${v}`), sql.raw(', '))})`;\n case 'notIn':\n if (!Array.isArray(condition.value) || condition.value.length === 0) {\n throw new Error(`NOT IN operator requires a non-empty array value for column ${condition.column}`);\n }\n return sql`${column} NOT IN (${sql.join(condition.value.map((v) => sql`${v}`), sql.raw(', '))})`;\n case 'isNull':\n if (condition.value !== undefined) {\n throw new Error(`IS NULL operator must not include value for column ${condition.column}`);\n }\n return sql`${column} IS NULL`;\n case 'isNotNull':\n if (condition.value !== undefined) {\n throw new Error(`IS NOT NULL operator must not include value for column ${condition.column}`);\n }\n return sql`${column} IS NOT NULL`;\n }\n}\n\n/**\n * Build a safe parameterized UPDATE query from structured input.\n */\nexport function buildUpdateQuery(input: UpdateQueryInput): BuiltUpdateQuery {\n validateQualifiedIdentifier(input.table, 'Table name');\n const normalizedData = normalizeUpdateData(input.data);\n\n const setClauses = Object.entries(normalizedData).map(([column, value]) => {\n const quotedColumn = sql.raw(quoteIdentifier(column, input.vendor));\n return sql`${quotedColumn} = ${value}`;\n });\n\n const whereConditions: SQL[] = (input.where ?? []).map((condition) =>\n buildUpdateWhereCondition(condition, input.vendor)\n );\n\n if (input.optimisticLock) {\n validateIdentifier(input.optimisticLock.column, 'Optimistic lock column');\n if (input.optimisticLock.expectedValue === undefined || input.optimisticLock.expectedValue === null) {\n throw new Error('Optimistic lock expectedValue must not be empty');\n }\n const lockColumn = sql.raw(quoteIdentifier(input.optimisticLock.column, input.vendor));\n whereConditions.push(sql`${lockColumn} = ${input.optimisticLock.expectedValue}`);\n }\n\n if (whereConditions.length === 0 && !input.allowFullTableUpdate) {\n throw new Error('WHERE conditions are required for UPDATE queries. Set allowFullTableUpdate=true to override.');\n }\n\n let query = sql.join(\n [\n sql.raw(`UPDATE ${quoteQualifiedIdentifier(input.table, input.vendor)} SET `),\n sql.join(setClauses, sql.raw(', ')),\n ],\n sql.raw('')\n );\n\n if (whereConditions.length > 0) {\n query = sql.join([query, sql.raw(' WHERE '), sql.join(whereConditions, sql.raw(' AND '))], sql.raw(''));\n }\n\n return {\n query,\n whereApplied: whereConditions.length > 0,\n usesOptimisticLock: !!input.optimisticLock,\n };\n}\n\n/**\n * Build a safe parameterized DELETE query from structured input.\n */\nexport function buildDeleteQuery(input: DeleteQueryInput): BuiltDeleteQuery {\n validateQualifiedIdentifier(input.table, 'Table name');\n\n const whereConditions: SQL[] = (input.where ?? []).map((condition) =>\n buildUpdateWhereCondition(condition, input.vendor)\n );\n\n if (whereConditions.length === 0 && !input.allowFullTableDelete) {\n throw new Error('WHERE conditions are required for DELETE queries. Set allowFullTableDelete=true to override.');\n }\n\n const softDeleteColumn = input.softDelete?.column ?? 'deleted_at';\n const softDeleteValue = input.softDelete?.value ?? new Date().toISOString();\n\n let query: SQL;\n if (input.softDelete) {\n validateIdentifier(softDeleteColumn, 'Soft delete column');\n const quotedColumn = sql.raw(quoteIdentifier(softDeleteColumn, input.vendor));\n query = sql.join(\n [\n sql.raw(`UPDATE ${quoteQualifiedIdentifier(input.table, input.vendor)} SET `),\n sql`${quotedColumn} = ${softDeleteValue}`,\n ],\n sql.raw('')\n );\n } else {\n query = sql.raw(`DELETE FROM ${quoteQualifiedIdentifier(input.table, input.vendor)}`);\n }\n\n if (whereConditions.length > 0) {\n query = sql.join([query, sql.raw(' WHERE '), sql.join(whereConditions, sql.raw(' AND '))], sql.raw(''));\n }\n\n return {\n query,\n whereApplied: whereConditions.length > 0,\n usesSoftDelete: !!input.softDelete,\n softDeleteColumn: input.softDelete ? softDeleteColumn : undefined,\n };\n}\n\n/**\n * ORDER BY direction for SELECT queries.\n */\nexport type SelectOrderDirection = 'asc' | 'desc';\n\n/**\n * ORDER BY clause for SELECT queries.\n */\nexport interface SelectOrderBy {\n column: string;\n direction: SelectOrderDirection;\n}\n\n/**\n * WHERE condition for SELECT queries.\n */\nexport interface SelectWhereCondition {\n column: string;\n operator: UpdateWhereOperator;\n value?: string | number | boolean | null | Array<string | number>;\n}\n\n/**\n * Builder input for SELECT queries.\n */\nexport interface SelectQueryInput {\n table: string;\n columns?: string[];\n where?: SelectWhereCondition[];\n orderBy?: SelectOrderBy[];\n limit?: number;\n offset?: number;\n vendor: DatabaseVendor;\n}\n\nfunction buildSelectWhereCondition(condition: SelectWhereCondition, vendor?: DatabaseVendor): SQL {\n validateIdentifier(condition.column, 'WHERE column');\n const column = sql.raw(quoteIdentifier(condition.column, vendor));\n\n switch (condition.operator) {\n case 'eq':\n if (condition.value === undefined) {\n throw new Error(`EQ operator requires a value for column ${condition.column}`);\n }\n if (condition.value === null) {\n throw new Error('null is only allowed with isNull/isNotNull operators');\n }\n return sql`${column} = ${condition.value}`;\n case 'ne':\n if (condition.value === undefined) {\n throw new Error(`NE operator requires a value for column ${condition.column}`);\n }\n if (condition.value === null) {\n throw new Error('null is only allowed with isNull/isNotNull operators');\n }\n return sql`${column} != ${condition.value}`;\n case 'gt':\n if (typeof condition.value !== 'string' && typeof condition.value !== 'number') {\n throw new Error(`GT operator requires a string or number value for column ${condition.column}`);\n }\n return sql`${column} > ${condition.value}`;\n case 'lt':\n if (typeof condition.value !== 'string' && typeof condition.value !== 'number') {\n throw new Error(`LT operator requires a string or number value for column ${condition.column}`);\n }\n return sql`${column} < ${condition.value}`;\n case 'gte':\n if (typeof condition.value !== 'string' && typeof condition.value !== 'number') {\n throw new Error(`GTE operator requires a string or number value for column ${condition.column}`);\n }\n return sql`${column} >= ${condition.value}`;\n case 'lte':\n if (typeof condition.value !== 'string' && typeof condition.value !== 'number') {\n throw new Error(`LTE operator requires a string or number value for column ${condition.column}`);\n }\n return sql`${column} <= ${condition.value}`;\n case 'like':\n if (typeof condition.value !== 'string') {\n throw new Error(`LIKE operator requires a string value for column ${condition.column}`);\n }\n return sql`${column} LIKE ${condition.value}`;\n case 'in':\n if (!Array.isArray(condition.value) || condition.value.length === 0) {\n throw new Error(`IN operator requires a non-empty array value for column ${condition.column}`);\n }\n return sql`${column} IN (${sql.join(condition.value.map((v) => sql`${v}`), sql.raw(', '))})`;\n case 'notIn':\n if (!Array.isArray(condition.value) || condition.value.length === 0) {\n throw new Error(`NOT IN operator requires a non-empty array value for column ${condition.column}`);\n }\n return sql`${column} NOT IN (${sql.join(condition.value.map((v) => sql`${v}`), sql.raw(', '))})`;\n case 'isNull':\n if (condition.value !== undefined) {\n throw new Error(`IS NULL operator must not include value for column ${condition.column}`);\n }\n return sql`${column} IS NULL`;\n case 'isNotNull':\n if (condition.value !== undefined) {\n throw new Error(`IS NOT NULL operator must not include value for column ${condition.column}`);\n }\n return sql`${column} IS NOT NULL`;\n }\n}\n\n/**\n * Build a safe parameterized SELECT query from structured input.\n */\nexport function buildSelectQuery(input: SelectQueryInput): SQL {\n validateQualifiedIdentifier(input.table, 'Table name');\n\n let query = sql.raw('SELECT ');\n\n if (input.columns && input.columns.length > 0) {\n input.columns.forEach((column) => validateIdentifier(column, 'SELECT column'));\n query = sql.join(\n [query, sql.raw(input.columns.map((column) => quoteIdentifier(column, input.vendor)).join(', '))],\n sql.raw('')\n );\n } else {\n query = sql.join([query, sql.raw('*')], sql.raw(''));\n }\n\n query = sql.join(\n [query, sql.raw(` FROM ${quoteQualifiedIdentifier(input.table, input.vendor)}`)],\n sql.raw('')\n );\n\n if (input.where && input.where.length > 0) {\n const whereConditions = input.where.map((condition) => buildSelectWhereCondition(condition, input.vendor));\n query = sql.join(\n [query, sql.raw(' WHERE '), sql.join(whereConditions, sql.raw(' AND '))],\n sql.raw('')\n );\n }\n\n if (input.orderBy && input.orderBy.length > 0) {\n const orderClauses = input.orderBy.map((order) => {\n validateIdentifier(order.column, 'ORDER BY column');\n return sql.raw(`${quoteIdentifier(order.column, input.vendor)} ${order.direction.toUpperCase()}`);\n });\n query = sql.join(\n [query, sql.raw(' ORDER BY '), sql.join(orderClauses, sql.raw(', '))],\n sql.raw('')\n );\n }\n\n if (input.limit !== undefined) {\n query = sql.join([query, sql` LIMIT ${input.limit}`], sql.raw(''));\n } else if (input.offset !== undefined && input.vendor === 'sqlite') {\n // SQLite requires LIMIT before OFFSET. When the caller specifies an\n // offset without a limit, inject LIMIT -1 (unlimited) so the OFFSET\n // clause is syntactically valid.\n query = sql.join([query, sql` LIMIT -1`], sql.raw(''));\n }\n\n if (input.offset !== undefined) {\n query = sql.join([query, sql` OFFSET ${input.offset}`], sql.raw(''));\n }\n\n return query;\n}\n","/**\n * Generic batch execution helpers for relational operations.\n * @module query/batch-executor\n */\n\nimport { createLogger } from '@agentforge/core';\n\nconst logger = createLogger('agentforge:tools:data:relational:batch');\n\n/** Default number of items processed per batch chunk. */\nexport const DEFAULT_BATCH_SIZE = 100;\n/** Maximum allowed batch size to prevent memory exhaustion. */\nexport const MAX_BATCH_SIZE = 5000;\nconst MAX_RETRY_ATTEMPTS = 5;\nconst MAX_RETRY_DELAY_MS = 60_000;\n\n/**\n * Progress payload emitted after each processed batch.\n */\nexport interface BatchProgressUpdate {\n operation: string;\n batchIndex: number;\n totalBatches: number;\n batchSize: number;\n processedItems: number;\n totalItems: number;\n successfulItems: number;\n failedItems: number;\n lastBatchSucceeded: boolean;\n}\n\n/**\n * Recorded batch failure metadata.\n */\nexport interface BatchFailureDetail {\n operation: string;\n batchIndex: number;\n batchSize: number;\n attempts: number;\n error: string;\n}\n\n/**\n * Runtime options for batched execution.\n */\nexport interface BatchExecutionOptions {\n batchSize?: number;\n continueOnError?: boolean;\n maxRetries?: number;\n retryDelayMs?: number;\n onProgress?: (progress: BatchProgressUpdate) => Promise<void> | void;\n}\n\n/**\n * Task descriptor for generic batched execution.\n */\nexport interface BatchExecutionTask<TItem, TResult> {\n operation: string;\n items: TItem[];\n executeBatch: (batchItems: TItem[], batchIndex: number) => Promise<TResult>;\n getBatchSuccessCount?: (result: TResult, batchItems: TItem[]) => number;\n}\n\n/**\n * Batched execution summary.\n */\nexport interface BatchExecutionResult<TResult> {\n results: TResult[];\n totalItems: number;\n processedItems: number;\n successfulItems: number;\n failedItems: number;\n totalBatches: number;\n retries: number;\n partialSuccess: boolean;\n executionTime: number;\n failures: BatchFailureDetail[];\n}\n\n/**\n * Synthetic benchmark output comparing individual and batched processing.\n */\nexport interface BatchBenchmarkResult {\n itemCount: number;\n batchSize: number;\n batchCount: number;\n individualExecutionTime: number;\n batchedExecutionTime: number;\n timeSavedMs: number;\n speedupRatio: number;\n speedupPercent: number;\n}\n\ninterface ResolvedBatchExecutionOptions {\n batchSize: number;\n continueOnError: boolean;\n maxRetries: number;\n retryDelayMs: number;\n onProgress?: (progress: BatchProgressUpdate) => Promise<void> | void;\n}\n\nfunction normalizePositiveInt(\n value: number | undefined,\n fieldName: string,\n min: number,\n max: number,\n fallback: number\n): number {\n if (value === undefined) {\n return fallback;\n }\n\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new Error(`${fieldName} must be an integer between ${min} and ${max}`);\n }\n\n return value;\n}\n\nfunction resolveOptions(options: BatchExecutionOptions): ResolvedBatchExecutionOptions {\n return {\n batchSize: normalizePositiveInt(options.batchSize, 'batchSize', 1, MAX_BATCH_SIZE, DEFAULT_BATCH_SIZE),\n continueOnError: options.continueOnError ?? true,\n maxRetries: normalizePositiveInt(options.maxRetries, 'maxRetries', 0, MAX_RETRY_ATTEMPTS, 0),\n retryDelayMs: normalizePositiveInt(options.retryDelayMs, 'retryDelayMs', 0, MAX_RETRY_DELAY_MS, 0),\n onProgress: options.onProgress,\n };\n}\n\nfunction chunkItems<TItem>(items: TItem[], chunkSize: number): TItem[][] {\n if (items.length === 0) {\n return [];\n }\n\n const chunks: TItem[][] = [];\n\n for (let start = 0; start < items.length; start += chunkSize) {\n chunks.push(items.slice(start, start + chunkSize));\n }\n\n return chunks;\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\n/**\n * Execute operation items in batches with retry and progress callbacks.\n */\nexport async function executeBatchedTask<TItem, TResult>(\n task: BatchExecutionTask<TItem, TResult>,\n options: BatchExecutionOptions = {}\n): Promise<BatchExecutionResult<TResult>> {\n const startTime = Date.now();\n const resolved = resolveOptions(options);\n const batches = chunkItems(task.items, resolved.batchSize);\n\n const results: TResult[] = [];\n const failures: BatchFailureDetail[] = [];\n\n let processedItems = 0;\n let successfulItems = 0;\n let failedItems = 0;\n let retries = 0;\n\n logger.debug('Starting batched execution', {\n operation: task.operation,\n totalItems: task.items.length,\n totalBatches: batches.length,\n batchSize: resolved.batchSize,\n continueOnError: resolved.continueOnError,\n maxRetries: resolved.maxRetries,\n });\n\n for (const [batchIndex, batchItems] of batches.entries()) {\n let attempts = 0;\n let lastError: unknown;\n\n while (attempts <= resolved.maxRetries) {\n try {\n attempts += 1;\n\n const result = await task.executeBatch(batchItems, batchIndex);\n const successCount = Math.min(\n Math.max(task.getBatchSuccessCount?.(result, batchItems) ?? batchItems.length, 0),\n batchItems.length\n );\n\n results.push(result);\n\n processedItems += batchItems.length;\n successfulItems += successCount;\n failedItems += batchItems.length - successCount;\n\n await resolved.onProgress?.({\n operation: task.operation,\n batchIndex,\n totalBatches: batches.length,\n batchSize: batchItems.length,\n processedItems,\n totalItems: task.items.length,\n successfulItems,\n failedItems,\n lastBatchSucceeded: true,\n });\n\n break;\n } catch (error) {\n lastError = error;\n\n if (attempts <= resolved.maxRetries) {\n retries += 1;\n\n logger.warn('Batch execution failed, retrying', {\n operation: task.operation,\n batchIndex,\n attempts,\n maxRetries: resolved.maxRetries,\n error: toErrorMessage(error),\n });\n\n if (resolved.retryDelayMs > 0) {\n await delay(resolved.retryDelayMs);\n }\n\n continue;\n }\n\n const failure: BatchFailureDetail = {\n operation: task.operation,\n batchIndex,\n batchSize: batchItems.length,\n attempts,\n error: toErrorMessage(error),\n };\n\n failures.push(failure);\n\n processedItems += batchItems.length;\n failedItems += batchItems.length;\n\n await resolved.onProgress?.({\n operation: task.operation,\n batchIndex,\n totalBatches: batches.length,\n batchSize: batchItems.length,\n processedItems,\n totalItems: task.items.length,\n successfulItems,\n failedItems,\n lastBatchSucceeded: false,\n });\n\n if (!resolved.continueOnError) {\n throw new Error(\n `Batch ${batchIndex + 1}/${batches.length} failed for ${task.operation}: ${failure.error}`,\n { cause: lastError }\n );\n }\n\n logger.warn('Batch execution failed and was recorded for partial success', {\n operation: task.operation,\n batchIndex,\n attempts,\n error: failure.error,\n });\n\n break;\n }\n }\n }\n\n const executionTime = Date.now() - startTime;\n const partialSuccess = successfulItems > 0 && failedItems > 0;\n\n logger.debug('Batched execution completed', {\n operation: task.operation,\n totalItems: task.items.length,\n successfulItems,\n failedItems,\n retries,\n partialSuccess,\n executionTime,\n });\n\n return {\n results,\n totalItems: task.items.length,\n processedItems,\n successfulItems,\n failedItems,\n totalBatches: batches.length,\n retries,\n partialSuccess,\n executionTime,\n failures,\n };\n}\n\n/**\n * Benchmark individual vs batched execution.\n *\n * Note: callers should run this only for idempotent or isolated workloads.\n */\nexport async function benchmarkBatchExecution<TItem, TIndividualResult, TBatchResult>(params: {\n items: TItem[];\n batchSize?: number;\n runIndividual: (item: TItem, index: number) => Promise<TIndividualResult>;\n runBatch: (batchItems: TItem[], batchIndex: number) => Promise<TBatchResult>;\n}): Promise<BatchBenchmarkResult> {\n const batchSize = normalizePositiveInt(\n params.batchSize,\n 'batchSize',\n 1,\n MAX_BATCH_SIZE,\n DEFAULT_BATCH_SIZE\n );\n const batches = chunkItems(params.items, batchSize);\n\n const individualStart = Date.now();\n for (const [index, item] of params.items.entries()) {\n await params.runIndividual(item, index);\n }\n const individualExecutionTime = Date.now() - individualStart;\n\n const batchStart = Date.now();\n for (const [batchIndex, batchItems] of batches.entries()) {\n await params.runBatch(batchItems, batchIndex);\n }\n const batchedExecutionTime = Date.now() - batchStart;\n\n const timeSavedMs = Math.max(individualExecutionTime - batchedExecutionTime, 0);\n const speedupRatio = batchedExecutionTime > 0\n ? individualExecutionTime / batchedExecutionTime\n : 0;\n const speedupPercent = individualExecutionTime > 0\n ? (timeSavedMs / individualExecutionTime) * 100\n : 0;\n\n logger.debug('Batch benchmark completed', {\n itemCount: params.items.length,\n batchCount: batches.length,\n batchSize,\n individualExecutionTime,\n batchedExecutionTime,\n timeSavedMs,\n speedupPercent,\n });\n\n return {\n itemCount: params.items.length,\n batchSize,\n batchCount: batches.length,\n individualExecutionTime,\n batchedExecutionTime,\n timeSavedMs,\n speedupRatio,\n speedupPercent,\n };\n}\n","/**\n * Streaming SELECT executor for large result sets.\n * @module query/stream-executor\n */\n\nimport { Readable } from 'node:stream';\nimport { createLogger } from '@agentforge/core';\nimport { buildSelectQuery, type SelectQueryInput } from './query-builder.js';\nimport type { SqlExecutor } from './types.js';\n\nconst logger = createLogger('agentforge:tools:data:relational:stream');\n\n/** Default number of rows fetched per streaming chunk. */\nexport const DEFAULT_CHUNK_SIZE = 100;\nconst MAX_CHUNK_SIZE = 5000;\nconst DEFAULT_SAMPLE_SIZE = 50;\n\n/**\n * Memory usage information captured during streaming execution.\n */\nexport interface StreamingMemoryUsage {\n startHeapUsed: number;\n peakHeapUsed: number;\n endHeapUsed: number;\n deltaHeapUsed: number;\n}\n\n/**\n * One streamed chunk payload.\n */\nexport interface StreamingSelectChunk {\n chunkIndex: number;\n offset: number;\n rows: unknown[];\n}\n\n/**\n * Streaming execution options.\n */\nexport interface StreamingSelectOptions {\n chunkSize?: number;\n maxRows?: number;\n sampleSize?: number;\n collectAllRows?: boolean;\n signal?: AbortSignal;\n onChunk?: (chunk: StreamingSelectChunk) => Promise<void> | void;\n}\n\n/**\n * Streaming execution result.\n */\nexport interface StreamingSelectResult {\n rows: unknown[];\n rowCount: number;\n chunkCount: number;\n executionTime: number;\n cancelled: boolean;\n memoryUsage: StreamingMemoryUsage;\n}\n\n/**\n * Optional benchmark result comparing regular vs streaming SELECT execution.\n */\nexport interface StreamingBenchmarkResult {\n nonStreamingExecutionTime: number;\n nonStreamingPeakHeapUsed: number;\n streamingExecutionTime: number;\n streamingPeakHeapUsed: number;\n memorySavedBytes: number;\n memorySavedPercent: number;\n}\n\nfunction normalizeBoundedInt(\n value: number | undefined,\n fieldName: string,\n min: number,\n max: number,\n fallback: number\n): number {\n if (value === undefined) {\n return fallback;\n }\n\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new Error(`${fieldName} must be an integer between ${min} and ${max}`);\n }\n\n return value;\n}\n\nfunction normalizePositiveInt(\n value: number | undefined,\n fieldName: string,\n fallback?: number\n): number | undefined {\n if (value === undefined) {\n return fallback;\n }\n\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${fieldName} must be a positive integer`);\n }\n\n return value;\n}\n\nfunction extractRows(result: unknown): unknown[] {\n if (Array.isArray(result)) {\n return result;\n }\n\n return (result as { rows?: unknown[] }).rows ?? [];\n}\n\nfunction isCancelledError(error: unknown): boolean {\n return error instanceof Error && error.message.includes('Stream cancelled by caller');\n}\n\nfunction resolveTotalRowsLimit(input: SelectQueryInput, options: StreamingSelectOptions): number | undefined {\n const inputLimit = normalizePositiveInt(input.limit, 'limit');\n const maxRows = normalizePositiveInt(options.maxRows, 'maxRows');\n\n if (inputLimit === undefined) {\n return maxRows;\n }\n\n if (maxRows === undefined) {\n return inputLimit;\n }\n\n return Math.min(inputLimit, maxRows);\n}\n\n/**\n * Yield SELECT rows chunk-by-chunk using LIMIT/OFFSET pagination.\n *\n * NOTE:\n * OFFSET-based pagination can degrade on very large offsets because many SQL\n * engines must scan/skip intermediate rows. For very large datasets, prefer\n * keyset/cursor pagination when available.\n */\nexport async function* streamSelectChunks(\n executor: SqlExecutor,\n input: SelectQueryInput,\n options: StreamingSelectOptions = {}\n): AsyncGenerator<StreamingSelectChunk> {\n const chunkSize = normalizeBoundedInt(options.chunkSize, 'chunkSize', 1, MAX_CHUNK_SIZE, DEFAULT_CHUNK_SIZE);\n const baseOffset = input.offset ?? 0;\n const totalRowsLimit = resolveTotalRowsLimit(input, options);\n\n let processedRows = 0;\n let chunkIndex = 0;\n\n while (true) {\n if (options.signal?.aborted) {\n throw new Error('Stream cancelled by caller.');\n }\n\n const remainingRows = totalRowsLimit === undefined ? chunkSize : totalRowsLimit - processedRows;\n if (remainingRows <= 0) {\n return;\n }\n\n const pageLimit = Math.min(chunkSize, remainingRows);\n const pageOffset = baseOffset + processedRows;\n\n const query = buildSelectQuery({\n ...input,\n limit: pageLimit,\n offset: pageOffset,\n });\n\n const result = await executor.execute(query);\n const rows = extractRows(result);\n\n if (rows.length === 0) {\n return;\n }\n\n yield {\n chunkIndex,\n offset: pageOffset,\n rows,\n };\n\n processedRows += rows.length;\n chunkIndex += 1;\n\n if (rows.length < pageLimit) {\n return;\n }\n }\n}\n\n/**\n * Create a Node.js Readable stream that emits SELECT chunks in object mode.\n */\nexport function createSelectReadableStream(\n executor: SqlExecutor,\n input: SelectQueryInput,\n options: StreamingSelectOptions = {}\n): Readable {\n return Readable.from(streamSelectChunks(executor, input, options), {\n objectMode: true,\n highWaterMark: 1,\n });\n}\n\n/**\n * Execute a SELECT query in streaming mode while tracking memory usage.\n */\nexport async function executeStreamingSelect(\n executor: SqlExecutor,\n input: SelectQueryInput,\n options: StreamingSelectOptions = {}\n): Promise<StreamingSelectResult> {\n const startTime = Date.now();\n const collectedRows: unknown[] = [];\n\n const sampleSize = normalizeBoundedInt(\n options.sampleSize,\n 'sampleSize',\n 0,\n 5000,\n DEFAULT_SAMPLE_SIZE\n );\n\n let rowCount = 0;\n let chunkCount = 0;\n let cancelled = false;\n\n const startHeapUsed = process.memoryUsage().heapUsed;\n let peakHeapUsed = startHeapUsed;\n\n const stream = createSelectReadableStream(executor, input, options);\n const abortHandler = () => {\n stream.destroy(new Error('Stream cancelled by caller.'));\n };\n\n options.signal?.addEventListener('abort', abortHandler, { once: true });\n\n try {\n for await (const chunk of stream as AsyncIterable<StreamingSelectChunk>) {\n chunkCount += 1;\n rowCount += chunk.rows.length;\n\n if (options.collectAllRows) {\n collectedRows.push(...chunk.rows);\n } else if (sampleSize > 0 && collectedRows.length < sampleSize) {\n const remaining = sampleSize - collectedRows.length;\n collectedRows.push(...chunk.rows.slice(0, remaining));\n }\n\n if (options.onChunk) {\n await options.onChunk(chunk);\n }\n\n peakHeapUsed = Math.max(peakHeapUsed, process.memoryUsage().heapUsed);\n }\n } catch (error) {\n if (isCancelledError(error)) {\n cancelled = true;\n } else {\n throw error;\n }\n } finally {\n options.signal?.removeEventListener('abort', abortHandler);\n }\n\n const endHeapUsed = process.memoryUsage().heapUsed;\n peakHeapUsed = Math.max(peakHeapUsed, endHeapUsed);\n\n const executionTime = Date.now() - startTime;\n\n logger.debug('Streaming SELECT execution completed', {\n table: input.table,\n vendor: input.vendor,\n chunkCount,\n rowCount,\n executionTime,\n cancelled,\n chunkSize: options.chunkSize ?? DEFAULT_CHUNK_SIZE,\n });\n\n return {\n rows: collectedRows,\n rowCount,\n chunkCount,\n executionTime,\n cancelled,\n memoryUsage: {\n startHeapUsed,\n peakHeapUsed,\n endHeapUsed,\n deltaHeapUsed: endHeapUsed - startHeapUsed,\n },\n };\n}\n\n/**\n * Benchmark memory usage of regular SELECT execution vs streaming execution.\n *\n * NOTE:\n * This benchmark intentionally executes the SELECT query twice (one regular,\n * one streaming). Use only with side-effect-free queries.\n */\nexport async function benchmarkStreamingSelectMemory(\n executor: SqlExecutor,\n input: SelectQueryInput,\n options: StreamingSelectOptions = {}\n): Promise<StreamingBenchmarkResult> {\n logger.warn('Running streaming benchmark will execute the SELECT query twice (regular + streaming).', {\n table: input.table,\n vendor: input.vendor,\n });\n\n const nonStreamingStartHeapUsed = process.memoryUsage().heapUsed;\n const nonStreamingStartTime = Date.now();\n\n const nonStreamingResult = await executor.execute(buildSelectQuery(input));\n const nonStreamingRows = extractRows(nonStreamingResult);\n\n const nonStreamingExecutionTime = Date.now() - nonStreamingStartTime;\n const nonStreamingPeakHeapUsed = Math.max(nonStreamingStartHeapUsed, process.memoryUsage().heapUsed);\n\n const streamingResult = await executeStreamingSelect(executor, input, {\n ...options,\n collectAllRows: false,\n sampleSize: 0,\n });\n\n const memorySavedBytes = Math.max(\n nonStreamingPeakHeapUsed - streamingResult.memoryUsage.peakHeapUsed,\n 0\n );\n\n const memorySavedPercent = nonStreamingPeakHeapUsed > 0\n ? (memorySavedBytes / nonStreamingPeakHeapUsed) * 100\n : 0;\n\n logger.debug('Streaming benchmark completed', {\n table: input.table,\n vendor: input.vendor,\n nonStreamingRows: nonStreamingRows.length,\n nonStreamingExecutionTime,\n streamingExecutionTime: streamingResult.executionTime,\n memorySavedBytes,\n memorySavedPercent,\n });\n\n return {\n nonStreamingExecutionTime,\n nonStreamingPeakHeapUsed,\n streamingExecutionTime: streamingResult.executionTime,\n streamingPeakHeapUsed: streamingResult.memoryUsage.peakHeapUsed,\n memorySavedBytes,\n memorySavedPercent,\n };\n}\n","/**\n * Transaction helpers for relational databases.\n * @module query/transaction\n */\n\nimport { createLogger } from '@agentforge/core';\nimport { sql, type SQL } from 'drizzle-orm';\nimport type { ConnectionManager } from '../connection/connection-manager.js';\nimport type { DatabaseVendor } from '../types.js';\nimport type { SqlExecutor } from './types.js';\n\nconst logger = createLogger('agentforge:tools:data:relational:transaction');\n\nlet transactionSequence = 0;\n\n/**\n * SQL transaction isolation level.\n *\n * Determines the visibility of changes made by concurrent transactions.\n * Supported by PostgreSQL and MySQL. SQLite supports `'read uncommitted'`\n * via `PRAGMA read_uncommitted = 1`; other levels are silently ignored\n * (SQLite uses serializable semantics by default).\n */\nexport type TransactionIsolationLevel =\n | 'read uncommitted'\n | 'read committed'\n | 'repeatable read'\n | 'serializable';\n\n/**\n * Options for configuring a database transaction.\n *\n * @property isolationLevel - SQL isolation level for the transaction\n * @property timeoutMs - Maximum duration in milliseconds before the transaction is rolled back\n */\nexport interface TransactionOptions {\n isolationLevel?: TransactionIsolationLevel;\n timeoutMs?: number;\n}\n\ninterface ResolvedTransactionOptions {\n isolationLevel?: TransactionIsolationLevel;\n timeoutMs?: number;\n}\n\nconst SAVEPOINT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/**\n * Active transaction handle with savepoint support.\n *\n * Extends {@link SqlExecutor} so queries can be executed within the transaction.\n * The transaction is automatically rolled back if an error occurs and is not\n * explicitly committed.\n *\n * @property id - Unique identifier for this transaction\n * @property vendor - Database vendor this transaction belongs to\n */\nexport interface TransactionContext extends SqlExecutor {\n id: string;\n vendor: DatabaseVendor;\n /** Whether the transaction is still active (not committed or rolled back). */\n isActive(): boolean;\n /** Commit all changes made within this transaction. */\n commit(): Promise<void>;\n /** Roll back all changes made within this transaction. */\n rollback(): Promise<void>;\n /** Create a savepoint within this transaction. Returns the savepoint name. */\n createSavepoint(name?: string): Promise<string>;\n /** Roll back to a previously created savepoint. */\n rollbackToSavepoint(name: string): Promise<void>;\n /** Release a savepoint, making its changes permanent within the transaction. */\n releaseSavepoint(name: string): Promise<void>;\n /** Execute an operation within a nested savepoint, with automatic rollback on failure. */\n withSavepoint<T>(operation: (transaction: TransactionContext) => Promise<T>, name?: string): Promise<T>;\n}\n\nfunction toSqlIsolationLevel(level: TransactionIsolationLevel): string {\n switch (level) {\n case 'read uncommitted':\n return 'READ UNCOMMITTED';\n case 'read committed':\n return 'READ COMMITTED';\n case 'repeatable read':\n return 'REPEATABLE READ';\n case 'serializable':\n return 'SERIALIZABLE';\n }\n}\n\nfunction resolveOptions(options?: TransactionOptions): ResolvedTransactionOptions {\n if (!options) {\n return {};\n }\n\n if (options.timeoutMs !== undefined && (!Number.isFinite(options.timeoutMs) || options.timeoutMs <= 0)) {\n throw new Error('Transaction timeout must be a positive number');\n }\n\n return {\n isolationLevel: options.isolationLevel,\n timeoutMs: options.timeoutMs,\n };\n}\n\nfunction withTimeout<T>(\n operation: Promise<T>,\n timeoutMs?: number,\n onTimeout?: () => void\n): Promise<T> {\n if (!timeoutMs) {\n return operation;\n }\n\n return new Promise<T>((resolve, reject) => {\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n onTimeout?.();\n reject(new Error(`Transaction timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n operation\n .then((result) => {\n if (timedOut) {\n return;\n }\n clearTimeout(timer);\n resolve(result);\n })\n .catch((error) => {\n if (timedOut) {\n return;\n }\n clearTimeout(timer);\n reject(error);\n });\n });\n}\n\nclass ManagedTransaction implements TransactionContext {\n public readonly id: string;\n public readonly vendor: DatabaseVendor;\n private readonly options: ResolvedTransactionOptions;\n private readonly executeQuery: (query: SQL) => Promise<unknown>;\n private completed = false;\n private cancelledReason: string | null = null;\n private savepointCounter = 0;\n private sqliteReadUncommittedOriginal: 0 | 1 | null = null;\n private shouldRestoreSqliteReadUncommitted = false;\n\n constructor(args: {\n id: string;\n vendor: DatabaseVendor;\n executeQuery: (query: SQL) => Promise<unknown>;\n options: ResolvedTransactionOptions;\n }) {\n this.id = args.id;\n this.vendor = args.vendor;\n this.executeQuery = args.executeQuery;\n this.options = args.options;\n }\n\n isActive(): boolean {\n return !this.completed;\n }\n\n async execute(query: SQL): Promise<unknown> {\n if (this.cancelledReason) {\n throw new Error(this.cancelledReason);\n }\n\n if (!this.isActive()) {\n throw new Error('Transaction is no longer active');\n }\n\n return this.executeQuery(query);\n }\n\n async begin(): Promise<void> {\n if (this.vendor === 'mysql') {\n // MySQL requires isolation level to be set before BEGIN\n // for it to reliably apply to the current transaction.\n await this.applyIsolationLevel();\n await this.executeQuery(sql.raw('BEGIN'));\n return;\n }\n\n await this.executeQuery(sql.raw('BEGIN'));\n await this.applyIsolationLevel();\n }\n\n cancel(reason: string): void {\n if (!this.cancelledReason) {\n this.cancelledReason = reason;\n }\n }\n\n async commit(): Promise<void> {\n if (!this.isActive()) {\n return;\n }\n\n await this.executeQuery(sql.raw('COMMIT'));\n await this.restoreSqliteIsolationIfNeeded();\n this.completed = true;\n }\n\n async rollback(): Promise<void> {\n if (!this.isActive()) {\n return;\n }\n\n await this.executeQuery(sql.raw('ROLLBACK'));\n await this.restoreSqliteIsolationIfNeeded();\n this.completed = true;\n }\n\n async createSavepoint(name?: string): Promise<string> {\n if (!this.isActive()) {\n throw new Error('Transaction is no longer active');\n }\n\n const savepointName = this.normalizeSavepointName(name ?? `sp_${++this.savepointCounter}`);\n await this.executeQuery(sql.raw(`SAVEPOINT ${savepointName}`));\n return savepointName;\n }\n\n async rollbackToSavepoint(name: string): Promise<void> {\n if (!this.isActive()) {\n throw new Error('Transaction is no longer active');\n }\n\n const savepointName = this.normalizeSavepointName(name);\n await this.executeQuery(sql.raw(`ROLLBACK TO SAVEPOINT ${savepointName}`));\n }\n\n async releaseSavepoint(name: string): Promise<void> {\n if (!this.isActive()) {\n throw new Error('Transaction is no longer active');\n }\n\n const savepointName = this.normalizeSavepointName(name);\n await this.executeQuery(sql.raw(`RELEASE SAVEPOINT ${savepointName}`));\n }\n\n async withSavepoint<T>(\n operation: (transaction: TransactionContext) => Promise<T>,\n name?: string\n ): Promise<T> {\n const savepointName = await this.createSavepoint(name);\n\n try {\n const result = await operation(this);\n await this.releaseSavepoint(savepointName);\n return result;\n } catch (error) {\n await this.rollbackToSavepoint(savepointName);\n try {\n await this.releaseSavepoint(savepointName);\n } catch {\n // Ignore release errors after rollback-to-savepoint.\n }\n throw error;\n }\n }\n\n private async applyIsolationLevel(): Promise<void> {\n if (!this.options.isolationLevel) {\n return;\n }\n\n const isolationSql = toSqlIsolationLevel(this.options.isolationLevel);\n\n if (this.vendor === 'sqlite') {\n if (this.options.isolationLevel === 'read uncommitted') {\n this.sqliteReadUncommittedOriginal = await this.getSqliteReadUncommittedState();\n await this.executeQuery(sql.raw('PRAGMA read_uncommitted = 1'));\n this.shouldRestoreSqliteReadUncommitted = true;\n } else {\n // SQLite defaults to SERIALIZABLE-like behavior for transactions.\n logger.debug('Ignoring SQLite isolation level override', {\n transactionId: this.id,\n isolationLevel: this.options.isolationLevel,\n });\n }\n return;\n }\n\n await this.executeQuery(sql.raw(`SET TRANSACTION ISOLATION LEVEL ${isolationSql}`));\n }\n\n private normalizeSavepointName(name: string): string {\n if (!SAVEPOINT_NAME_PATTERN.test(name)) {\n throw new Error(\n 'Invalid savepoint name. Use only letters, numbers, and underscores, and start with a letter or underscore.'\n );\n }\n\n return name;\n }\n\n private async restoreSqliteIsolationIfNeeded(): Promise<void> {\n if (!this.shouldRestoreSqliteReadUncommitted) {\n return;\n }\n\n try {\n const targetValue = this.sqliteReadUncommittedOriginal ?? 0;\n await this.executeQuery(sql.raw(`PRAGMA read_uncommitted = ${targetValue}`));\n } catch (error) {\n logger.warn('Failed to restore SQLite read_uncommitted pragma', {\n transactionId: this.id,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n this.shouldRestoreSqliteReadUncommitted = false;\n }\n }\n\n private async getSqliteReadUncommittedState(): Promise<0 | 1 | null> {\n try {\n const result = await this.executeQuery(sql.raw('PRAGMA read_uncommitted'));\n const rows = Array.isArray(result)\n ? result\n : ((result as { rows?: unknown[] }).rows ?? []);\n\n const first = rows[0];\n if (first && typeof first === 'object') {\n const value = (first as Record<string, unknown>).read_uncommitted;\n if (typeof value === 'number') {\n return value === 1 ? 1 : 0;\n }\n }\n } catch {\n // If introspection fails, we'll restore to default (0) in finalize path.\n }\n\n return null;\n }\n}\n\n/**\n * Execute a callback inside a database transaction.\n *\n * Automatically commits on success and rolls back on failure.\n */\nexport async function withTransaction<T>(\n manager: ConnectionManager,\n operation: (transaction: TransactionContext) => Promise<T>,\n options?: TransactionOptions\n): Promise<T> {\n const startTime = Date.now();\n const resolvedOptions = resolveOptions(options);\n const transactionId = `tx-${++transactionSequence}`;\n const vendor = manager.getVendor();\n\n logger.debug('Starting transaction', {\n transactionId,\n vendor,\n isolationLevel: resolvedOptions.isolationLevel,\n timeoutMs: resolvedOptions.timeoutMs,\n });\n\n return manager.executeInConnection(async (executeQuery) => {\n const transaction = new ManagedTransaction({\n id: transactionId,\n vendor,\n executeQuery,\n options: resolvedOptions,\n });\n\n await transaction.begin();\n\n try {\n const result = await withTimeout(\n operation(transaction),\n resolvedOptions.timeoutMs,\n () => {\n if (resolvedOptions.timeoutMs) {\n transaction.cancel(`Transaction timed out after ${resolvedOptions.timeoutMs}ms`);\n }\n }\n );\n\n if (transaction.isActive()) {\n await transaction.commit();\n }\n\n logger.debug('Transaction committed', {\n transactionId,\n vendor,\n duration: Date.now() - startTime,\n });\n\n return result;\n } catch (error) {\n if (transaction.isActive()) {\n try {\n await transaction.rollback();\n } catch (rollbackError) {\n logger.error('Transaction rollback failed', {\n transactionId,\n vendor,\n error: rollbackError instanceof Error ? rollbackError.message : String(rollbackError),\n });\n }\n }\n\n logger.error('Transaction failed', {\n transactionId,\n vendor,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n });\n}\n","/**\n * Shared validation constants for relational schema introspection.\n */\n\n/**\n * Valid table filter pattern:\n * - table\n * - schema.table\n */\nexport const VALID_TABLE_FILTER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)?$/;\n","/**\n * Schema inspector for relational databases.\n * @module schema/schema-inspector\n */\n\nimport { createLogger } from '@agentforge/core';\nimport type { ConnectionManager } from '../connection/connection-manager.js';\nimport { executeQuery } from '../query/query-executor.js';\nimport type { DatabaseVendor } from '../types.js';\nimport { VALID_TABLE_FILTER_PATTERN } from './validation.js';\nimport type {\n ColumnSchema,\n DatabaseSchema,\n ForeignKeySchema,\n IndexSchema,\n SchemaInspectOptions,\n SchemaInspectorConfig,\n TableSchema,\n} from './types.js';\n\nconst logger = createLogger('agentforge:tools:data:relational:schema-inspector');\n\nconst DEFAULT_CACHE_TTL_MS = 60_000;\n\ninterface QueryRow {\n [key: string]: unknown;\n}\n\ninterface TableRef {\n schemaName?: string;\n tableName: string;\n}\n\ninterface CacheEntry {\n expiresAt: number;\n schema: DatabaseSchema;\n}\n\nconst schemaCache = new Map<string, CacheEntry>();\n\nconst POSTGRES_TABLES_QUERY = `\nSELECT\n table_schema AS schema_name,\n table_name\nFROM information_schema.tables\nWHERE table_type = 'BASE TABLE'\n AND table_schema NOT IN ('pg_catalog', 'information_schema')\nORDER BY table_schema, table_name\n`;\n\nconst POSTGRES_COLUMNS_QUERY = `\nSELECT\n table_schema AS schema_name,\n table_name,\n column_name,\n data_type,\n is_nullable,\n column_default\nFROM information_schema.columns\nWHERE table_schema NOT IN ('pg_catalog', 'information_schema')\nORDER BY table_schema, table_name, ordinal_position\n`;\n\nconst POSTGRES_PRIMARY_KEYS_QUERY = `\nSELECT\n kcu.table_schema AS schema_name,\n kcu.table_name,\n kcu.column_name,\n kcu.ordinal_position AS key_position\nFROM information_schema.table_constraints tc\nJOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n AND tc.table_name = kcu.table_name\nWHERE tc.constraint_type = 'PRIMARY KEY'\nORDER BY kcu.table_schema, kcu.table_name, kcu.ordinal_position\n`;\n\nconst POSTGRES_FOREIGN_KEYS_QUERY = `\nSELECT\n tc.table_schema AS schema_name,\n tc.table_name,\n tc.constraint_name,\n kcu.column_name,\n ccu.table_schema AS referenced_schema_name,\n ccu.table_name AS referenced_table_name,\n ccu.column_name AS referenced_column_name\nFROM information_schema.table_constraints tc\nJOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\nJOIN information_schema.constraint_column_usage ccu\n ON ccu.constraint_name = tc.constraint_name\n AND ccu.table_schema = tc.table_schema\nWHERE tc.constraint_type = 'FOREIGN KEY'\nORDER BY tc.table_schema, tc.table_name, tc.constraint_name, kcu.ordinal_position\n`;\n\nconst POSTGRES_INDEXES_QUERY = `\nSELECT\n ns.nspname AS schema_name,\n tbl.relname AS table_name,\n idx.relname AS index_name,\n ix.indisunique AS is_unique,\n att.attname AS column_name,\n ord.ordinality AS column_position\nFROM pg_class tbl\nJOIN pg_namespace ns\n ON ns.oid = tbl.relnamespace\nJOIN pg_index ix\n ON ix.indrelid = tbl.oid\nJOIN pg_class idx\n ON idx.oid = ix.indexrelid\nJOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS ord(attnum, ordinality)\n ON true\nJOIN pg_attribute att\n ON att.attrelid = tbl.oid\n AND att.attnum = ord.attnum\nWHERE tbl.relkind = 'r'\n AND ns.nspname NOT IN ('pg_catalog', 'information_schema')\n AND ix.indisprimary = false\nORDER BY ns.nspname, tbl.relname, idx.relname, ord.ordinality\n`;\n\nconst MYSQL_TABLES_QUERY = `\nSELECT\n table_schema AS schema_name,\n table_name AS table_name\nFROM information_schema.tables\nWHERE table_type = 'BASE TABLE'\n AND table_schema = DATABASE()\nORDER BY table_name\n`;\n\nconst MYSQL_COLUMNS_QUERY = `\nSELECT\n table_schema AS schema_name,\n table_name AS table_name,\n column_name AS column_name,\n column_type AS data_type,\n is_nullable AS is_nullable,\n column_default AS column_default\nFROM information_schema.columns\nWHERE table_schema = DATABASE()\nORDER BY table_name, ordinal_position\n`;\n\nconst MYSQL_PRIMARY_KEYS_QUERY = `\nSELECT\n table_schema AS schema_name,\n table_name AS table_name,\n column_name AS column_name,\n ordinal_position AS key_position\nFROM information_schema.key_column_usage\nWHERE table_schema = DATABASE()\n AND constraint_name = 'PRIMARY'\nORDER BY table_name, ordinal_position\n`;\n\nconst MYSQL_FOREIGN_KEYS_QUERY = `\nSELECT\n table_schema AS schema_name,\n table_name AS table_name,\n constraint_name AS constraint_name,\n column_name AS column_name,\n referenced_table_schema AS referenced_schema_name,\n referenced_table_name AS referenced_table_name,\n referenced_column_name AS referenced_column_name\nFROM information_schema.key_column_usage\nWHERE table_schema = DATABASE()\n AND referenced_table_name IS NOT NULL\nORDER BY table_name, constraint_name, ordinal_position\n`;\n\nconst MYSQL_INDEXES_QUERY = `\nSELECT\n table_schema AS schema_name,\n table_name AS table_name,\n index_name AS index_name,\n non_unique AS non_unique,\n column_name AS column_name,\n seq_in_index AS seq_in_index\nFROM information_schema.statistics\nWHERE table_schema = DATABASE()\n AND index_name <> 'PRIMARY'\nORDER BY table_name, index_name, seq_in_index\n`;\n\nconst SQLITE_TABLES_QUERY = `\nSELECT\n name AS table_name\nFROM sqlite_master\nWHERE type = 'table'\n AND name NOT LIKE 'sqlite_%'\nORDER BY name\n`;\n\nfunction normalizeFilterName(value: string): string {\n return value.trim().toLowerCase();\n}\n\nfunction buildTableKey(tableName: string, schemaName?: string): string {\n return schemaName ? `${schemaName}.${tableName}` : tableName;\n}\n\nfunction toStringValue(value: unknown): string {\n return typeof value === 'string' ? value : String(value ?? '');\n}\n\nfunction toOptionalStringValue(value: unknown): string | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n\n const result = toStringValue(value);\n return result.length > 0 ? result : undefined;\n}\n\nfunction toBooleanValue(value: unknown): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'number') {\n return value !== 0;\n }\n\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n return normalized === 'yes' || normalized === 'true' || normalized === 't' || normalized === '1';\n }\n\n return false;\n}\n\nfunction toNumberValue(value: unknown): number {\n if (typeof value === 'number') {\n return value;\n }\n\n if (typeof value === 'string') {\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n }\n\n return 0;\n}\n\nfunction validateTableFilters(tables?: string[]): Set<string> | null {\n if (!tables) {\n return null;\n }\n\n if (tables.length === 0) {\n throw new Error('Tables filter must not be empty when provided');\n }\n\n const normalized = new Set<string>();\n for (const table of tables) {\n const trimmed = table.trim();\n if (!VALID_TABLE_FILTER_PATTERN.test(trimmed)) {\n throw new Error(\n `Invalid table filter \"${table}\". Table filter contains invalid characters. Use alphanumeric, underscore, and optional schema qualification.`,\n );\n }\n normalized.add(normalizeFilterName(trimmed));\n }\n\n return normalized;\n}\n\nfunction cloneSchema(schema: DatabaseSchema): DatabaseSchema {\n return {\n vendor: schema.vendor,\n generatedAt: schema.generatedAt,\n tables: schema.tables.map((table) => ({\n name: table.name,\n schema: table.schema,\n primaryKey: [...table.primaryKey],\n columns: table.columns.map((column) => ({ ...column })),\n foreignKeys: table.foreignKeys.map((foreignKey) => ({ ...foreignKey })),\n indexes: table.indexes.map((index) => ({\n name: index.name,\n isUnique: index.isUnique,\n columns: [...index.columns],\n })),\n })),\n };\n}\n\nfunction filterSchemaTables(schema: DatabaseSchema, tableFilters: Set<string> | null): DatabaseSchema {\n if (!tableFilters) {\n return schema;\n }\n\n return {\n ...schema,\n tables: schema.tables.filter((table) => {\n const bare = normalizeFilterName(table.name);\n const qualified = table.schema\n ? normalizeFilterName(`${table.schema}.${table.name}`)\n : bare;\n\n return tableFilters.has(bare) || tableFilters.has(qualified);\n }),\n };\n}\n\nfunction escapeSqliteStringLiteral(value: string): string {\n return value.replace(/'/g, \"''\");\n}\n\nfunction sortColumnsByPosition(columnsByPosition: Array<{ position: number; column: string }>): string[] {\n return columnsByPosition\n .sort((a, b) => a.position - b.position)\n .map((entry) => entry.column);\n}\n\n/**\n * Inspects database schemas across PostgreSQL, MySQL, and SQLite.\n *\n * Retrieves table, column, index, and foreign key metadata with built-in\n * caching support. Use {@link SchemaInspector.clearCache} to invalidate\n * cached schemas.\n */\nexport class SchemaInspector {\n private readonly cacheTtlMs: number;\n private readonly cacheKey?: string;\n\n /**\n * Create a new SchemaInspector.\n *\n * @param manager - ConnectionManager instance for database access\n * @param vendor - Database vendor ('postgresql' | 'mysql' | 'sqlite')\n * @param config - Optional configuration for cache TTL and cache key\n */\n constructor(\n private readonly manager: ConnectionManager,\n private readonly vendor: DatabaseVendor,\n config?: SchemaInspectorConfig,\n ) {\n this.cacheTtlMs = config?.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n this.cacheKey = config?.cacheKey;\n }\n\n /**\n * Clear cached schema data.\n *\n * @param cacheKey - Specific cache key to clear. If omitted, clears all cached schemas.\n */\n static clearCache(cacheKey?: string): void {\n if (cacheKey) {\n schemaCache.delete(cacheKey);\n return;\n }\n\n schemaCache.clear();\n }\n\n /** Invalidate this inspector's cached schema, if any. */\n invalidateCache(): void {\n SchemaInspector.clearCache(this.cacheKey);\n }\n\n /**\n * Inspect the database schema and return structured metadata.\n *\n * Results are cached when a `cacheKey` was provided at construction time.\n *\n * @param options - Optional table filters and cache bypass flag\n * @returns Structured schema with tables, columns, indexes, and foreign keys\n */\n async inspect(options?: SchemaInspectOptions): Promise<DatabaseSchema> {\n const tableFilters = validateTableFilters(options?.tables);\n const bypassCache = options?.bypassCache ?? false;\n\n if (!bypassCache && this.cacheKey) {\n const cached = schemaCache.get(this.cacheKey);\n if (cached && cached.expiresAt > Date.now()) {\n logger.debug('Schema cache hit', { vendor: this.vendor });\n return filterSchemaTables(cloneSchema(cached.schema), tableFilters);\n }\n }\n\n const schema = await this.inspectFromDatabase();\n\n if (this.cacheKey && this.cacheTtlMs > 0) {\n schemaCache.set(this.cacheKey, {\n schema: cloneSchema(schema),\n expiresAt: Date.now() + this.cacheTtlMs,\n });\n }\n\n return filterSchemaTables(cloneSchema(schema), tableFilters);\n }\n\n private async inspectFromDatabase(): Promise<DatabaseSchema> {\n const tables = this.vendor === 'postgresql'\n ? await this.inspectPostgreSQL()\n : this.vendor === 'mysql'\n ? await this.inspectMySQL()\n : await this.inspectSQLite();\n\n return {\n vendor: this.vendor,\n tables: tables.sort((left, right) => {\n const leftKey = left.schema ? `${left.schema}.${left.name}` : left.name;\n const rightKey = right.schema ? `${right.schema}.${right.name}` : right.name;\n return leftKey.localeCompare(rightKey);\n }),\n generatedAt: new Date().toISOString(),\n };\n }\n\n private async runQueryRows(query: string): Promise<QueryRow[]> {\n const result = await executeQuery(this.manager, {\n sql: query,\n vendor: this.vendor,\n });\n\n return result.rows as QueryRow[];\n }\n\n private createTableMap(refs: TableRef[]): Map<string, TableSchema> {\n const tableMap = new Map<string, TableSchema>();\n\n for (const ref of refs) {\n const key = buildTableKey(ref.tableName, ref.schemaName);\n tableMap.set(key, {\n name: ref.tableName,\n schema: ref.schemaName,\n columns: [],\n primaryKey: [],\n foreignKeys: [],\n indexes: [],\n });\n }\n\n return tableMap;\n }\n\n private getTableFromRow(\n tableMap: Map<string, TableSchema>,\n row: QueryRow,\n tableField: string,\n schemaField?: string,\n ): TableSchema | undefined {\n const tableName = toStringValue(row[tableField]);\n const schemaName = schemaField ? toOptionalStringValue(row[schemaField]) : undefined;\n const key = buildTableKey(tableName, schemaName);\n return tableMap.get(key);\n }\n\n private async inspectPostgreSQL(): Promise<TableSchema[]> {\n const tableRows = await this.runQueryRows(POSTGRES_TABLES_QUERY);\n const tableMap = this.createTableMap(\n tableRows.map((row) => ({\n schemaName: toOptionalStringValue(row.schema_name),\n tableName: toStringValue(row.table_name),\n })),\n );\n\n const columnsRows = await this.runQueryRows(POSTGRES_COLUMNS_QUERY);\n for (const row of columnsRows) {\n const table = this.getTableFromRow(tableMap, row, 'table_name', 'schema_name');\n if (!table) {\n continue;\n }\n\n const column: ColumnSchema = {\n name: toStringValue(row.column_name),\n type: toStringValue(row.data_type),\n isNullable: toBooleanValue(row.is_nullable),\n defaultValue: row.column_default ?? null,\n isPrimaryKey: false,\n };\n table.columns.push(column);\n }\n\n const primaryKeyRows = await this.runQueryRows(POSTGRES_PRIMARY_KEYS_QUERY);\n for (const row of primaryKeyRows) {\n const table = this.getTableFromRow(tableMap, row, 'table_name', 'schema_name');\n if (!table) {\n continue;\n }\n\n const columnName = toStringValue(row.column_name);\n table.primaryKey.push(columnName);\n\n const column = table.columns.find((entry) => entry.name === columnName);\n if (column) {\n column.isPrimaryKey = true;\n }\n }\n\n const foreignKeyRows = await this.runQueryRows(POSTGRES_FOREIGN_KEYS_QUERY);\n for (const row of foreignKeyRows) {\n const table = this.getTableFromRow(tableMap, row, 'table_name', 'schema_name');\n if (!table) {\n continue;\n }\n\n const foreignKey: ForeignKeySchema = {\n name: toOptionalStringValue(row.constraint_name),\n column: toStringValue(row.column_name),\n referencedSchema: toOptionalStringValue(row.referenced_schema_name),\n referencedTable: toStringValue(row.referenced_table_name),\n referencedColumn: toStringValue(row.referenced_column_name),\n };\n\n table.foreignKeys.push(foreignKey);\n }\n\n const indexRows = await this.runQueryRows(POSTGRES_INDEXES_QUERY);\n this.applyIndexRows(tableMap, indexRows, 'table_name', 'schema_name', {\n indexNameField: 'index_name',\n columnField: 'column_name',\n positionField: 'column_position',\n uniqueResolver: (row) => toBooleanValue(row.is_unique),\n });\n\n return Array.from(tableMap.values());\n }\n\n private async inspectMySQL(): Promise<TableSchema[]> {\n const tableRows = await this.runQueryRows(MYSQL_TABLES_QUERY);\n const tableMap = this.createTableMap(\n tableRows.map((row) => ({\n schemaName: toOptionalStringValue(row.schema_name),\n tableName: toStringValue(row.table_name),\n })),\n );\n\n const columnsRows = await this.runQueryRows(MYSQL_COLUMNS_QUERY);\n for (const row of columnsRows) {\n const table = this.getTableFromRow(tableMap, row, 'table_name', 'schema_name');\n if (!table) {\n continue;\n }\n\n const column: ColumnSchema = {\n name: toStringValue(row.column_name),\n type: toStringValue(row.data_type),\n isNullable: toBooleanValue(row.is_nullable),\n defaultValue: row.column_default ?? null,\n isPrimaryKey: false,\n };\n table.columns.push(column);\n }\n\n const primaryKeyRows = await this.runQueryRows(MYSQL_PRIMARY_KEYS_QUERY);\n for (const row of primaryKeyRows) {\n const table = this.getTableFromRow(tableMap, row, 'table_name', 'schema_name');\n if (!table) {\n continue;\n }\n\n const columnName = toStringValue(row.column_name);\n table.primaryKey.push(columnName);\n\n const column = table.columns.find((entry) => entry.name === columnName);\n if (column) {\n column.isPrimaryKey = true;\n }\n }\n\n const foreignKeyRows = await this.runQueryRows(MYSQL_FOREIGN_KEYS_QUERY);\n for (const row of foreignKeyRows) {\n const table = this.getTableFromRow(tableMap, row, 'table_name', 'schema_name');\n if (!table) {\n continue;\n }\n\n const foreignKey: ForeignKeySchema = {\n name: toOptionalStringValue(row.constraint_name),\n column: toStringValue(row.column_name),\n referencedSchema: toOptionalStringValue(row.referenced_schema_name),\n referencedTable: toStringValue(row.referenced_table_name),\n referencedColumn: toStringValue(row.referenced_column_name),\n };\n\n table.foreignKeys.push(foreignKey);\n }\n\n const indexRows = await this.runQueryRows(MYSQL_INDEXES_QUERY);\n this.applyIndexRows(tableMap, indexRows, 'table_name', 'schema_name', {\n indexNameField: 'index_name',\n columnField: 'column_name',\n positionField: 'seq_in_index',\n uniqueResolver: (row) => !toBooleanValue(row.non_unique),\n });\n\n return Array.from(tableMap.values());\n }\n\n private async inspectSQLite(): Promise<TableSchema[]> {\n const tableRows = await this.runQueryRows(SQLITE_TABLES_QUERY);\n const tableMap = this.createTableMap(\n tableRows.map((row) => ({\n tableName: toStringValue(row.table_name),\n })),\n );\n\n for (const table of tableMap.values()) {\n const tableLiteral = escapeSqliteStringLiteral(table.name);\n\n const columnRows = await this.runQueryRows(`PRAGMA table_info('${tableLiteral}')`);\n const primaryKeyColumns: Array<{ position: number; column: string }> = [];\n\n for (const row of columnRows) {\n const pkPosition = toNumberValue(row.pk);\n const columnName = toStringValue(row.name);\n\n if (pkPosition > 0) {\n primaryKeyColumns.push({ position: pkPosition, column: columnName });\n }\n\n const column: ColumnSchema = {\n name: columnName,\n type: toStringValue(row.type),\n isNullable: !toBooleanValue(row.notnull),\n defaultValue: row.dflt_value ?? null,\n isPrimaryKey: pkPosition > 0,\n };\n table.columns.push(column);\n }\n\n table.primaryKey = sortColumnsByPosition(primaryKeyColumns);\n\n const foreignKeyRows = await this.runQueryRows(`PRAGMA foreign_key_list('${tableLiteral}')`);\n for (const row of foreignKeyRows) {\n const foreignKey: ForeignKeySchema = {\n column: toStringValue(row.from),\n referencedTable: toStringValue(row.table),\n referencedColumn: toStringValue(row.to),\n };\n table.foreignKeys.push(foreignKey);\n }\n\n const indexListRows = await this.runQueryRows(`PRAGMA index_list('${tableLiteral}')`);\n for (const indexRow of indexListRows) {\n const indexName = toStringValue(indexRow.name);\n if (!indexName || toStringValue(indexRow.origin) === 'pk') {\n continue;\n }\n\n const indexNameLiteral = escapeSqliteStringLiteral(indexName);\n const indexInfoRows = await this.runQueryRows(`PRAGMA index_info('${indexNameLiteral}')`);\n const indexColumns = sortColumnsByPosition(\n indexInfoRows.map((row) => ({\n position: toNumberValue(row.seqno),\n column: toStringValue(row.name),\n })),\n );\n\n const index: IndexSchema = {\n name: indexName,\n isUnique: toBooleanValue(indexRow.unique),\n columns: indexColumns,\n };\n table.indexes.push(index);\n }\n }\n\n return Array.from(tableMap.values());\n }\n\n private applyIndexRows(\n tableMap: Map<string, TableSchema>,\n rows: QueryRow[],\n tableField: string,\n schemaField: string | undefined,\n config: {\n indexNameField: string;\n columnField: string;\n positionField: string;\n uniqueResolver: (row: QueryRow) => boolean;\n },\n ): void {\n const grouped = new Map<\n string,\n {\n table: TableSchema;\n indexName: string;\n isUnique: boolean;\n columnsByPosition: Array<{ position: number; column: string }>;\n }\n >();\n\n for (const row of rows) {\n const table = this.getTableFromRow(tableMap, row, tableField, schemaField);\n if (!table) {\n continue;\n }\n\n const indexName = toStringValue(row[config.indexNameField]);\n if (!indexName) {\n continue;\n }\n\n const groupKey = `${table.schema ?? ''}.${table.name}.${indexName}`;\n const entry = grouped.get(groupKey) ?? {\n table,\n indexName,\n isUnique: config.uniqueResolver(row),\n columnsByPosition: [],\n };\n\n entry.columnsByPosition.push({\n position: toNumberValue(row[config.positionField]),\n column: toStringValue(row[config.columnField]),\n });\n grouped.set(groupKey, entry);\n }\n\n for (const entry of grouped.values()) {\n const index: IndexSchema = {\n name: entry.indexName,\n isUnique: entry.isUnique,\n columns: sortColumnsByPosition(entry.columnsByPosition),\n };\n entry.table.indexes.push(index);\n }\n }\n}\n","/**\n * Schema metadata validation utilities.\n *\n * Validates table existence, column existence, and column types\n * against an introspected {@link DatabaseSchema}.\n *\n * @module schema/schema-validator\n */\n\nimport { createLogger } from '@agentforge/core';\nimport type { ColumnSchema, DatabaseSchema, TableSchema } from './types.js';\n\nconst logger = createLogger('agentforge:tools:data:relational:schema-validator');\n\n/**\n * Result of a schema validation check.\n */\nexport interface ValidationResult {\n /** Whether the validation passed */\n valid: boolean;\n /** Error messages (empty when valid) */\n errors: string[];\n}\n\n/**\n * Validate that a table exists in the database schema.\n *\n * Supports both plain table names (`users`) and schema-qualified names (`public.users`).\n *\n * @param schema - The introspected database schema\n * @param tableName - Table name to check (plain or schema-qualified)\n * @returns Validation result\n */\nexport function validateTableExists(\n schema: DatabaseSchema,\n tableName: string,\n): ValidationResult {\n const errors: string[] = [];\n\n if (!tableName || typeof tableName !== 'string') {\n errors.push('Table name must be a non-empty string');\n return { valid: false, errors };\n }\n\n const table = findTable(schema, tableName);\n\n if (!table) {\n const available = schema.tables.map((t) => formatTableName(t)).join(', ');\n errors.push(\n `Table \"${tableName}\" does not exist. Available tables: ${available || '(none)'}`,\n );\n }\n\n logger.debug('Table existence validation', { tableName, valid: errors.length === 0 });\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * Validate that one or more columns exist in a table.\n *\n * @param schema - The introspected database schema\n * @param tableName - Table that should contain the columns\n * @param columnNames - Column names to verify\n * @returns Validation result\n */\nexport function validateColumnsExist(\n schema: DatabaseSchema,\n tableName: string,\n columnNames: string[],\n): ValidationResult {\n const errors: string[] = [];\n\n if (!tableName || typeof tableName !== 'string') {\n errors.push('Table name must be a non-empty string');\n return { valid: false, errors };\n }\n\n const table = findTable(schema, tableName);\n if (!table) {\n errors.push(`Table \"${tableName}\" does not exist`);\n return { valid: false, errors };\n }\n\n const existingColumns = new Set(table.columns.map((c) => c.name.toLowerCase()));\n\n for (const col of columnNames) {\n if (!existingColumns.has(col.toLowerCase())) {\n const available = table.columns.map((c) => c.name).join(', ');\n errors.push(\n `Column \"${col}\" does not exist in table \"${tableName}\". Available columns: ${available}`,\n );\n }\n }\n\n logger.debug('Column existence validation', {\n tableName,\n columnCount: columnNames.length,\n valid: errors.length === 0,\n });\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * Validate that columns in a table match expected types.\n *\n * Type matching is case-insensitive and uses substring containment:\n * a match succeeds when either string contains the other. For example\n * `varchar` matches `varchar(255)` (the actual type contains the expected\n * string), but `varchar` does **not** match `character varying` because\n * neither is a substring of the other.\n *\n * @param schema - The introspected database schema\n * @param tableName - Table to validate against\n * @param expectedTypes - Map of column name → expected type substring\n * @returns Validation result\n */\nexport function validateColumnTypes(\n schema: DatabaseSchema,\n tableName: string,\n expectedTypes: Record<string, string>,\n): ValidationResult {\n const errors: string[] = [];\n\n if (!tableName || typeof tableName !== 'string') {\n errors.push('Table name must be a non-empty string');\n return { valid: false, errors };\n }\n\n const table = findTable(schema, tableName);\n if (!table) {\n errors.push(`Table \"${tableName}\" does not exist`);\n return { valid: false, errors };\n }\n\n const columnMap = new Map<string, ColumnSchema>();\n for (const col of table.columns) {\n columnMap.set(col.name.toLowerCase(), col);\n }\n\n for (const [columnName, expectedType] of Object.entries(expectedTypes)) {\n const col = columnMap.get(columnName.toLowerCase());\n if (!col) {\n errors.push(`Column \"${columnName}\" does not exist in table \"${tableName}\"`);\n continue;\n }\n\n const actualLower = col.type.toLowerCase();\n const expectedLower = expectedType.toLowerCase();\n\n if (!actualLower.includes(expectedLower) && !expectedLower.includes(actualLower)) {\n errors.push(\n `Column \"${columnName}\" has type \"${col.type}\", expected type containing \"${expectedType}\"`,\n );\n }\n }\n\n logger.debug('Column type validation', {\n tableName,\n typeChecks: Object.keys(expectedTypes).length,\n valid: errors.length === 0,\n });\n return { valid: errors.length === 0, errors };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Find a table by name, supporting both plain and schema-qualified names.\n */\nfunction findTable(schema: DatabaseSchema, tableName: string): TableSchema | undefined {\n const parts = tableName.split('.');\n\n if (parts.length === 2) {\n const [schemaName, table] = parts;\n return schema.tables.find(\n (t) =>\n t.name.toLowerCase() === table.toLowerCase() &&\n t.schema?.toLowerCase() === schemaName.toLowerCase(),\n );\n }\n\n return schema.tables.find((t) => t.name.toLowerCase() === tableName.toLowerCase());\n}\n\n/**\n * Format a table schema entry as a display name.\n */\nfunction formatTableName(table: TableSchema): string {\n return table.schema ? `${table.schema}.${table.name}` : table.name;\n}\n","/**\n * Database type → TypeScript type mapper.\n *\n * Maps vendor-specific SQL column types to their closest TypeScript\n * equivalents. Used for code generation hints, documentation, and\n * schema-aware validation utilities.\n *\n * @module schema/type-mapper\n */\n\nimport { createLogger } from '@agentforge/core';\nimport type { DatabaseVendor } from '../types.js';\n\nconst logger = createLogger('agentforge:tools:data:relational:type-mapper');\n\n/**\n * TypeScript type representation for a mapped database column.\n */\nexport interface MappedType {\n /** The TypeScript type string (e.g. `string`, `number`, `boolean`) */\n tsType: string;\n /** Whether the column is nullable (adds `| null`) */\n nullable: boolean;\n /** The original database type string */\n dbType: string;\n /** Optional notes about precision loss, range, etc. */\n notes?: string;\n}\n\n// ---------------------------------------------------------------------------\n// PostgreSQL type mappings\n// ---------------------------------------------------------------------------\n\nconst POSTGRES_TYPE_MAP: Record<string, string> = {\n // Numeric\n smallint: 'number',\n integer: 'number',\n int: 'number',\n int2: 'number',\n int4: 'number',\n int8: 'string', // bigint → string to avoid JS precision loss\n bigint: 'string',\n serial: 'number',\n bigserial: 'string',\n smallserial: 'number',\n real: 'number',\n float4: 'number',\n 'double precision': 'number',\n float8: 'number',\n numeric: 'string', // arbitrary precision → string\n decimal: 'string',\n money: 'string',\n\n // Text\n text: 'string',\n 'character varying': 'string',\n varchar: 'string',\n char: 'string',\n character: 'string',\n name: 'string',\n citext: 'string',\n\n // Boolean\n boolean: 'boolean',\n bool: 'boolean',\n\n // Date / time\n date: 'string',\n timestamp: 'string',\n 'timestamp with time zone': 'string',\n 'timestamp without time zone': 'string',\n timestamptz: 'string',\n time: 'string',\n 'time with time zone': 'string',\n 'time without time zone': 'string',\n timetz: 'string',\n interval: 'string',\n\n // JSON\n json: 'unknown',\n jsonb: 'unknown',\n\n // Binary\n bytea: 'Buffer',\n\n // UUID\n uuid: 'string',\n\n // Network\n inet: 'string',\n cidr: 'string',\n macaddr: 'string',\n macaddr8: 'string',\n\n // Geometric (represented as strings)\n point: 'string',\n line: 'string',\n lseg: 'string',\n box: 'string',\n path: 'string',\n polygon: 'string',\n circle: 'string',\n\n // Other\n xml: 'string',\n tsvector: 'string',\n tsquery: 'string',\n oid: 'number',\n};\n\n// ---------------------------------------------------------------------------\n// MySQL type mappings\n// ---------------------------------------------------------------------------\n\nconst MYSQL_TYPE_MAP: Record<string, string> = {\n // Numeric\n tinyint: 'number',\n smallint: 'number',\n mediumint: 'number',\n int: 'number',\n integer: 'number',\n bigint: 'string', // precision\n float: 'number',\n double: 'number',\n 'double precision': 'number',\n decimal: 'string',\n dec: 'string',\n numeric: 'string',\n bit: 'number',\n\n // Text\n char: 'string',\n varchar: 'string',\n tinytext: 'string',\n text: 'string',\n mediumtext: 'string',\n longtext: 'string',\n enum: 'string',\n set: 'string',\n\n // Boolean (MySQL uses tinyint(1))\n boolean: 'boolean',\n bool: 'boolean',\n\n // Binary\n binary: 'Buffer',\n varbinary: 'Buffer',\n tinyblob: 'Buffer',\n blob: 'Buffer',\n mediumblob: 'Buffer',\n longblob: 'Buffer',\n\n // Date / time\n date: 'string',\n datetime: 'string',\n timestamp: 'string',\n time: 'string',\n year: 'number',\n\n // JSON\n json: 'unknown',\n\n // Spatial (represented as strings)\n geometry: 'string',\n point: 'string',\n linestring: 'string',\n polygon: 'string',\n};\n\n// ---------------------------------------------------------------------------\n// SQLite type mappings\n// ---------------------------------------------------------------------------\n\nconst SQLITE_TYPE_MAP: Record<string, string> = {\n // SQLite has dynamic typing with 5 storage classes.\n // The declared type is advisory; these are the common declared types.\n integer: 'number',\n int: 'number',\n tinyint: 'number',\n smallint: 'number',\n mediumint: 'number',\n bigint: 'number', // SQLite stores as 64-bit int, JS number is safe up to 2^53\n real: 'number',\n double: 'number',\n 'double precision': 'number',\n float: 'number',\n numeric: 'number',\n decimal: 'number',\n boolean: 'number', // SQLite stores booleans as 0/1\n text: 'string',\n varchar: 'string',\n char: 'string',\n clob: 'string',\n 'character varying': 'string',\n 'native character': 'string',\n nchar: 'string',\n nvarchar: 'string',\n blob: 'Buffer',\n date: 'string',\n datetime: 'string',\n timestamp: 'string',\n json: 'unknown',\n};\n\n// ---------------------------------------------------------------------------\n// Vendor map\n// ---------------------------------------------------------------------------\n\nconst VENDOR_MAPS: Record<DatabaseVendor, Record<string, string>> = {\n postgresql: POSTGRES_TYPE_MAP,\n mysql: MYSQL_TYPE_MAP,\n sqlite: SQLITE_TYPE_MAP,\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Map a single database column type to its TypeScript equivalent.\n *\n * Normalises the input type to lower-case and strips size suffixes\n * (e.g. `varchar(255)` → `varchar`) before looking up the mapping.\n *\n * @param vendor - Database vendor\n * @param dbType - The raw column type string from the database\n * @param nullable - Whether the column is nullable\n * @returns The mapped TypeScript type information\n */\nexport function mapColumnType(\n vendor: DatabaseVendor,\n dbType: string,\n nullable = false,\n): MappedType {\n const typeMap = VENDOR_MAPS[vendor];\n if (!typeMap) {\n return { tsType: 'unknown', nullable, dbType, notes: `Unsupported vendor: ${vendor}` };\n }\n\n const normalised = normaliseDbType(dbType);\n const tsType = typeMap[normalised] ?? 'unknown';\n\n const result: MappedType = { tsType, nullable, dbType };\n\n if (tsType === 'unknown' && normalised !== 'json' && normalised !== 'jsonb') {\n result.notes = `No explicit mapping for \"${dbType}\"; defaulting to unknown`;\n logger.debug('Unmapped database type', { vendor, dbType, normalised });\n }\n\n if (\n (normalised === 'bigint' || normalised === 'int8' || normalised === 'bigserial') &&\n (vendor === 'postgresql' || vendor === 'mysql')\n ) {\n result.notes = 'Mapped to string to avoid JavaScript number precision loss for 64-bit integers';\n }\n\n return result;\n}\n\n/**\n * Map all columns in a database schema to TypeScript types.\n *\n * Returns a nested map: `tableName → columnName → MappedType`.\n *\n * @param vendor - Database vendor\n * @param columns - Array of columns with their metadata\n * @returns Nested map from table to column to mapped type\n */\nexport function mapSchemaTypes(\n vendor: DatabaseVendor,\n columns: Array<{ table: string; name: string; type: string; nullable: boolean }>,\n): Map<string, Map<string, MappedType>> {\n const result = new Map<string, Map<string, MappedType>>();\n\n for (const col of columns) {\n if (!result.has(col.table)) {\n result.set(col.table, new Map());\n }\n result.get(col.table)!.set(col.name, mapColumnType(vendor, col.type, col.nullable));\n }\n\n logger.debug('Schema type mapping complete', {\n vendor,\n tables: result.size,\n columns: columns.length,\n });\n\n return result;\n}\n\n/**\n * Get the full type map for a vendor (useful for documentation / tooling).\n *\n * @param vendor - Database vendor\n * @returns Read-only copy of the vendor's type mapping table\n */\nexport function getVendorTypeMap(vendor: DatabaseVendor): Readonly<Record<string, string>> {\n return { ...VENDOR_MAPS[vendor] };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Normalise a raw database type string for map lookup.\n *\n * Strips size/precision suffixes (`(255)`, `(10,2)`) and converts to\n * lower-case. Also handles `unsigned` and `[]` (PostgreSQL array) suffixes.\n */\nfunction normaliseDbType(raw: string): string {\n let type = raw.toLowerCase().trim();\n\n // Strip array suffix (PostgreSQL)\n type = type.replace(/\\[\\]$/, '');\n\n // Strip size/precision suffix\n type = type.replace(/\\([\\d,\\s]+\\)/, '');\n\n // Strip unsigned (MySQL)\n type = type.replace(/\\s+unsigned$/, '');\n\n return type.trim();\n}\n","/**\n * Schema diff and serialisation utilities.\n *\n * Compare two {@link DatabaseSchema} instances and produce a structured\n * diff report. Also provide JSON export / import for snapshot testing\n * and cross-environment schema comparison.\n *\n * @module schema/schema-diff\n */\n\nimport { createLogger } from '@agentforge/core';\nimport type { ColumnSchema, DatabaseSchema, TableSchema } from './types.js';\n\nconst logger = createLogger('agentforge:tools:data:relational:schema-diff');\n\n// ---------------------------------------------------------------------------\n// Diff types\n// ---------------------------------------------------------------------------\n\n/** Describes a difference for a single column. */\nexport interface ColumnDiff {\n column: string;\n type: 'added' | 'removed' | 'changed';\n /** Present when type is `changed` */\n changes?: Array<{\n property: string;\n before: unknown;\n after: unknown;\n }>;\n}\n\n/** Describes a difference for a single table. */\nexport interface TableDiff {\n table: string;\n type: 'added' | 'removed' | 'changed';\n /** Present when type is `changed` — per-column changes */\n columns?: ColumnDiff[];\n /** Present when type is `changed` — primary-key changes */\n primaryKeyChanged?: { before: string[]; after: string[] };\n}\n\n/** Full diff report between two schemas. */\nexport interface SchemaDiffResult {\n /** Whether the schemas are identical */\n identical: boolean;\n /** Per-table differences */\n tables: TableDiff[];\n /** Summary counts */\n summary: {\n tablesAdded: number;\n tablesRemoved: number;\n tablesChanged: number;\n columnsAdded: number;\n columnsRemoved: number;\n columnsChanged: number;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Diff implementation\n// ---------------------------------------------------------------------------\n\n/**\n * Compare two database schemas and return a structured diff report.\n *\n * The comparison is name-based and case-insensitive. Schema-qualified\n * names are supported (e.g. `public.users`).\n *\n * @param before - The baseline schema\n * @param after - The schema to compare against the baseline\n * @returns A structured diff report\n */\nexport function diffSchemas(before: DatabaseSchema, after: DatabaseSchema): SchemaDiffResult {\n const tableDiffs: TableDiff[] = [];\n let columnsAdded = 0;\n let columnsRemoved = 0;\n let columnsChanged = 0;\n\n const beforeMap = tableMap(before.tables);\n const afterMap = tableMap(after.tables);\n\n // Removed tables\n for (const [key, table] of beforeMap) {\n if (!afterMap.has(key)) {\n tableDiffs.push({ table: formatName(table), type: 'removed' });\n }\n }\n\n // Added tables\n for (const [key, table] of afterMap) {\n if (!beforeMap.has(key)) {\n tableDiffs.push({ table: formatName(table), type: 'added' });\n }\n }\n\n // Changed tables\n for (const [key, beforeTable] of beforeMap) {\n const afterTable = afterMap.get(key);\n if (!afterTable) continue;\n\n const colDiffs = diffColumns(beforeTable.columns, afterTable.columns);\n const pkChanged = !arraysEqual(beforeTable.primaryKey, afterTable.primaryKey);\n\n if (colDiffs.length > 0 || pkChanged) {\n const diff: TableDiff = { table: formatName(beforeTable), type: 'changed', columns: colDiffs };\n if (pkChanged) {\n diff.primaryKeyChanged = { before: beforeTable.primaryKey, after: afterTable.primaryKey };\n }\n tableDiffs.push(diff);\n }\n\n for (const cd of colDiffs) {\n if (cd.type === 'added') columnsAdded++;\n else if (cd.type === 'removed') columnsRemoved++;\n else columnsChanged++;\n }\n }\n\n const tablesAdded = tableDiffs.filter((d) => d.type === 'added').length;\n const tablesRemoved = tableDiffs.filter((d) => d.type === 'removed').length;\n const tablesChanged = tableDiffs.filter((d) => d.type === 'changed').length;\n const identical = tableDiffs.length === 0;\n\n logger.debug('Schema diff computed', {\n identical,\n tablesAdded,\n tablesRemoved,\n tablesChanged,\n });\n\n return {\n identical,\n tables: tableDiffs,\n summary: { tablesAdded, tablesRemoved, tablesChanged, columnsAdded, columnsRemoved, columnsChanged },\n };\n}\n\n// ---------------------------------------------------------------------------\n// JSON export / import\n// ---------------------------------------------------------------------------\n\n/**\n * Export a {@link DatabaseSchema} to a JSON string.\n *\n * The output is deterministic (keys sorted, 2-space indent) so that it\n * can be used for snapshot testing.\n *\n * @param schema - The schema to serialise\n * @returns Pretty-printed JSON string\n */\nexport function exportSchemaToJson(schema: DatabaseSchema): string {\n return JSON.stringify(schema, sortedReplacer, 2);\n}\n\n/**\n * Import a {@link DatabaseSchema} from a JSON string.\n *\n * Performs basic structural validation to ensure the parsed object has the\n * required shape.\n *\n * @param json - JSON string produced by {@link exportSchemaToJson}\n * @returns Parsed database schema\n * @throws Error when the JSON is not a valid DatabaseSchema\n */\nexport function importSchemaFromJson(json: string): DatabaseSchema {\n const parsed: unknown = JSON.parse(json);\n\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('Invalid schema JSON: expected an object');\n }\n\n const obj = parsed as Record<string, unknown>;\n\n if (!obj.vendor || typeof obj.vendor !== 'string') {\n throw new Error('Invalid schema JSON: missing or invalid \"vendor\" field');\n }\n\n if (!Array.isArray(obj.tables)) {\n throw new Error('Invalid schema JSON: missing or invalid \"tables\" array');\n }\n\n if (!obj.generatedAt || typeof obj.generatedAt !== 'string') {\n throw new Error('Invalid schema JSON: missing or invalid \"generatedAt\" field');\n }\n\n // Validate individual tables have required fields\n for (const table of obj.tables) {\n if (!table || typeof table !== 'object') {\n throw new Error('Invalid schema JSON: each table must be an object');\n }\n if (!table.name || typeof table.name !== 'string') {\n throw new Error('Invalid schema JSON: each table must have a \"name\" string');\n }\n if (!Array.isArray(table.columns)) {\n throw new Error(`Invalid schema JSON: table \"${table.name}\" missing \"columns\" array`);\n }\n if (!Array.isArray(table.primaryKey)) {\n throw new Error(`Invalid schema JSON: table \"${table.name}\" missing \"primaryKey\" array`);\n }\n }\n\n logger.debug('Schema imported from JSON', {\n vendor: obj.vendor,\n tableCount: (obj.tables as unknown[]).length,\n });\n\n return parsed as DatabaseSchema;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * JSON replacer that sorts object keys for deterministic output.\n * Arrays are left in their original order.\n */\nfunction sortedReplacer(_key: string, value: unknown): unknown {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record<string, unknown> = {};\n for (const k of Object.keys(value as Record<string, unknown>).sort()) {\n sorted[k] = (value as Record<string, unknown>)[k];\n }\n return sorted;\n }\n return value;\n}\n\nfunction tableMap(tables: TableSchema[]): Map<string, TableSchema> {\n const map = new Map<string, TableSchema>();\n for (const t of tables) {\n map.set(formatName(t).toLowerCase(), t);\n }\n return map;\n}\n\nfunction formatName(table: TableSchema): string {\n return table.schema ? `${table.schema}.${table.name}` : table.name;\n}\n\nfunction diffColumns(before: ColumnSchema[], after: ColumnSchema[]): ColumnDiff[] {\n const diffs: ColumnDiff[] = [];\n const beforeMap = new Map<string, ColumnSchema>();\n const afterMap = new Map<string, ColumnSchema>();\n\n for (const c of before) beforeMap.set(c.name.toLowerCase(), c);\n for (const c of after) afterMap.set(c.name.toLowerCase(), c);\n\n // Removed\n for (const [key] of beforeMap) {\n if (!afterMap.has(key)) {\n diffs.push({ column: beforeMap.get(key)!.name, type: 'removed' });\n }\n }\n\n // Added\n for (const [key] of afterMap) {\n if (!beforeMap.has(key)) {\n diffs.push({ column: afterMap.get(key)!.name, type: 'added' });\n }\n }\n\n // Changed\n for (const [key, beforeCol] of beforeMap) {\n const afterCol = afterMap.get(key);\n if (!afterCol) continue;\n\n const changes: Array<{ property: string; before: unknown; after: unknown }> = [];\n\n if (beforeCol.type.toLowerCase() !== afterCol.type.toLowerCase()) {\n changes.push({ property: 'type', before: beforeCol.type, after: afterCol.type });\n }\n if (beforeCol.isNullable !== afterCol.isNullable) {\n changes.push({ property: 'isNullable', before: beforeCol.isNullable, after: afterCol.isNullable });\n }\n if (beforeCol.isPrimaryKey !== afterCol.isPrimaryKey) {\n changes.push({ property: 'isPrimaryKey', before: beforeCol.isPrimaryKey, after: afterCol.isPrimaryKey });\n }\n if (String(beforeCol.defaultValue) !== String(afterCol.defaultValue)) {\n changes.push({ property: 'defaultValue', before: beforeCol.defaultValue, after: afterCol.defaultValue });\n }\n\n if (changes.length > 0) {\n diffs.push({ column: beforeCol.name, type: 'changed', changes });\n }\n }\n\n return diffs;\n}\n\nfunction arraysEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n return a.every((v, i) => v === b[i]);\n}\n","/**\n * Relational Query Tool - Execute raw SQL queries with parameter binding\n * @module tools/relational-query\n */\n\nimport { z } from 'zod';\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { ConnectionManager } from '../connection/connection-manager.js';\nimport { executeQuery } from '../query/query-executor.js';\nimport type { DatabaseVendor } from '../types.js';\n\n/**\n * Zod schema for relational-query tool input\n */\nconst relationalQuerySchema = z.object({\n sql: z.string().describe('SQL query string to execute'),\n params: z.union([\n z.array(z.unknown()).describe('Positional parameters (e.g., [value1, value2])'),\n z.record(z.string(), z.unknown()).describe('Named parameters (e.g., { name: \"John\", age: 30 })'),\n ]).optional().describe('Query parameters for parameter binding (prevents SQL injection)'),\n vendor: z.enum(['postgresql', 'mysql', 'sqlite']).describe('Database vendor'),\n connectionString: z\n .string()\n .min(1, 'Database connection string is required')\n .describe('Database connection string used to create a new connection'),\n});\n\n/**\n * Relational Query Tool\n * \n * Executes raw SQL queries against relational databases (PostgreSQL, MySQL, SQLite)\n * with proper parameter binding to prevent SQL injection.\n * \n * Features:\n * - Supports SELECT, INSERT, UPDATE, DELETE, and other SQL statements\n * - Parameter binding prevents SQL injection\n * - Supports positional ($1, ?) and named (:name) parameters\n * - Result formatting to JSON\n * - Error handling with sanitized messages\n * \n * @example\n * ```typescript\n * // SELECT with positional parameters\n * const result = await relationalQuery.invoke({\n * sql: 'SELECT * FROM users WHERE id = $1',\n * params: [42],\n * vendor: 'postgresql',\n * connectionString: 'postgresql://user:pass@localhost:5432/mydb'\n * });\n * \n * // INSERT with named parameters\n * const result = await relationalQuery.invoke({\n * sql: 'INSERT INTO users (name, email) VALUES (:name, :email)',\n * params: { name: 'John Doe', email: 'john@example.com' },\n * vendor: 'postgresql',\n * connectionString: 'postgresql://user:pass@localhost:5432/mydb'\n * });\n * ```\n */\nexport const relationalQuery = toolBuilder()\n .name('relational-query')\n .displayName('Relational Query')\n .description('Execute raw SQL queries against relational databases (PostgreSQL, MySQL, SQLite) with parameter binding to prevent SQL injection')\n .category(ToolCategory.DATABASE)\n .tags(['database', 'sql', 'query', 'postgresql', 'mysql', 'sqlite'])\n .schema(relationalQuerySchema)\n .example({\n description: 'SELECT query with positional parameters',\n input: {\n sql: 'SELECT * FROM users WHERE id = $1',\n params: [42],\n vendor: 'postgresql' as DatabaseVendor,\n connectionString: 'postgresql://user:pass@localhost:5432/mydb'\n }\n })\n .example({\n description: 'INSERT query with named parameters',\n input: {\n sql: 'INSERT INTO users (name, email) VALUES (:name, :email)',\n params: { name: 'John Doe', email: 'john@example.com' },\n vendor: 'postgresql' as DatabaseVendor,\n connectionString: 'postgresql://user:pass@localhost:5432/mydb'\n }\n })\n .example({\n description: 'UPDATE query with positional parameters',\n input: {\n sql: 'UPDATE users SET status = ? WHERE id = ?',\n params: ['active', 42],\n vendor: 'mysql' as DatabaseVendor,\n connectionString: 'mysql://user:pass@localhost:3306/mydb'\n }\n })\n .usageNotes('Always use parameter binding (params) instead of string concatenation to prevent SQL injection. Supports positional ($1, ?) and named (:name) parameters.')\n .limitation('Requires database-specific driver as peer dependency (pg, mysql2, or better-sqlite3)')\n .limitation('Connection string must be valid for the specified vendor')\n .limitation('Large result sets may impact performance')\n .limitation('Placeholder characters ($n, ?, :name) inside SQL string literals are not supported. Use parameter binding for all dynamic values instead of embedding them in string literals')\n .implement(async (input) => {\n // TODO (ST-02002 or later): Implement connection pooling/reuse to avoid creating\n // a new ConnectionManager on every invocation. For agent workflows with multiple\n // queries, this creates connection storms and significant overhead. Consider:\n // - Shared connection registry keyed by connection string/config\n // - Connection pool reuse similar to neo4jPool pattern\n // - Lifecycle management for long-running agents\n\n // Create connection manager\n const manager = new ConnectionManager({\n vendor: input.vendor,\n connection: input.connectionString || ''\n });\n\n try {\n // Initialize connection\n await manager.initialize();\n\n // Execute query\n const result = await executeQuery(manager, {\n sql: input.sql,\n params: input.params,\n vendor: input.vendor\n });\n\n // Return formatted result\n return {\n success: true,\n rows: result.rows,\n rowCount: result.rowCount,\n executionTime: result.executionTime\n };\n } catch (error) {\n // Return error with sanitized message\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n rows: [],\n rowCount: 0\n };\n } finally {\n // Always close connection\n await manager.close();\n }\n })\n .build();\n\n","/**\n * Zod schemas for relational SELECT operations\n * @module tools/relational-select/schemas\n */\n\nimport { z } from 'zod';\nimport { VALID_QUALIFIED_IDENTIFIER_PATTERN } from '../../utils/identifier-utils.js';\n\n/**\n * WHERE condition operator types\n */\nexport const whereOperatorSchema = z.enum([\n 'eq', // equals\n 'ne', // not equals\n 'gt', // greater than\n 'lt', // less than\n 'gte', // greater than or equal\n 'lte', // less than or equal\n 'like', // LIKE pattern matching\n 'in', // IN array\n 'notIn', // NOT IN array\n 'isNull', // IS NULL\n 'isNotNull' // IS NOT NULL\n]);\n\n/**\n * WHERE condition schema\n */\nexport const whereConditionSchema = z.object({\n column: z.string().min(1, 'Column name must not be empty').describe('Column name to filter on'),\n operator: whereOperatorSchema.describe('Comparison operator'),\n value: z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.array(z.union([z.string(), z.number()])),\n z.null()\n ]).optional().describe('Value to compare against (not required for isNull/isNotNull)')\n}).superRefine((val, ctx) => {\n const op = val.operator;\n\n if (op === 'isNull' || op === 'isNotNull') {\n if (val.value !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: 'value must not be provided when using isNull or isNotNull operator',\n });\n }\n return;\n }\n\n // All other operators require a value\n if (val.value === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: 'value is required for this operator',\n });\n return;\n }\n\n // IN/NOT IN operators require a non-empty array\n if (op === 'in' || op === 'notIn') {\n if (!Array.isArray(val.value)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: `${op === 'in' ? 'IN' : 'NOT IN'} operator requires an array value`,\n });\n } else if (val.value.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: `${op === 'in' ? 'IN' : 'NOT IN'} operator requires a non-empty array value`,\n });\n }\n return;\n }\n\n // Operators other than IS NULL/IS NOT NULL should not use null values.\n // Use explicit null operators to avoid generating invalid SQL like \"column = NULL\".\n if (val.value === null) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: 'null is only allowed with isNull/isNotNull operators',\n });\n return;\n }\n\n if (op === 'like' && typeof val.value !== 'string') {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: 'LIKE operator requires a string value',\n });\n return;\n }\n\n if ((op === 'gt' || op === 'lt' || op === 'gte' || op === 'lte') &&\n typeof val.value !== 'string' &&\n typeof val.value !== 'number') {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: `${op.toUpperCase()} operator requires a string or number value`,\n });\n return;\n }\n\n if ((op === 'eq' || op === 'ne') && Array.isArray(val.value)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: `${op.toUpperCase()} operator requires a scalar value`,\n });\n }\n});\n\n/**\n * ORDER BY direction\n */\nexport const orderDirectionSchema = z.enum(['asc', 'desc']);\n\n/**\n * ORDER BY clause schema\n */\nexport const orderBySchema = z.object({\n column: z.string().min(1, 'Column name must not be empty').describe('Column name to order by'),\n direction: orderDirectionSchema.describe('Sort direction (ascending or descending)')\n});\n\n/**\n * Optional streaming configuration\n */\nexport const streamingOptionsSchema = z.object({\n enabled: z.boolean().default(true).describe('Enable chunked streaming mode for large result sets'),\n chunkSize: z.number().int().min(1).max(5000).optional().describe('Rows fetched per chunk (default: 100)'),\n maxRows: z.number().int().positive().optional().describe('Optional cap on streamed rows'),\n sampleSize: z.number().int().min(0).max(5000).optional().describe('Number of rows to include in the response payload'),\n benchmark: z.boolean().optional().default(false).describe('Run memory benchmark comparing regular vs streaming execution (adds two extra query executions; use side-effect-free SELECT statements)')\n});\n\n/**\n * Relational SELECT tool input schema\n */\nexport const relationalSelectSchema = z.object({\n table: z.string()\n .min(1, 'Table name is required')\n .regex(\n VALID_QUALIFIED_IDENTIFIER_PATTERN,\n 'Table name contains invalid characters. Only alphanumeric characters, underscores, and dots (for schema qualification) are allowed.'\n )\n .describe('Table name to select from (schema-qualified names supported, e.g. public.users)'),\n columns: z.array(z.string().min(1, 'Column name must not be empty')).min(1, 'Columns array must not be empty').optional().describe('Columns to select (omit for SELECT *)'),\n where: z.array(whereConditionSchema).optional().describe('WHERE conditions (combined with AND)'),\n orderBy: z.array(orderBySchema).optional().describe('ORDER BY clauses'),\n limit: z.number().int().positive().optional().describe('Maximum number of rows to return'),\n offset: z.number().int().nonnegative().optional().describe('Number of rows to skip'),\n streaming: streamingOptionsSchema.optional().describe('Optional streaming mode configuration'),\n vendor: z.enum(['postgresql', 'mysql', 'sqlite']).describe('Database vendor'),\n connectionString: z.string().min(1, 'Database connection string is required').describe('Database connection string')\n});\n","/**\n * Query builder adapter for relational SELECT operations.\n * @module tools/relational-select/query-builder\n */\n\nimport {\n buildSelectQuery as buildSharedSelectQuery,\n type SelectQueryInput,\n} from '../../query/query-builder.js';\nimport type { RelationalSelectInput } from './types.js';\n\n/**\n * Build a complete SELECT query using shared query builder utilities.\n */\nexport function buildSelectQuery(input: RelationalSelectInput) {\n const queryInput: SelectQueryInput = {\n table: input.table,\n columns: input.columns,\n where: input.where,\n orderBy: input.orderBy,\n limit: input.limit,\n offset: input.offset,\n vendor: input.vendor,\n };\n\n return buildSharedSelectQuery(queryInput);\n}\n","/**\n * Helpers for classifying safe validation errors in relational-select.\n * These messages are safe to expose to callers because they describe\n * input-shape/identifier issues rather than database internals.\n */\n\nconst SAFE_VALIDATION_ERROR_PATTERNS = [\n 'must not be empty',\n 'contains invalid characters',\n 'requires an array value',\n 'requires a non-empty array value',\n 'must be an integer between',\n 'must be a positive integer',\n 'null is only allowed with isNull/isNotNull operators',\n 'LIKE operator requires a string value',\n 'operator requires a string or number value',\n 'operator requires a scalar value',\n 'Stream cancelled by caller',\n] as const;\n\n/**\n * Check whether an error is a safe SELECT input validation error\n * that can be exposed to the caller without leaking database internals.\n *\n * @param error - The caught error\n * @returns `true` if the error message matches a known validation pattern\n */\nexport function isSafeValidationError(error: unknown): error is Error {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return SAFE_VALIDATION_ERROR_PATTERNS.some((pattern) =>\n error.message.includes(pattern)\n );\n}\n","/**\n * Query executor for relational SELECT operations\n * @module tools/relational-select/executor\n */\n\nimport { createLogger } from '@agentforge/core';\nimport type { ConnectionManager } from '../../connection/connection-manager.js';\nimport type { TransactionContext } from '../../query/transaction.js';\nimport {\n DEFAULT_CHUNK_SIZE,\n executeStreamingSelect,\n benchmarkStreamingSelectMemory,\n type SelectQueryInput,\n} from '../../query/index.js';\nimport type { RelationalSelectInput, SelectResult } from './types.js';\nimport { buildSelectQuery } from './query-builder.js';\nimport { isSafeValidationError } from './error-utils.js';\n\nconst logger = createLogger('agentforge:tools:data:relational:select');\n\n/**\n * Execution context for SELECT operations.\n *\n * @property transaction - Optional active transaction to execute within\n */\nexport interface SelectExecutionContext {\n transaction?: TransactionContext;\n}\n\nfunction toSelectQueryInput(input: RelationalSelectInput): SelectQueryInput {\n return {\n table: input.table,\n columns: input.columns,\n where: input.where,\n orderBy: input.orderBy,\n limit: input.limit,\n offset: input.offset,\n vendor: input.vendor,\n };\n}\n\n/**\n * Execute a SELECT query using Drizzle query builder\n */\nexport async function executeSelect(\n manager: ConnectionManager,\n input: RelationalSelectInput,\n context?: SelectExecutionContext\n): Promise<SelectResult> {\n const startTime = Date.now();\n\n logger.debug('Building SELECT query', {\n vendor: input.vendor,\n table: input.table,\n hasWhere: !!input.where,\n hasOrderBy: !!input.orderBy,\n hasLimit: !!input.limit,\n streamingEnabled: !!input.streaming?.enabled,\n });\n\n try {\n const executor = context?.transaction ?? manager;\n\n if (input.streaming?.enabled) {\n const streamOptions = {\n chunkSize: input.streaming.chunkSize,\n maxRows: input.streaming.maxRows,\n sampleSize: input.streaming.sampleSize,\n };\n\n const streamInput = toSelectQueryInput(input);\n\n if (input.streaming.benchmark) {\n logger.warn('Streaming benchmark enabled; SELECT will execute up to three times (result + benchmark regular + benchmark streaming).', {\n vendor: input.vendor,\n table: input.table,\n chunkSize: streamOptions.chunkSize ?? DEFAULT_CHUNK_SIZE,\n maxRows: streamOptions.maxRows,\n sampleSize: streamOptions.sampleSize,\n });\n }\n\n const streamResult = await executeStreamingSelect(executor, streamInput, streamOptions);\n\n const benchmark = input.streaming.benchmark\n ? await benchmarkStreamingSelectMemory(executor, streamInput, streamOptions)\n : undefined;\n\n const executionTime = Date.now() - startTime;\n\n logger.debug('Streaming SELECT query executed successfully', {\n vendor: input.vendor,\n table: input.table,\n rowCount: streamResult.rowCount,\n chunkCount: streamResult.chunkCount,\n executionTime,\n cancelled: streamResult.cancelled,\n });\n\n return {\n rows: streamResult.rows,\n rowCount: streamResult.rowCount,\n executionTime,\n streaming: {\n enabled: true,\n chunkSize: input.streaming.chunkSize ?? DEFAULT_CHUNK_SIZE,\n chunkCount: streamResult.chunkCount,\n sampledRowCount: streamResult.rows.length,\n streamedRowCount: streamResult.rowCount,\n cancelled: streamResult.cancelled,\n memoryUsage: streamResult.memoryUsage,\n benchmark,\n },\n };\n }\n\n // Build SELECT query\n const query = buildSelectQuery(input);\n\n // Execute query\n const result = await executor.execute(query);\n\n const executionTime = Date.now() - startTime;\n\n // Format result\n const rows = Array.isArray(result) ? result : (result as unknown as { rows?: unknown[] }).rows || [];\n const rowCount = rows.length;\n\n logger.debug('SELECT query executed successfully', {\n vendor: input.vendor,\n table: input.table,\n rowCount,\n executionTime\n });\n\n return {\n rows,\n rowCount,\n executionTime\n };\n } catch (error) {\n const executionTime = Date.now() - startTime;\n\n logger.error('SELECT query execution failed', {\n vendor: input.vendor,\n table: input.table,\n error: error instanceof Error ? error.message : String(error),\n executionTime\n });\n\n // Let known-safe validation errors propagate so callers can fix bad inputs.\n if (isSafeValidationError(error)) {\n throw error;\n }\n\n // Sanitize database/driver failures while preserving root cause for diagnostics.\n throw new Error('SELECT query failed. See logs for details.', { cause: error });\n }\n}\n","/**\n * Relational SELECT Tool\n * \n * Type-safe SELECT operations using Drizzle ORM query builder.\n * Supports WHERE conditions, ORDER BY, LIMIT, and OFFSET.\n * \n * @module tools/relational-select\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { ConnectionManager } from '../../connection/connection-manager.js';\nimport { relationalSelectSchema } from './schemas.js';\nimport { executeSelect } from './executor.js';\nimport type { RelationalSelectInput, SelectResponse } from './types.js';\nimport { isSafeValidationError } from './error-utils.js';\n\n// Re-export types and schemas for external use\nexport * from './types.js';\nexport * from './schemas.js';\n\n/**\n * Relational SELECT Tool\n * \n * Execute type-safe SELECT queries using Drizzle ORM query builder.\n * \n * Features:\n * - Type-safe column selection\n * - WHERE conditions with multiple operators\n * - ORDER BY with ascending/descending\n * - LIMIT and OFFSET for pagination\n * - Optional chunked streaming mode for large result sets\n * - Result formatting to JSON\n * - Error handling with clear messages\n * \n * @example\n * ```typescript\n * // SELECT with WHERE and ORDER BY\n * const result = await relationalSelect.invoke({\n * table: 'users',\n * columns: ['id', 'name', 'email'],\n * where: [\n * { column: 'status', operator: 'eq', value: 'active' },\n * { column: 'age', operator: 'gte', value: 18 }\n * ],\n * orderBy: [{ column: 'name', direction: 'asc' }],\n * limit: 10,\n * vendor: 'postgresql',\n * connectionString: 'postgresql://user:pass@localhost:5432/mydb'\n * });\n * ```\n */\nexport const relationalSelect = toolBuilder()\n .name('relational-select')\n .displayName('Relational SELECT')\n .description('Execute type-safe SELECT queries with WHERE conditions, ORDER BY, LIMIT, and OFFSET using Drizzle ORM query builder')\n .category(ToolCategory.DATABASE)\n .tags(['database', 'sql', 'select', 'query', 'postgresql', 'mysql', 'sqlite'])\n .schema(relationalSelectSchema)\n .example({\n description: 'SELECT with WHERE condition',\n input: {\n table: 'users',\n columns: ['id', 'name', 'email'],\n where: [{ column: 'status', operator: 'eq', value: 'active' }],\n vendor: 'postgresql',\n connectionString: 'postgresql://localhost/mydb'\n }\n })\n .example({\n description: 'SELECT with pagination',\n input: {\n table: 'products',\n orderBy: [{ column: 'created_at', direction: 'desc' }],\n limit: 20,\n offset: 0,\n vendor: 'mysql',\n connectionString: 'mysql://localhost/shop'\n }\n })\n .example({\n description: 'SELECT with streaming mode',\n input: {\n table: 'events',\n orderBy: [{ column: 'id', direction: 'asc' }],\n streaming: {\n enabled: true,\n chunkSize: 250,\n sampleSize: 25\n },\n vendor: 'postgresql',\n connectionString: 'postgresql://localhost/analytics'\n }\n })\n .implement(async (input: RelationalSelectInput): Promise<SelectResponse> => {\n const manager = new ConnectionManager({\n vendor: input.vendor,\n connection: input.connectionString\n });\n\n try {\n // Connect to database\n await manager.connect();\n\n // Build and execute SELECT query\n const result = await executeSelect(manager, input);\n\n // Return formatted result\n return {\n success: true,\n rows: result.rows,\n rowCount: result.rowCount,\n executionTime: result.executionTime,\n streaming: result.streaming,\n };\n } catch (error) {\n let errorMessage = 'Failed to execute SELECT query. Please verify your input and database connection.';\n\n // Propagate known-safe validation messages so callers can correct input.\n if (isSafeValidationError(error)) {\n errorMessage = error.message;\n }\n\n return {\n success: false,\n error: errorMessage,\n rows: [],\n rowCount: 0\n };\n } finally {\n // Always disconnect\n await manager.disconnect();\n }\n })\n .build();\n","/**\n * Zod schemas for relational INSERT operations\n * @module tools/relational-insert/schemas\n */\n\nimport { z } from 'zod';\nimport { VALID_QUALIFIED_IDENTIFIER_PATTERN } from '../../utils/identifier-utils.js';\n\n/**\n * Scalar values accepted for INSERT payloads.\n */\nexport const insertValueSchema = z.union([\n z.string().describe('String value'),\n z.number().describe('Numeric value'),\n z.boolean().describe('Boolean value'),\n z.null().describe('Null value'),\n]).describe('Scalar value for an INSERT column');\n\n/**\n * INSERT row payload schema.\n *\n * Empty objects are allowed to support INSERT ... DEFAULT VALUES.\n */\nexport const insertRowSchema = z.record(\n z.string().min(1, 'Column name must not be empty').describe('Column name'),\n insertValueSchema\n).describe('One row object where keys are column names and values are scalar values');\n\n/**\n * INSERT RETURNING mode schema.\n */\nexport const insertReturningModeSchema = z.enum(['none', 'id', 'row']);\n\n/**\n * INSERT RETURNING options schema.\n */\nexport const insertReturningSchema = z.object({\n mode: insertReturningModeSchema.default('none').describe('Returning mode: none, id, or full row'),\n idColumn: z.string().min(1, 'idColumn must not be empty').optional().describe('Primary key column to return when mode is \"id\"'),\n}).superRefine((value, ctx) => {\n if (value.idColumn && value.mode !== 'id') {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['idColumn'],\n message: 'idColumn can only be provided when returning.mode is \"id\"',\n });\n }\n});\n\n/**\n * Batch execution options for INSERT processing.\n */\nexport const insertBatchOptionsSchema = z.object({\n enabled: z.boolean().optional().default(true).describe('Enable chunked batch execution for array insert payloads'),\n batchSize: z.number().int().positive().max(5000).optional().default(100).describe('Rows per batch chunk'),\n continueOnError: z.boolean().optional().default(true).describe('Continue processing remaining chunks when one chunk fails'),\n maxRetries: z.number().int().min(0).max(5).optional().default(0).describe('Retry attempts per failed chunk'),\n retryDelayMs: z.number().int().min(0).max(60000).optional().default(0).describe('Delay between retry attempts in milliseconds'),\n benchmark: z.boolean().optional().default(false).describe('Run synthetic benchmark metadata comparing individual vs batched execution callbacks'),\n});\n\n/**\n * Relational INSERT tool input schema.\n */\nexport const relationalInsertSchema = z.object({\n table: z.string()\n .min(1, 'Table name is required')\n .regex(\n VALID_QUALIFIED_IDENTIFIER_PATTERN,\n 'Table name contains invalid characters. Only alphanumeric characters, underscores, and dots (for schema qualification) are allowed.'\n )\n .describe('Table name to insert into (schema-qualified names supported, e.g. public.users)'),\n data: z.union([\n insertRowSchema,\n z.array(insertRowSchema).min(1, 'Insert data array must not be empty'),\n ]).describe('Single row object or array of row objects to insert'),\n batch: insertBatchOptionsSchema.optional().describe('Optional batch execution controls for array insert payloads'),\n returning: insertReturningSchema.optional().describe('Optional RETURNING behavior'),\n vendor: z.enum(['postgresql', 'mysql', 'sqlite']).describe('Database vendor'),\n connectionString: z.string().min(1, 'Database connection string is required').describe('Database connection string'),\n});\n","/**\n * Helpers for classifying safe validation and constraint errors in relational-insert.\n */\n\nconst SAFE_INSERT_VALIDATION_PATTERNS = [\n 'must not be empty',\n 'contains invalid characters',\n 'must be an object',\n 'must not be an empty array',\n 'must not be undefined',\n 'idColumn can only be provided',\n 'Returning full rows is not supported for mysql',\n 'Batch INSERT with only DEFAULT VALUES is not supported',\n] as const;\n\nconst CONSTRAINT_VIOLATION_PATTERNS = [\n {\n pattern: /(unique constraint|duplicate key|duplicate entry)/i,\n message: 'Insert failed: unique constraint violation.',\n },\n {\n pattern: /(foreign key constraint|violates foreign key constraint)/i,\n message: 'Insert failed: foreign key constraint violation.',\n },\n {\n pattern: /(not null constraint|cannot be null)/i,\n message: 'Insert failed: NOT NULL constraint violation.',\n },\n] as const;\n\n/**\n * Check whether an error is a safe INSERT input validation error\n * that can be exposed to the caller without leaking database internals.\n *\n * @param error - The caught error\n * @returns `true` if the error message matches a known validation pattern\n */\nexport function isSafeInsertValidationError(error: unknown): error is Error {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return SAFE_INSERT_VALIDATION_PATTERNS.some((pattern) => error.message.includes(pattern));\n}\n\n/**\n * Extract a user-safe constraint violation message from an INSERT error.\n *\n * @param error - The caught error\n * @returns A sanitized message string, or `null` if no constraint pattern matched\n */\nexport function getConstraintViolationMessage(error: unknown): string | null {\n if (!(error instanceof Error)) {\n return null;\n }\n\n // Check both the error message and the cause message, because drizzle-orm\n // wraps driver-level errors (e.g. SqliteError) in a DrizzleError whose\n // message is generic (\"Failed to run the query ...\") while the original\n // constraint violation sits on error.cause.\n const messages = [error.message];\n if (error.cause instanceof Error) {\n messages.push(error.cause.message);\n }\n\n for (const entry of CONSTRAINT_VIOLATION_PATTERNS) {\n if (messages.some((msg) => entry.pattern.test(msg))) {\n return entry.message;\n }\n }\n\n return null;\n}\n\n/**\n * Check whether an INSERT error is safe to expose to the caller.\n * Matches both validation errors and constraint violation patterns.\n *\n * @param error - The caught error\n * @returns `true` if the error is safe to surface\n */\nexport function isSafeInsertError(error: unknown): error is Error {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return isSafeInsertValidationError(error) || getConstraintViolationMessage(error) !== null;\n}\n","/**\n * Query executor for relational INSERT operations\n * @module tools/relational-insert/executor\n */\n\nimport { createLogger } from '@agentforge/core';\nimport { buildInsertQuery } from '../../query/query-builder.js';\nimport {\n benchmarkBatchExecution,\n executeBatchedTask,\n} from '../../query/batch-executor.js';\nimport type { ConnectionManager } from '../../connection/connection-manager.js';\nimport type { TransactionContext } from '../../query/transaction.js';\nimport type {\n InsertRow,\n InsertBatchMetadata,\n InsertBatchOptions,\n InsertResult,\n RelationalInsertInput,\n} from './types.js';\nimport { getConstraintViolationMessage, isSafeInsertValidationError } from './error-utils.js';\n\nconst logger = createLogger('agentforge:tools:data:relational:insert');\n\ninterface NormalizedExecutionResult {\n rows: unknown[];\n rowCount: number;\n insertId?: number;\n lastInsertRowid?: number;\n}\n\n/**\n * Execution context for INSERT operations.\n *\n * @property transaction - Optional active transaction to execute within\n */\nexport interface InsertExecutionContext {\n transaction?: TransactionContext;\n}\n\nfunction toNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction normalizeExecutionResult(result: unknown): NormalizedExecutionResult {\n if (Array.isArray(result)) {\n if (result.length > 0 && isPlainObject(result[0])) {\n const first = result[0];\n const affectedRows = toNumber(first.affectedRows) ?? toNumber(first.rowCount) ?? toNumber(first.changes);\n const insertId = toNumber(first.insertId);\n const lastInsertRowid = toNumber(first.lastInsertRowid);\n\n if (affectedRows !== undefined || insertId !== undefined || lastInsertRowid !== undefined) {\n return {\n rows: [],\n rowCount: affectedRows ?? 0,\n insertId,\n lastInsertRowid,\n };\n }\n }\n\n return {\n rows: result,\n rowCount: result.length,\n };\n }\n\n if (isPlainObject(result)) {\n const rows = Array.isArray(result.rows) ? result.rows : [];\n const rowCount = toNumber(result.rowCount)\n ?? toNumber(result.affectedRows)\n ?? toNumber(result.changes)\n ?? rows.length;\n\n return {\n rows,\n rowCount,\n insertId: toNumber(result.insertId),\n lastInsertRowid: toNumber(result.lastInsertRowid),\n };\n }\n\n return {\n rows: [],\n rowCount: 0,\n };\n}\n\nfunction deriveInsertedIds(options: {\n idColumn: string;\n inputRows: Array<Record<string, unknown>>;\n returnedRows: unknown[];\n rowCount: number;\n insertId?: number;\n lastInsertRowid?: number;\n}): Array<number | string> {\n const { idColumn, inputRows, returnedRows, rowCount, insertId, lastInsertRowid } = options;\n\n if (returnedRows.length > 0) {\n const idsFromReturn = returnedRows\n .map((row) => (isPlainObject(row) ? row[idColumn] : undefined))\n .filter((id): id is number | string => typeof id === 'number' || typeof id === 'string');\n\n if (idsFromReturn.length > 0) {\n return idsFromReturn;\n }\n }\n\n if (inputRows.every((row) => typeof row[idColumn] === 'number' || typeof row[idColumn] === 'string')) {\n return inputRows.map((row) => row[idColumn] as number | string);\n }\n\n if (insertId !== undefined && rowCount > 0) {\n return Array.from({ length: rowCount }, (_, index) => insertId + index);\n }\n\n if (lastInsertRowid !== undefined && rowCount > 0) {\n const startId = lastInsertRowid - rowCount + 1;\n return Array.from({ length: rowCount }, (_, index) => startId + index);\n }\n\n return [];\n}\n\nfunction resolveBatchOptions(batch: InsertBatchOptions | undefined): Required<InsertBatchOptions> | undefined {\n if (!batch || batch.enabled === false) {\n return undefined;\n }\n\n return {\n enabled: batch.enabled ?? true,\n batchSize: batch.batchSize ?? 100,\n continueOnError: batch.continueOnError ?? true,\n maxRetries: batch.maxRetries ?? 0,\n retryDelayMs: batch.retryDelayMs ?? 0,\n benchmark: batch.benchmark ?? false,\n };\n}\n\nasync function executeInsertOnce(\n manager: ConnectionManager,\n input: RelationalInsertInput,\n context?: InsertExecutionContext\n): Promise<InsertResult> {\n const built = buildInsertQuery({\n table: input.table,\n data: input.data,\n returning: input.returning,\n vendor: input.vendor,\n });\n\n const executor = context?.transaction ?? manager;\n\n // When the query builder returns SQL[] (heterogeneous SQLite rows),\n // execute each statement individually and aggregate results.\n if (Array.isArray(built.query)) {\n let totalRowCount = 0;\n const allRows: Record<string, unknown>[] = [];\n const allIds: Array<string | number> = [];\n\n for (const singleQuery of built.query) {\n const rawResult = await executor.execute(singleQuery);\n const normalized = normalizeExecutionResult(rawResult);\n totalRowCount += normalized.rowCount > 0 ? normalized.rowCount : 1;\n if (built.returningMode === 'row') {\n allRows.push(...normalized.rows);\n }\n if (built.returningMode === 'id') {\n const ids = deriveInsertedIds({\n idColumn: built.idColumn,\n inputRows: [built.rows[allIds.length]],\n returnedRows: normalized.rows,\n rowCount: 1,\n insertId: normalized.insertId,\n lastInsertRowid: normalized.lastInsertRowid,\n });\n allIds.push(...ids);\n }\n }\n\n return {\n rowCount: totalRowCount,\n rows: allRows,\n insertedIds: allIds,\n executionTime: 0,\n };\n }\n\n const rawResult = await executor.execute(built.query);\n const normalized = normalizeExecutionResult(rawResult);\n\n const rowCount = normalized.rowCount > 0 ? normalized.rowCount : built.rows.length;\n const rows = built.returningMode === 'row' ? normalized.rows : [];\n const insertedIds = built.returningMode === 'id'\n ? deriveInsertedIds({\n idColumn: built.idColumn,\n inputRows: built.rows,\n returnedRows: normalized.rows,\n rowCount,\n insertId: normalized.insertId,\n lastInsertRowid: normalized.lastInsertRowid,\n })\n : [];\n\n return {\n rowCount,\n rows,\n insertedIds,\n executionTime: 0,\n };\n}\n\nasync function executeInsertInBatchMode(\n manager: ConnectionManager,\n input: RelationalInsertInput & { data: InsertRow[] },\n context: InsertExecutionContext | undefined,\n options: Required<InsertBatchOptions>\n): Promise<InsertResult> {\n const batchResult = await executeBatchedTask<InsertRow, InsertResult>(\n {\n operation: 'insert',\n items: input.data,\n executeBatch: async (rows) =>\n executeInsertOnce(manager, {\n ...input,\n data: rows,\n batch: undefined,\n }, context),\n getBatchSuccessCount: (result, rows) => Math.min(result.rowCount, rows.length),\n },\n {\n batchSize: options.batchSize,\n continueOnError: options.continueOnError,\n maxRetries: options.maxRetries,\n retryDelayMs: options.retryDelayMs,\n onProgress: (progress) => {\n logger.debug('INSERT batch progress', {\n vendor: input.vendor,\n table: input.table,\n ...progress,\n });\n },\n }\n );\n\n const rowCount = batchResult.results.reduce((total, result) => total + result.rowCount, 0);\n const rows = batchResult.results.flatMap((result) => result.rows);\n const insertedIds = batchResult.results.flatMap((result) => result.insertedIds);\n\n let benchmark: InsertBatchMetadata['benchmark'];\n if (options.benchmark) {\n logger.warn('INSERT batch benchmark enabled. Synthetic benchmark callbacks are side-effect free and do not execute SQL.', {\n vendor: input.vendor,\n table: input.table,\n totalRows: input.data.length,\n batchSize: options.batchSize,\n });\n\n benchmark = await benchmarkBatchExecution({\n items: input.data,\n batchSize: options.batchSize,\n runIndividual: async () => {\n // Synthetic benchmark callback for timing-only comparison.\n },\n runBatch: async () => {\n // Synthetic benchmark callback for timing-only comparison.\n },\n });\n }\n\n return {\n rowCount,\n rows,\n insertedIds,\n executionTime: batchResult.executionTime,\n batch: {\n enabled: true,\n batchSize: options.batchSize,\n totalItems: batchResult.totalItems,\n processedItems: batchResult.processedItems,\n successfulItems: batchResult.successfulItems,\n failedItems: batchResult.failedItems,\n totalBatches: batchResult.totalBatches,\n retries: batchResult.retries,\n partialSuccess: batchResult.partialSuccess,\n failures: batchResult.failures,\n benchmark,\n },\n };\n}\n\n/**\n * Execute an INSERT query using the shared query builder.\n */\nexport async function executeInsert(\n manager: ConnectionManager,\n input: RelationalInsertInput,\n context?: InsertExecutionContext\n): Promise<InsertResult> {\n const startTime = Date.now();\n\n logger.debug('Building INSERT query', {\n vendor: input.vendor,\n table: input.table,\n isBatch: Array.isArray(input.data),\n batchModeEnabled: !!input.batch?.enabled,\n returningMode: input.returning?.mode ?? 'none',\n });\n\n try {\n const batchOptions = resolveBatchOptions(input.batch);\n\n const result = Array.isArray(input.data) && batchOptions\n ? await executeInsertInBatchMode(\n manager,\n input as RelationalInsertInput & { data: InsertRow[] },\n context,\n batchOptions\n )\n : await executeInsertOnce(manager, input, context);\n\n const executionTime = Date.now() - startTime;\n\n logger.debug('INSERT query executed successfully', {\n vendor: input.vendor,\n table: input.table,\n rowCount: result.rowCount,\n returnedRows: result.rows.length,\n returnedIds: result.insertedIds.length,\n executionTime,\n batchMode: !!result.batch,\n partialSuccess: result.batch?.partialSuccess ?? false,\n });\n\n return {\n ...result,\n executionTime,\n };\n } catch (error) {\n const executionTime = Date.now() - startTime;\n\n logger.error('INSERT query execution failed', {\n vendor: input.vendor,\n table: input.table,\n error: error instanceof Error ? error.message : String(error),\n executionTime,\n });\n\n const constraintMessage = getConstraintViolationMessage(error);\n if (constraintMessage) {\n throw new Error(constraintMessage, { cause: error });\n }\n\n if (isSafeInsertValidationError(error)) {\n throw error;\n }\n\n throw new Error('INSERT query failed. See logs for details.', { cause: error });\n }\n}\n","/**\n * Relational INSERT Tool\n *\n * Type-safe INSERT operations using Drizzle ORM query builder.\n * Supports single-row and batch inserts with configurable return behavior.\n *\n * @module tools/relational-insert\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { ConnectionManager } from '../../connection/connection-manager.js';\nimport { relationalInsertSchema } from './schemas.js';\nimport { executeInsert } from './executor.js';\nimport type { InsertResponse, RelationalInsertInput } from './types.js';\nimport { isSafeInsertError } from './error-utils.js';\n\n// Re-export types and schemas for external use\nexport * from './types.js';\nexport * from './schemas.js';\n\n/**\n * Relational INSERT Tool\n *\n * Execute type-safe INSERT queries using Drizzle ORM query builder.\n */\nexport const relationalInsert = toolBuilder()\n .name('relational-insert')\n .displayName('Relational INSERT')\n .description('Execute type-safe INSERT queries with single-row and batch insert support')\n .category(ToolCategory.DATABASE)\n .tags(['database', 'sql', 'insert', 'postgresql', 'mysql', 'sqlite'])\n .schema(relationalInsertSchema)\n .example({\n description: 'Insert a single row and return generated ID',\n input: {\n table: 'users',\n data: { name: 'Alice', email: 'alice@example.com' },\n returning: { mode: 'id', idColumn: 'id' },\n vendor: 'postgresql',\n connectionString: 'postgresql://localhost/mydb',\n },\n })\n .example({\n description: 'Batch insert rows',\n input: {\n table: 'users',\n data: [\n { name: 'Bob', email: 'bob@example.com' },\n { name: 'Carol', email: 'carol@example.com' },\n ],\n batch: {\n batchSize: 250,\n continueOnError: true,\n maxRetries: 1,\n },\n vendor: 'sqlite',\n connectionString: 'data.db',\n },\n })\n .implement(async (input: RelationalInsertInput): Promise<InsertResponse> => {\n const manager = new ConnectionManager({\n vendor: input.vendor,\n connection: input.connectionString,\n });\n\n try {\n await manager.connect();\n\n const result = await executeInsert(manager, input);\n\n return {\n success: true,\n rowCount: result.rowCount,\n insertedIds: result.insertedIds,\n rows: result.rows,\n executionTime: result.executionTime,\n batch: result.batch,\n };\n } catch (error) {\n let errorMessage = 'Failed to execute INSERT query. Please verify your input and database connection.';\n\n if (isSafeInsertError(error)) {\n errorMessage = error.message;\n }\n\n return {\n success: false,\n error: errorMessage,\n rowCount: 0,\n insertedIds: [],\n rows: [],\n };\n } finally {\n await manager.disconnect();\n }\n })\n .build();\n","/**\n * Zod schemas for relational UPDATE operations\n * @module tools/relational-update/schemas\n */\n\nimport { z } from 'zod';\nimport { VALID_QUALIFIED_IDENTIFIER_PATTERN } from '../../utils/identifier-utils.js';\n\n/**\n * Scalar values accepted for UPDATE payloads.\n */\nexport const updateValueSchema = z.union([\n z.string().describe('String value'),\n z.number().describe('Numeric value'),\n z.boolean().describe('Boolean value'),\n z.null().describe('Null value'),\n]).describe('Scalar value for an UPDATE column');\n\n/**\n * UPDATE payload schema.\n */\nexport const updateDataSchema = z.record(\n z.string().min(1, 'Column name must not be empty').describe('Column name'),\n updateValueSchema\n).superRefine((value, ctx) => {\n if (Object.keys(value).length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Update data must not be empty',\n });\n }\n}).describe('Object containing column-value pairs to update');\n\n/**\n * WHERE condition operators.\n */\nexport const updateWhereOperatorSchema = z.enum([\n 'eq',\n 'ne',\n 'gt',\n 'lt',\n 'gte',\n 'lte',\n 'like',\n 'in',\n 'notIn',\n 'isNull',\n 'isNotNull',\n]);\n\n/**\n * WHERE condition schema.\n */\nexport const updateWhereConditionSchema = z.object({\n column: z.string().min(1, 'Column name must not be empty').describe('Column name to filter on'),\n operator: updateWhereOperatorSchema.describe('Comparison operator'),\n value: z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.array(z.union([z.string(), z.number()])),\n z.null(),\n ]).optional().describe('Value to compare against (not required for isNull/isNotNull)'),\n}).superRefine((value, ctx) => {\n const op = value.operator;\n\n if (op === 'isNull' || op === 'isNotNull') {\n if (value.value !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: 'value must not be provided when using isNull or isNotNull operator',\n });\n }\n return;\n }\n\n if (value.value === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: 'value is required for this operator',\n });\n return;\n }\n\n if (op === 'in' || op === 'notIn') {\n if (!Array.isArray(value.value)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: `${op === 'in' ? 'IN' : 'NOT IN'} operator requires an array value`,\n });\n } else if (value.value.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: `${op === 'in' ? 'IN' : 'NOT IN'} operator requires a non-empty array value`,\n });\n }\n return;\n }\n\n if (value.value === null) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: 'null is only allowed with isNull/isNotNull operators',\n });\n return;\n }\n\n if (op === 'like' && typeof value.value !== 'string') {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: 'LIKE operator requires a string value',\n });\n return;\n }\n\n if ((op === 'gt' || op === 'lt' || op === 'gte' || op === 'lte') &&\n typeof value.value !== 'string' &&\n typeof value.value !== 'number') {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: `${op.toUpperCase()} operator requires a string or number value`,\n });\n }\n});\n\n/**\n * Optimistic lock schema.\n */\nexport const updateOptimisticLockSchema = z.object({\n column: z.string().min(1, 'Optimistic lock column must not be empty').describe('Version or lock column name'),\n expectedValue: z.union([\n z.string().describe('Expected string version value'),\n z.number().describe('Expected numeric version value'),\n ]).describe('Expected current value for the lock column'),\n}).describe('Optional optimistic lock condition');\n\n/**\n * One UPDATE operation item for batch mode.\n */\nexport const updateBatchOperationSchema = z.object({\n data: updateDataSchema.describe('Columns and values to update'),\n where: z.array(updateWhereConditionSchema).optional().describe('WHERE conditions (combined with AND)'),\n allowFullTableUpdate: z.boolean().default(false).describe('Explicitly allow UPDATE without WHERE conditions for this operation'),\n optimisticLock: updateOptimisticLockSchema.optional().describe('Optional optimistic locking condition for this operation'),\n}).superRefine((value, ctx) => {\n const hasWhere = (value.where?.length ?? 0) > 0;\n const hasOptimisticLock = !!value.optimisticLock;\n\n if (!value.allowFullTableUpdate && !hasWhere && !hasOptimisticLock) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['where'],\n message: 'WHERE conditions are required unless allowFullTableUpdate is true',\n });\n }\n});\n\n/**\n * Batch execution options for UPDATE operations.\n */\nexport const updateBatchOptionsSchema = z.object({\n enabled: z.boolean().optional().default(true).describe('Enable batched processing for operations[] payloads'),\n batchSize: z.number().int().positive().max(5000).optional().default(100).describe('Operations per batch chunk'),\n continueOnError: z.boolean().optional().default(true).describe('Continue processing remaining chunks when one chunk fails'),\n maxRetries: z.number().int().min(0).max(5).optional().default(0).describe('Retry attempts per failed chunk'),\n retryDelayMs: z.number().int().min(0).max(60000).optional().default(0).describe('Delay between retry attempts in milliseconds'),\n benchmark: z.boolean().optional().default(false).describe('Run synthetic benchmark metadata comparing individual vs batched execution callbacks'),\n});\n\n/**\n * Relational UPDATE tool input schema.\n */\nexport const relationalUpdateSchema = z.object({\n table: z.string()\n .min(1, 'Table name is required')\n .regex(\n VALID_QUALIFIED_IDENTIFIER_PATTERN,\n 'Table name contains invalid characters. Only alphanumeric characters, underscores, and dots (for schema qualification) are allowed.'\n )\n .describe('Table name to update (schema-qualified names supported, e.g. public.users)'),\n data: updateDataSchema.optional().describe('Columns and values to update'),\n where: z.array(updateWhereConditionSchema).optional().describe('WHERE conditions (combined with AND)'),\n allowFullTableUpdate: z.boolean().default(false).describe('Explicitly allow UPDATE without WHERE conditions'),\n optimisticLock: updateOptimisticLockSchema.optional().describe('Optional optimistic locking condition'),\n operations: z.array(updateBatchOperationSchema).min(1, 'operations must contain at least one batch item').optional().describe('Batch update operation list'),\n batch: updateBatchOptionsSchema.optional().describe('Optional batch execution controls for operations payloads'),\n vendor: z.enum(['postgresql', 'mysql', 'sqlite']).describe('Database vendor'),\n connectionString: z.string().min(1, 'Database connection string is required').describe('Database connection string'),\n}).superRefine((value, ctx) => {\n const hasOperations = (value.operations?.length ?? 0) > 0;\n\n if (hasOperations && value.data) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['data'],\n message: 'data cannot be provided when operations[] is used',\n });\n }\n\n if (!hasOperations && !value.data) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['data'],\n message: 'data is required when operations[] is not provided',\n });\n }\n\n if (hasOperations && (value.where?.length ?? 0) > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['where'],\n message: 'where cannot be provided when operations[] is used',\n });\n }\n\n if (hasOperations && value.optimisticLock) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['optimisticLock'],\n message: 'optimisticLock cannot be provided when operations[] is used',\n });\n }\n\n if (hasOperations && value.allowFullTableUpdate) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['allowFullTableUpdate'],\n message: 'allowFullTableUpdate cannot be provided when operations[] is used',\n });\n }\n\n if (hasOperations) {\n return;\n }\n\n const hasWhere = (value.where?.length ?? 0) > 0;\n const hasOptimisticLock = !!value.optimisticLock;\n\n if (!value.allowFullTableUpdate && !hasWhere && !hasOptimisticLock) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['where'],\n message: 'WHERE conditions are required unless allowFullTableUpdate is true',\n });\n }\n});\n","/**\n * Helpers for classifying safe validation and constraint errors in relational-update.\n */\n\nconst SAFE_UPDATE_VALIDATION_PATTERNS = [\n 'must not be empty',\n 'contains invalid characters',\n 'Update data must be an object',\n 'Update data must not be empty',\n 'must not be undefined',\n 'WHERE conditions are required for UPDATE queries',\n 'null is only allowed with isNull/isNotNull operators',\n 'operator requires a string or number value',\n 'operator requires a non-empty array value',\n 'operator requires a string value',\n 'must not include value',\n 'Optimistic lock expectedValue must not be empty',\n 'optimistic lock check failed',\n 'WHERE conditions are required unless allowFullTableUpdate is true',\n] as const;\n\nconst CONSTRAINT_VIOLATION_PATTERNS = [\n {\n pattern: /(unique constraint|duplicate key|duplicate entry)/i,\n message: 'Update failed: unique constraint violation.',\n },\n {\n pattern: /(foreign key constraint|violates foreign key constraint)/i,\n message: 'Update failed: foreign key constraint violation.',\n },\n {\n pattern: /(not null constraint|cannot be null)/i,\n message: 'Update failed: NOT NULL constraint violation.',\n },\n] as const;\n\n/**\n * Check whether an error is a safe UPDATE input validation error\n * that can be exposed to the caller without leaking database internals.\n *\n * @param error - The caught error\n * @returns `true` if the error message matches a known validation pattern\n */\nexport function isSafeUpdateValidationError(error: unknown): error is Error {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return SAFE_UPDATE_VALIDATION_PATTERNS.some((pattern) => error.message.includes(pattern));\n}\n\n/**\n * Extract a user-safe constraint violation message from an UPDATE error.\n *\n * @param error - The caught error\n * @returns A sanitized message string, or `null` if no constraint pattern matched\n */\nexport function getUpdateConstraintViolationMessage(error: unknown): string | null {\n if (!(error instanceof Error)) {\n return null;\n }\n\n // Check both the error message and the cause message, because drizzle-orm\n // wraps driver-level errors (e.g. SqliteError) in a DrizzleError whose\n // message is generic (\"Failed to run the query ...\") while the original\n // constraint violation sits on error.cause.\n const messages = [error.message];\n if (error.cause instanceof Error) {\n messages.push(error.cause.message);\n }\n\n for (const entry of CONSTRAINT_VIOLATION_PATTERNS) {\n if (messages.some((msg) => entry.pattern.test(msg))) {\n return entry.message;\n }\n }\n\n return null;\n}\n\n/**\n * Check whether an UPDATE error is safe to expose to the caller.\n * Matches both validation errors and constraint violation patterns.\n *\n * @param error - The caught error\n * @returns `true` if the error is safe to surface\n */\nexport function isSafeUpdateError(error: unknown): error is Error {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return isSafeUpdateValidationError(error) || getUpdateConstraintViolationMessage(error) !== null;\n}\n","/**\n * Query executor for relational UPDATE operations\n * @module tools/relational-update/executor\n */\n\nimport { createLogger } from '@agentforge/core';\nimport { buildUpdateQuery } from '../../query/query-builder.js';\nimport {\n benchmarkBatchExecution,\n executeBatchedTask,\n} from '../../query/batch-executor.js';\nimport type { ConnectionManager } from '../../connection/connection-manager.js';\nimport type { TransactionContext } from '../../query/transaction.js';\nimport type {\n RelationalUpdateInput,\n UpdateBatchMetadata,\n UpdateBatchOperation,\n UpdateBatchOptions,\n UpdateResult,\n} from './types.js';\nimport { getUpdateConstraintViolationMessage, isSafeUpdateValidationError } from './error-utils.js';\n\nconst logger = createLogger('agentforge:tools:data:relational:update');\n\n/**\n * Execution context for UPDATE operations.\n *\n * @property transaction - Optional active transaction to execute within\n */\nexport interface UpdateExecutionContext {\n transaction?: TransactionContext;\n}\n\ninterface SingleUpdateOperation {\n data: NonNullable<RelationalUpdateInput['data']>;\n where?: RelationalUpdateInput['where'];\n allowFullTableUpdate?: RelationalUpdateInput['allowFullTableUpdate'];\n optimisticLock?: RelationalUpdateInput['optimisticLock'];\n}\n\ninterface UpdateChunkExecutionResult {\n rowCount: number;\n successfulItems: number;\n failedItems: number;\n failures: UpdateBatchMetadata['failures'];\n}\n\nfunction toNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction normalizeAffectedRows(result: unknown): number {\n if (Array.isArray(result)) {\n if (result.length > 0 && result[0] && typeof result[0] === 'object') {\n const first = result[0] as Record<string, unknown>;\n const affectedRows = toNumber(first.affectedRows) ?? toNumber(first.rowCount) ?? toNumber(first.changes);\n if (affectedRows !== undefined) {\n return affectedRows;\n }\n }\n return result.length;\n }\n\n if (result && typeof result === 'object') {\n const resultRecord = result as Record<string, unknown>;\n return toNumber(resultRecord.rowCount)\n ?? toNumber(resultRecord.affectedRows)\n ?? toNumber(resultRecord.changes)\n ?? (Array.isArray(resultRecord.rows) ? resultRecord.rows.length : 0);\n }\n\n return 0;\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction resolveBatchOptions(batch: UpdateBatchOptions | undefined): Required<UpdateBatchOptions> | undefined {\n if (!batch || batch.enabled === false) {\n return undefined;\n }\n\n return {\n enabled: batch.enabled ?? true,\n batchSize: batch.batchSize ?? 100,\n continueOnError: batch.continueOnError ?? true,\n maxRetries: batch.maxRetries ?? 0,\n retryDelayMs: batch.retryDelayMs ?? 0,\n benchmark: batch.benchmark ?? false,\n };\n}\n\nfunction toSingleUpdateOperation(input: RelationalUpdateInput): SingleUpdateOperation {\n if (!input.data) {\n throw new Error('UPDATE data is required when operations[] is not provided.');\n }\n\n return {\n data: input.data,\n where: input.where,\n allowFullTableUpdate: input.allowFullTableUpdate,\n optimisticLock: input.optimisticLock,\n };\n}\n\nasync function executeSingleUpdate(\n manager: ConnectionManager,\n input: RelationalUpdateInput,\n operation: SingleUpdateOperation,\n context?: UpdateExecutionContext\n): Promise<UpdateResult> {\n const built = buildUpdateQuery({\n table: input.table,\n data: operation.data,\n where: operation.where,\n allowFullTableUpdate: operation.allowFullTableUpdate,\n optimisticLock: operation.optimisticLock,\n vendor: input.vendor,\n });\n\n const executor = context?.transaction ?? manager;\n const rawResult = await executor.execute(built.query);\n const rowCount = normalizeAffectedRows(rawResult);\n\n if (built.usesOptimisticLock && rowCount === 0) {\n throw new Error('Update failed: optimistic lock check failed.');\n }\n\n return {\n rowCount,\n executionTime: 0,\n };\n}\n\nasync function executeUpdateInBatchMode(\n manager: ConnectionManager,\n input: RelationalUpdateInput & { operations: UpdateBatchOperation[] },\n context: UpdateExecutionContext | undefined,\n options: Required<UpdateBatchOptions>\n): Promise<UpdateResult> {\n const batchResult = await executeBatchedTask<UpdateBatchOperation, UpdateChunkExecutionResult>(\n {\n operation: 'update',\n items: input.operations,\n executeBatch: async (operations, batchIndex) => {\n let rowCount = 0;\n let successfulItems = 0;\n let failedItems = 0;\n const failures: UpdateBatchMetadata['failures'] = [];\n\n for (const operation of operations) {\n try {\n const result = await executeSingleUpdate(\n manager,\n input,\n {\n data: operation.data,\n where: operation.where,\n allowFullTableUpdate: operation.allowFullTableUpdate,\n optimisticLock: operation.optimisticLock,\n },\n context\n );\n\n rowCount += result.rowCount;\n successfulItems += 1;\n } catch (error) {\n if (!options.continueOnError) {\n throw error;\n }\n\n failedItems += 1;\n failures.push({\n operation: 'update',\n batchIndex,\n batchSize: operations.length,\n attempts: 1,\n error: toErrorMessage(error),\n });\n }\n }\n\n return {\n rowCount,\n successfulItems,\n failedItems,\n failures,\n };\n },\n getBatchSuccessCount: (result) => result.successfulItems,\n },\n {\n batchSize: options.batchSize,\n continueOnError: options.continueOnError,\n maxRetries: options.maxRetries,\n retryDelayMs: options.retryDelayMs,\n onProgress: (progress) => {\n logger.debug('UPDATE batch progress', {\n vendor: input.vendor,\n table: input.table,\n ...progress,\n });\n },\n }\n );\n\n const rowCount = batchResult.results.reduce((total, result) => total + result.rowCount, 0);\n const operationFailures = batchResult.results.flatMap((result) => result.failures);\n\n let benchmark: UpdateBatchMetadata['benchmark'];\n if (options.benchmark) {\n logger.warn('UPDATE batch benchmark enabled. Synthetic benchmark callbacks are side-effect free and do not execute SQL.', {\n vendor: input.vendor,\n table: input.table,\n operationCount: input.operations.length,\n batchSize: options.batchSize,\n });\n\n benchmark = await benchmarkBatchExecution({\n items: input.operations,\n batchSize: options.batchSize,\n runIndividual: async () => {\n // Synthetic benchmark callback for timing-only comparison.\n },\n runBatch: async () => {\n // Synthetic benchmark callback for timing-only comparison.\n },\n });\n }\n\n return {\n rowCount,\n executionTime: batchResult.executionTime,\n batch: {\n enabled: true,\n batchSize: options.batchSize,\n totalItems: batchResult.totalItems,\n processedItems: batchResult.processedItems,\n successfulItems: batchResult.successfulItems,\n failedItems: batchResult.failedItems,\n totalBatches: batchResult.totalBatches,\n retries: batchResult.retries,\n partialSuccess: batchResult.partialSuccess,\n failures: [...batchResult.failures, ...operationFailures],\n benchmark,\n },\n };\n}\n\n/**\n * Execute an UPDATE query using the shared query builder.\n */\nexport async function executeUpdate(\n manager: ConnectionManager,\n input: RelationalUpdateInput,\n context?: UpdateExecutionContext\n): Promise<UpdateResult> {\n const startTime = Date.now();\n\n logger.debug('Building UPDATE query', {\n vendor: input.vendor,\n table: input.table,\n hasWhere: !!input.where?.length,\n allowFullTableUpdate: input.allowFullTableUpdate,\n hasOptimisticLock: !!input.optimisticLock,\n operationCount: input.operations?.length ?? 0,\n batchModeEnabled: !!input.batch?.enabled,\n });\n\n try {\n const batchOptions = resolveBatchOptions(input.batch);\n\n const result = input.operations && batchOptions\n ? await executeUpdateInBatchMode(\n manager,\n input as RelationalUpdateInput & { operations: UpdateBatchOperation[] },\n context,\n batchOptions\n )\n : await executeSingleUpdate(manager, input, toSingleUpdateOperation(input), context);\n\n const executionTime = Date.now() - startTime;\n\n logger.debug('UPDATE query executed successfully', {\n vendor: input.vendor,\n table: input.table,\n rowCount: result.rowCount,\n executionTime,\n batchMode: !!result.batch,\n partialSuccess: result.batch?.partialSuccess ?? false,\n });\n\n return {\n ...result,\n executionTime,\n };\n } catch (error) {\n const executionTime = Date.now() - startTime;\n\n logger.error('UPDATE query execution failed', {\n vendor: input.vendor,\n table: input.table,\n error: error instanceof Error ? error.message : String(error),\n executionTime,\n });\n\n const constraintMessage = getUpdateConstraintViolationMessage(error);\n if (constraintMessage) {\n throw new Error(constraintMessage, { cause: error });\n }\n\n if (isSafeUpdateValidationError(error)) {\n throw error;\n }\n\n throw new Error('UPDATE query failed. See logs for details.', { cause: error });\n }\n}\n","/**\n * Relational UPDATE Tool\n *\n * Type-safe UPDATE operations using Drizzle ORM query builder.\n * Supports WHERE conditions, full-table update protection, and optimistic locking.\n *\n * @module tools/relational-update\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { ConnectionManager } from '../../connection/connection-manager.js';\nimport { relationalUpdateSchema } from './schemas.js';\nimport { executeUpdate } from './executor.js';\nimport type { RelationalUpdateInput, UpdateResponse } from './types.js';\nimport { isSafeUpdateError } from './error-utils.js';\n\n// Re-export types and schemas for external use\nexport * from './types.js';\nexport * from './schemas.js';\n\n/**\n * Relational UPDATE Tool\n *\n * Execute type-safe UPDATE queries using Drizzle ORM query builder.\n */\nexport const relationalUpdate = toolBuilder()\n .name('relational-update')\n .displayName('Relational UPDATE')\n .description('Execute type-safe UPDATE queries with single and batched operation support')\n .category(ToolCategory.DATABASE)\n .tags(['database', 'sql', 'update', 'postgresql', 'mysql', 'sqlite'])\n .schema(relationalUpdateSchema)\n .example({\n description: 'Update one row by condition',\n input: {\n table: 'users',\n data: { status: 'inactive' },\n where: [{ column: 'id', operator: 'eq', value: 123 }],\n vendor: 'postgresql',\n connectionString: 'postgresql://localhost/mydb',\n },\n })\n .example({\n description: 'Optimistic lock update',\n input: {\n table: 'users',\n data: { status: 'active' },\n where: [{ column: 'id', operator: 'eq', value: 123 }],\n optimisticLock: { column: 'version', expectedValue: 5 },\n vendor: 'sqlite',\n connectionString: 'data.db',\n },\n })\n .example({\n description: 'Batch update operations',\n input: {\n table: 'users',\n operations: [\n {\n data: { status: 'inactive' },\n where: [{ column: 'id', operator: 'eq', value: 1 }],\n },\n {\n data: { status: 'inactive' },\n where: [{ column: 'id', operator: 'eq', value: 2 }],\n },\n ],\n batch: {\n batchSize: 100,\n continueOnError: true,\n },\n vendor: 'postgresql',\n connectionString: 'postgresql://localhost/mydb',\n },\n })\n .implement(async (input: RelationalUpdateInput): Promise<UpdateResponse> => {\n const manager = new ConnectionManager({\n vendor: input.vendor,\n connection: input.connectionString,\n });\n\n try {\n await manager.connect();\n\n const result = await executeUpdate(manager, input);\n\n return {\n success: true,\n rowCount: result.rowCount,\n executionTime: result.executionTime,\n batch: result.batch,\n };\n } catch (error) {\n let errorMessage = 'Failed to execute UPDATE query. Please verify your input and database connection.';\n\n if (isSafeUpdateError(error)) {\n errorMessage = error.message;\n }\n\n return {\n success: false,\n error: errorMessage,\n rowCount: 0,\n };\n } finally {\n await manager.disconnect();\n }\n })\n .build();\n","/**\n * Zod schemas for relational DELETE operations\n * @module tools/relational-delete/schemas\n */\n\nimport { z } from 'zod';\nimport { VALID_QUALIFIED_IDENTIFIER_PATTERN } from '../../utils/identifier-utils.js';\n\n/** Allowed comparison operators for DELETE WHERE conditions. */\nexport const deleteWhereOperatorSchema = z.enum([\n 'eq',\n 'ne',\n 'gt',\n 'lt',\n 'gte',\n 'lte',\n 'like',\n 'in',\n 'notIn',\n 'isNull',\n 'isNotNull',\n]);\n\n/** Schema for a single WHERE condition in DELETE operations. */\nexport const deleteWhereConditionSchema = z.object({\n column: z.string().min(1, 'Column name must not be empty').describe('Column name to filter on'),\n operator: deleteWhereOperatorSchema.describe('Comparison operator'),\n value: z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.array(z.union([z.string(), z.number()])),\n z.null(),\n ]).optional().describe('Value to compare against (not required for isNull/isNotNull)'),\n}).superRefine((value, ctx) => {\n const op = value.operator;\n\n if (op === 'isNull' || op === 'isNotNull') {\n if (value.value !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: 'value must not be provided when using isNull or isNotNull operator',\n });\n }\n return;\n }\n\n if (value.value === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: 'value is required for this operator',\n });\n return;\n }\n\n if (op === 'in' || op === 'notIn') {\n if (!Array.isArray(value.value)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: `${op === 'in' ? 'IN' : 'NOT IN'} operator requires an array value`,\n });\n } else if (value.value.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: `${op === 'in' ? 'IN' : 'NOT IN'} operator requires a non-empty array value`,\n });\n }\n return;\n }\n\n if (value.value === null) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: 'null is only allowed with isNull/isNotNull operators',\n });\n return;\n }\n\n if (op === 'like' && typeof value.value !== 'string') {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: 'LIKE operator requires a string value',\n });\n return;\n }\n\n if ((op === 'gt' || op === 'lt' || op === 'gte' || op === 'lte') &&\n typeof value.value !== 'string' &&\n typeof value.value !== 'number') {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['value'],\n message: `${op.toUpperCase()} operator requires a string or number value`,\n });\n }\n});\n\n/** Soft-delete configuration schema. Updates a column instead of physically deleting rows. */\nexport const deleteSoftDeleteSchema = z.object({\n column: z.string().min(1, 'Soft delete column must not be empty').default('deleted_at').describe('Column to write deletion timestamp/value into'),\n value: z.union([z.string(), z.number()]).optional().describe('Optional explicit value for the soft-delete column (defaults to ISO timestamp)'),\n}).describe('Enable soft delete by updating a column instead of physically deleting rows');\n\n/**\n * One DELETE operation item for batch mode.\n */\nexport const deleteBatchOperationSchema = z.object({\n where: z.array(deleteWhereConditionSchema).optional().describe('WHERE conditions (combined with AND)'),\n allowFullTableDelete: z.boolean().default(false).describe('Explicitly allow DELETE without WHERE conditions for this operation'),\n cascade: z.boolean().default(false).describe('Enable cascade-aware error messaging for this operation'),\n softDelete: deleteSoftDeleteSchema.optional().describe('Use soft-delete semantics instead of hard DELETE for this operation'),\n}).superRefine((value, ctx) => {\n const hasWhere = (value.where?.length ?? 0) > 0;\n\n if (!value.allowFullTableDelete && !hasWhere) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['where'],\n message: 'WHERE conditions are required unless allowFullTableDelete is true',\n });\n }\n});\n\n/**\n * Batch execution options for DELETE operations.\n */\nexport const deleteBatchOptionsSchema = z.object({\n enabled: z.boolean().optional().default(true).describe('Enable batched processing for operations[] payloads'),\n batchSize: z.number().int().positive().max(5000).optional().default(100).describe('Operations per batch chunk'),\n continueOnError: z.boolean().optional().default(true).describe('Continue processing remaining chunks when one chunk fails'),\n maxRetries: z.number().int().min(0).max(5).optional().default(0).describe('Retry attempts per failed chunk'),\n retryDelayMs: z.number().int().min(0).max(60000).optional().default(0).describe('Delay between retry attempts in milliseconds'),\n benchmark: z.boolean().optional().default(false).describe('Run synthetic benchmark metadata comparing individual vs batched execution callbacks'),\n});\n\n/** Complete input schema for the relational-delete tool. */\nexport const relationalDeleteSchema = z.object({\n table: z.string()\n .min(1, 'Table name is required')\n .regex(\n VALID_QUALIFIED_IDENTIFIER_PATTERN,\n 'Table name contains invalid characters. Only alphanumeric characters, underscores, and dots (for schema qualification) are allowed.'\n )\n .describe('Table name to delete from (schema-qualified names supported, e.g. public.users)'),\n where: z.array(deleteWhereConditionSchema).optional().describe('WHERE conditions (combined with AND)'),\n allowFullTableDelete: z.boolean().default(false).describe('Explicitly allow DELETE without WHERE conditions'),\n cascade: z.boolean().default(false).describe('Enable cascade-aware error messaging for foreign key constraints'),\n softDelete: deleteSoftDeleteSchema.optional().describe('Use soft-delete semantics instead of hard DELETE'),\n operations: z.array(deleteBatchOperationSchema).min(1, 'operations must contain at least one batch item').optional().describe('Batch delete operation list'),\n batch: deleteBatchOptionsSchema.optional().describe('Optional batch execution controls for operations payloads'),\n vendor: z.enum(['postgresql', 'mysql', 'sqlite']).describe('Database vendor'),\n connectionString: z.string().min(1, 'Database connection string is required').describe('Database connection string'),\n}).superRefine((value, ctx) => {\n const hasOperations = (value.operations?.length ?? 0) > 0;\n\n if (hasOperations && (value.where?.length ?? 0) > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['where'],\n message: 'where cannot be provided when operations[] is used',\n });\n }\n\n if (hasOperations && value.allowFullTableDelete) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['allowFullTableDelete'],\n message: 'allowFullTableDelete cannot be provided when operations[] is used',\n });\n }\n\n if (hasOperations && value.cascade) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['cascade'],\n message: 'cascade cannot be provided when operations[] is used',\n });\n }\n\n if (hasOperations && value.softDelete) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['softDelete'],\n message: 'softDelete cannot be provided when operations[] is used',\n });\n }\n\n if (hasOperations) {\n return;\n }\n\n const hasWhere = (value.where?.length ?? 0) > 0;\n\n if (!value.allowFullTableDelete && !hasWhere) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['where'],\n message: 'WHERE conditions are required unless allowFullTableDelete is true',\n });\n }\n});\n","/**\n * Helpers for classifying safe validation and constraint errors in relational-delete.\n */\n\nconst SAFE_DELETE_VALIDATION_PATTERNS = [\n 'must not be empty',\n 'contains invalid characters',\n 'WHERE conditions are required for DELETE queries',\n 'WHERE conditions are required unless allowFullTableDelete is true',\n 'value is required for this operator',\n 'null is only allowed with isNull/isNotNull operators',\n 'operator requires a value',\n 'operator requires a string or number value',\n 'operator requires a string value',\n 'operator requires a non-empty array value',\n 'must not include value',\n] as const;\n\nconst CONSTRAINT_VIOLATION_PATTERNS = [\n {\n pattern: /(foreign key constraint|violates foreign key constraint|foreign key mismatch|a foreign key constraint fails)/i,\n message: 'Delete failed: foreign key constraint violation.',\n },\n] as const;\n\n/**\n * Check whether an error is a safe DELETE input validation error\n * that can be exposed to the caller without leaking database internals.\n *\n * @param error - The caught error\n * @returns `true` if the error message matches a known validation pattern\n */\nexport function isSafeDeleteValidationError(error: unknown): error is Error {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return SAFE_DELETE_VALIDATION_PATTERNS.some((pattern) => error.message.includes(pattern));\n}\n\n/**\n * Extract a user-safe constraint violation message from a DELETE error.\n *\n * @param error - The caught error\n * @param cascade - Whether cascade mode was requested\n * @returns A sanitized message string, or `null` if no constraint pattern matched\n */\nexport function getDeleteConstraintViolationMessage(error: unknown, cascade: boolean): string | null {\n if (!(error instanceof Error)) {\n return null;\n }\n\n // Check both the error message and the cause message, because drizzle-orm\n // wraps driver-level errors (e.g. SqliteError) in a DrizzleError whose\n // message is generic (\"Failed to run the query ...\") while the original\n // constraint violation sits on error.cause.\n const messages = [error.message];\n if (error.cause instanceof Error) {\n messages.push(error.cause.message);\n }\n\n for (const entry of CONSTRAINT_VIOLATION_PATTERNS) {\n if (messages.some((msg) => entry.pattern.test(msg))) {\n if (cascade) {\n return `${entry.message} Verify database-level ON DELETE CASCADE is configured for related foreign keys.`;\n }\n return entry.message;\n }\n }\n\n return null;\n}\n\n/**\n * Check whether a DELETE error is safe to expose to the caller.\n * Matches both validation errors and constraint violation patterns.\n *\n * @param error - The caught error\n * @returns `true` if the error is safe to surface\n */\nexport function isSafeDeleteError(error: unknown): error is Error {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return SAFE_DELETE_VALIDATION_PATTERNS.some((pattern) => error.message.includes(pattern))\n || error.message.startsWith('Delete failed:');\n}\n","/**\n * Query executor for relational DELETE operations\n * @module tools/relational-delete/executor\n */\n\nimport { createLogger } from '@agentforge/core';\nimport { buildDeleteQuery } from '../../query/query-builder.js';\nimport {\n benchmarkBatchExecution,\n executeBatchedTask,\n} from '../../query/batch-executor.js';\nimport type { ConnectionManager } from '../../connection/connection-manager.js';\nimport type { TransactionContext } from '../../query/transaction.js';\nimport type {\n DeleteBatchMetadata,\n DeleteBatchOperation,\n DeleteBatchOptions,\n DeleteResult,\n RelationalDeleteInput,\n} from './types.js';\nimport { getDeleteConstraintViolationMessage, isSafeDeleteValidationError } from './error-utils.js';\n\nconst logger = createLogger('agentforge:tools:data:relational:delete');\n\n/**\n * Execution context for DELETE operations.\n *\n * @property transaction - Optional active transaction to execute within\n */\nexport interface DeleteExecutionContext {\n transaction?: TransactionContext;\n}\n\ninterface SingleDeleteOperation {\n where?: RelationalDeleteInput['where'];\n allowFullTableDelete?: RelationalDeleteInput['allowFullTableDelete'];\n cascade?: RelationalDeleteInput['cascade'];\n softDelete?: RelationalDeleteInput['softDelete'];\n}\n\ninterface DeleteChunkExecutionResult {\n rowCount: number;\n successfulItems: number;\n failedItems: number;\n softDeletedCount: number;\n failures: DeleteBatchMetadata['failures'];\n}\n\nfunction toNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction normalizeAffectedRows(result: unknown): number {\n if (Array.isArray(result)) {\n if (result.length > 0 && result[0] && typeof result[0] === 'object') {\n const first = result[0] as Record<string, unknown>;\n const affectedRows = toNumber(first.affectedRows) ?? toNumber(first.rowCount) ?? toNumber(first.changes);\n if (affectedRows !== undefined) {\n return affectedRows;\n }\n }\n return result.length;\n }\n\n if (result && typeof result === 'object') {\n const resultRecord = result as Record<string, unknown>;\n return toNumber(resultRecord.rowCount)\n ?? toNumber(resultRecord.affectedRows)\n ?? toNumber(resultRecord.changes)\n ?? (Array.isArray(resultRecord.rows) ? resultRecord.rows.length : 0);\n }\n\n return 0;\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction resolveBatchOptions(batch: DeleteBatchOptions | undefined): Required<DeleteBatchOptions> | undefined {\n if (!batch || batch.enabled === false) {\n return undefined;\n }\n\n return {\n enabled: batch.enabled ?? true,\n batchSize: batch.batchSize ?? 100,\n continueOnError: batch.continueOnError ?? true,\n maxRetries: batch.maxRetries ?? 0,\n retryDelayMs: batch.retryDelayMs ?? 0,\n benchmark: batch.benchmark ?? false,\n };\n}\n\nfunction toSingleDeleteOperation(input: RelationalDeleteInput): SingleDeleteOperation {\n return {\n where: input.where,\n allowFullTableDelete: input.allowFullTableDelete,\n cascade: input.cascade,\n softDelete: input.softDelete,\n };\n}\n\nasync function executeSingleDelete(\n manager: ConnectionManager,\n input: RelationalDeleteInput,\n operation: SingleDeleteOperation,\n context?: DeleteExecutionContext\n): Promise<DeleteResult> {\n const built = buildDeleteQuery({\n table: input.table,\n where: operation.where,\n allowFullTableDelete: operation.allowFullTableDelete,\n softDelete: operation.softDelete,\n vendor: input.vendor,\n });\n\n const executor = context?.transaction ?? manager;\n const rawResult = await executor.execute(built.query);\n const rowCount = normalizeAffectedRows(rawResult);\n\n return {\n rowCount,\n executionTime: 0,\n softDeleted: built.usesSoftDelete,\n };\n}\n\nasync function executeDeleteInBatchMode(\n manager: ConnectionManager,\n input: RelationalDeleteInput & { operations: DeleteBatchOperation[] },\n context: DeleteExecutionContext | undefined,\n options: Required<DeleteBatchOptions>\n): Promise<DeleteResult> {\n const batchResult = await executeBatchedTask<DeleteBatchOperation, DeleteChunkExecutionResult>(\n {\n operation: 'delete',\n items: input.operations,\n executeBatch: async (operations, batchIndex) => {\n let rowCount = 0;\n let successfulItems = 0;\n let failedItems = 0;\n let softDeletedCount = 0;\n const failures: DeleteBatchMetadata['failures'] = [];\n\n for (const operation of operations) {\n try {\n const result = await executeSingleDelete(\n manager,\n input,\n {\n where: operation.where,\n allowFullTableDelete: operation.allowFullTableDelete,\n cascade: operation.cascade,\n softDelete: operation.softDelete,\n },\n context\n );\n\n rowCount += result.rowCount;\n successfulItems += 1;\n if (result.softDeleted) {\n softDeletedCount += 1;\n }\n } catch (error) {\n if (!options.continueOnError) {\n throw error;\n }\n\n failedItems += 1;\n failures.push({\n operation: 'delete',\n batchIndex,\n batchSize: operations.length,\n attempts: 1,\n error: toErrorMessage(error),\n });\n }\n }\n\n return {\n rowCount,\n successfulItems,\n failedItems,\n softDeletedCount,\n failures,\n };\n },\n getBatchSuccessCount: (result) => result.successfulItems,\n },\n {\n batchSize: options.batchSize,\n continueOnError: options.continueOnError,\n maxRetries: options.maxRetries,\n retryDelayMs: options.retryDelayMs,\n onProgress: (progress) => {\n logger.debug('DELETE batch progress', {\n vendor: input.vendor,\n table: input.table,\n ...progress,\n });\n },\n }\n );\n\n const rowCount = batchResult.results.reduce((total, result) => total + result.rowCount, 0);\n const softDeleted = batchResult.results.some((result) => result.softDeletedCount > 0);\n const operationFailures = batchResult.results.flatMap((result) => result.failures);\n\n let benchmark: DeleteBatchMetadata['benchmark'];\n if (options.benchmark) {\n logger.warn('DELETE batch benchmark enabled. Synthetic benchmark callbacks are side-effect free and do not execute SQL.', {\n vendor: input.vendor,\n table: input.table,\n operationCount: input.operations.length,\n batchSize: options.batchSize,\n });\n\n benchmark = await benchmarkBatchExecution({\n items: input.operations,\n batchSize: options.batchSize,\n runIndividual: async () => {\n // Synthetic benchmark callback for timing-only comparison.\n },\n runBatch: async () => {\n // Synthetic benchmark callback for timing-only comparison.\n },\n });\n }\n\n return {\n rowCount,\n executionTime: batchResult.executionTime,\n softDeleted,\n batch: {\n enabled: true,\n batchSize: options.batchSize,\n totalItems: batchResult.totalItems,\n processedItems: batchResult.processedItems,\n successfulItems: batchResult.successfulItems,\n failedItems: batchResult.failedItems,\n totalBatches: batchResult.totalBatches,\n retries: batchResult.retries,\n partialSuccess: batchResult.partialSuccess,\n failures: [...batchResult.failures, ...operationFailures],\n benchmark,\n },\n };\n}\n\n/**\n * Execute a DELETE query using the shared query builder.\n */\nexport async function executeDelete(\n manager: ConnectionManager,\n input: RelationalDeleteInput,\n context?: DeleteExecutionContext\n): Promise<DeleteResult> {\n const startTime = Date.now();\n\n logger.debug('Building DELETE query', {\n vendor: input.vendor,\n table: input.table,\n hasWhere: !!input.where?.length,\n allowFullTableDelete: input.allowFullTableDelete,\n cascade: input.cascade,\n softDelete: !!input.softDelete,\n operationCount: input.operations?.length ?? 0,\n batchModeEnabled: !!input.batch?.enabled,\n });\n\n try {\n const batchOptions = resolveBatchOptions(input.batch);\n\n const result = input.operations && batchOptions\n ? await executeDeleteInBatchMode(\n manager,\n input as RelationalDeleteInput & { operations: DeleteBatchOperation[] },\n context,\n batchOptions\n )\n : await executeSingleDelete(manager, input, toSingleDeleteOperation(input), context);\n\n const executionTime = Date.now() - startTime;\n\n logger.debug('DELETE query executed successfully', {\n vendor: input.vendor,\n table: input.table,\n rowCount: result.rowCount,\n executionTime,\n softDelete: result.softDeleted,\n cascade: input.cascade,\n batchMode: !!result.batch,\n partialSuccess: result.batch?.partialSuccess ?? false,\n });\n\n return {\n ...result,\n executionTime,\n };\n } catch (error) {\n const executionTime = Date.now() - startTime;\n\n logger.error('DELETE query execution failed', {\n vendor: input.vendor,\n table: input.table,\n error: error instanceof Error ? error.message : String(error),\n executionTime,\n cascade: input.cascade,\n softDelete: !!input.softDelete,\n });\n\n const constraintMessage = getDeleteConstraintViolationMessage(error, input.cascade ?? false);\n if (constraintMessage) {\n throw new Error(constraintMessage, { cause: error });\n }\n\n if (isSafeDeleteValidationError(error)) {\n throw error;\n }\n\n throw new Error('DELETE query failed. See logs for details.', { cause: error });\n }\n}\n","/**\n * Relational DELETE Tool\n *\n * Type-safe DELETE operations using Drizzle ORM query builder.\n * Supports WHERE conditions, full-table delete protection, and optional soft delete mode.\n *\n * @module tools/relational-delete\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { ConnectionManager } from '../../connection/connection-manager.js';\nimport { relationalDeleteSchema } from './schemas.js';\nimport { executeDelete } from './executor.js';\nimport type { RelationalDeleteInput, DeleteResponse } from './types.js';\nimport { isSafeDeleteError } from './error-utils.js';\n\nexport * from './types.js';\nexport * from './schemas.js';\n\n/**\n * LangGraph tool for type-safe DELETE queries with single and batched operation support.\n *\n * Supports WHERE conditions, full-table-delete protection, soft-delete mode,\n * batch operations with retry logic, and optional cascade hints.\n */\nexport const relationalDelete = toolBuilder()\n .name('relational-delete')\n .displayName('Relational DELETE')\n .description('Execute type-safe DELETE queries with single and batched operation support')\n .category(ToolCategory.DATABASE)\n .tags(['database', 'sql', 'delete', 'postgresql', 'mysql', 'sqlite'])\n .schema(relationalDeleteSchema)\n .example({\n description: 'Delete one row by condition',\n input: {\n table: 'users',\n where: [{ column: 'id', operator: 'eq', value: 123 }],\n vendor: 'postgresql',\n connectionString: 'postgresql://localhost/mydb',\n },\n })\n .example({\n description: 'Soft delete rows',\n input: {\n table: 'users',\n where: [{ column: 'status', operator: 'eq', value: 'inactive' }],\n softDelete: { column: 'deleted_at' },\n vendor: 'sqlite',\n connectionString: 'data.db',\n },\n })\n .example({\n description: 'Batch delete operations',\n input: {\n table: 'users',\n operations: [\n {\n where: [{ column: 'status', operator: 'eq', value: 'inactive' }],\n softDelete: { column: 'deleted_at' },\n },\n {\n where: [{ column: 'status', operator: 'eq', value: 'pending_delete' }],\n softDelete: { column: 'deleted_at' },\n },\n ],\n batch: {\n batchSize: 100,\n continueOnError: true,\n },\n vendor: 'postgresql',\n connectionString: 'postgresql://localhost/mydb',\n },\n })\n .implement(async (input: RelationalDeleteInput): Promise<DeleteResponse> => {\n const manager = new ConnectionManager({\n vendor: input.vendor,\n connection: input.connectionString,\n });\n\n try {\n await manager.connect();\n\n const result = await executeDelete(manager, input);\n\n return {\n success: true,\n rowCount: result.rowCount,\n executionTime: result.executionTime,\n softDeleted: result.softDeleted,\n batch: result.batch,\n };\n } catch (error) {\n let errorMessage = 'Failed to execute DELETE query. Please verify your input and database connection.';\n\n if (isSafeDeleteError(error)) {\n errorMessage = error.message;\n }\n\n return {\n success: false,\n error: errorMessage,\n rowCount: 0,\n softDeleted: false,\n };\n } finally {\n await manager.disconnect();\n }\n })\n .build();\n","/**\n * Helpers for classifying safe validation errors in relational-get-schema.\n * These messages are safe to expose to callers because they describe\n * input validation issues rather than database internals.\n */\n\nconst SAFE_VALIDATION_ERROR_PATTERNS = [\n 'must not be empty',\n 'contains invalid characters',\n 'Invalid table filter',\n] as const;\n\n/**\n * Check whether an error is a safe get-schema input validation error\n * that can be exposed to the caller without leaking database internals.\n *\n * @param error - The caught error\n * @returns `true` if the error message matches a known validation pattern\n */\nexport function isSafeGetSchemaValidationError(error: unknown): error is Error {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return SAFE_VALIDATION_ERROR_PATTERNS.some((pattern) =>\n error.message.includes(pattern),\n );\n}\n","/**\n * Relational Get Schema Tool\n * @module tools/relational-get-schema\n */\n\nimport { z } from 'zod';\nimport { createLogger, toolBuilder, ToolCategory } from '@agentforge/core';\nimport { createHash } from 'node:crypto';\nimport { ConnectionManager } from '../connection/connection-manager.js';\nimport { SchemaInspector } from '../schema/schema-inspector.js';\nimport { VALID_TABLE_FILTER_PATTERN } from '../schema/validation.js';\nimport type { DatabaseVendor } from '../types.js';\nimport { isSafeGetSchemaValidationError } from './relational-get-schema-error-utils.js';\nconst logger = createLogger('agentforge:tools:data:relational:get-schema');\n\nfunction buildSchemaCacheKey(vendor: DatabaseVendor, connectionString: string, database?: string): string {\n const databaseScope = database ?? 'default';\n const connectionHash = createHash('sha256')\n .update(connectionString)\n .digest('hex');\n return `${vendor}:${databaseScope}:${connectionHash}`;\n}\n\n/**\n * Zod schema for relational-get-schema input.\n */\nconst relationalGetSchemaInputSchema = z.object({\n vendor: z.enum(['postgresql', 'mysql', 'sqlite']).describe('Database vendor'),\n connectionString: z\n .string()\n .min(1, 'Database connection string is required')\n .describe('Database connection string used to create a new connection'),\n database: z\n .string()\n .min(1)\n .optional()\n .describe('Optional logical database name used for cache scoping'),\n tables: z\n .array(\n z\n .string()\n .regex(\n VALID_TABLE_FILTER_PATTERN,\n 'Table filter contains invalid characters. Use alphanumeric, underscore, and optional schema qualification.',\n ),\n )\n .optional()\n .describe('Optional table filter list. When omitted, all tables are returned.'),\n cacheTtlMs: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Schema cache TTL in milliseconds (0 disables caching)'),\n refreshCache: z\n .boolean()\n .optional()\n .describe('Force cache invalidation before introspecting schema'),\n});\n\n/**\n * Relational Get Schema Tool\n *\n * Introspects database schema metadata including tables, columns, primary keys,\n * foreign keys, and indexes for PostgreSQL, MySQL, and SQLite.\n */\nexport const relationalGetSchema = toolBuilder()\n .name('relational-get-schema')\n .displayName('Relational Get Schema')\n .description('Inspect relational database schema (tables, columns, primary keys, foreign keys, indexes) across PostgreSQL, MySQL, and SQLite')\n .category(ToolCategory.DATABASE)\n .tags(['database', 'schema', 'introspection', 'postgresql', 'mysql', 'sqlite'])\n .schema(relationalGetSchemaInputSchema)\n .example({\n description: 'Inspect all SQLite tables',\n input: {\n vendor: 'sqlite' as DatabaseVendor,\n connectionString: ':memory:',\n },\n })\n .example({\n description: 'Inspect selected PostgreSQL tables with cache control',\n input: {\n vendor: 'postgresql' as DatabaseVendor,\n connectionString: 'postgresql://localhost/app',\n tables: ['public.users', 'public.orders'],\n cacheTtlMs: 30000,\n refreshCache: true,\n },\n })\n .implement(async (input) => {\n const manager = new ConnectionManager({\n vendor: input.vendor,\n connection: input.connectionString,\n });\n\n const cacheKey = buildSchemaCacheKey(\n input.vendor,\n input.connectionString,\n input.database,\n );\n const inspector = new SchemaInspector(manager, input.vendor, {\n cacheTtlMs: input.cacheTtlMs,\n cacheKey,\n });\n\n try {\n await manager.connect();\n\n if (input.refreshCache) {\n inspector.invalidateCache();\n }\n\n const schema = await inspector.inspect({\n tables: input.tables,\n });\n\n const summary = schema.tables.reduce(\n (accumulator, table) => {\n accumulator.tableCount += 1;\n accumulator.columnCount += table.columns.length;\n accumulator.foreignKeyCount += table.foreignKeys.length;\n accumulator.indexCount += table.indexes.length;\n return accumulator;\n },\n { tableCount: 0, columnCount: 0, foreignKeyCount: 0, indexCount: 0 },\n );\n\n return {\n success: true,\n schema,\n summary,\n };\n } catch (error) {\n logger.error('Schema introspection failed', {\n vendor: input.vendor,\n hasTablesFilter: Array.isArray(input.tables),\n tablesFilterCount: input.tables?.length ?? 0,\n refreshCache: input.refreshCache ?? false,\n error: error instanceof Error ? error.message : String(error),\n });\n\n const errorMessage = isSafeGetSchemaValidationError(error)\n ? error.message\n : 'Failed to inspect schema. See logs for details.';\n\n return {\n success: false,\n error: errorMessage,\n schema: null,\n };\n } finally {\n await manager.disconnect();\n }\n })\n .build();\n","/**\n * File Operations Types\n * \n * Type definitions and schemas for file operation tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * File reader schema\n */\nexport const fileReaderSchema = z.object({\n path: z.string().describe('Path to the file to read'),\n encoding: z.enum(['utf8', 'utf-8', 'ascii', 'base64', 'hex', 'binary']).default('utf8').describe('File encoding'),\n});\n\n/**\n * File writer schema\n */\nexport const fileWriterSchema = z.object({\n path: z.string().describe('Path to the file to write'),\n content: z.string().describe('Content to write to the file'),\n encoding: z.enum(['utf8', 'utf-8', 'ascii', 'base64', 'hex']).default('utf8').describe('File encoding'),\n createDirs: z.boolean().default(false).describe('Create parent directories if they don\\'t exist'),\n});\n\n/**\n * File append schema\n */\nexport const fileAppendSchema = z.object({\n path: z.string().describe('Path to the file to append to'),\n content: z.string().describe('Content to append to the file'),\n encoding: z.enum(['utf8', 'utf-8', 'ascii']).default('utf8').describe('File encoding'),\n});\n\n/**\n * File delete schema\n */\nexport const fileDeleteSchema = z.object({\n path: z.string().describe('Path to the file to delete'),\n});\n\n/**\n * File exists schema\n */\nexport const fileExistsSchema = z.object({\n path: z.string().describe('Path to check'),\n});\n\n/**\n * File operations configuration\n */\nexport interface FileOperationsConfig {\n defaultEncoding?: 'utf8' | 'utf-8' | 'ascii' | 'base64' | 'hex';\n createDirsDefault?: boolean;\n}\n\n","/**\n * File Reader Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { fileReaderSchema } from '../types.js';\nimport { promises as fs } from 'fs';\n\n/**\n * Create file reader tool\n */\nexport function createFileReaderTool(defaultEncoding: string = 'utf8') {\n return toolBuilder()\n .name('file-reader')\n .description('Read the contents of a file from the file system. Supports text and binary files with various encodings.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['file', 'read', 'io', 'filesystem'])\n .schema(fileReaderSchema)\n .implementSafe(async (input) => {\n const encoding = input.encoding || defaultEncoding;\n const content = await fs.readFile(input.path, encoding as BufferEncoding);\n const stats = await fs.stat(input.path);\n\n return {\n content,\n size: stats.size,\n path: input.path,\n encoding,\n };\n })\n .build();\n}\n\n","/**\n * File Writer Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { fileWriterSchema } from '../types.js';\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\n\n/**\n * Create file writer tool\n */\nexport function createFileWriterTool(defaultEncoding: string = 'utf8', createDirsDefault: boolean = false) {\n return toolBuilder()\n .name('file-writer')\n .description('Write content to a file. Creates the file if it doesn\\'t exist, or overwrites it if it does.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['file', 'write', 'io', 'filesystem'])\n .schema(fileWriterSchema)\n .implementSafe(async (input) => {\n const encoding = input.encoding || defaultEncoding;\n const createDirs = input.createDirs ?? createDirsDefault;\n\n // Create parent directories if requested\n if (createDirs) {\n const dir = path.dirname(input.path);\n await fs.mkdir(dir, { recursive: true });\n }\n\n await fs.writeFile(input.path, input.content, encoding as BufferEncoding);\n const stats = await fs.stat(input.path);\n\n return {\n path: input.path,\n size: stats.size,\n encoding,\n };\n })\n .build();\n}\n\n","/**\n * File Append Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { fileAppendSchema } from '../types.js';\nimport { promises as fs } from 'fs';\n\n/**\n * Create file append tool\n */\nexport function createFileAppendTool(defaultEncoding: string = 'utf8') {\n return toolBuilder()\n .name('file-append')\n .description('Append content to the end of a file. Creates the file if it doesn\\'t exist.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['file', 'append', 'io', 'filesystem'])\n .schema(fileAppendSchema)\n .implementSafe(async (input) => {\n const encoding = input.encoding || defaultEncoding;\n await fs.appendFile(input.path, input.content, encoding as BufferEncoding);\n const stats = await fs.stat(input.path);\n\n return {\n path: input.path,\n size: stats.size,\n };\n })\n .build();\n}\n\n","/**\n * File Delete Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { fileDeleteSchema } from '../types.js';\nimport { promises as fs } from 'fs';\n\n/**\n * Create file delete tool\n */\nexport function createFileDeleteTool() {\n return toolBuilder()\n .name('file-delete')\n .description('Delete a file from the file system. Returns an error if the file doesn\\'t exist.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['file', 'delete', 'remove', 'filesystem'])\n .schema(fileDeleteSchema)\n .implementSafe(async (input) => {\n await fs.unlink(input.path);\n\n return {\n path: input.path,\n message: 'File deleted successfully',\n };\n })\n .build();\n}\n\n","/**\n * File Exists Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { fileExistsSchema } from '../types.js';\nimport { promises as fs } from 'fs';\n\n/**\n * Create file exists tool\n */\nexport function createFileExistsTool() {\n return toolBuilder()\n .name('file-exists')\n .description('Check if a file or directory exists at the specified path.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['file', 'exists', 'check', 'filesystem'])\n .schema(fileExistsSchema)\n .implement(async (input) => {\n try {\n await fs.access(input.path);\n const stats = await fs.stat(input.path);\n \n return {\n exists: true,\n path: input.path,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n size: stats.size,\n modified: stats.mtime.toISOString(),\n };\n } catch {\n return {\n exists: false,\n path: input.path,\n };\n }\n })\n .build();\n}\n\n","/**\n * File Operations Tools\n * \n * Tools for reading, writing, and manipulating files.\n */\n\nexport * from './types.js';\nexport * from './tools/file-reader.js';\nexport * from './tools/file-writer.js';\nexport * from './tools/file-append.js';\nexport * from './tools/file-delete.js';\nexport * from './tools/file-exists.js';\n\nimport { createFileReaderTool } from './tools/file-reader.js';\nimport { createFileWriterTool } from './tools/file-writer.js';\nimport { createFileAppendTool } from './tools/file-append.js';\nimport { createFileDeleteTool } from './tools/file-delete.js';\nimport { createFileExistsTool } from './tools/file-exists.js';\nimport type { FileOperationsConfig } from './types.js';\n\n/**\n * Default file operation tool instances\n */\nexport const fileReader = createFileReaderTool();\nexport const fileWriter = createFileWriterTool();\nexport const fileAppend = createFileAppendTool();\nexport const fileDelete = createFileDeleteTool();\nexport const fileExists = createFileExistsTool();\n\n/**\n * Array of all file operation tools\n */\nexport const fileOperationTools = [\n fileReader,\n fileWriter,\n fileAppend,\n fileDelete,\n fileExists,\n];\n\n/**\n * Create file operation tools with custom configuration\n */\nexport function createFileOperationTools(config: FileOperationsConfig = {}) {\n const {\n defaultEncoding = 'utf8',\n createDirsDefault = false,\n } = config;\n\n return [\n createFileReaderTool(defaultEncoding),\n createFileWriterTool(defaultEncoding, createDirsDefault),\n createFileAppendTool(defaultEncoding),\n createFileDeleteTool(),\n createFileExistsTool(),\n ];\n}\n\n","/**\n * Directory Operations Types\n * \n * Type definitions and schemas for directory operation tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * Directory list schema\n */\nexport const directoryListSchema = z.object({\n path: z.string().describe('Path to the directory to list'),\n recursive: z.boolean().default(false).describe('List files recursively in subdirectories'),\n includeDetails: z.boolean().default(false).describe('Include file size, type, and modification date'),\n extension: z.string().optional().describe('Optional file extension filter (e.g., \".txt\", \".js\")'),\n});\n\n/**\n * Directory create schema\n */\nexport const directoryCreateSchema = z.object({\n path: z.string().describe('Path to the directory to create'),\n recursive: z.boolean().default(true).describe('Create parent directories if they don\\'t exist'),\n});\n\n/**\n * Directory delete schema\n */\nexport const directoryDeleteSchema = z.object({\n path: z.string().describe('Path to the directory to delete'),\n recursive: z.boolean().default(false).describe('Delete directory and all its contents'),\n});\n\n/**\n * File search schema\n */\nexport const fileSearchSchema = z.object({\n directory: z.string().describe('Directory to search in'),\n pattern: z.string().describe('File name pattern to search for (supports * wildcard)'),\n recursive: z.boolean().default(true).describe('Search in subdirectories'),\n caseSensitive: z.boolean().default(false).describe('Case-sensitive pattern matching'),\n});\n\n/**\n * Directory operations configuration\n */\nexport interface DirectoryOperationsConfig {\n defaultRecursive?: boolean;\n defaultIncludeDetails?: boolean;\n defaultCaseSensitive?: boolean;\n}\n\n","/**\n * Directory List Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { directoryListSchema } from '../types.js';\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\n\n/**\n * Create directory list tool\n */\nexport function createDirectoryListTool(defaultRecursive: boolean = false, defaultIncludeDetails: boolean = false) {\n return toolBuilder()\n .name('directory-list')\n .description('List all files and directories in a directory. Can optionally include file details and filter by extension.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['directory', 'list', 'files', 'filesystem'])\n .schema(directoryListSchema)\n .implementSafe(async (input) => {\n const listFiles = async (dir: string, recursive: boolean): Promise<any[]> => {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const files: any[] = [];\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(input.path, fullPath);\n\n // Apply extension filter if specified\n if (input.extension && !entry.name.endsWith(input.extension)) {\n if (!entry.isDirectory() || !recursive) {\n continue;\n }\n }\n\n if (input.includeDetails) {\n const stats = await fs.stat(fullPath);\n files.push({\n name: entry.name,\n path: relativePath,\n fullPath,\n isFile: entry.isFile(),\n isDirectory: entry.isDirectory(),\n size: stats.size,\n modified: stats.mtime.toISOString(),\n });\n } else {\n files.push({\n name: entry.name,\n path: relativePath,\n isFile: entry.isFile(),\n isDirectory: entry.isDirectory(),\n });\n }\n\n // Recurse into subdirectories if requested\n if (recursive && entry.isDirectory()) {\n const subFiles = await listFiles(fullPath, true);\n files.push(...subFiles);\n }\n }\n\n return files;\n };\n\n const recursive = input.recursive ?? defaultRecursive;\n const files = await listFiles(input.path, recursive);\n\n return {\n path: input.path,\n files,\n count: files.length,\n };\n })\n .build();\n}\n\n","/**\n * Directory Create Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { directoryCreateSchema } from '../types.js';\nimport { promises as fs } from 'fs';\n\n/**\n * Create directory create tool\n */\nexport function createDirectoryCreateTool(defaultRecursive: boolean = true) {\n return toolBuilder()\n .name('directory-create')\n .description('Create a new directory. Can optionally create parent directories if they don\\'t exist.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['directory', 'create', 'mkdir', 'filesystem'])\n .schema(directoryCreateSchema)\n .implementSafe(async (input) => {\n const recursive = input.recursive ?? defaultRecursive;\n await fs.mkdir(input.path, { recursive });\n\n return {\n path: input.path,\n message: 'Directory created successfully',\n };\n })\n .build();\n}\n\n","/**\n * Directory Delete Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { directoryDeleteSchema } from '../types.js';\nimport { promises as fs } from 'fs';\n\n/**\n * Create directory delete tool\n */\nexport function createDirectoryDeleteTool(defaultRecursive: boolean = false) {\n return toolBuilder()\n .name('directory-delete')\n .description('Delete a directory. Can optionally delete non-empty directories recursively.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['directory', 'delete', 'remove', 'filesystem'])\n .schema(directoryDeleteSchema)\n .implementSafe(async (input) => {\n const recursive = input.recursive ?? defaultRecursive;\n await fs.rm(input.path, { recursive, force: false });\n\n return {\n path: input.path,\n message: 'Directory deleted successfully',\n };\n })\n .build();\n}\n\n","/**\n * File Search Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { fileSearchSchema } from '../types.js';\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\n\n/**\n * Create file search tool\n */\nexport function createFileSearchTool(defaultRecursive: boolean = true, defaultCaseSensitive: boolean = false) {\n return toolBuilder()\n .name('file-search')\n .description('Search for files by name pattern in a directory. Supports wildcards and recursive search.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['file', 'search', 'find', 'filesystem'])\n .schema(fileSearchSchema)\n .implementSafe(async (input) => {\n const recursive = input.recursive ?? defaultRecursive;\n const caseSensitive = input.caseSensitive ?? defaultCaseSensitive;\n\n const searchFiles = async (dir: string): Promise<string[]> => {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const matches: string[] = [];\n\n // Convert pattern to regex\n const regexPattern = input.pattern\n .replace(/\\./g, '\\\\.')\n .replace(/\\*/g, '.*');\n const regex = new RegExp(`^${regexPattern}$`, caseSensitive ? '' : 'i');\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isFile() && regex.test(entry.name)) {\n matches.push(fullPath);\n }\n\n if (recursive && entry.isDirectory()) {\n const subMatches = await searchFiles(fullPath);\n matches.push(...subMatches);\n }\n }\n\n return matches;\n };\n\n const matches = await searchFiles(input.directory);\n\n return {\n directory: input.directory,\n pattern: input.pattern,\n matches,\n count: matches.length,\n };\n })\n .build();\n}\n\n","/**\n * Directory Operations Tools\n * \n * Tools for working with directories and file listings.\n */\n\nexport * from './types.js';\nexport * from './tools/directory-list.js';\nexport * from './tools/directory-create.js';\nexport * from './tools/directory-delete.js';\nexport * from './tools/file-search.js';\n\nimport { createDirectoryListTool } from './tools/directory-list.js';\nimport { createDirectoryCreateTool } from './tools/directory-create.js';\nimport { createDirectoryDeleteTool } from './tools/directory-delete.js';\nimport { createFileSearchTool } from './tools/file-search.js';\nimport type { DirectoryOperationsConfig } from './types.js';\n\n/**\n * Default directory operation tool instances\n */\nexport const directoryList = createDirectoryListTool();\nexport const directoryCreate = createDirectoryCreateTool();\nexport const directoryDelete = createDirectoryDeleteTool();\nexport const fileSearch = createFileSearchTool();\n\n/**\n * Array of all directory operation tools\n */\nexport const directoryOperationTools = [\n directoryList,\n directoryCreate,\n directoryDelete,\n fileSearch,\n];\n\n/**\n * Create directory operation tools with custom configuration\n */\nexport function createDirectoryOperationTools(config: DirectoryOperationsConfig = {}) {\n const {\n defaultRecursive = false,\n defaultIncludeDetails = false,\n defaultCaseSensitive = false,\n } = config;\n\n return [\n createDirectoryListTool(defaultRecursive, defaultIncludeDetails),\n createDirectoryCreateTool(true), // Always default to true for create\n createDirectoryDeleteTool(false), // Always default to false for delete (safety)\n createFileSearchTool(defaultRecursive, defaultCaseSensitive),\n ];\n}\n\n","/**\n * Path Utilities Types\n * \n * Type definitions and schemas for path utility tools.\n */\n\nimport { z } from 'zod';\n\n/**\n * Path join schema\n */\nexport const pathJoinSchema = z.object({\n segments: z.array(z.string().describe(\"String value\")).describe('Path segments to join'),\n});\n\n/**\n * Path resolve schema\n */\nexport const pathResolveSchema = z.object({\n paths: z.array(z.string().describe(\"String value\")).describe('Paths to resolve'),\n});\n\n/**\n * Path parse schema\n */\nexport const pathParseSchema = z.object({\n path: z.string().describe('File path to parse'),\n});\n\n/**\n * Path basename schema\n */\nexport const pathBasenameSchema = z.object({\n path: z.string().describe('File path'),\n removeExtension: z.boolean().default(false).describe('Remove the file extension'),\n});\n\n/**\n * Path dirname schema\n */\nexport const pathDirnameSchema = z.object({\n path: z.string().describe('File path'),\n});\n\n/**\n * Path extension schema\n */\nexport const pathExtensionSchema = z.object({\n path: z.string().describe('File path'),\n});\n\n/**\n * Path relative schema\n */\nexport const pathRelativeSchema = z.object({\n from: z.string().describe('Source path'),\n to: z.string().describe('Destination path'),\n});\n\n/**\n * Path normalize schema\n */\nexport const pathNormalizeSchema = z.object({\n path: z.string().describe('Path to normalize'),\n});\n\n/**\n * Path utilities configuration\n */\nexport type PathUtilitiesConfig = Record<string, never>;\n","/**\n * Path Join Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathJoinSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path join tool\n */\nexport function createPathJoinTool() {\n return toolBuilder()\n .name('path-join')\n .description('Join multiple path segments into a single path. Handles platform-specific separators.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'join', 'filesystem'])\n .schema(pathJoinSchema)\n .implement(async (input) => {\n const joined = path.join(...input.segments);\n \n return {\n path: joined,\n segments: input.segments,\n };\n })\n .build();\n}\n\n","/**\n * Path Resolve Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathResolveSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path resolve tool\n */\nexport function createPathResolveTool() {\n return toolBuilder()\n .name('path-resolve')\n .description('Resolve a sequence of paths into an absolute path. Resolves relative paths from the current working directory.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'resolve', 'absolute', 'filesystem'])\n .schema(pathResolveSchema)\n .implement(async (input) => {\n const resolved = path.resolve(...input.paths);\n \n return {\n path: resolved,\n isAbsolute: path.isAbsolute(resolved),\n };\n })\n .build();\n}\n\n","/**\n * Path Parse Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathParseSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path parse tool\n */\nexport function createPathParseTool() {\n return toolBuilder()\n .name('path-parse')\n .description('Parse a file path into its components (directory, filename, extension, etc.).')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'parse', 'filesystem'])\n .schema(pathParseSchema)\n .implement(async (input) => {\n const parsed = path.parse(input.path);\n \n return {\n root: parsed.root,\n dir: parsed.dir,\n base: parsed.base,\n name: parsed.name,\n ext: parsed.ext,\n isAbsolute: path.isAbsolute(input.path),\n };\n })\n .build();\n}\n\n","/**\n * Path Basename Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathBasenameSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path basename tool\n */\nexport function createPathBasenameTool() {\n return toolBuilder()\n .name('path-basename')\n .description('Get the last portion of a path (filename with extension). Optionally remove the extension.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'basename', 'filename', 'filesystem'])\n .schema(pathBasenameSchema)\n .implement(async (input) => {\n const basename = input.removeExtension \n ? path.basename(input.path, path.extname(input.path))\n : path.basename(input.path);\n \n return {\n basename,\n extension: path.extname(input.path),\n };\n })\n .build();\n}\n\n","/**\n * Path Dirname Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathDirnameSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path dirname tool\n */\nexport function createPathDirnameTool() {\n return toolBuilder()\n .name('path-dirname')\n .description('Get the directory name of a path (everything except the last portion).')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'dirname', 'directory', 'filesystem'])\n .schema(pathDirnameSchema)\n .implement(async (input) => {\n const dirname = path.dirname(input.path);\n \n return {\n dirname,\n basename: path.basename(input.path),\n };\n })\n .build();\n}\n\n","/**\n * Path Extension Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathExtensionSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path extension tool\n */\nexport function createPathExtensionTool() {\n return toolBuilder()\n .name('path-extension')\n .description('Get the file extension from a path (including the dot, e.g., \".txt\").')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'extension', 'ext', 'filesystem'])\n .schema(pathExtensionSchema)\n .implement(async (input) => {\n const ext = path.extname(input.path);\n \n return {\n extension: ext,\n hasExtension: ext.length > 0,\n filename: path.basename(input.path, ext),\n };\n })\n .build();\n}\n\n","/**\n * Path Relative Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathRelativeSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path relative tool\n */\nexport function createPathRelativeTool() {\n return toolBuilder()\n .name('path-relative')\n .description('Get the relative path from one path to another.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'relative', 'filesystem'])\n .schema(pathRelativeSchema)\n .implement(async (input) => {\n const relative = path.relative(input.from, input.to);\n \n return {\n relativePath: relative,\n from: input.from,\n to: input.to,\n };\n })\n .build();\n}\n\n","/**\n * Path Normalize Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { pathNormalizeSchema } from '../types.js';\nimport * as path from 'path';\n\n/**\n * Create path normalize tool\n */\nexport function createPathNormalizeTool() {\n return toolBuilder()\n .name('path-normalize')\n .description('Normalize a path by resolving \"..\" and \".\" segments and removing duplicate separators.')\n .category(ToolCategory.FILE_SYSTEM)\n .tags(['path', 'normalize', 'filesystem'])\n .schema(pathNormalizeSchema)\n .implement(async (input) => {\n const normalized = path.normalize(input.path);\n \n return {\n normalized,\n original: input.path,\n };\n })\n .build();\n}\n\n","/**\n * Path Utilities Tools\n * \n * Tools for working with file paths.\n */\n\nexport * from './types.js';\nexport * from './tools/path-join.js';\nexport * from './tools/path-resolve.js';\nexport * from './tools/path-parse.js';\nexport * from './tools/path-basename.js';\nexport * from './tools/path-dirname.js';\nexport * from './tools/path-extension.js';\nexport * from './tools/path-relative.js';\nexport * from './tools/path-normalize.js';\n\nimport { createPathJoinTool } from './tools/path-join.js';\nimport { createPathResolveTool } from './tools/path-resolve.js';\nimport { createPathParseTool } from './tools/path-parse.js';\nimport { createPathBasenameTool } from './tools/path-basename.js';\nimport { createPathDirnameTool } from './tools/path-dirname.js';\nimport { createPathExtensionTool } from './tools/path-extension.js';\nimport { createPathRelativeTool } from './tools/path-relative.js';\nimport { createPathNormalizeTool } from './tools/path-normalize.js';\nimport type { PathUtilitiesConfig } from './types.js';\n\n/**\n * Default path utility tool instances\n */\nexport const pathJoin = createPathJoinTool();\nexport const pathResolve = createPathResolveTool();\nexport const pathParse = createPathParseTool();\nexport const pathBasename = createPathBasenameTool();\nexport const pathDirname = createPathDirnameTool();\nexport const pathExtension = createPathExtensionTool();\nexport const pathRelative = createPathRelativeTool();\nexport const pathNormalize = createPathNormalizeTool();\n\n/**\n * Array of all path utility tools\n */\nexport const pathUtilityTools = [\n pathJoin,\n pathResolve,\n pathParse,\n pathBasename,\n pathDirname,\n pathExtension,\n pathRelative,\n pathNormalize,\n];\n\n/**\n * Create path utility tools with custom configuration\n */\nexport function createPathUtilityTools(config: PathUtilitiesConfig = {}) {\n return [\n createPathJoinTool(),\n createPathResolveTool(),\n createPathParseTool(),\n createPathBasenameTool(),\n createPathDirnameTool(),\n createPathExtensionTool(),\n createPathRelativeTool(),\n createPathNormalizeTool(),\n ];\n}\n\n","/**\n * Date and Time Tools - Type Definitions\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema for current date/time tool\n */\nexport const CurrentDateTimeSchema = z.object({\n format: z.enum(['iso', 'unix', 'custom']).default('iso').describe('Output format'),\n customFormat: z.string().optional().describe('Custom format string (e.g., \"yyyy-MM-dd HH:mm:ss\") when format is \"custom\"'),\n timezone: z.string().optional().describe('Timezone (e.g., \"America/New_York\")'),\n});\n\n/**\n * Schema for date formatter tool\n */\nexport const DateFormatterSchema = z.object({\n date: z.string().describe('Date string or Unix timestamp to format'),\n outputFormat: z.string().describe('Output format string (e.g., \"yyyy-MM-dd\", \"MMM dd, yyyy\")'),\n inputFormat: z.string().optional().describe('Input format string (optional, auto-detected if not provided)'),\n});\n\n/**\n * Schema for date arithmetic tool\n */\nexport const DateArithmeticSchema = z.object({\n date: z.string().describe('Starting date (ISO string or Unix timestamp)'),\n operation: z.enum(['add', 'subtract']).describe('Operation to perform'),\n amount: z.number().describe('Amount to add or subtract'),\n unit: z.enum(['years', 'months', 'weeks', 'days', 'hours', 'minutes', 'seconds']).describe('Time unit'),\n});\n\n/**\n * Schema for date difference tool\n */\nexport const DateDifferenceSchema = z.object({\n startDate: z.string().describe('Start date (ISO string or Unix timestamp)'),\n endDate: z.string().describe('End date (ISO string or Unix timestamp)'),\n unit: z.enum(['days', 'hours', 'minutes']).default('days').describe('Unit for the difference'),\n});\n\n/**\n * Schema for date comparison tool\n */\nexport const DateComparisonSchema = z.object({\n date1: z.string().describe('First date to compare'),\n date2: z.string().describe('Second date to compare'),\n});\n\n/**\n * Configuration for date/time tools\n */\nexport type DateTimeConfig = Record<string, never>;\n\nexport type CurrentDateTimeInput = z.infer<typeof CurrentDateTimeSchema>;\nexport type DateFormatterInput = z.infer<typeof DateFormatterSchema>;\nexport type DateArithmeticInput = z.infer<typeof DateArithmeticSchema>;\nexport type DateDifferenceInput = z.infer<typeof DateDifferenceSchema>;\nexport type DateComparisonInput = z.infer<typeof DateComparisonSchema>;\n","/**\n * Current Date/Time Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { format } from 'date-fns';\nimport { CurrentDateTimeSchema } from '../types.js';\n\n/**\n * Create current date/time tool\n */\nexport function createCurrentDateTimeTool() {\n return toolBuilder()\n .name('current-date-time')\n .description('Get the current date and time in various formats (ISO, Unix timestamp, formatted string).')\n .category(ToolCategory.UTILITY)\n .tags(['date', 'time', 'now', 'current'])\n .schema(CurrentDateTimeSchema)\n .implement(async (input) => {\n const now = new Date();\n \n let formatted: string | number;\n if (input.format === 'iso') {\n formatted = now.toISOString();\n } else if (input.format === 'unix') {\n formatted = Math.floor(now.getTime() / 1000);\n } else if (input.format === 'custom' && input.customFormat) {\n formatted = format(now, input.customFormat);\n } else {\n formatted = now.toISOString();\n }\n \n return {\n formatted,\n iso: now.toISOString(),\n unix: Math.floor(now.getTime() / 1000),\n year: now.getFullYear(),\n month: now.getMonth() + 1,\n day: now.getDate(),\n hour: now.getHours(),\n minute: now.getMinutes(),\n second: now.getSeconds(),\n };\n })\n .build();\n}\n\n","/**\n * Date Formatter Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { format, parse, isValid } from 'date-fns';\nimport { DateFormatterSchema } from '../types.js';\n\n/**\n * Create date formatter tool\n */\nexport function createDateFormatterTool() {\n return toolBuilder()\n .name('date-formatter')\n .description('Format a date string or timestamp into a different format. Supports ISO, Unix timestamps, and custom formats.')\n .category(ToolCategory.UTILITY)\n .tags(['date', 'format', 'time'])\n .schema(DateFormatterSchema)\n .implement(async (input) => {\n try {\n let date: Date;\n \n // Try to parse the input\n if (input.inputFormat) {\n date = parse(input.date, input.inputFormat, new Date());\n } else if (!isNaN(Number(input.date))) {\n // Unix timestamp\n date = new Date(Number(input.date) * 1000);\n } else {\n // ISO or other standard format\n date = new Date(input.date);\n }\n \n if (!isValid(date)) {\n return {\n success: false,\n error: 'Invalid date',\n };\n }\n \n const formatted = format(date, input.outputFormat);\n \n return {\n success: true,\n formatted,\n iso: date.toISOString(),\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to format date',\n };\n }\n })\n .build();\n}\n\n","/**\n * Date Arithmetic Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { add, sub, isValid } from 'date-fns';\nimport { DateArithmeticSchema } from '../types.js';\n\n/**\n * Create date arithmetic tool\n */\nexport function createDateArithmeticTool() {\n return toolBuilder()\n .name('date-arithmetic')\n .description('Add or subtract time from a date. Supports years, months, weeks, days, hours, minutes, and seconds.')\n .category(ToolCategory.UTILITY)\n .tags(['date', 'time', 'add', 'subtract', 'arithmetic'])\n .schema(DateArithmeticSchema)\n .implement(async (input) => {\n try {\n const date = new Date(input.date);\n \n if (!isValid(date)) {\n return {\n success: false,\n error: 'Invalid date',\n };\n }\n \n const duration = { [input.unit]: input.amount };\n const result = input.operation === 'add' \n ? add(date, duration)\n : sub(date, duration);\n \n return {\n success: true,\n result: result.toISOString(),\n unix: Math.floor(result.getTime() / 1000),\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to perform date arithmetic',\n };\n }\n })\n .build();\n}\n\n","/**\n * Date Difference Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { differenceInDays, differenceInHours, differenceInMinutes, isValid } from 'date-fns';\nimport { DateDifferenceSchema } from '../types.js';\n\n/**\n * Create date difference tool\n */\nexport function createDateDifferenceTool() {\n return toolBuilder()\n .name('date-difference')\n .description('Calculate the difference between two dates in various units (days, hours, minutes).')\n .category(ToolCategory.UTILITY)\n .tags(['date', 'time', 'difference', 'duration'])\n .schema(DateDifferenceSchema)\n .implement(async (input) => {\n try {\n const start = new Date(input.startDate);\n const end = new Date(input.endDate);\n \n if (!isValid(start) || !isValid(end)) {\n return {\n success: false,\n error: 'Invalid date(s)',\n };\n }\n \n let difference: number;\n if (input.unit === 'days') {\n difference = differenceInDays(end, start);\n } else if (input.unit === 'hours') {\n difference = differenceInHours(end, start);\n } else {\n difference = differenceInMinutes(end, start);\n }\n \n return {\n success: true,\n difference,\n unit: input.unit,\n startDate: start.toISOString(),\n endDate: end.toISOString(),\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to calculate date difference',\n };\n }\n })\n .build();\n}\n\n","/**\n * Date Comparison Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { isAfter, isBefore, isValid } from 'date-fns';\nimport { DateComparisonSchema } from '../types.js';\n\n/**\n * Create date comparison tool\n */\nexport function createDateComparisonTool() {\n return toolBuilder()\n .name('date-comparison')\n .description('Compare two dates to determine if one is before, after, or equal to the other.')\n .category(ToolCategory.UTILITY)\n .tags(['date', 'time', 'compare', 'comparison'])\n .schema(DateComparisonSchema)\n .implement(async (input) => {\n try {\n const d1 = new Date(input.date1);\n const d2 = new Date(input.date2);\n \n if (!isValid(d1) || !isValid(d2)) {\n return {\n success: false,\n error: 'Invalid date(s)',\n };\n }\n \n return {\n success: true,\n date1IsBefore: isBefore(d1, d2),\n date1IsAfter: isAfter(d1, d2),\n datesAreEqual: d1.getTime() === d2.getTime(),\n date1: d1.toISOString(),\n date2: d2.toISOString(),\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to compare dates',\n };\n }\n })\n .build();\n}\n\n","/**\n * Date and Time Utility Tools\n * \n * Tools for working with dates, times, and timestamps.\n */\n\nimport { createCurrentDateTimeTool } from './tools/current-date-time.js';\nimport { createDateFormatterTool } from './tools/date-formatter.js';\nimport { createDateArithmeticTool } from './tools/date-arithmetic.js';\nimport { createDateDifferenceTool } from './tools/date-difference.js';\nimport { createDateComparisonTool } from './tools/date-comparison.js';\nimport type { DateTimeConfig } from './types.js';\n\n// Default tool instances\nexport const currentDateTime = createCurrentDateTimeTool();\nexport const dateFormatter = createDateFormatterTool();\nexport const dateArithmetic = createDateArithmeticTool();\nexport const dateDifference = createDateDifferenceTool();\nexport const dateComparison = createDateComparisonTool();\n\n// Tools array\nexport const dateTimeTools = [\n currentDateTime,\n dateFormatter,\n dateArithmetic,\n dateDifference,\n dateComparison,\n];\n\n/**\n * Create date/time tools with optional configuration\n */\nexport function createDateTimeTools(config: DateTimeConfig = {}) {\n return [\n createCurrentDateTimeTool(),\n createDateFormatterTool(),\n createDateArithmeticTool(),\n createDateDifferenceTool(),\n createDateComparisonTool(),\n ];\n}\n\n// Re-export types\nexport * from './types.js';\n\n// Re-export tool factory functions\nexport { createCurrentDateTimeTool } from './tools/current-date-time.js';\nexport { createDateFormatterTool } from './tools/date-formatter.js';\nexport { createDateArithmeticTool } from './tools/date-arithmetic.js';\nexport { createDateDifferenceTool } from './tools/date-difference.js';\nexport { createDateComparisonTool } from './tools/date-comparison.js';\n\n","/**\n * String Utility Tools - Type Definitions\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema for string case converter tool\n */\nexport const StringCaseConverterSchema = z.object({\n text: z.string().describe('Text to convert'),\n targetCase: z.enum(['lowercase', 'uppercase', 'title', 'camel', 'snake', 'kebab', 'pascal']).describe('Target case format'),\n});\n\n/**\n * Schema for string trim tool\n */\nexport const StringTrimSchema = z.object({\n text: z.string().describe('Text to trim'),\n mode: z.enum(['both', 'start', 'end']).default('both').describe('Which side to trim'),\n characters: z.string().optional().describe('Optional custom characters to trim (default: whitespace)'),\n});\n\n/**\n * Schema for string replace tool\n */\nexport const StringReplaceSchema = z.object({\n text: z.string().describe('Text to search in'),\n search: z.string().describe('String or regex pattern to search for'),\n replace: z.string().describe('Replacement string'),\n global: z.boolean().default(true).describe('Replace all occurrences (true) or just the first (false)'),\n caseInsensitive: z.boolean().default(false).describe('Case-insensitive search'),\n});\n\n/**\n * Schema for string split tool\n */\nexport const StringSplitSchema = z.object({\n text: z.string().describe('Text to split'),\n delimiter: z.string().describe('Delimiter to split on (can be a regex pattern)'),\n limit: z.number().optional().describe('Maximum number of splits'),\n});\n\n/**\n * Schema for string join tool\n */\nexport const StringJoinSchema = z.object({\n parts: z.array(z.string().describe(\"String value\")).describe('Array of strings to join'),\n separator: z.string().default('').describe('Separator to use between parts'),\n});\n\n/**\n * Schema for string substring tool\n */\nexport const StringSubstringSchema = z.object({\n text: z.string().describe('Source text'),\n start: z.number().describe('Start position (0-based)'),\n end: z.number().optional().describe('End position (optional, defaults to end of string)'),\n});\n\n/**\n * Schema for string length tool\n */\nexport const StringLengthSchema = z.object({\n text: z.string().describe('Text to measure'),\n});\n\n/**\n * Configuration for string utility tools\n */\nexport type StringUtilitiesConfig = Record<string, never>;\n\nexport type StringCaseConverterInput = z.infer<typeof StringCaseConverterSchema>;\nexport type StringTrimInput = z.infer<typeof StringTrimSchema>;\nexport type StringReplaceInput = z.infer<typeof StringReplaceSchema>;\nexport type StringSplitInput = z.infer<typeof StringSplitSchema>;\nexport type StringJoinInput = z.infer<typeof StringJoinSchema>;\nexport type StringSubstringInput = z.infer<typeof StringSubstringSchema>;\nexport type StringLengthInput = z.infer<typeof StringLengthSchema>;\n","/**\n * String Case Converter Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StringCaseConverterSchema } from '../types.js';\n\n/**\n * Create string case converter tool\n */\nexport function createStringCaseConverterTool() {\n return toolBuilder()\n .name('string-case-converter')\n .description('Convert string to different cases: lowercase, uppercase, title case, camel case, snake case, kebab case.')\n .category(ToolCategory.UTILITY)\n .tags(['string', 'case', 'convert', 'transform'])\n .schema(StringCaseConverterSchema)\n .implement(async (input) => {\n let result: string;\n \n switch (input.targetCase) {\n case 'lowercase':\n result = input.text.toLowerCase();\n break;\n case 'uppercase':\n result = input.text.toUpperCase();\n break;\n case 'title':\n result = input.text.toLowerCase().replace(/\\b\\w/g, (char) => char.toUpperCase());\n break;\n case 'camel':\n result = input.text\n .toLowerCase()\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, char) => char.toUpperCase());\n break;\n case 'snake':\n result = input.text\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_|_$/g, '');\n break;\n case 'kebab':\n result = input.text\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n break;\n case 'pascal':\n result = input.text\n .toLowerCase()\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, char) => char.toUpperCase())\n .replace(/^./, (char) => char.toUpperCase());\n break;\n default:\n result = input.text;\n }\n \n return {\n original: input.text,\n converted: result,\n targetCase: input.targetCase,\n };\n })\n .build();\n}\n\n","/**\n * String Trim Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StringTrimSchema } from '../types.js';\n\n/**\n * Create string trim tool\n */\nexport function createStringTrimTool() {\n return toolBuilder()\n .name('string-trim')\n .description('Remove whitespace from the beginning and/or end of a string. Supports trim, trim start, and trim end.')\n .category(ToolCategory.UTILITY)\n .tags(['string', 'trim', 'whitespace'])\n .schema(StringTrimSchema)\n .implement(async (input) => {\n let result: string;\n \n if (input.characters) {\n const chars = input.characters.split('').map(c => c.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('');\n const regex = input.mode === 'both' \n ? new RegExp(`^[${chars}]+|[${chars}]+$`, 'g')\n : input.mode === 'start'\n ? new RegExp(`^[${chars}]+`, 'g')\n : new RegExp(`[${chars}]+$`, 'g');\n result = input.text.replace(regex, '');\n } else {\n result = input.mode === 'both' \n ? input.text.trim()\n : input.mode === 'start'\n ? input.text.trimStart()\n : input.text.trimEnd();\n }\n \n return {\n original: input.text,\n trimmed: result,\n removed: input.text.length - result.length,\n };\n })\n .build();\n}\n\n","/**\n * String Replace Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StringReplaceSchema } from '../types.js';\n\n/**\n * Create string replace tool\n */\nexport function createStringReplaceTool() {\n return toolBuilder()\n .name('string-replace')\n .description('Replace occurrences of a substring or pattern in a string. Supports regex patterns and global replacement.')\n .category(ToolCategory.UTILITY)\n .tags(['string', 'replace', 'substitute'])\n .schema(StringReplaceSchema)\n .implement(async (input) => {\n const flags = (input.global ? 'g' : '') + (input.caseInsensitive ? 'i' : '');\n const regex = new RegExp(input.search, flags);\n const result = input.text.replace(regex, input.replace);\n \n // Count replacements\n const matches = input.text.match(regex);\n const count = matches ? matches.length : 0;\n \n return {\n original: input.text,\n result,\n replacements: count,\n };\n })\n .build();\n}\n\n","/**\n * String Split Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StringSplitSchema } from '../types.js';\n\n/**\n * Create string split tool\n */\nexport function createStringSplitTool() {\n return toolBuilder()\n .name('string-split')\n .description('Split a string into an array of substrings using a delimiter. Supports regex delimiters and limit.')\n .category(ToolCategory.UTILITY)\n .tags(['string', 'split', 'array'])\n .schema(StringSplitSchema)\n .implement(async (input) => {\n const parts = input.text.split(input.delimiter, input.limit);\n \n return {\n parts,\n count: parts.length,\n };\n })\n .build();\n}\n\n","/**\n * String Join Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StringJoinSchema } from '../types.js';\n\n/**\n * Create string join tool\n */\nexport function createStringJoinTool() {\n return toolBuilder()\n .name('string-join')\n .description('Join an array of strings into a single string with a separator.')\n .category(ToolCategory.UTILITY)\n .tags(['string', 'join', 'array'])\n .schema(StringJoinSchema)\n .implement(async (input) => {\n const result = input.parts.join(input.separator);\n \n return {\n result,\n partCount: input.parts.length,\n length: result.length,\n };\n })\n .build();\n}\n\n","/**\n * String Substring Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StringSubstringSchema } from '../types.js';\n\n/**\n * Create string substring tool\n */\nexport function createStringSubstringTool() {\n return toolBuilder()\n .name('string-substring')\n .description('Extract a substring from a string using start and end positions.')\n .category(ToolCategory.UTILITY)\n .tags(['string', 'substring', 'slice'])\n .schema(StringSubstringSchema)\n .implement(async (input) => {\n const result = input.text.substring(input.start, input.end);\n \n return {\n result,\n length: result.length,\n start: input.start,\n end: input.end ?? input.text.length,\n };\n })\n .build();\n}\n\n","/**\n * String Length Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StringLengthSchema } from '../types.js';\n\n/**\n * Create string length tool\n */\nexport function createStringLengthTool() {\n return toolBuilder()\n .name('string-length')\n .description('Get the length of a string in characters, words, or lines.')\n .category(ToolCategory.UTILITY)\n .tags(['string', 'length', 'count'])\n .schema(StringLengthSchema)\n .implement(async (input) => {\n const words = input.text.trim().split(/\\s+/).filter(w => w.length > 0);\n const lines = input.text.split('\\n');\n \n return {\n characters: input.text.length,\n words: words.length,\n lines: lines.length,\n };\n })\n .build();\n}\n\n","/**\n * String Utility Tools\n * \n * Tools for string manipulation and transformation.\n */\n\nimport { createStringCaseConverterTool } from './tools/string-case-converter.js';\nimport { createStringTrimTool } from './tools/string-trim.js';\nimport { createStringReplaceTool } from './tools/string-replace.js';\nimport { createStringSplitTool } from './tools/string-split.js';\nimport { createStringJoinTool } from './tools/string-join.js';\nimport { createStringSubstringTool } from './tools/string-substring.js';\nimport { createStringLengthTool } from './tools/string-length.js';\nimport type { StringUtilitiesConfig } from './types.js';\n\n// Default tool instances\nexport const stringCaseConverter = createStringCaseConverterTool();\nexport const stringTrim = createStringTrimTool();\nexport const stringReplace = createStringReplaceTool();\nexport const stringSplit = createStringSplitTool();\nexport const stringJoin = createStringJoinTool();\nexport const stringSubstring = createStringSubstringTool();\nexport const stringLength = createStringLengthTool();\n\n// Tools array\nexport const stringUtilityTools = [\n stringCaseConverter,\n stringTrim,\n stringReplace,\n stringSplit,\n stringJoin,\n stringSubstring,\n stringLength,\n];\n\n/**\n * Create string utility tools with optional configuration\n */\nexport function createStringUtilityTools(config: StringUtilitiesConfig = {}) {\n return [\n createStringCaseConverterTool(),\n createStringTrimTool(),\n createStringReplaceTool(),\n createStringSplitTool(),\n createStringJoinTool(),\n createStringSubstringTool(),\n createStringLengthTool(),\n ];\n}\n\n// Re-export types\nexport * from './types.js';\n\n// Re-export tool factory functions\nexport { createStringCaseConverterTool } from './tools/string-case-converter.js';\nexport { createStringTrimTool } from './tools/string-trim.js';\nexport { createStringReplaceTool } from './tools/string-replace.js';\nexport { createStringSplitTool } from './tools/string-split.js';\nexport { createStringJoinTool } from './tools/string-join.js';\nexport { createStringSubstringTool } from './tools/string-substring.js';\nexport { createStringLengthTool } from './tools/string-length.js';\n\n","/**\n * Math Operations Tools - Type Definitions\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema for calculator tool\n */\nexport const CalculatorSchema = z.object({\n operation: z.enum(['add', 'subtract', 'multiply', 'divide', 'power', 'modulo']).describe('Mathematical operation to perform'),\n a: z.number().describe('First number'),\n b: z.number().describe('Second number'),\n});\n\n/**\n * Schema for math functions tool\n */\nexport const MathFunctionsSchema = z.object({\n function: z.enum(['sqrt', 'abs', 'round', 'floor', 'ceil', 'sin', 'cos', 'tan', 'log', 'exp']).describe('Mathematical function to apply'),\n value: z.number().describe('Input value'),\n});\n\n/**\n * Schema for random number tool\n */\nexport const RandomNumberSchema = z.object({\n min: z.number().default(0).describe('Minimum value (inclusive)'),\n max: z.number().default(1).describe('Maximum value (exclusive for decimals, inclusive for integers)'),\n integer: z.boolean().default(false).describe('Generate an integer (true) or decimal (false)'),\n});\n\n/**\n * Schema for statistics tool\n */\nexport const StatisticsSchema = z.object({\n numbers: z.array(z.number().describe(\"Number value\")).describe('Array of numbers to analyze'),\n});\n\n/**\n * Configuration for math operations tools\n */\nexport type MathOperationsConfig = Record<string, never>;\n\nexport type CalculatorInput = z.infer<typeof CalculatorSchema>;\nexport type MathFunctionsInput = z.infer<typeof MathFunctionsSchema>;\nexport type RandomNumberInput = z.infer<typeof RandomNumberSchema>;\nexport type StatisticsInput = z.infer<typeof StatisticsSchema>;\n","/**\n * Calculator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { CalculatorSchema } from '../types.js';\n\n/**\n * Create calculator tool\n */\nexport function createCalculatorTool() {\n return toolBuilder()\n .name('calculator')\n .description('Perform basic arithmetic operations: add, subtract, multiply, divide, power, modulo.')\n .category(ToolCategory.UTILITY)\n .tags(['math', 'calculator', 'arithmetic'])\n .schema(CalculatorSchema)\n .implement(async (input) => {\n let result: number;\n \n switch (input.operation) {\n case 'add':\n result = input.a + input.b;\n break;\n case 'subtract':\n result = input.a - input.b;\n break;\n case 'multiply':\n result = input.a * input.b;\n break;\n case 'divide':\n if (input.b === 0) {\n return {\n success: false,\n error: 'Division by zero',\n };\n }\n result = input.a / input.b;\n break;\n case 'power':\n result = Math.pow(input.a, input.b);\n break;\n case 'modulo':\n result = input.a % input.b;\n break;\n default:\n return {\n success: false,\n error: 'Unknown operation',\n };\n }\n \n return {\n success: true,\n result,\n operation: input.operation,\n a: input.a,\n b: input.b,\n };\n })\n .build();\n}\n\n","/**\n * Math Functions Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { MathFunctionsSchema } from '../types.js';\n\n/**\n * Create math functions tool\n */\nexport function createMathFunctionsTool() {\n return toolBuilder()\n .name('math-functions')\n .description('Apply mathematical functions: sqrt, abs, round, floor, ceil, sin, cos, tan, log, exp.')\n .category(ToolCategory.UTILITY)\n .tags(['math', 'functions', 'trigonometry'])\n .schema(MathFunctionsSchema)\n .implement(async (input) => {\n let result: number;\n \n try {\n switch (input.function) {\n case 'sqrt':\n result = Math.sqrt(input.value);\n break;\n case 'abs':\n result = Math.abs(input.value);\n break;\n case 'round':\n result = Math.round(input.value);\n break;\n case 'floor':\n result = Math.floor(input.value);\n break;\n case 'ceil':\n result = Math.ceil(input.value);\n break;\n case 'sin':\n result = Math.sin(input.value);\n break;\n case 'cos':\n result = Math.cos(input.value);\n break;\n case 'tan':\n result = Math.tan(input.value);\n break;\n case 'log':\n result = Math.log(input.value);\n break;\n case 'exp':\n result = Math.exp(input.value);\n break;\n default:\n return {\n success: false,\n error: 'Unknown function',\n };\n }\n \n if (isNaN(result) || !isFinite(result)) {\n return {\n success: false,\n error: 'Invalid result (NaN or Infinity)',\n };\n }\n \n return {\n success: true,\n result,\n function: input.function,\n input: input.value,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Math operation failed',\n };\n }\n })\n .build();\n}\n\n","/**\n * Random Number Generator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { RandomNumberSchema } from '../types.js';\n\n/**\n * Create random number tool\n */\nexport function createRandomNumberTool() {\n return toolBuilder()\n .name('random-number')\n .description('Generate a random number within a specified range. Supports integers and decimals.')\n .category(ToolCategory.UTILITY)\n .tags(['random', 'number', 'generator'])\n .schema(RandomNumberSchema)\n .implement(async (input) => {\n const min = input.min ?? 0;\n const max = input.max ?? 1;\n const integer = input.integer ?? false;\n\n let result: number;\n\n if (integer) {\n result = Math.floor(Math.random() * (max - min + 1)) + min;\n } else {\n result = Math.random() * (max - min) + min;\n }\n\n return {\n result,\n min,\n max,\n integer,\n };\n })\n .build();\n}\n\n","/**\n * Statistics Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { StatisticsSchema } from '../types.js';\n\n/**\n * Create statistics tool\n */\nexport function createStatisticsTool() {\n return toolBuilder()\n .name('statistics')\n .description('Calculate statistics for an array of numbers: sum, average, min, max, median, standard deviation.')\n .category(ToolCategory.UTILITY)\n .tags(['math', 'statistics', 'average', 'sum'])\n .schema(StatisticsSchema)\n .implement(async (input) => {\n if (input.numbers.length === 0) {\n return {\n success: false,\n error: 'Empty array',\n };\n }\n \n const sorted = [...input.numbers].sort((a, b) => a - b);\n const sum = input.numbers.reduce((acc, n) => acc + n, 0);\n const average = sum / input.numbers.length;\n const min = sorted[0];\n const max = sorted[sorted.length - 1];\n \n // Median\n const mid = Math.floor(sorted.length / 2);\n const median = sorted.length % 2 === 0\n ? (sorted[mid - 1] + sorted[mid]) / 2\n : sorted[mid];\n \n // Standard deviation\n const variance = input.numbers.reduce((acc, n) => acc + Math.pow(n - average, 2), 0) / input.numbers.length;\n const stdDev = Math.sqrt(variance);\n \n return {\n success: true,\n count: input.numbers.length,\n sum,\n average,\n min,\n max,\n median,\n standardDeviation: stdDev,\n variance,\n };\n })\n .build();\n}\n\n","/**\n * Math Operations Tools\n * \n * Tools for mathematical calculations and operations.\n */\n\nimport { createCalculatorTool } from './tools/calculator.js';\nimport { createMathFunctionsTool } from './tools/math-functions.js';\nimport { createRandomNumberTool } from './tools/random-number.js';\nimport { createStatisticsTool } from './tools/statistics.js';\nimport type { MathOperationsConfig } from './types.js';\n\n// Default tool instances\nexport const calculator = createCalculatorTool();\nexport const mathFunctions = createMathFunctionsTool();\nexport const randomNumber = createRandomNumberTool();\nexport const statistics = createStatisticsTool();\n\n// Tools array\nexport const mathOperationTools = [\n calculator,\n mathFunctions,\n randomNumber,\n statistics,\n];\n\n/**\n * Create math operation tools with optional configuration\n */\nexport function createMathOperationTools(config: MathOperationsConfig = {}) {\n return [\n createCalculatorTool(),\n createMathFunctionsTool(),\n createRandomNumberTool(),\n createStatisticsTool(),\n ];\n}\n\n// Re-export types\nexport * from './types.js';\n\n// Re-export tool factory functions\nexport { createCalculatorTool } from './tools/calculator.js';\nexport { createMathFunctionsTool } from './tools/math-functions.js';\nexport { createRandomNumberTool } from './tools/random-number.js';\nexport { createStatisticsTool } from './tools/statistics.js';\n\n","/**\n * Validation Tools - Type Definitions\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema for email validator tool\n */\nexport const EmailValidatorSchema = z.object({\n email: z.string().describe('Email address to validate'),\n});\n\n/**\n * Schema for URL validator tool\n */\nexport const UrlValidatorSimpleSchema = z.object({\n url: z.string().describe('URL to validate'),\n});\n\n/**\n * Schema for phone validator tool\n */\nexport const PhoneValidatorSchema = z.object({\n phone: z.string().describe('Phone number to validate'),\n strict: z.boolean().default(false).describe('Use strict validation (requires country code)'),\n});\n\n/**\n * Schema for credit card validator tool\n */\nexport const CreditCardValidatorSchema = z.object({\n cardNumber: z.string().describe('Credit card number to validate'),\n});\n\n/**\n * Schema for IP validator tool\n */\nexport const IpValidatorSchema = z.object({\n ip: z.string().describe('IP address to validate'),\n version: z.enum(['v4', 'v6', 'any']).default('any').describe('IP version to validate against'),\n});\n\n/**\n * Schema for UUID validator tool\n */\nexport const UuidValidatorSchema = z.object({\n uuid: z.string().describe('UUID to validate'),\n});\n\n/**\n * Configuration for validation tools\n */\nexport type ValidationConfig = Record<string, never>;\n\nexport type EmailValidatorInput = z.infer<typeof EmailValidatorSchema>;\nexport type UrlValidatorSimpleInput = z.infer<typeof UrlValidatorSimpleSchema>;\nexport type PhoneValidatorInput = z.infer<typeof PhoneValidatorSchema>;\nexport type CreditCardValidatorInput = z.infer<typeof CreditCardValidatorSchema>;\nexport type IpValidatorInput = z.infer<typeof IpValidatorSchema>;\nexport type UuidValidatorInput = z.infer<typeof UuidValidatorSchema>;\n","/**\n * Email Validator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { EmailValidatorSchema } from '../types.js';\n\n/**\n * Create email validator tool\n */\nexport function createEmailValidatorTool() {\n return toolBuilder()\n .name('email-validator')\n .description('Validate if a string is a valid email address format.')\n .category(ToolCategory.UTILITY)\n .tags(['validation', 'email', 'validate'])\n .schema(EmailValidatorSchema)\n .implement(async (input) => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n const valid = emailRegex.test(input.email);\n \n return {\n valid,\n email: input.email,\n message: valid ? 'Valid email address' : 'Invalid email address format',\n };\n })\n .build();\n}\n\n","/**\n * URL Validator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { UrlValidatorSimpleSchema } from '../types.js';\n\n/**\n * Create URL validator tool\n */\nexport function createUrlValidatorSimpleTool() {\n return toolBuilder()\n .name('url-validator-simple')\n .description('Validate if a string is a valid URL format.')\n .category(ToolCategory.UTILITY)\n .tags(['validation', 'url', 'validate'])\n .schema(UrlValidatorSimpleSchema)\n .implement(async (input) => {\n try {\n new URL(input.url);\n return {\n valid: true,\n url: input.url,\n message: 'Valid URL',\n };\n } catch {\n return {\n valid: false,\n url: input.url,\n message: 'Invalid URL format',\n };\n }\n })\n .build();\n}\n\n","/**\n * Phone Validator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { PhoneValidatorSchema } from '../types.js';\n\n/**\n * Create phone validator tool\n */\nexport function createPhoneValidatorTool() {\n return toolBuilder()\n .name('phone-validator')\n .description('Validate if a string is a valid phone number format. Supports various international formats.')\n .category(ToolCategory.UTILITY)\n .tags(['validation', 'phone', 'validate'])\n .schema(PhoneValidatorSchema)\n .implement(async (input) => {\n // Basic phone validation - matches common formats\n // eslint-disable-next-line no-useless-escape\n const basicRegex = /^[\\d\\s\\-\\+\\(\\)]+$/;\n const strictRegex = /^\\+?[1-9]\\d{1,14}$/; // E.164 format\n \n const regex = input.strict ? strictRegex : basicRegex;\n const valid = regex.test(input.phone.replace(/\\s/g, ''));\n \n return {\n valid,\n phone: input.phone,\n message: valid ? 'Valid phone number format' : 'Invalid phone number format',\n };\n })\n .build();\n}\n\n","/**\n * Credit Card Validator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { CreditCardValidatorSchema } from '../types.js';\n\n/**\n * Create credit card validator tool\n */\nexport function createCreditCardValidatorTool() {\n return toolBuilder()\n .name('credit-card-validator')\n .description('Validate if a string is a valid credit card number using the Luhn algorithm.')\n .category(ToolCategory.UTILITY)\n .tags(['validation', 'credit-card', 'validate', 'luhn'])\n .schema(CreditCardValidatorSchema)\n .implement(async (input) => {\n // Remove spaces and dashes\n // eslint-disable-next-line no-useless-escape\n const cleaned = input.cardNumber.replace(/[\\s\\-]/g, '');\n \n // Check if it's all digits\n if (!/^\\d+$/.test(cleaned)) {\n return {\n valid: false,\n message: 'Card number must contain only digits',\n };\n }\n \n // Luhn algorithm\n let sum = 0;\n let isEven = false;\n \n for (let i = cleaned.length - 1; i >= 0; i--) {\n let digit = parseInt(cleaned[i], 10);\n \n if (isEven) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n \n sum += digit;\n isEven = !isEven;\n }\n \n const valid = sum % 10 === 0;\n \n return {\n valid,\n cardNumber: input.cardNumber,\n message: valid ? 'Valid credit card number' : 'Invalid credit card number (failed Luhn check)',\n };\n })\n .build();\n}\n\n","/**\n * IP Address Validator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { IpValidatorSchema } from '../types.js';\n\n/**\n * Create IP validator tool\n */\nexport function createIpValidatorTool() {\n return toolBuilder()\n .name('ip-validator')\n .description('Validate if a string is a valid IPv4 or IPv6 address.')\n .category(ToolCategory.UTILITY)\n .tags(['validation', 'ip', 'validate', 'network'])\n .schema(IpValidatorSchema)\n .implement(async (input) => {\n const ipv4Regex = /^(\\d{1,3}\\.){3}\\d{1,3}$/;\n const ipv6Regex = /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/;\n \n let valid = false;\n let detectedVersion: string | undefined;\n \n if (input.version === 'v4' || input.version === 'any') {\n if (ipv4Regex.test(input.ip)) {\n // Additional check for valid ranges (0-255)\n const parts = input.ip.split('.');\n valid = parts.every(part => {\n const num = parseInt(part, 10);\n return num >= 0 && num <= 255;\n });\n if (valid) detectedVersion = 'IPv4';\n }\n }\n \n if (!valid && (input.version === 'v6' || input.version === 'any')) {\n if (ipv6Regex.test(input.ip)) {\n valid = true;\n detectedVersion = 'IPv6';\n }\n }\n \n return {\n valid,\n ip: input.ip,\n version: detectedVersion,\n message: valid ? `Valid ${detectedVersion} address` : 'Invalid IP address format',\n };\n })\n .build();\n}\n\n","/**\n * UUID Validator Tool\n */\n\nimport { toolBuilder, ToolCategory } from '@agentforge/core';\nimport { UuidValidatorSchema } from '../types.js';\n\n/**\n * Create UUID validator tool\n */\nexport function createUuidValidatorTool() {\n return toolBuilder()\n .name('uuid-validator')\n .description('Validate if a string is a valid UUID (v1, v3, v4, or v5).')\n .category(ToolCategory.UTILITY)\n .tags(['validation', 'uuid', 'validate', 'guid'])\n .schema(UuidValidatorSchema)\n .implement(async (input) => {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n const valid = uuidRegex.test(input.uuid);\n \n let version: number | undefined;\n if (valid) {\n version = parseInt(input.uuid[14], 10);\n }\n \n return {\n valid,\n uuid: input.uuid,\n version,\n message: valid ? `Valid UUID v${version}` : 'Invalid UUID format',\n };\n })\n .build();\n}\n\n","/**\n * Validation Utility Tools\n * \n * Tools for validating data formats and types.\n */\n\nimport { createEmailValidatorTool } from './tools/email-validator.js';\nimport { createUrlValidatorSimpleTool } from './tools/url-validator-simple.js';\nimport { createPhoneValidatorTool } from './tools/phone-validator.js';\nimport { createCreditCardValidatorTool } from './tools/credit-card-validator.js';\nimport { createIpValidatorTool } from './tools/ip-validator.js';\nimport { createUuidValidatorTool } from './tools/uuid-validator.js';\nimport type { ValidationConfig } from './types.js';\n\n// Default tool instances\nexport const emailValidator = createEmailValidatorTool();\nexport const urlValidatorSimple = createUrlValidatorSimpleTool();\nexport const phoneValidator = createPhoneValidatorTool();\nexport const creditCardValidator = createCreditCardValidatorTool();\nexport const ipValidator = createIpValidatorTool();\nexport const uuidValidator = createUuidValidatorTool();\n\n// Tools array\nexport const validationTools = [\n emailValidator,\n urlValidatorSimple,\n phoneValidator,\n creditCardValidator,\n ipValidator,\n uuidValidator,\n];\n\n/**\n * Create validation tools with optional configuration\n */\nexport function createValidationTools(config: ValidationConfig = {}) {\n return [\n createEmailValidatorTool(),\n createUrlValidatorSimpleTool(),\n createPhoneValidatorTool(),\n createCreditCardValidatorTool(),\n createIpValidatorTool(),\n createUuidValidatorTool(),\n ];\n}\n\n// Re-export types\nexport * from './types.js';\n\n// Re-export tool factory functions\nexport { createEmailValidatorTool } from './tools/email-validator.js';\nexport { createUrlValidatorSimpleTool } from './tools/url-validator-simple.js';\nexport { createPhoneValidatorTool } from './tools/phone-validator.js';\nexport { createCreditCardValidatorTool } from './tools/credit-card-validator.js';\nexport { createIpValidatorTool } from './tools/ip-validator.js';\nexport { createUuidValidatorTool } from './tools/uuid-validator.js';\n\n","/**\n * Types for askHuman tool and human-in-the-loop workflows\n * @module tools/agent/ask-human/types\n */\n\nimport { z } from 'zod';\nimport type { HumanRequest, HumanRequestPriority, HumanRequestStatus } from '@agentforge/core';\n\n/**\n * Input schema for askHuman tool\n */\nexport const AskHumanInputSchema = z.object({\n /**\n * The question to ask the human\n */\n question: z.string().min(1).describe('The question to ask the human'),\n\n /**\n * Optional context to help the human understand the question\n */\n context: z.record(z.any()).optional().describe('Additional context for the question'),\n\n /**\n * Priority level for this request\n */\n priority: z.enum(['low', 'normal', 'high', 'critical']).default('normal').describe('Priority level for this request'),\n\n /**\n * Timeout in milliseconds (0 = no timeout)\n */\n timeout: z.number().min(0).default(0).describe('Timeout in milliseconds (0 = no timeout)'),\n\n /**\n * Default response if timeout occurs\n */\n defaultResponse: z.string().optional().describe('Default response if timeout occurs'),\n\n /**\n * Suggested responses (for UI to show as options)\n */\n suggestions: z.array(z.string()).optional().describe('Suggested responses for the human'),\n});\n\n/**\n * Input type for askHuman tool\n */\nexport type AskHumanInput = z.infer<typeof AskHumanInputSchema>;\n\n/**\n * Output from askHuman tool\n */\nexport interface AskHumanOutput {\n /**\n * The human's response\n */\n response: string;\n\n /**\n * Metadata about the interaction\n */\n metadata: {\n /**\n * Unique ID for this request\n */\n requestId: string;\n\n /**\n * When the request was created\n */\n requestedAt: number;\n\n /**\n * When the response was received\n */\n respondedAt: number;\n\n /**\n * How long it took to get a response (ms)\n */\n duration: number;\n\n /**\n * Whether this was a timeout response\n */\n timedOut: boolean;\n\n /**\n * Priority level\n */\n priority: HumanRequestPriority;\n };\n}\n\n// HumanRequest, HumanRequestPriority, and HumanRequestStatus are now imported from @agentforge/core\n// They are defined in packages/core/src/langgraph/interrupts/types.ts\n\n","/**\n * askHuman tool implementation\n * @module tools/agent/ask-human/tool\n */\n\nimport { toolBuilder, ToolCategory, createLogger, LogLevel } from '@agentforge/core';\nimport { AskHumanInputSchema, type AskHumanInput, type AskHumanOutput } from './types.js';\nimport { randomUUID } from 'crypto';\n\n// Create logger for askHuman tool\n// Log level can be controlled via LOG_LEVEL environment variable\nconst logLevel = (process.env.LOG_LEVEL?.toLowerCase() as LogLevel) || LogLevel.INFO;\nconst logger = createLogger('askHuman', { level: logLevel });\n\n/**\n * Create the askHuman tool\n * \n * This tool enables human-in-the-loop workflows by pausing agent execution\n * and waiting for human input. It uses LangGraph's interrupt mechanism.\n * \n * @example\n * ```typescript\n * import { createAskHumanTool } from '@agentforge/tools';\n *\n * const askHuman = createAskHumanTool();\n *\n * // In your agent\n * const tools = [askHuman, ...otherTools];\n *\n * // The agent can call this tool to ask for human input\n * // When called, it will pause execution and wait for a response\n * ```\n * \n * @returns The askHuman tool\n */\nexport function createAskHumanTool() {\n return toolBuilder()\n .name('ask-human')\n .description(\n 'Ask a human for input or approval. Use this when you need human guidance, ' +\n 'approval for a critical action, or clarification on ambiguous requirements. ' +\n 'The agent execution will pause until the human responds.'\n )\n .category(ToolCategory.UTILITY)\n .schema(AskHumanInputSchema)\n .implement(async (input): Promise<AskHumanOutput> => {\n // Type assertion after Zod validation\n const validatedInput = input as AskHumanInput;\n const requestId = randomUUID();\n const requestedAt = Date.now();\n\n // Import interrupt dynamically to avoid circular dependencies\n // and to allow this tool to work even if LangGraph is not installed\n let interrupt: ((value: any) => any) | undefined;\n \n try {\n const langgraph = await import('@langchain/langgraph');\n interrupt = (langgraph as any).interrupt;\n } catch (error) {\n throw new Error(\n 'askHuman tool requires @langchain/langgraph to be installed. ' +\n 'Install it with: npm install @langchain/langgraph'\n );\n }\n\n if (!interrupt) {\n throw new Error(\n 'interrupt function not found in @langchain/langgraph. ' +\n 'Make sure you are using a compatible version of LangGraph.'\n );\n }\n\n // Create the human request object\n const humanRequest = {\n id: requestId,\n question: validatedInput.question,\n context: validatedInput.context,\n priority: validatedInput.priority,\n createdAt: requestedAt,\n timeout: validatedInput.timeout,\n defaultResponse: validatedInput.defaultResponse,\n suggestions: validatedInput.suggestions,\n status: 'pending' as const,\n };\n\n // Use LangGraph's interrupt to pause execution\n // This will save the request to the checkpoint and pause the graph\n // The application can then resume with the human's response\n logger.debug('About to call interrupt()', { humanRequest });\n\n let response;\n try {\n response = interrupt(humanRequest);\n logger.debug('interrupt() returned successfully', { response, responseType: typeof response });\n } catch (error) {\n logger.debug('interrupt() threw error (expected for GraphInterrupt)', {\n errorType: error?.constructor?.name,\n error: error instanceof Error ? error.message : String(error)\n });\n throw error; // Re-throw to let the node handle it\n }\n\n const respondedAt = Date.now();\n const duration = respondedAt - requestedAt;\n\n // Check if we got a timeout response\n const timedOut = validatedInput.timeout > 0 && duration >= validatedInput.timeout;\n\n // If timeout occurred and we have a default response, use it\n const finalResponse = timedOut && validatedInput.defaultResponse\n ? validatedInput.defaultResponse\n : (response || '');\n\n return {\n response: finalResponse,\n metadata: {\n requestId,\n requestedAt,\n respondedAt,\n duration,\n timedOut,\n priority: validatedInput.priority,\n },\n };\n })\n .build();\n}\n\n/**\n * Default instance of the askHuman tool\n * \n * @example\n * ```typescript\n * import { askHumanTool } from '@agentforge/core';\n * \n * const agent = createReActAgent({\n * llm,\n * tools: [askHumanTool, ...otherTools],\n * });\n * ```\n */\nexport const askHumanTool = createAskHumanTool();\n\n"]}
|