@5ss/ai-tools 2.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +112 -0
- package/LICENSE +21 -0
- package/README.md +221 -0
- package/dist/ai-sdk/index.d.ts +15 -0
- package/dist/ai-sdk/index.d.ts.map +1 -0
- package/dist/ai-sdk/index.js +24 -0
- package/dist/ai-sdk/index.js.map +1 -0
- package/dist/artifact-D064mHfK.js +44 -0
- package/dist/artifact-D064mHfK.js.map +1 -0
- package/dist/artifacts-O8g-40Pw.js +404 -0
- package/dist/artifacts-O8g-40Pw.js.map +1 -0
- package/dist/aws-json-CecFqzqX.js +23 -0
- package/dist/aws-json-CecFqzqX.js.map +1 -0
- package/dist/aws-service-msttbPrz.js +58 -0
- package/dist/aws-service-msttbPrz.js.map +1 -0
- package/dist/batch-BMM5dXqL.d.ts +22 -0
- package/dist/batch-BMM5dXqL.d.ts.map +1 -0
- package/dist/batch-Co1ujeAW.js +67 -0
- package/dist/batch-Co1ujeAW.js.map +1 -0
- package/dist/bedrock-agentcore-browser-a_qOs-NR.js +182 -0
- package/dist/bedrock-agentcore-browser-a_qOs-NR.js.map +1 -0
- package/dist/bedrock-agentcore-code-interpreter-MWK-8RhA.js +357 -0
- package/dist/bedrock-agentcore-code-interpreter-MWK-8RhA.js.map +1 -0
- package/dist/bytes-BxpimpQx.js +45 -0
- package/dist/bytes-BxpimpQx.js.map +1 -0
- package/dist/client-CCKGsTeI.js +743 -0
- package/dist/client-CCKGsTeI.js.map +1 -0
- package/dist/cloudflare/index.d.ts +37 -0
- package/dist/cloudflare/index.d.ts.map +1 -0
- package/dist/cloudflare/index.js +41 -0
- package/dist/cloudflare/index.js.map +1 -0
- package/dist/cloudflare-browser-B6Yolpin.js +428 -0
- package/dist/cloudflare-browser-B6Yolpin.js.map +1 -0
- package/dist/cloudflare-email-Dy0KHeDf.js +197 -0
- package/dist/cloudflare-email-Dy0KHeDf.js.map +1 -0
- package/dist/cloudflare-sandbox-Dp_uNaqW.js +982 -0
- package/dist/cloudflare-sandbox-Dp_uNaqW.js.map +1 -0
- package/dist/content-type-CORxaxcv.js +49 -0
- package/dist/content-type-CORxaxcv.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +204 -0
- package/dist/core/index.js.map +1 -0
- package/dist/define-CvpJ_pNP.js +115 -0
- package/dist/define-CvpJ_pNP.js.map +1 -0
- package/dist/errors-DoSpNHvs.js +20 -0
- package/dist/errors-DoSpNHvs.js.map +1 -0
- package/dist/errors-aKhko9T1.d.ts +18 -0
- package/dist/errors-aKhko9T1.d.ts.map +1 -0
- package/dist/eventbridge-scheduler-Bh6GqZY2.js +349 -0
- package/dist/eventbridge-scheduler-Bh6GqZY2.js.map +1 -0
- package/dist/framework-context-DVIIY8ZO.js +24 -0
- package/dist/framework-context-DVIIY8ZO.js.map +1 -0
- package/dist/gotenberg-NuJjxyln.js +291 -0
- package/dist/gotenberg-NuJjxyln.js.map +1 -0
- package/dist/http/index.d.ts +47 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +3 -0
- package/dist/http-service-DDNCO1s4.js +254 -0
- package/dist/http-service-DDNCO1s4.js.map +1 -0
- package/dist/http-service-T7E5UjP8.d.ts +80 -0
- package/dist/http-service-T7E5UjP8.d.ts.map +1 -0
- package/dist/imessage-BSAFOI8Z.js +154 -0
- package/dist/imessage-BSAFOI8Z.js.map +1 -0
- package/dist/index-BU4gmYO8.d.ts +254 -0
- package/dist/index-BU4gmYO8.d.ts.map +1 -0
- package/dist/index-CCivzmxO.d.ts +188 -0
- package/dist/index-CCivzmxO.d.ts.map +1 -0
- package/dist/index-CLmTrcu5.d.ts +22 -0
- package/dist/index-CLmTrcu5.d.ts.map +1 -0
- package/dist/index-CZX5OeOF.d.ts +235 -0
- package/dist/index-CZX5OeOF.d.ts.map +1 -0
- package/dist/index-CdFmEfZO.d.ts +359 -0
- package/dist/index-CdFmEfZO.d.ts.map +1 -0
- package/dist/index-Cuh6eMWc.d.ts +285 -0
- package/dist/index-Cuh6eMWc.d.ts.map +1 -0
- package/dist/index-DuOGj7vc.d.ts +107 -0
- package/dist/index-DuOGj7vc.d.ts.map +1 -0
- package/dist/index-ccZ1XOHw.d.ts +69 -0
- package/dist/index-ccZ1XOHw.d.ts.map +1 -0
- package/dist/index-n8JTpNf1.d.ts +247 -0
- package/dist/index-n8JTpNf1.d.ts.map +1 -0
- package/dist/index-pwW1OsOx.d.ts +134 -0
- package/dist/index-pwW1OsOx.d.ts.map +1 -0
- package/dist/index-zK1ZwS4m.d.ts +347 -0
- package/dist/index-zK1ZwS4m.d.ts.map +1 -0
- package/dist/limits-hjrO8zUG.js +80 -0
- package/dist/limits-hjrO8zUG.js.map +1 -0
- package/dist/mastra/index.d.ts +14 -0
- package/dist/mastra/index.d.ts.map +1 -0
- package/dist/mastra/index.js +26 -0
- package/dist/mastra/index.js.map +1 -0
- package/dist/mastra-vector-Dhc6XZ8l.js +234 -0
- package/dist/mastra-vector-Dhc6XZ8l.js.map +1 -0
- package/dist/mcp/index.d.ts +80 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +97 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/modules/artifacts/index.d.ts +337 -0
- package/dist/modules/artifacts/index.d.ts.map +1 -0
- package/dist/modules/artifacts/index.js +348 -0
- package/dist/modules/artifacts/index.js.map +1 -0
- package/dist/modules/browser/index.d.ts +516 -0
- package/dist/modules/browser/index.d.ts.map +1 -0
- package/dist/modules/browser/index.js +475 -0
- package/dist/modules/browser/index.js.map +1 -0
- package/dist/modules/calendar/index.d.ts +93 -0
- package/dist/modules/calendar/index.d.ts.map +1 -0
- package/dist/modules/calendar/index.js +131 -0
- package/dist/modules/calendar/index.js.map +1 -0
- package/dist/modules/code-sandbox/index.d.ts +317 -0
- package/dist/modules/code-sandbox/index.d.ts.map +1 -0
- package/dist/modules/code-sandbox/index.js +537 -0
- package/dist/modules/code-sandbox/index.js.map +1 -0
- package/dist/modules/content-type/index.d.ts +22 -0
- package/dist/modules/content-type/index.d.ts.map +1 -0
- package/dist/modules/content-type/index.js +66 -0
- package/dist/modules/content-type/index.js.map +1 -0
- package/dist/modules/crypto/index.d.ts +115 -0
- package/dist/modules/crypto/index.d.ts.map +1 -0
- package/dist/modules/crypto/index.js +139 -0
- package/dist/modules/crypto/index.js.map +1 -0
- package/dist/modules/document/index.d.ts +575 -0
- package/dist/modules/document/index.d.ts.map +1 -0
- package/dist/modules/document/index.js +444 -0
- package/dist/modules/document/index.js.map +1 -0
- package/dist/modules/document-extract/index.d.ts +438 -0
- package/dist/modules/document-extract/index.d.ts.map +1 -0
- package/dist/modules/document-extract/index.js +127 -0
- package/dist/modules/document-extract/index.js.map +1 -0
- package/dist/modules/document-render/index.d.ts +336 -0
- package/dist/modules/document-render/index.d.ts.map +1 -0
- package/dist/modules/document-render/index.js +155 -0
- package/dist/modules/document-render/index.js.map +1 -0
- package/dist/modules/email/index.d.ts +311 -0
- package/dist/modules/email/index.d.ts.map +1 -0
- package/dist/modules/email/index.js +167 -0
- package/dist/modules/email/index.js.map +1 -0
- package/dist/modules/email-message/index.d.ts +95 -0
- package/dist/modules/email-message/index.d.ts.map +1 -0
- package/dist/modules/email-message/index.js +264 -0
- package/dist/modules/email-message/index.js.map +1 -0
- package/dist/modules/file-convert/index.d.ts +273 -0
- package/dist/modules/file-convert/index.d.ts.map +1 -0
- package/dist/modules/file-convert/index.js +103 -0
- package/dist/modules/file-convert/index.js.map +1 -0
- package/dist/modules/files/index.d.ts +452 -0
- package/dist/modules/files/index.d.ts.map +1 -0
- package/dist/modules/files/index.js +733 -0
- package/dist/modules/files/index.js.map +1 -0
- package/dist/modules/image/index.d.ts +342 -0
- package/dist/modules/image/index.d.ts.map +1 -0
- package/dist/modules/image/index.js +281 -0
- package/dist/modules/image/index.js.map +1 -0
- package/dist/modules/messaging/index.d.ts +608 -0
- package/dist/modules/messaging/index.d.ts.map +1 -0
- package/dist/modules/messaging/index.js +1067 -0
- package/dist/modules/messaging/index.js.map +1 -0
- package/dist/modules/pdf/index.d.ts +287 -0
- package/dist/modules/pdf/index.d.ts.map +1 -0
- package/dist/modules/pdf/index.js +259 -0
- package/dist/modules/pdf/index.js.map +1 -0
- package/dist/modules/presentation/index.d.ts +247 -0
- package/dist/modules/presentation/index.d.ts.map +1 -0
- package/dist/modules/presentation/index.js +12657 -0
- package/dist/modules/presentation/index.js.map +1 -0
- package/dist/modules/queue/index.d.ts +129 -0
- package/dist/modules/queue/index.d.ts.map +1 -0
- package/dist/modules/queue/index.js +131 -0
- package/dist/modules/queue/index.js.map +1 -0
- package/dist/modules/rag/index.d.ts +250 -0
- package/dist/modules/rag/index.d.ts.map +1 -0
- package/dist/modules/rag/index.js +366 -0
- package/dist/modules/rag/index.js.map +1 -0
- package/dist/modules/scheduler/index.d.ts +216 -0
- package/dist/modules/scheduler/index.d.ts.map +1 -0
- package/dist/modules/scheduler/index.js +153 -0
- package/dist/modules/scheduler/index.js.map +1 -0
- package/dist/modules/skills/index.d.ts +205 -0
- package/dist/modules/skills/index.d.ts.map +1 -0
- package/dist/modules/skills/index.js +203 -0
- package/dist/modules/skills/index.js.map +1 -0
- package/dist/modules/tasks/index.d.ts +287 -0
- package/dist/modules/tasks/index.d.ts.map +1 -0
- package/dist/modules/tasks/index.js +207 -0
- package/dist/modules/tasks/index.js.map +1 -0
- package/dist/modules/vector-store/index.d.ts +3 -0
- package/dist/modules/vector-store/index.js +3 -0
- package/dist/modules/web-fetch/index.d.ts +99 -0
- package/dist/modules/web-fetch/index.d.ts.map +1 -0
- package/dist/modules/web-fetch/index.js +242 -0
- package/dist/modules/web-fetch/index.js.map +1 -0
- package/dist/object-artifact-store-CMTzCm_G.d.ts +7 -0
- package/dist/object-artifact-store-CMTzCm_G.d.ts.map +1 -0
- package/dist/object-artifact-store-wZ2j9cto.js +28 -0
- package/dist/object-artifact-store-wZ2j9cto.js.map +1 -0
- package/dist/pinecone-umY4t6OF.js +190 -0
- package/dist/pinecone-umY4t6OF.js.map +1 -0
- package/dist/provider-CgDAlg6K.js +34 -0
- package/dist/provider-CgDAlg6K.js.map +1 -0
- package/dist/qdrant-DMp4NhKR.js +253 -0
- package/dist/qdrant-DMp4NhKR.js.map +1 -0
- package/dist/resend-BAC38_dA.js +155 -0
- package/dist/resend-BAC38_dA.js.map +1 -0
- package/dist/s3-CsOaPWMP.js +955 -0
- package/dist/s3-CsOaPWMP.js.map +1 -0
- package/dist/schemas-ChOAhdo9.js +192 -0
- package/dist/schemas-ChOAhdo9.js.map +1 -0
- package/dist/slack-Di5BBNpt.js +1455 -0
- package/dist/slack-Di5BBNpt.js.map +1 -0
- package/dist/sqs-DCwS1i2N.js +225 -0
- package/dist/sqs-DCwS1i2N.js.map +1 -0
- package/dist/supabase-vector-Dpp9mmJR.js +218 -0
- package/dist/supabase-vector-Dpp9mmJR.js.map +1 -0
- package/dist/tanstack/index.d.ts +15 -0
- package/dist/tanstack/index.d.ts.map +1 -0
- package/dist/tanstack/index.js +28 -0
- package/dist/tanstack/index.js.map +1 -0
- package/dist/teams-DYAHNb39.js +835 -0
- package/dist/teams-DYAHNb39.js.map +1 -0
- package/dist/telegram-DDXWzkfL.js +734 -0
- package/dist/telegram-DDXWzkfL.js.map +1 -0
- package/dist/textract-CPLiB22H.js +554 -0
- package/dist/textract-CPLiB22H.js.map +1 -0
- package/dist/transport-B4vn-XiQ.js +157 -0
- package/dist/transport-B4vn-XiQ.js.map +1 -0
- package/dist/transport-i96ACAI_.d.ts +46 -0
- package/dist/transport-i96ACAI_.d.ts.map +1 -0
- package/dist/types-Ccb0DXY9.d.ts +150 -0
- package/dist/types-Ccb0DXY9.d.ts.map +1 -0
- package/dist/unique-EwBH1JPB.js +19 -0
- package/dist/unique-EwBH1JPB.js.map +1 -0
- package/dist/vector-store-C3nEO80e.js +193 -0
- package/dist/vector-store-C3nEO80e.js.map +1 -0
- package/dist/vendors/amazon-sp-api/index.d.ts +526 -0
- package/dist/vendors/amazon-sp-api/index.d.ts.map +1 -0
- package/dist/vendors/amazon-sp-api/index.js +975 -0
- package/dist/vendors/amazon-sp-api/index.js.map +1 -0
- package/dist/vendors/bedrock-agentcore-browser/index.d.ts +2 -0
- package/dist/vendors/bedrock-agentcore-browser/index.js +2 -0
- package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts +228 -0
- package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts.map +1 -0
- package/dist/vendors/bedrock-agentcore-code-interpreter/index.js +2 -0
- package/dist/vendors/cloudflare-browser/index.d.ts +2 -0
- package/dist/vendors/cloudflare-browser/index.js +2 -0
- package/dist/vendors/cloudflare-email/index.d.ts +260 -0
- package/dist/vendors/cloudflare-email/index.d.ts.map +1 -0
- package/dist/vendors/cloudflare-email/index.js +3 -0
- package/dist/vendors/cloudflare-sandbox/index.d.ts +565 -0
- package/dist/vendors/cloudflare-sandbox/index.d.ts.map +1 -0
- package/dist/vendors/cloudflare-sandbox/index.js +2 -0
- package/dist/vendors/eventbridge-scheduler/index.d.ts +2 -0
- package/dist/vendors/eventbridge-scheduler/index.js +2 -0
- package/dist/vendors/gotenberg/index.d.ts +306 -0
- package/dist/vendors/gotenberg/index.d.ts.map +1 -0
- package/dist/vendors/gotenberg/index.js +2 -0
- package/dist/vendors/imessage/index.d.ts +420 -0
- package/dist/vendors/imessage/index.d.ts.map +1 -0
- package/dist/vendors/imessage/index.js +4 -0
- package/dist/vendors/katana/index.d.ts +1570 -0
- package/dist/vendors/katana/index.d.ts.map +1 -0
- package/dist/vendors/katana/index.js +1639 -0
- package/dist/vendors/katana/index.js.map +1 -0
- package/dist/vendors/mastra-vector/index.d.ts +120 -0
- package/dist/vendors/mastra-vector/index.d.ts.map +1 -0
- package/dist/vendors/mastra-vector/index.js +3 -0
- package/dist/vendors/pinecone/index.d.ts +75 -0
- package/dist/vendors/pinecone/index.d.ts.map +1 -0
- package/dist/vendors/pinecone/index.js +3 -0
- package/dist/vendors/qdrant/index.d.ts +75 -0
- package/dist/vendors/qdrant/index.d.ts.map +1 -0
- package/dist/vendors/qdrant/index.js +3 -0
- package/dist/vendors/resend/index.d.ts +3 -0
- package/dist/vendors/resend/index.js +3 -0
- package/dist/vendors/s3/index.d.ts +2 -0
- package/dist/vendors/s3/index.js +2 -0
- package/dist/vendors/slack/index.d.ts +576 -0
- package/dist/vendors/slack/index.d.ts.map +1 -0
- package/dist/vendors/slack/index.js +3 -0
- package/dist/vendors/sqs/index.d.ts +2 -0
- package/dist/vendors/sqs/index.js +2 -0
- package/dist/vendors/supabase-vector/index.d.ts +89 -0
- package/dist/vendors/supabase-vector/index.d.ts.map +1 -0
- package/dist/vendors/supabase-vector/index.js +3 -0
- package/dist/vendors/teams/index.d.ts +303 -0
- package/dist/vendors/teams/index.d.ts.map +1 -0
- package/dist/vendors/teams/index.js +3 -0
- package/dist/vendors/telegram/index.d.ts +319 -0
- package/dist/vendors/telegram/index.d.ts.map +1 -0
- package/dist/vendors/telegram/index.js +3 -0
- package/dist/vendors/textract/index.d.ts +2 -0
- package/dist/vendors/textract/index.js +2 -0
- package/dist/vendors/woocommerce/index.d.ts +1700 -0
- package/dist/vendors/woocommerce/index.d.ts.map +1 -0
- package/dist/vendors/woocommerce/index.js +1427 -0
- package/dist/vendors/woocommerce/index.js.map +1 -0
- package/dist/with-auth-CpKqTrGK.js +240 -0
- package/dist/with-auth-CpKqTrGK.js.map +1 -0
- package/logos/LUCIDE-ATTRIBUTION.txt +4 -0
- package/logos/README.md +89 -0
- package/logos/amazon.svg +6 -0
- package/logos/artifacts.svg +9 -0
- package/logos/browser.svg +9 -0
- package/logos/calendar.svg +15 -0
- package/logos/cloudflare-browser.svg +5 -0
- package/logos/cloudflare-email.svg +5 -0
- package/logos/cloudflare.svg +4 -0
- package/logos/code-sandbox.svg +8 -0
- package/logos/content-type.svg +10 -0
- package/logos/crypto.svg +7 -0
- package/logos/document-extract.svg +12 -0
- package/logos/document-render.svg +8 -0
- package/logos/document.svg +10 -0
- package/logos/email-message.svg +8 -0
- package/logos/email.svg +7 -0
- package/logos/file-convert.svg +9 -0
- package/logos/files.svg +6 -0
- package/logos/gotenberg.svg +340 -0
- package/logos/image.svg +8 -0
- package/logos/imessage.svg +7 -0
- package/logos/katana.svg +13 -0
- package/logos/mastra.svg +7 -0
- package/logos/messaging.svg +7 -0
- package/logos/pack-logos.json +48 -0
- package/logos/pdf.svg +10 -0
- package/logos/pinecone.svg +25 -0
- package/logos/presentation.svg +8 -0
- package/logos/qdrant.svg +4 -0
- package/logos/queue.svg +11 -0
- package/logos/rag.svg +18 -0
- package/logos/resend.svg +5 -0
- package/logos/scheduler.svg +7 -0
- package/logos/skills.svg +10 -0
- package/logos/slack.svg +14 -0
- package/logos/supabase.svg +4 -0
- package/logos/tasks.svg +10 -0
- package/logos/teams.svg +6 -0
- package/logos/telegram.svg +10 -0
- package/logos/textract.svg +5 -0
- package/logos/vector-store.svg +8 -0
- package/logos/web-fetch.svg +8 -0
- package/logos/woocommerce.svg +4 -0
- package/package.json +373 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { t as ToolError } from "./errors-DoSpNHvs.js";
|
|
2
|
+
import { n as defineModule, r as defineTool } from "./define-CvpJ_pNP.js";
|
|
3
|
+
import { n as requireAuth } from "./provider-CgDAlg6K.js";
|
|
4
|
+
import { S as requireCollection, _ as parseMetadata, a as deleteVectorsOutputSchema, c as upsertVectorsInputSchema, g as mergeVectorFilter, i as deleteVectorsInputSchema, l as upsertVectorsOutputSchema, o as queryVectorsInputSchema, s as queryVectorsOutputSchema, u as vectorDefaultFilterSchema, w as stampDefaultFilterMetadata } from "./schemas-ChOAhdo9.js";
|
|
5
|
+
import { isNumber, isPlainObject, isString } from "es-toolkit";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { PgVector } from "@mastra/pg";
|
|
8
|
+
//#region src/vendors/mastra-vector/contracts.ts
|
|
9
|
+
/**
|
|
10
|
+
* Mastra PgVector auth (`@mastra/pg`).
|
|
11
|
+
* Host owns Postgres connection + schema; package does not invent org policy.
|
|
12
|
+
*/
|
|
13
|
+
const mastraVectorAuthSchema = z.object({
|
|
14
|
+
connection_string: z.string().min(1).describe("Postgres connection string for Mastra PgVector (e.g. Supabase DB URL)"),
|
|
15
|
+
id: z.string().min(1).describe("Mastra vector store id (stable string for this store instance)"),
|
|
16
|
+
schema_name: z.string().min(1).optional().describe("Postgres schema for vector tables (e.g. agent); omit for package default"),
|
|
17
|
+
default_index: z.string().min(1).optional().describe("Default index name when tool input omits collection"),
|
|
18
|
+
dimension: z.number().int().positive().optional().describe("Embedding dimension; required when auto_create_index is true"),
|
|
19
|
+
auto_create_index: z.boolean().optional().describe("When true, create the index on upsert if missing (needs dimension)"),
|
|
20
|
+
disable_init: z.boolean().optional().describe("Pass disableInit to PgVector (host manages migration/init)"),
|
|
21
|
+
default_filter: vectorDefaultFilterSchema.optional().describe("Host-bound metadata filter always applied on query (Mongo-style / Mastra PG filter); flat keys stamped on upsert")
|
|
22
|
+
});
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/vendors/mastra-vector/client.ts
|
|
25
|
+
/**
|
|
26
|
+
* Mastra PgVector vendor client (`@mastra/pg`).
|
|
27
|
+
* Host: `new MastraVectorClient(auth)`. Agent tools: `fromContext(ctx)`.
|
|
28
|
+
* Runtime: node (Postgres). Optional peer: `@mastra/pg`.
|
|
29
|
+
*/
|
|
30
|
+
/** Narrow a built arg bag to PgVector query params (Mongo-style filter is structural). */
|
|
31
|
+
function isPgQueryArgs(value) {
|
|
32
|
+
return isPlainObject(value) && isString(value["indexName"]) && value["indexName"].length > 0 && Array.isArray(value["queryVector"]);
|
|
33
|
+
}
|
|
34
|
+
var MastraVectorClient = class MastraVectorClient {
|
|
35
|
+
#store;
|
|
36
|
+
#defaultIndex;
|
|
37
|
+
#defaultFilter;
|
|
38
|
+
#dimension;
|
|
39
|
+
#autoCreateIndex;
|
|
40
|
+
#ownsStore;
|
|
41
|
+
constructor(auth, options = {}) {
|
|
42
|
+
const parsed = mastraVectorAuthSchema.safeParse(auth);
|
|
43
|
+
if (!parsed.success) throw new ToolError("Invalid Mastra vector auth credentials", {
|
|
44
|
+
code: "bad_auth",
|
|
45
|
+
details: { issues: parsed.error.issues.map((issue) => issue.message) }
|
|
46
|
+
});
|
|
47
|
+
const data = parsed.data;
|
|
48
|
+
this.#defaultIndex = data.default_index;
|
|
49
|
+
this.#defaultFilter = data.default_filter;
|
|
50
|
+
this.#dimension = data.dimension;
|
|
51
|
+
this.#autoCreateIndex = data.auto_create_index === true;
|
|
52
|
+
if (options.store) {
|
|
53
|
+
this.#store = options.store;
|
|
54
|
+
this.#ownsStore = false;
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const config = {
|
|
58
|
+
connectionString: data.connection_string,
|
|
59
|
+
id: data.id
|
|
60
|
+
};
|
|
61
|
+
if (data.schema_name) config.schemaName = data.schema_name;
|
|
62
|
+
if (data.disable_init === true) config.disableInit = true;
|
|
63
|
+
const pg = new PgVector(config);
|
|
64
|
+
this.#store = {
|
|
65
|
+
upsert: (input) => pg.upsert({
|
|
66
|
+
indexName: input.indexName,
|
|
67
|
+
ids: input.ids,
|
|
68
|
+
vectors: input.vectors,
|
|
69
|
+
metadata: input.metadata
|
|
70
|
+
}),
|
|
71
|
+
query: (input) => {
|
|
72
|
+
const args = {
|
|
73
|
+
indexName: input.indexName,
|
|
74
|
+
queryVector: input.queryVector,
|
|
75
|
+
...input.topK !== void 0 && { topK: input.topK },
|
|
76
|
+
...input.includeVector !== void 0 && { includeVector: input.includeVector },
|
|
77
|
+
...input.filter !== void 0 && { filter: input.filter }
|
|
78
|
+
};
|
|
79
|
+
if (!isPgQueryArgs(args)) throw new ToolError("Invalid Mastra vector query args", { code: "internal" });
|
|
80
|
+
return pg.query(args);
|
|
81
|
+
},
|
|
82
|
+
deleteVectors: (input) => pg.deleteVectors({
|
|
83
|
+
indexName: input.indexName,
|
|
84
|
+
ids: input.ids
|
|
85
|
+
}),
|
|
86
|
+
createIndex: (input) => pg.createIndex({
|
|
87
|
+
indexName: input.indexName,
|
|
88
|
+
dimension: input.dimension
|
|
89
|
+
}),
|
|
90
|
+
disconnect: () => pg.disconnect()
|
|
91
|
+
};
|
|
92
|
+
this.#ownsStore = true;
|
|
93
|
+
}
|
|
94
|
+
static fromContext(ctx) {
|
|
95
|
+
const auth = requireAuth(ctx, mastraVectorAuthSchema);
|
|
96
|
+
return new MastraVectorClient(auth);
|
|
97
|
+
}
|
|
98
|
+
async upsert(input) {
|
|
99
|
+
const indexName = requireCollection(input.collection, this.#defaultIndex, "Mastra vector upsert");
|
|
100
|
+
await this.#ensureIndex(indexName, input.vectors[0]?.values.length);
|
|
101
|
+
await this.#store.upsert({
|
|
102
|
+
indexName,
|
|
103
|
+
ids: input.vectors.map((point) => point.id),
|
|
104
|
+
vectors: input.vectors.map((point) => point.values),
|
|
105
|
+
metadata: input.vectors.map((point) => stampDefaultFilterMetadata(point.metadata, this.#defaultFilter) ?? {})
|
|
106
|
+
});
|
|
107
|
+
return {
|
|
108
|
+
upserted: input.vectors.length,
|
|
109
|
+
collection: indexName
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
async query(input) {
|
|
113
|
+
const indexName = requireCollection(input.collection, this.#defaultIndex, "Mastra vector query");
|
|
114
|
+
const topK = input.top_k ?? 8;
|
|
115
|
+
const includeVector = input.include_values === true;
|
|
116
|
+
const filter = mergeVectorFilter(this.#defaultFilter, input.filter);
|
|
117
|
+
const rows = await this.#store.query({
|
|
118
|
+
indexName,
|
|
119
|
+
queryVector: input.vector,
|
|
120
|
+
topK,
|
|
121
|
+
includeVector,
|
|
122
|
+
...filter && { filter }
|
|
123
|
+
});
|
|
124
|
+
const includeMetadata = input.include_metadata !== false;
|
|
125
|
+
const matches = [];
|
|
126
|
+
for (const row of rows) {
|
|
127
|
+
if (!isString(row.id) || row.id.length === 0) continue;
|
|
128
|
+
const score = isNumber(row.score) ? row.score : 0;
|
|
129
|
+
const match = {
|
|
130
|
+
id: row.id,
|
|
131
|
+
score
|
|
132
|
+
};
|
|
133
|
+
if (includeMetadata && row.metadata !== void 0) {
|
|
134
|
+
const meta = parseMetadata(row.metadata);
|
|
135
|
+
if (meta) match.metadata = meta;
|
|
136
|
+
}
|
|
137
|
+
if (includeVector && Array.isArray(row.vector)) {
|
|
138
|
+
const values = row.vector.filter((n) => isNumber(n) && Number.isFinite(n));
|
|
139
|
+
if (values.length === row.vector.length) match.values = values;
|
|
140
|
+
}
|
|
141
|
+
matches.push(match);
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
matches,
|
|
145
|
+
collection: indexName
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
async delete(input) {
|
|
149
|
+
const indexName = requireCollection(input.collection, this.#defaultIndex, "Mastra vector delete");
|
|
150
|
+
await this.#store.deleteVectors({
|
|
151
|
+
indexName,
|
|
152
|
+
ids: input.ids
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
deleted: input.ids.length,
|
|
156
|
+
collection: indexName
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
async disconnect() {
|
|
160
|
+
if (this.#ownsStore && this.#store.disconnect) await this.#store.disconnect();
|
|
161
|
+
}
|
|
162
|
+
async #ensureIndex(indexName, inferredDimension) {
|
|
163
|
+
if (!this.#autoCreateIndex) return;
|
|
164
|
+
const dimension = this.#dimension ?? inferredDimension;
|
|
165
|
+
if (dimension === void 0) throw new ToolError("Mastra auto_create_index requires dimension on auth or non-empty vectors", { code: "bad_input" });
|
|
166
|
+
try {
|
|
167
|
+
await this.#store.createIndex({
|
|
168
|
+
indexName,
|
|
169
|
+
dimension
|
|
170
|
+
});
|
|
171
|
+
} catch (error) {
|
|
172
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
173
|
+
if (/already exists|duplicate|exist/i.test(message)) return;
|
|
174
|
+
throw new ToolError(`Mastra createIndex failed: ${message}`, {
|
|
175
|
+
code: "upstream",
|
|
176
|
+
cause: error
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
//#endregion
|
|
182
|
+
//#region src/vendors/mastra-vector/module.ts
|
|
183
|
+
const mastraVectorUpsertTool = defineTool({
|
|
184
|
+
id: "mastra-vector-upsert",
|
|
185
|
+
name: "mastraVectorUpsert",
|
|
186
|
+
description: "Upsert vectors into a Mastra PgVector index. collection maps to indexName.",
|
|
187
|
+
inputSchema: upsertVectorsInputSchema,
|
|
188
|
+
outputSchema: upsertVectorsOutputSchema,
|
|
189
|
+
sideEffect: "write",
|
|
190
|
+
runtime: "node",
|
|
191
|
+
execute: async (input, ctx) => MastraVectorClient.fromContext(ctx).upsert(input)
|
|
192
|
+
});
|
|
193
|
+
const mastraVectorQueryTool = defineTool({
|
|
194
|
+
id: "mastra-vector-query",
|
|
195
|
+
name: "mastraVectorQuery",
|
|
196
|
+
description: "Nearest-neighbor query against a Mastra PgVector index.",
|
|
197
|
+
inputSchema: queryVectorsInputSchema,
|
|
198
|
+
outputSchema: queryVectorsOutputSchema,
|
|
199
|
+
sideEffect: "read",
|
|
200
|
+
runtime: "node",
|
|
201
|
+
execute: async (input, ctx) => MastraVectorClient.fromContext(ctx).query(input)
|
|
202
|
+
});
|
|
203
|
+
const mastraVectorDeleteTool = defineTool({
|
|
204
|
+
id: "mastra-vector-delete",
|
|
205
|
+
name: "mastraVectorDelete",
|
|
206
|
+
description: "Delete vectors by id from a Mastra PgVector index.",
|
|
207
|
+
inputSchema: deleteVectorsInputSchema,
|
|
208
|
+
outputSchema: deleteVectorsOutputSchema,
|
|
209
|
+
sideEffect: "delete",
|
|
210
|
+
runtime: "node",
|
|
211
|
+
execute: async (input, ctx) => MastraVectorClient.fromContext(ctx).delete(input)
|
|
212
|
+
});
|
|
213
|
+
const mastraVectorModule = defineModule({
|
|
214
|
+
id: "mastra-vector",
|
|
215
|
+
title: "Mastra Vector",
|
|
216
|
+
description: "Mastra PgVector over Postgres: upsert, query, and delete vectors. Index names map from collection. Node runtime.",
|
|
217
|
+
runtime: "node",
|
|
218
|
+
auth: {
|
|
219
|
+
type: "custom",
|
|
220
|
+
schema: mastraVectorAuthSchema
|
|
221
|
+
},
|
|
222
|
+
categories: ["ai", "vector"],
|
|
223
|
+
classification: "pii",
|
|
224
|
+
tags: ["pgvector", "mastra"],
|
|
225
|
+
tools: [
|
|
226
|
+
mastraVectorUpsertTool,
|
|
227
|
+
mastraVectorQueryTool,
|
|
228
|
+
mastraVectorDeleteTool
|
|
229
|
+
]
|
|
230
|
+
});
|
|
231
|
+
//#endregion
|
|
232
|
+
export { MastraVectorClient as a, mastraVectorUpsertTool as i, mastraVectorModule as n, mastraVectorAuthSchema as o, mastraVectorQueryTool as r, mastraVectorDeleteTool as t };
|
|
233
|
+
|
|
234
|
+
//# sourceMappingURL=mastra-vector-Dhc6XZ8l.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mastra-vector-Dhc6XZ8l.js","names":["#store","#defaultIndex","#defaultFilter","#dimension","#autoCreateIndex","#ownsStore","#ensureIndex"],"sources":["../src/vendors/mastra-vector/contracts.ts","../src/vendors/mastra-vector/client.ts","../src/vendors/mastra-vector/module.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { vectorDefaultFilterSchema } from '../_vector'\n\nexport {\n\tMAX_TOP_K,\n\tMAX_VECTOR_BATCH,\n\tMAX_VECTOR_DIMENSIONS,\n\tdeleteVectorsInputSchema,\n\tdeleteVectorsOutputSchema,\n\tqueryVectorsInputSchema,\n\tqueryVectorsOutputSchema,\n\tupsertVectorsInputSchema,\n\tupsertVectorsOutputSchema,\n\tvectorMatchSchema,\n\tvectorMetadataSchema,\n\tvectorPointSchema\n} from '../_vector'\nexport type {\n\tDeleteVectorsInput,\n\tDeleteVectorsOutput,\n\tQueryVectorsInput,\n\tQueryVectorsOutput,\n\tUpsertVectorsInput,\n\tUpsertVectorsOutput,\n\tVectorMatch,\n\tVectorMetadata,\n\tVectorPoint\n} from '../_vector'\n\n/**\n * Mastra PgVector auth (`@mastra/pg`).\n * Host owns Postgres connection + schema; package does not invent org policy.\n */\nexport const mastraVectorAuthSchema = z.object({\n\tconnection_string: z\n\t\t.string()\n\t\t.min(1)\n\t\t.describe('Postgres connection string for Mastra PgVector (e.g. Supabase DB URL)'),\n\tid: z.string().min(1).describe('Mastra vector store id (stable string for this store instance)'),\n\tschema_name: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe('Postgres schema for vector tables (e.g. agent); omit for package default'),\n\tdefault_index: z.string().min(1).optional().describe('Default index name when tool input omits collection'),\n\tdimension: z\n\t\t.number()\n\t\t.int()\n\t\t.positive()\n\t\t.optional()\n\t\t.describe('Embedding dimension; required when auto_create_index is true'),\n\tauto_create_index: z\n\t\t.boolean()\n\t\t.optional()\n\t\t.describe('When true, create the index on upsert if missing (needs dimension)'),\n\tdisable_init: z.boolean().optional().describe('Pass disableInit to PgVector (host manages migration/init)'),\n\tdefault_filter: vectorDefaultFilterSchema\n\t\t.optional()\n\t\t.describe(\n\t\t\t'Host-bound metadata filter always applied on query (Mongo-style / Mastra PG filter); flat keys stamped on upsert'\n\t\t)\n})\n\nexport type MastraVectorAuth = z.infer<typeof mastraVectorAuthSchema>\n","/**\n * Mastra PgVector vendor client (`@mastra/pg`).\n * Host: `new MastraVectorClient(auth)`. Agent tools: `fromContext(ctx)`.\n * Runtime: node (Postgres). Optional peer: `@mastra/pg`.\n */\n\nimport { PgVector } from '@mastra/pg'\nimport { isNumber, isPlainObject, isString } from 'es-toolkit'\n\nimport { ToolError } from '../../core/errors'\nimport { requireAuth } from '../../core/provider'\nimport type { ToolContext } from '../../core/types'\nimport { mergeVectorFilter, parseMetadata, requireCollection, stampDefaultFilterMetadata } from '../_vector/domain'\nimport type { VectorDefaultFilter } from '../_vector/domain'\nimport type {\n\tDeleteVectorsInput,\n\tDeleteVectorsOutput,\n\tMastraVectorAuth,\n\tQueryVectorsInput,\n\tQueryVectorsOutput,\n\tUpsertVectorsInput,\n\tUpsertVectorsOutput,\n\tVectorMatch\n} from './contracts'\nimport { mastraVectorAuthSchema } from './contracts'\n\n/** Injected / real store surface (filter is opaque Record for seam compatibility). */\ntype MastraStore = {\n\tupsert: (input: {\n\t\tindexName: string\n\t\tids: string[]\n\t\tvectors: number[][]\n\t\tmetadata: Array<Record<string, unknown>>\n\t}) => Promise<unknown>\n\tquery: (input: {\n\t\tindexName: string\n\t\tqueryVector: number[]\n\t\ttopK?: number\n\t\tincludeVector?: boolean\n\t\tfilter?: Record<string, unknown>\n\t}) => Promise<Array<{ id?: string; score?: number; metadata?: unknown; vector?: number[] }>>\n\tdeleteVectors: (input: { indexName: string; ids: string[] }) => Promise<unknown>\n\tcreateIndex: (input: { indexName: string; dimension: number }) => Promise<unknown>\n\tdisconnect?: () => Promise<void>\n}\n\ntype PgQueryArgs = Parameters<PgVector['query']>[0]\n\n/** Narrow a built arg bag to PgVector query params (Mongo-style filter is structural). */\nfunction isPgQueryArgs(value: unknown): value is PgQueryArgs {\n\treturn (\n\t\tisPlainObject(value) &&\n\t\tisString(value['indexName']) &&\n\t\tvalue['indexName'].length > 0 &&\n\t\tArray.isArray(value['queryVector'])\n\t)\n}\n\nexport type MastraVectorClientOptions = {\n\t/**\n\t * Test injection — production uses PgVector.\n\t * Must implement the same method names as PgVector for upsert/query/deleteVectors/createIndex.\n\t */\n\tstore?: MastraStore\n}\n\nexport class MastraVectorClient {\n\treadonly #store: MastraStore\n\treadonly #defaultIndex: string | undefined\n\treadonly #defaultFilter: VectorDefaultFilter | undefined\n\treadonly #dimension: number | undefined\n\treadonly #autoCreateIndex: boolean\n\treadonly #ownsStore: boolean\n\n\tconstructor(auth: MastraVectorAuth, options: MastraVectorClientOptions = {}) {\n\t\tconst parsed = mastraVectorAuthSchema.safeParse(auth)\n\t\tif (!parsed.success) {\n\t\t\tthrow new ToolError('Invalid Mastra vector auth credentials', {\n\t\t\t\tcode: 'bad_auth',\n\t\t\t\tdetails: { issues: parsed.error.issues.map((issue) => issue.message) }\n\t\t\t})\n\t\t}\n\t\tconst data = parsed.data\n\t\tthis.#defaultIndex = data.default_index\n\t\tthis.#defaultFilter = data.default_filter\n\t\tthis.#dimension = data.dimension\n\t\tthis.#autoCreateIndex = data.auto_create_index === true\n\n\t\tif (options.store) {\n\t\t\tthis.#store = options.store\n\t\t\tthis.#ownsStore = false\n\t\t\treturn\n\t\t}\n\n\t\tconst config: {\n\t\t\tconnectionString: string\n\t\t\tid: string\n\t\t\tschemaName?: string\n\t\t\tdisableInit?: boolean\n\t\t} = {\n\t\t\tconnectionString: data.connection_string,\n\t\t\tid: data.id\n\t\t}\n\t\tif (data.schema_name) config.schemaName = data.schema_name\n\t\tif (data.disable_init === true) config.disableInit = true\n\n\t\tconst pg = new PgVector(config)\n\t\t// Adapt PgVector to opaque Record filters (Mongo-style / flat equality is native).\n\t\tthis.#store = {\n\t\t\tupsert: (input) =>\n\t\t\t\tpg.upsert({\n\t\t\t\t\tindexName: input.indexName,\n\t\t\t\t\tids: input.ids,\n\t\t\t\t\tvectors: input.vectors,\n\t\t\t\t\tmetadata: input.metadata\n\t\t\t\t}),\n\t\t\tquery: (input) => {\n\t\t\t\tconst args: Record<string, unknown> = {\n\t\t\t\t\tindexName: input.indexName,\n\t\t\t\t\tqueryVector: input.queryVector,\n\t\t\t\t\t...(input.topK !== undefined && { topK: input.topK }),\n\t\t\t\t\t...(input.includeVector !== undefined && { includeVector: input.includeVector }),\n\t\t\t\t\t...(input.filter !== undefined && { filter: input.filter })\n\t\t\t\t}\n\t\t\t\tif (!isPgQueryArgs(args)) {\n\t\t\t\t\tthrow new ToolError('Invalid Mastra vector query args', { code: 'internal' })\n\t\t\t\t}\n\t\t\t\treturn pg.query(args)\n\t\t\t},\n\t\t\tdeleteVectors: (input) => pg.deleteVectors({ indexName: input.indexName, ids: input.ids }),\n\t\t\tcreateIndex: (input) => pg.createIndex({ indexName: input.indexName, dimension: input.dimension }),\n\t\t\tdisconnect: () => pg.disconnect()\n\t\t}\n\t\tthis.#ownsStore = true\n\t}\n\n\tstatic fromContext(ctx: ToolContext): MastraVectorClient {\n\t\tconst auth = requireAuth(ctx, mastraVectorAuthSchema)\n\t\treturn new MastraVectorClient(auth)\n\t}\n\n\tasync upsert(input: UpsertVectorsInput): Promise<UpsertVectorsOutput> {\n\t\tconst indexName = requireCollection(input.collection, this.#defaultIndex, 'Mastra vector upsert')\n\t\tawait this.#ensureIndex(indexName, input.vectors[0]?.values.length)\n\n\t\tawait this.#store.upsert({\n\t\t\tindexName,\n\t\t\tids: input.vectors.map((point) => point.id),\n\t\t\tvectors: input.vectors.map((point) => point.values),\n\t\t\tmetadata: input.vectors.map((point) => stampDefaultFilterMetadata(point.metadata, this.#defaultFilter) ?? {})\n\t\t})\n\t\treturn { upserted: input.vectors.length, collection: indexName }\n\t}\n\n\tasync query(input: QueryVectorsInput): Promise<QueryVectorsOutput> {\n\t\tconst indexName = requireCollection(input.collection, this.#defaultIndex, 'Mastra vector query')\n\t\tconst topK = input.top_k ?? 8\n\t\tconst includeVector = input.include_values === true\n\t\tconst filter = mergeVectorFilter(this.#defaultFilter, input.filter)\n\n\t\tconst rows = await this.#store.query({\n\t\t\tindexName,\n\t\t\tqueryVector: input.vector,\n\t\t\ttopK,\n\t\t\tincludeVector,\n\t\t\t...(filter && { filter })\n\t\t})\n\n\t\tconst includeMetadata = input.include_metadata !== false\n\t\tconst matches: VectorMatch[] = []\n\t\tfor (const row of rows) {\n\t\t\tif (!isString(row.id) || row.id.length === 0) continue\n\t\t\tconst score = isNumber(row.score) ? row.score : 0\n\t\t\tconst match: VectorMatch = { id: row.id, score }\n\t\t\tif (includeMetadata && row.metadata !== undefined) {\n\t\t\t\tconst meta = parseMetadata(row.metadata)\n\t\t\t\tif (meta) match.metadata = meta\n\t\t\t}\n\t\t\tif (includeVector && Array.isArray(row.vector)) {\n\t\t\t\tconst values = row.vector.filter((n): n is number => isNumber(n) && Number.isFinite(n))\n\t\t\t\tif (values.length === row.vector.length) match.values = values\n\t\t\t}\n\t\t\tmatches.push(match)\n\t\t}\n\t\treturn { matches, collection: indexName }\n\t}\n\n\tasync delete(input: DeleteVectorsInput): Promise<DeleteVectorsOutput> {\n\t\tconst indexName = requireCollection(input.collection, this.#defaultIndex, 'Mastra vector delete')\n\t\tawait this.#store.deleteVectors({ indexName, ids: input.ids })\n\t\treturn { deleted: input.ids.length, collection: indexName }\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tif (this.#ownsStore && this.#store.disconnect) {\n\t\t\tawait this.#store.disconnect()\n\t\t}\n\t}\n\n\tasync #ensureIndex(indexName: string, inferredDimension: number | undefined): Promise<void> {\n\t\tif (!this.#autoCreateIndex) return\n\t\tconst dimension = this.#dimension ?? inferredDimension\n\t\tif (dimension === undefined) {\n\t\t\tthrow new ToolError('Mastra auto_create_index requires dimension on auth or non-empty vectors', {\n\t\t\t\tcode: 'bad_input'\n\t\t\t})\n\t\t}\n\t\ttry {\n\t\t\tawait this.#store.createIndex({ indexName, dimension })\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\t\tif (/already exists|duplicate|exist/i.test(message)) return\n\t\t\tthrow new ToolError(`Mastra createIndex failed: ${message}`, {\n\t\t\t\tcode: 'upstream',\n\t\t\t\tcause: error\n\t\t\t})\n\t\t}\n\t}\n}\n","import { defineModule, defineTool } from '../../core/define'\nimport { MastraVectorClient } from './client'\nimport {\n\tdeleteVectorsInputSchema,\n\tdeleteVectorsOutputSchema,\n\tmastraVectorAuthSchema,\n\tqueryVectorsInputSchema,\n\tqueryVectorsOutputSchema,\n\tupsertVectorsInputSchema,\n\tupsertVectorsOutputSchema\n} from './contracts'\n\nexport const mastraVectorUpsertTool = defineTool({\n\tid: 'mastra-vector-upsert',\n\tname: 'mastraVectorUpsert',\n\tdescription: 'Upsert vectors into a Mastra PgVector index. collection maps to indexName.',\n\tinputSchema: upsertVectorsInputSchema,\n\toutputSchema: upsertVectorsOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'node',\n\texecute: async (input, ctx) => MastraVectorClient.fromContext(ctx).upsert(input)\n})\n\nexport const mastraVectorQueryTool = defineTool({\n\tid: 'mastra-vector-query',\n\tname: 'mastraVectorQuery',\n\tdescription: 'Nearest-neighbor query against a Mastra PgVector index.',\n\tinputSchema: queryVectorsInputSchema,\n\toutputSchema: queryVectorsOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'node',\n\texecute: async (input, ctx) => MastraVectorClient.fromContext(ctx).query(input)\n})\n\nexport const mastraVectorDeleteTool = defineTool({\n\tid: 'mastra-vector-delete',\n\tname: 'mastraVectorDelete',\n\tdescription: 'Delete vectors by id from a Mastra PgVector index.',\n\tinputSchema: deleteVectorsInputSchema,\n\toutputSchema: deleteVectorsOutputSchema,\n\tsideEffect: 'delete',\n\truntime: 'node',\n\texecute: async (input, ctx) => MastraVectorClient.fromContext(ctx).delete(input)\n})\n\nexport const mastraVectorModule = defineModule({\n\tid: 'mastra-vector',\n\ttitle: 'Mastra Vector',\n\tdescription:\n\t\t'Mastra PgVector over Postgres: upsert, query, and delete vectors. Index names map from collection. Node runtime.',\n\truntime: 'node',\n\tauth: { type: 'custom', schema: mastraVectorAuthSchema },\n\tcategories: ['ai', 'vector'],\n\tclassification: 'pii',\n\ttags: ['pgvector', 'mastra'],\n\ttools: [mastraVectorUpsertTool, mastraVectorQueryTool, mastraVectorDeleteTool]\n})\n"],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { g as ToolSource, o as ToolContext, s as ToolDefinition } from "../types-Ccb0DXY9.js";
|
|
2
|
+
import { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
//#region src/adapters/mcp/create-mcp-tool.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* MCP tools/list item shape (JSON Schema input).
|
|
6
|
+
* @see https://modelcontextprotocol.io/specification/2025-03-26/server/tools
|
|
7
|
+
*/
|
|
8
|
+
type McpToolListItem = {
|
|
9
|
+
annotations?: McpToolAnnotations;
|
|
10
|
+
description: string;
|
|
11
|
+
inputSchema: Record<string, unknown>;
|
|
12
|
+
name: string;
|
|
13
|
+
};
|
|
14
|
+
type McpToolAnnotations = {
|
|
15
|
+
destructiveHint?: boolean;
|
|
16
|
+
idempotentHint?: boolean;
|
|
17
|
+
openWorldHint?: boolean;
|
|
18
|
+
readOnlyHint?: boolean;
|
|
19
|
+
title?: string;
|
|
20
|
+
};
|
|
21
|
+
/** Subset of MCP CallToolResult used by this projector. */
|
|
22
|
+
type McpCallToolResult = {
|
|
23
|
+
content: Array<{
|
|
24
|
+
text: string;
|
|
25
|
+
type: 'text';
|
|
26
|
+
}>;
|
|
27
|
+
isError?: boolean;
|
|
28
|
+
structuredContent?: Record<string, unknown>;
|
|
29
|
+
};
|
|
30
|
+
type McpRequestExtra = Parameters<ToolCallback>[0];
|
|
31
|
+
/**
|
|
32
|
+
* Minimal surface of `@modelcontextprotocol/sdk` `McpServer.registerTool`
|
|
33
|
+
* used by the optional MCP adapter peer.
|
|
34
|
+
*/
|
|
35
|
+
type McpServerLike = {
|
|
36
|
+
registerTool: (name: string, config: {
|
|
37
|
+
annotations?: McpToolAnnotations;
|
|
38
|
+
description?: string;
|
|
39
|
+
inputSchema?: unknown;
|
|
40
|
+
outputSchema?: unknown;
|
|
41
|
+
title?: string;
|
|
42
|
+
}, cb: (args: unknown, extra: McpRequestExtra) => Promise<unknown>) => unknown;
|
|
43
|
+
};
|
|
44
|
+
type McpToolset = {
|
|
45
|
+
/** tools/list payload items */
|
|
46
|
+
list: McpToolListItem[];
|
|
47
|
+
/** tools/call by name */
|
|
48
|
+
call: (name: string, args: unknown, ctx?: ToolContext) => Promise<McpCallToolResult>;
|
|
49
|
+
/** raw executors (pre-MCP result wrapping) */
|
|
50
|
+
executors: Record<string, (args: unknown, ctx?: ToolContext) => Promise<unknown>>;
|
|
51
|
+
};
|
|
52
|
+
declare function createMcpToolListItem(tool: ToolDefinition): McpToolListItem;
|
|
53
|
+
/**
|
|
54
|
+
* Project kernel tools into MCP list + call helpers (no SDK required).
|
|
55
|
+
* Hosts implement transport / McpServer themselves.
|
|
56
|
+
*/
|
|
57
|
+
declare function createMcpTools(source: ToolSource): McpToolset;
|
|
58
|
+
type RegisterMcpToolsOptions = {
|
|
59
|
+
/**
|
|
60
|
+
* Static base context **or** async factory (back-compat with pre-H-02 `context: () => …`).
|
|
61
|
+
* Prefer `withAuth` / `bindModule` before projection when credentials are fixed or dynamic.
|
|
62
|
+
*/
|
|
63
|
+
context?: ToolContext | (() => ToolContext | Promise<ToolContext>);
|
|
64
|
+
/**
|
|
65
|
+
* Map MCP request extras into ToolContext.
|
|
66
|
+
* Merged over framework defaults (`signal`) so cancel works unless explicitly overridden.
|
|
67
|
+
* Explicit `undefined` fields do not erase the framework signal.
|
|
68
|
+
*/
|
|
69
|
+
createContext?: (extra: McpRequestExtra) => ToolContext | Promise<ToolContext>;
|
|
70
|
+
/** @deprecated Alias of factory form of `context`. */
|
|
71
|
+
contextFactory?: ToolContext | (() => ToolContext | Promise<ToolContext>);
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Register kernel tools on an MCP `McpServer` (or compatible) via `registerTool`.
|
|
75
|
+
* Requires the host to construct the server from `@modelcontextprotocol/sdk`.
|
|
76
|
+
*/
|
|
77
|
+
declare function registerMcpTools(server: McpServerLike, source: ToolSource, options?: RegisterMcpToolsOptions): void;
|
|
78
|
+
//#endregion
|
|
79
|
+
export { type McpCallToolResult, type McpRequestExtra, type McpServerLike, type McpToolAnnotations, type McpToolListItem, type McpToolset, type RegisterMcpToolsOptions, createMcpToolListItem, createMcpTools, registerMcpTools };
|
|
80
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/adapters/mcp/create-mcp-tool.ts"],"mappings":";;;;;;;KAeY;EACX,cAAc;EACd;EACA,aAAa;EACb;;KAGW;EACX;EACA;EACA;EACA;EACA;;;KAIW;EACX,SAAS;IAAQ;IAAc;;EAC/B;EACA,oBAAoB;;KAGT,kBAAkB,WAAW;;;;;KAM7B;EACX,eACC,cACA;IACC,cAAc;IACd;IACA;IACA;IACA;KAED,KAAK,eAAe,OAAO,oBAAoB;;KAIrC;;EAEX,MAAM;;EAEN,OAAO,cAAc,eAAe,MAAM,gBAAgB,QAAQ;;EAElE,WAAW,gBAAgB,eAAe,MAAM,gBAAgB;;iBAejD,sBAAsB,MAAM,iBAAiB;;;;;iBAwB7C,eAAe,QAAQ,aAAa;KAuCxC;;;;;EAKX,UAAU,qBAAqB,cAAc,QAAQ;;;;;;EAMrD,iBAAiB,OAAO,oBAAoB,cAAc,QAAQ;;EAElE,iBAAiB,qBAAqB,cAAc,QAAQ;;;;;;iBAe7C,iBACf,QAAQ,eACR,QAAQ,YACR,UAAS"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { m as mergeToolContext, n as runTool, s as resolveTools } from "../with-auth-CpKqTrGK.js";
|
|
2
|
+
import { t as assertUniqueBy } from "../unique-EwBH1JPB.js";
|
|
3
|
+
import { t as mergeAdapterToolContext } from "../framework-context-DVIIY8ZO.js";
|
|
4
|
+
import { isFunction, isPlainObject, isString, keyBy, mapValues } from "es-toolkit";
|
|
5
|
+
import { toJSONSchema } from "zod";
|
|
6
|
+
//#region src/adapters/mcp/create-mcp-tool.ts
|
|
7
|
+
function annotationsForTool(tool) {
|
|
8
|
+
const sideEffect = tool.meta.sideEffect;
|
|
9
|
+
const readOnly = sideEffect === "read" || sideEffect === "none";
|
|
10
|
+
return {
|
|
11
|
+
readOnlyHint: readOnly,
|
|
12
|
+
destructiveHint: sideEffect === "delete",
|
|
13
|
+
idempotentHint: tool.meta.idempotent ?? readOnly,
|
|
14
|
+
openWorldHint: tool.meta.network ?? true
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function createMcpToolListItem(tool) {
|
|
18
|
+
return {
|
|
19
|
+
name: tool.id,
|
|
20
|
+
description: tool.description,
|
|
21
|
+
inputSchema: toJSONSchema(tool.inputSchema),
|
|
22
|
+
annotations: annotationsForTool(tool)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function toCallResult(value) {
|
|
26
|
+
const result = { content: [{
|
|
27
|
+
type: "text",
|
|
28
|
+
text: isString(value) ? value : JSON.stringify(value)
|
|
29
|
+
}] };
|
|
30
|
+
if (isPlainObject(value)) result.structuredContent = value;
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Project kernel tools into MCP list + call helpers (no SDK required).
|
|
35
|
+
* Hosts implement transport / McpServer themselves.
|
|
36
|
+
*/
|
|
37
|
+
function createMcpTools(source) {
|
|
38
|
+
const tools = resolveTools(source);
|
|
39
|
+
assertUniqueBy(tools, (t) => t.id, (id) => `Duplicate tool id when building MCP tools: ${id}`);
|
|
40
|
+
const executors = mapValues(keyBy(tools, (t) => t.id), (tool) => (args, ctx = {}) => runTool(tool, args, ctx));
|
|
41
|
+
return {
|
|
42
|
+
list: tools.map(createMcpToolListItem),
|
|
43
|
+
executors,
|
|
44
|
+
call: async (name, args, ctx = {}) => {
|
|
45
|
+
const run = executors[name];
|
|
46
|
+
if (!run) return {
|
|
47
|
+
isError: true,
|
|
48
|
+
content: [{
|
|
49
|
+
type: "text",
|
|
50
|
+
text: `Unknown tool: ${name}`
|
|
51
|
+
}]
|
|
52
|
+
};
|
|
53
|
+
try {
|
|
54
|
+
return toCallResult(await run(args, ctx));
|
|
55
|
+
} catch (error) {
|
|
56
|
+
return {
|
|
57
|
+
isError: true,
|
|
58
|
+
content: [{
|
|
59
|
+
type: "text",
|
|
60
|
+
text: error instanceof Error ? error.message : "Tool execution failed"
|
|
61
|
+
}]
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async function resolveMcpStaticContext(options) {
|
|
68
|
+
const fromDeprecated = options.contextFactory;
|
|
69
|
+
const deprecatedBase = isFunction(fromDeprecated) ? await fromDeprecated() : fromDeprecated ?? {};
|
|
70
|
+
const c = options.context;
|
|
71
|
+
return mergeToolContext(deprecatedBase, isFunction(c) ? await c() : c ?? {});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Register kernel tools on an MCP `McpServer` (or compatible) via `registerTool`.
|
|
75
|
+
* Requires the host to construct the server from `@modelcontextprotocol/sdk`.
|
|
76
|
+
*/
|
|
77
|
+
function registerMcpTools(server, source, options = {}) {
|
|
78
|
+
const tools = resolveTools(source);
|
|
79
|
+
assertUniqueBy(tools, (t) => t.id, (id) => `Duplicate tool id when registering MCP tools: ${id}`);
|
|
80
|
+
for (const tool of tools) server.registerTool(tool.id, {
|
|
81
|
+
title: tool.name,
|
|
82
|
+
description: tool.description,
|
|
83
|
+
inputSchema: tool.inputSchema,
|
|
84
|
+
outputSchema: tool.outputSchema,
|
|
85
|
+
annotations: annotationsForTool(tool)
|
|
86
|
+
}, async (args, extra) => {
|
|
87
|
+
const ctx = await mergeAdapterToolContext(extra, {
|
|
88
|
+
context: await resolveMcpStaticContext(options),
|
|
89
|
+
createContext: options.createContext
|
|
90
|
+
}, "signal");
|
|
91
|
+
return toCallResult(await runTool(tool, args, ctx));
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//#endregion
|
|
95
|
+
export { createMcpToolListItem, createMcpTools, registerMcpTools };
|
|
96
|
+
|
|
97
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/adapters/mcp/create-mcp-tool.ts"],"sourcesContent":["import { isFunction, isPlainObject, isString, keyBy, mapValues } from 'es-toolkit'\nimport type { ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { toJSONSchema } from 'zod'\n\nimport { mergeToolContext } from '../../core/context'\nimport { mergeAdapterToolContext } from '../framework-context'\nimport { resolveTools } from '../../core/resolve-tools'\nimport type { ToolContext, ToolDefinition, ToolSideEffect, ToolSource } from '../../core/types'\nimport { assertUniqueBy } from '../../core/unique'\nimport { runTool } from '../../core/with-auth'\n\n/**\n * MCP tools/list item shape (JSON Schema input).\n * @see https://modelcontextprotocol.io/specification/2025-03-26/server/tools\n */\nexport type McpToolListItem = {\n\tannotations?: McpToolAnnotations\n\tdescription: string\n\tinputSchema: Record<string, unknown>\n\tname: string\n}\n\nexport type McpToolAnnotations = {\n\tdestructiveHint?: boolean\n\tidempotentHint?: boolean\n\topenWorldHint?: boolean\n\treadOnlyHint?: boolean\n\ttitle?: string\n}\n\n/** Subset of MCP CallToolResult used by this projector. */\nexport type McpCallToolResult = {\n\tcontent: Array<{ text: string; type: 'text' }>\n\tisError?: boolean\n\tstructuredContent?: Record<string, unknown>\n}\n\nexport type McpRequestExtra = Parameters<ToolCallback>[0]\n\n/**\n * Minimal surface of `@modelcontextprotocol/sdk` `McpServer.registerTool`\n * used by the optional MCP adapter peer.\n */\nexport type McpServerLike = {\n\tregisterTool: (\n\t\tname: string,\n\t\tconfig: {\n\t\t\tannotations?: McpToolAnnotations\n\t\t\tdescription?: string\n\t\t\tinputSchema?: unknown\n\t\t\toutputSchema?: unknown\n\t\t\ttitle?: string\n\t\t},\n\t\tcb: (args: unknown, extra: McpRequestExtra) => Promise<unknown>\n\t) => unknown\n}\n\nexport type McpToolset = {\n\t/** tools/list payload items */\n\tlist: McpToolListItem[]\n\t/** tools/call by name */\n\tcall: (name: string, args: unknown, ctx?: ToolContext) => Promise<McpCallToolResult>\n\t/** raw executors (pre-MCP result wrapping) */\n\texecutors: Record<string, (args: unknown, ctx?: ToolContext) => Promise<unknown>>\n}\n\nfunction annotationsForTool(tool: ToolDefinition): McpToolAnnotations {\n\tconst sideEffect: ToolSideEffect = tool.meta.sideEffect\n\tconst readOnly = sideEffect === 'read' || sideEffect === 'none'\n\treturn {\n\t\treadOnlyHint: readOnly,\n\t\tdestructiveHint: sideEffect === 'delete',\n\t\tidempotentHint: tool.meta.idempotent ?? readOnly,\n\t\t// Most integrations touch external systems; hosts can override via register options later.\n\t\topenWorldHint: tool.meta.network ?? true\n\t}\n}\n\nexport function createMcpToolListItem(tool: ToolDefinition): McpToolListItem {\n\treturn {\n\t\tname: tool.id,\n\t\tdescription: tool.description,\n\t\tinputSchema: toJSONSchema(tool.inputSchema),\n\t\tannotations: annotationsForTool(tool)\n\t}\n}\n\nfunction toCallResult(value: unknown): McpCallToolResult {\n\tconst text = isString(value) ? value : JSON.stringify(value)\n\tconst result: McpCallToolResult = {\n\t\tcontent: [{ type: 'text', text }]\n\t}\n\tif (isPlainObject(value)) {\n\t\tresult.structuredContent = value\n\t}\n\treturn result\n}\n\n/**\n * Project kernel tools into MCP list + call helpers (no SDK required).\n * Hosts implement transport / McpServer themselves.\n */\nexport function createMcpTools(source: ToolSource): McpToolset {\n\tconst tools = resolveTools(source)\n\tassertUniqueBy(\n\t\ttools,\n\t\t(t) => t.id,\n\t\t(id) => `Duplicate tool id when building MCP tools: ${id}`\n\t)\n\tconst executors = mapValues(\n\t\tkeyBy(tools, (t) => t.id),\n\t\t(tool) =>\n\t\t\t(args: unknown, ctx: ToolContext = {}) =>\n\t\t\t\trunTool(tool, args, ctx)\n\t)\n\n\treturn {\n\t\tlist: tools.map(createMcpToolListItem),\n\t\texecutors,\n\t\tcall: async (name, args, ctx = {}) => {\n\t\t\tconst run = executors[name]\n\t\t\tif (!run) {\n\t\t\t\treturn {\n\t\t\t\t\tisError: true,\n\t\t\t\t\tcontent: [{ type: 'text', text: `Unknown tool: ${name}` }]\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst value = await run(args, ctx)\n\t\t\t\treturn toCallResult(value)\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : 'Tool execution failed'\n\t\t\t\treturn {\n\t\t\t\t\tisError: true,\n\t\t\t\t\tcontent: [{ type: 'text', text: message }]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport type RegisterMcpToolsOptions = {\n\t/**\n\t * Static base context **or** async factory (back-compat with pre-H-02 `context: () => …`).\n\t * Prefer `withAuth` / `bindModule` before projection when credentials are fixed or dynamic.\n\t */\n\tcontext?: ToolContext | (() => ToolContext | Promise<ToolContext>)\n\t/**\n\t * Map MCP request extras into ToolContext.\n\t * Merged over framework defaults (`signal`) so cancel works unless explicitly overridden.\n\t * Explicit `undefined` fields do not erase the framework signal.\n\t */\n\tcreateContext?: (extra: McpRequestExtra) => ToolContext | Promise<ToolContext>\n\t/** @deprecated Alias of factory form of `context`. */\n\tcontextFactory?: ToolContext | (() => ToolContext | Promise<ToolContext>)\n}\n\nasync function resolveMcpStaticContext(options: RegisterMcpToolsOptions): Promise<ToolContext> {\n\tconst fromDeprecated = options.contextFactory\n\tconst deprecatedBase: ToolContext = isFunction(fromDeprecated) ? await fromDeprecated() : (fromDeprecated ?? {})\n\tconst c = options.context\n\tconst fromContext: ToolContext = isFunction(c) ? await c() : (c ?? {})\n\treturn mergeToolContext(deprecatedBase, fromContext)\n}\n\n/**\n * Register kernel tools on an MCP `McpServer` (or compatible) via `registerTool`.\n * Requires the host to construct the server from `@modelcontextprotocol/sdk`.\n */\nexport function registerMcpTools(\n\tserver: McpServerLike,\n\tsource: ToolSource,\n\toptions: RegisterMcpToolsOptions = {}\n): void {\n\tconst tools = resolveTools(source)\n\tassertUniqueBy(\n\t\ttools,\n\t\t(t) => t.id,\n\t\t(id) => `Duplicate tool id when registering MCP tools: ${id}`\n\t)\n\n\tfor (const tool of tools) {\n\t\tserver.registerTool(\n\t\t\ttool.id,\n\t\t\t{\n\t\t\t\ttitle: tool.name,\n\t\t\t\tdescription: tool.description,\n\t\t\t\tinputSchema: tool.inputSchema,\n\t\t\t\toutputSchema: tool.outputSchema,\n\t\t\t\tannotations: annotationsForTool(tool)\n\t\t\t},\n\t\t\tasync (args, extra) => {\n\t\t\t\tconst staticCtx = await resolveMcpStaticContext(options)\n\t\t\t\tconst ctx = await mergeAdapterToolContext(\n\t\t\t\t\textra,\n\t\t\t\t\t{ context: staticCtx, createContext: options.createContext },\n\t\t\t\t\t'signal'\n\t\t\t\t)\n\t\t\t\tconst value = await runTool(tool, args, ctx)\n\t\t\t\treturn toCallResult(value)\n\t\t\t}\n\t\t)\n\t}\n}\n"],"mappings":";;;;;;AAkEA,SAAS,mBAAmB,MAA0C;CACrE,MAAM,aAA6B,KAAK,KAAK;CAC7C,MAAM,WAAW,eAAe,UAAU,eAAe;CACzD,OAAO;EACN,cAAc;EACd,iBAAiB,eAAe;EAChC,gBAAgB,KAAK,KAAK,cAAc;EAExC,eAAe,KAAK,KAAK,WAAW;CACrC;AACD;AAEA,SAAgB,sBAAsB,MAAuC;CAC5E,OAAO;EACN,MAAM,KAAK;EACX,aAAa,KAAK;EAClB,aAAa,aAAa,KAAK,WAAW;EAC1C,aAAa,mBAAmB,IAAI;CACrC;AACD;AAEA,SAAS,aAAa,OAAmC;CAExD,MAAM,SAA4B,EACjC,SAAS,CAAC;EAAE,MAAM;EAAQ,MAFd,SAAS,KAAK,IAAI,QAAQ,KAAK,UAAU,KAAK;CAE3B,CAAC,EACjC;CACA,IAAI,cAAc,KAAK,GACtB,OAAO,oBAAoB;CAE5B,OAAO;AACR;;;;;AAMA,SAAgB,eAAe,QAAgC;CAC9D,MAAM,QAAQ,aAAa,MAAM;CACjC,eACC,QACC,MAAM,EAAE,KACR,OAAO,8CAA8C,IACvD;CACA,MAAM,YAAY,UACjB,MAAM,QAAQ,MAAM,EAAE,EAAE,IACvB,UACC,MAAe,MAAmB,CAAC,MACnC,QAAQ,MAAM,MAAM,GAAG,CAC1B;CAEA,OAAO;EACN,MAAM,MAAM,IAAI,qBAAqB;EACrC;EACA,MAAM,OAAO,MAAM,MAAM,MAAM,CAAC,MAAM;GACrC,MAAM,MAAM,UAAU;GACtB,IAAI,CAAC,KACJ,OAAO;IACN,SAAS;IACT,SAAS,CAAC;KAAE,MAAM;KAAQ,MAAM,iBAAiB;IAAO,CAAC;GAC1D;GAED,IAAI;IAEH,OAAO,aAAa,MADA,IAAI,MAAM,GAAG,CACR;GAC1B,SAAS,OAAO;IAEf,OAAO;KACN,SAAS;KACT,SAAS,CAAC;MAAE,MAAM;MAAQ,MAHX,iBAAiB,QAAQ,MAAM,UAAU;KAGhB,CAAC;IAC1C;GACD;EACD;CACD;AACD;AAkBA,eAAe,wBAAwB,SAAwD;CAC9F,MAAM,iBAAiB,QAAQ;CAC/B,MAAM,iBAA8B,WAAW,cAAc,IAAI,MAAM,eAAe,IAAK,kBAAkB,CAAC;CAC9G,MAAM,IAAI,QAAQ;CAElB,OAAO,iBAAiB,gBADS,WAAW,CAAC,IAAI,MAAM,EAAE,IAAK,KAAK,CAAC,CACjB;AACpD;;;;;AAMA,SAAgB,iBACf,QACA,QACA,UAAmC,CAAC,GAC7B;CACP,MAAM,QAAQ,aAAa,MAAM;CACjC,eACC,QACC,MAAM,EAAE,KACR,OAAO,iDAAiD,IAC1D;CAEA,KAAK,MAAM,QAAQ,OAClB,OAAO,aACN,KAAK,IACL;EACC,OAAO,KAAK;EACZ,aAAa,KAAK;EAClB,aAAa,KAAK;EAClB,cAAc,KAAK;EACnB,aAAa,mBAAmB,IAAI;CACrC,GACA,OAAO,MAAM,UAAU;EAEtB,MAAM,MAAM,MAAM,wBACjB,OACA;GAAE,SAAS,MAHY,wBAAwB,OAAO;GAGhC,eAAe,QAAQ;EAAc,GAC3D,QACD;EAEA,OAAO,aAAa,MADA,QAAQ,MAAM,MAAM,GAAG,CAClB;CAC1B,CACD;AAEF"}
|