@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,404 @@
|
|
|
1
|
+
import { t as ToolError } from "./errors-DoSpNHvs.js";
|
|
2
|
+
import { t as artifactRefSchema } from "./artifact-D064mHfK.js";
|
|
3
|
+
import { o as utf8ToBytes, r as bytesToUtf8, t as base64ToBytes } from "./bytes-BxpimpQx.js";
|
|
4
|
+
import { m as s3AuthSchema } from "./s3-CsOaPWMP.js";
|
|
5
|
+
import { r as mediaTypeFromPath } from "./content-type-CORxaxcv.js";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { compile } from "html-to-text";
|
|
8
|
+
import { imageSize } from "image-size";
|
|
9
|
+
import { definePDFJSModule, extractText, renderPageAsImage } from "unpdf";
|
|
10
|
+
//#region src/modules/document/formats/text.ts
|
|
11
|
+
/** Text, Markdown, JSON, CSV, and HTML helpers for the document capability. */
|
|
12
|
+
const convertHtml = compile({
|
|
13
|
+
decodeEntities: true,
|
|
14
|
+
preserveNewlines: false,
|
|
15
|
+
wordwrap: false,
|
|
16
|
+
selectors: [
|
|
17
|
+
{
|
|
18
|
+
selector: "script",
|
|
19
|
+
format: "skip"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
selector: "style",
|
|
23
|
+
format: "skip"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
selector: "h1",
|
|
27
|
+
options: { uppercase: false }
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
selector: "h2",
|
|
31
|
+
options: { uppercase: false }
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
selector: "h3",
|
|
35
|
+
options: { uppercase: false }
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
selector: "h4",
|
|
39
|
+
options: { uppercase: false }
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
selector: "h5",
|
|
43
|
+
options: { uppercase: false }
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
selector: "h6",
|
|
47
|
+
options: { uppercase: false }
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
});
|
|
51
|
+
function readHtml(html) {
|
|
52
|
+
return {
|
|
53
|
+
html,
|
|
54
|
+
text: convertHtml(html).trim()
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function readJson(bytes) {
|
|
58
|
+
const text = bytesToUtf8(bytes);
|
|
59
|
+
try {
|
|
60
|
+
JSON.parse(text);
|
|
61
|
+
return text;
|
|
62
|
+
} catch (error) {
|
|
63
|
+
throw new ToolError("Invalid JSON document", {
|
|
64
|
+
code: "bad_input",
|
|
65
|
+
cause: error
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function replaceText(text, replacement) {
|
|
70
|
+
if (replacement.match === "first") {
|
|
71
|
+
const index = text.indexOf(replacement.find);
|
|
72
|
+
if (index < 0) return {
|
|
73
|
+
text,
|
|
74
|
+
count: 0
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
text: `${text.slice(0, index)}${replacement.replace}${text.slice(index + replacement.find.length)}`,
|
|
78
|
+
count: 1
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
let count = 0;
|
|
82
|
+
let cursor = 0;
|
|
83
|
+
let output = "";
|
|
84
|
+
while (true) {
|
|
85
|
+
const index = text.indexOf(replacement.find, cursor);
|
|
86
|
+
if (index < 0) break;
|
|
87
|
+
output += text.slice(cursor, index);
|
|
88
|
+
output += replacement.replace;
|
|
89
|
+
cursor = index + replacement.find.length;
|
|
90
|
+
count += 1;
|
|
91
|
+
}
|
|
92
|
+
if (count === 0) return {
|
|
93
|
+
text,
|
|
94
|
+
count: 0
|
|
95
|
+
};
|
|
96
|
+
return {
|
|
97
|
+
text: `${output}${text.slice(cursor)}`,
|
|
98
|
+
count
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function assertReplacementApplied(count, find) {
|
|
102
|
+
if (count > 0) return;
|
|
103
|
+
throw new ToolError("A requested text replacement did not match the source document", {
|
|
104
|
+
code: "bad_input",
|
|
105
|
+
details: { find }
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
function patchTextDocument(bytes, format, replacements) {
|
|
109
|
+
let text = bytesToUtf8(bytes);
|
|
110
|
+
for (const replacement of replacements) {
|
|
111
|
+
const result = replaceText(text, replacement);
|
|
112
|
+
assertReplacementApplied(result.count, replacement.find);
|
|
113
|
+
text = result.text;
|
|
114
|
+
}
|
|
115
|
+
if (format === "json") try {
|
|
116
|
+
JSON.parse(text);
|
|
117
|
+
} catch (error) {
|
|
118
|
+
throw new ToolError("Text replacements produced invalid JSON", {
|
|
119
|
+
code: "bad_input",
|
|
120
|
+
cause: error
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return utf8ToBytes(text);
|
|
124
|
+
}
|
|
125
|
+
function mediaTypeForTextFormat(format) {
|
|
126
|
+
return mediaTypeFromPath(`document.${format}`) ?? "text/plain";
|
|
127
|
+
}
|
|
128
|
+
//#endregion
|
|
129
|
+
//#region src/modules/document/formats/image.ts
|
|
130
|
+
/** Image metadata reader used by the document capability. */
|
|
131
|
+
function readImageMetadata(bytes) {
|
|
132
|
+
try {
|
|
133
|
+
const dimensions = imageSize(bytes);
|
|
134
|
+
if (!dimensions.width && !dimensions.height) return void 0;
|
|
135
|
+
return {
|
|
136
|
+
...dimensions.width && { width: dimensions.width },
|
|
137
|
+
...dimensions.height && { height: dimensions.height }
|
|
138
|
+
};
|
|
139
|
+
} catch {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//#endregion
|
|
144
|
+
//#region src/modules/document/formats/pdf.ts
|
|
145
|
+
/** PDF text and page rendering implementation for the document capability. */
|
|
146
|
+
let nodePdfJsReady;
|
|
147
|
+
function ensurePdfJs() {
|
|
148
|
+
if (typeof process === "undefined" || process.release?.name !== "node") return Promise.resolve();
|
|
149
|
+
nodePdfJsReady ??= definePDFJSModule(() => import("pdfjs-dist/legacy/build/pdf.mjs"));
|
|
150
|
+
return nodePdfJsReady;
|
|
151
|
+
}
|
|
152
|
+
async function readPdf(bytes) {
|
|
153
|
+
try {
|
|
154
|
+
await ensurePdfJs();
|
|
155
|
+
const { text, totalPages } = await extractText(bytes.slice());
|
|
156
|
+
const pageText = Array.isArray(text) ? text : [text];
|
|
157
|
+
return {
|
|
158
|
+
text: pageText.join("\n"),
|
|
159
|
+
page_count: totalPages,
|
|
160
|
+
pages: pageText.map((page, index) => ({
|
|
161
|
+
page_number: index + 1,
|
|
162
|
+
text: page
|
|
163
|
+
}))
|
|
164
|
+
};
|
|
165
|
+
} catch (error) {
|
|
166
|
+
throw new ToolError("Failed to extract text from PDF", {
|
|
167
|
+
code: "upstream",
|
|
168
|
+
cause: error
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async function renderPdfPages(bytes, pageNumbers, scale = 1.5) {
|
|
173
|
+
await ensurePdfJs();
|
|
174
|
+
const pages = [];
|
|
175
|
+
for (const pageNumber of pageNumbers) try {
|
|
176
|
+
const rendered = new Uint8Array(await renderPageAsImage(bytes.slice(), pageNumber, {
|
|
177
|
+
canvasImport: () => import("@napi-rs/canvas"),
|
|
178
|
+
scale
|
|
179
|
+
}));
|
|
180
|
+
const dimensions = readImageMetadata(rendered);
|
|
181
|
+
pages.push({
|
|
182
|
+
page_number: pageNumber,
|
|
183
|
+
bytes: rendered,
|
|
184
|
+
...dimensions?.width && { width: dimensions.width },
|
|
185
|
+
...dimensions?.height && { height: dimensions.height }
|
|
186
|
+
});
|
|
187
|
+
} catch (error) {
|
|
188
|
+
throw new ToolError("Failed to render PDF page image", {
|
|
189
|
+
code: "upstream",
|
|
190
|
+
cause: error,
|
|
191
|
+
details: { page_number: pageNumber }
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
return pages;
|
|
195
|
+
}
|
|
196
|
+
//#endregion
|
|
197
|
+
//#region src/modules/document/contracts.ts
|
|
198
|
+
/**
|
|
199
|
+
* Document contracts for reading, building, and editing core native artifacts.
|
|
200
|
+
* Auth: nested object storage for ArtifactRef IO.
|
|
201
|
+
*/
|
|
202
|
+
const MAX_INLINE_CHARS = 2e6;
|
|
203
|
+
const MAX_SECTIONS = 100;
|
|
204
|
+
const MAX_SHEET_ROWS = 5e3;
|
|
205
|
+
const MAX_SHEETS = 20;
|
|
206
|
+
const MAX_REPLACEMENTS = 200;
|
|
207
|
+
const MAX_PDF_PAGE_IMAGES = 20;
|
|
208
|
+
const documentAuthSchema = z.object({ storage: s3AuthSchema.describe("Object storage for document ArtifactRef read/write") });
|
|
209
|
+
const documentFormatSchema = z.enum([
|
|
210
|
+
"txt",
|
|
211
|
+
"md",
|
|
212
|
+
"json",
|
|
213
|
+
"csv",
|
|
214
|
+
"html",
|
|
215
|
+
"pdf",
|
|
216
|
+
"docx",
|
|
217
|
+
"xlsx",
|
|
218
|
+
"image"
|
|
219
|
+
]);
|
|
220
|
+
const documentSourceSchema = z.object({
|
|
221
|
+
artifact: artifactRefSchema.optional().describe("Object-store artifact to read (store must be object)"),
|
|
222
|
+
body_base64: z.string().min(1).optional().describe("Inline file bytes as base64 (small files only)"),
|
|
223
|
+
text: z.string().min(1).max(MAX_INLINE_CHARS).optional().describe("Inline utf8 text when the format is text-based"),
|
|
224
|
+
filename: z.string().min(1).optional().describe("Filename hint for format detection"),
|
|
225
|
+
media_type: z.string().min(1).optional().describe("MIME type hint for format detection")
|
|
226
|
+
}).superRefine((val, ctx) => {
|
|
227
|
+
if ([
|
|
228
|
+
val.artifact,
|
|
229
|
+
val.body_base64,
|
|
230
|
+
val.text
|
|
231
|
+
].filter((x) => x !== void 0).length !== 1) ctx.addIssue({
|
|
232
|
+
code: "custom",
|
|
233
|
+
message: "Provide exactly one of artifact, body_base64, or text"
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
const documentTableSchema = z.object({
|
|
237
|
+
name: z.string().optional().describe("Sheet or table name"),
|
|
238
|
+
rows: z.array(z.array(z.union([
|
|
239
|
+
z.string(),
|
|
240
|
+
z.number(),
|
|
241
|
+
z.boolean(),
|
|
242
|
+
z.null()
|
|
243
|
+
]))).max(MAX_SHEET_ROWS).describe("Row-major cell values")
|
|
244
|
+
});
|
|
245
|
+
const documentPageSchema = z.object({
|
|
246
|
+
page_number: z.int().min(1).describe("1-based page number"),
|
|
247
|
+
text: z.string().optional().describe("Text extracted from this page when available"),
|
|
248
|
+
image: artifactRefSchema.optional().describe("Rendered page image when page images were requested")
|
|
249
|
+
});
|
|
250
|
+
const documentImageMetadataSchema = z.object({
|
|
251
|
+
width: z.int().positive().optional().describe("Pixel width when available"),
|
|
252
|
+
height: z.int().positive().optional().describe("Pixel height when available")
|
|
253
|
+
});
|
|
254
|
+
const documentSectionSchema = z.object({
|
|
255
|
+
heading: z.string().max(500).optional().describe("Section heading"),
|
|
256
|
+
paragraphs: z.array(z.string().max(2e4)).max(50).optional().describe("Body paragraphs")
|
|
257
|
+
});
|
|
258
|
+
const documentPdfPageImagesSchema = z.object({
|
|
259
|
+
page_numbers: z.array(z.int().min(1)).min(1).max(20).describe("Specific 1-based PDF pages to render as images"),
|
|
260
|
+
output_key_prefix: z.string().min(1).describe("Object-key prefix for rendered page images"),
|
|
261
|
+
scale: z.number().min(.5).max(4).optional().describe("Render scale; defaults to 1.5")
|
|
262
|
+
});
|
|
263
|
+
const documentReadInputSchema = z.object({
|
|
264
|
+
source: documentSourceSchema.describe("Document to read. For an ArtifactRef, pass { artifact: <ArtifactRef> }; do not pass the reference directly."),
|
|
265
|
+
format: documentFormatSchema.optional().describe("Format override when filename/media_type is missing"),
|
|
266
|
+
pdf_page_images: documentPdfPageImagesSchema.optional().describe("Optional PDF pages to render for visual reasoning; valid only for PDF documents")
|
|
267
|
+
});
|
|
268
|
+
const documentReadOutputSchema = z.object({
|
|
269
|
+
format: documentFormatSchema,
|
|
270
|
+
text: z.string().optional().describe("Extracted plain text when available"),
|
|
271
|
+
html: z.string().optional().describe("HTML when available (e.g. from docx)"),
|
|
272
|
+
tables: z.array(documentTableSchema).optional().describe("Spreadsheet / tabular data"),
|
|
273
|
+
page_count: z.int().nonnegative().optional().describe("Page count when available"),
|
|
274
|
+
pages: z.array(documentPageSchema).optional().describe("Per-page text and requested page images"),
|
|
275
|
+
image: documentImageMetadataSchema.optional().describe("Image dimensions when available"),
|
|
276
|
+
filename: z.string().optional(),
|
|
277
|
+
media_type: z.string().optional(),
|
|
278
|
+
byte_length: z.int().nonnegative().optional()
|
|
279
|
+
});
|
|
280
|
+
const documentBuildTextInputSchema = z.object({
|
|
281
|
+
format: z.enum([
|
|
282
|
+
"txt",
|
|
283
|
+
"md",
|
|
284
|
+
"json",
|
|
285
|
+
"csv",
|
|
286
|
+
"html"
|
|
287
|
+
]).describe("Text output format"),
|
|
288
|
+
content: z.string().min(1).max(MAX_INLINE_CHARS).describe("Utf8 content to write"),
|
|
289
|
+
output_key: z.string().min(1).describe("Object key for the written artifact"),
|
|
290
|
+
filename: z.string().min(1).optional().describe("Display filename on the ArtifactRef")
|
|
291
|
+
});
|
|
292
|
+
const documentBuildOutputSchema = z.object({ result: artifactRefSchema });
|
|
293
|
+
const documentBuildSpreadsheetInputSchema = z.object({
|
|
294
|
+
sheets: z.array(documentTableSchema).min(1).max(20).describe("Worksheets to create, with each rows field containing a row-major two-dimensional cell array"),
|
|
295
|
+
output_key: z.string().min(1).describe("Durable object key for the final .xlsx artifact"),
|
|
296
|
+
filename: z.string().min(1).optional().describe("Display filename (defaults to workbook.xlsx)")
|
|
297
|
+
});
|
|
298
|
+
const documentBuildDocumentInputSchema = z.object({
|
|
299
|
+
title: z.string().max(500).optional().describe("Document title"),
|
|
300
|
+
sections: z.array(documentSectionSchema).min(1).max(100).describe("Document sections"),
|
|
301
|
+
output_key: z.string().min(1).describe("Object key for the .docx artifact"),
|
|
302
|
+
filename: z.string().min(1).optional().describe("Display filename (defaults to document.docx)")
|
|
303
|
+
});
|
|
304
|
+
const documentTextReplacementSchema = z.object({
|
|
305
|
+
find: z.string().min(1).max(2e4).describe("Exact existing text to find"),
|
|
306
|
+
replace: z.string().max(2e4).describe("Replacement text"),
|
|
307
|
+
match: z.enum(["first", "all"]).describe("Replace the first match or every match")
|
|
308
|
+
});
|
|
309
|
+
const documentEditTextInputSchema = z.object({
|
|
310
|
+
source: documentSourceSchema.describe("Existing txt, md, json, or html document. For an ArtifactRef, pass { artifact: <ArtifactRef> }; do not pass the reference directly."),
|
|
311
|
+
format: z.enum([
|
|
312
|
+
"txt",
|
|
313
|
+
"md",
|
|
314
|
+
"json",
|
|
315
|
+
"html"
|
|
316
|
+
]).optional().describe("Format override when it cannot be detected"),
|
|
317
|
+
replacements: z.array(documentTextReplacementSchema).min(1).max(200).describe("Ordered exact-text replacements"),
|
|
318
|
+
output_key: z.string().min(1).describe("Object key for the written document"),
|
|
319
|
+
filename: z.string().min(1).optional().describe("Display filename")
|
|
320
|
+
});
|
|
321
|
+
const documentEditDocumentInputSchema = z.object({
|
|
322
|
+
source: documentSourceSchema.describe("Existing docx document. For an ArtifactRef, pass { artifact: <ArtifactRef> }; do not pass the reference directly."),
|
|
323
|
+
replacements: z.array(documentTextReplacementSchema).min(1).max(200).describe("Ordered layout-preserving text replacements"),
|
|
324
|
+
output_key: z.string().min(1).describe("Object key for the written docx document"),
|
|
325
|
+
filename: z.string().min(1).optional().describe("Display filename")
|
|
326
|
+
});
|
|
327
|
+
const documentEditSpreadsheetInputSchema = z.object({
|
|
328
|
+
source: documentSourceSchema.describe("Existing xlsx or csv spreadsheet. For an ArtifactRef, pass { artifact: <ArtifactRef> }; do not pass the reference directly."),
|
|
329
|
+
patches: z.array(z.object({
|
|
330
|
+
sheet: z.string().min(1).optional().describe("Sheet name (default first sheet)"),
|
|
331
|
+
row: z.int().min(1).describe("1-based row index"),
|
|
332
|
+
col: z.int().min(1).describe("1-based column index"),
|
|
333
|
+
value: z.union([
|
|
334
|
+
z.string(),
|
|
335
|
+
z.number(),
|
|
336
|
+
z.boolean(),
|
|
337
|
+
z.null()
|
|
338
|
+
]).describe("New cell value")
|
|
339
|
+
})).min(1).max(2e3).describe("Cell updates to apply using 1-based row and column positions"),
|
|
340
|
+
output_key: z.string().min(1).describe("Durable object key for the edited spreadsheet artifact"),
|
|
341
|
+
filename: z.string().min(1).optional().describe("Display filename")
|
|
342
|
+
});
|
|
343
|
+
//#endregion
|
|
344
|
+
//#region src/modules/document/artifacts.ts
|
|
345
|
+
/** Document source loading and ArtifactRef output helpers. */
|
|
346
|
+
function sourceName(loaded, fallback) {
|
|
347
|
+
return loaded.filename?.split("/").at(-1) || fallback;
|
|
348
|
+
}
|
|
349
|
+
async function loadDocumentSource(source, readArtifact) {
|
|
350
|
+
if (source.text !== void 0) return {
|
|
351
|
+
bytes: utf8ToBytes(source.text),
|
|
352
|
+
filename: source.filename,
|
|
353
|
+
media_type: source.media_type ?? (source.filename ? void 0 : "text/plain")
|
|
354
|
+
};
|
|
355
|
+
if (source.body_base64 !== void 0) return {
|
|
356
|
+
bytes: base64ToBytes(source.body_base64),
|
|
357
|
+
filename: source.filename,
|
|
358
|
+
media_type: source.media_type
|
|
359
|
+
};
|
|
360
|
+
if (source.artifact) {
|
|
361
|
+
if (source.artifact.store !== "object") throw new ToolError("Document artifact store must be object", { code: "bad_input" });
|
|
362
|
+
return {
|
|
363
|
+
bytes: await readArtifact(source.artifact.key),
|
|
364
|
+
filename: source.filename ?? source.artifact.filename,
|
|
365
|
+
media_type: source.media_type ?? source.artifact.media_type
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
throw new ToolError("Missing document source", { code: "bad_input" });
|
|
369
|
+
}
|
|
370
|
+
async function attachPdfPageArtifacts(output, loaded, format, options, writeArtifact) {
|
|
371
|
+
if (format !== "pdf") throw new ToolError("pdf_page_images is only valid for PDF documents", { code: "bad_input" });
|
|
372
|
+
const pageCount = output.page_count ?? 0;
|
|
373
|
+
const invalidPage = options.page_numbers.find((page) => page > pageCount);
|
|
374
|
+
if (invalidPage) throw new ToolError("Requested PDF page is outside the document", {
|
|
375
|
+
code: "bad_input",
|
|
376
|
+
details: {
|
|
377
|
+
page_number: invalidPage,
|
|
378
|
+
page_count: pageCount
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
const rendered = await renderPdfPages(loaded.bytes, options.page_numbers, options.scale);
|
|
382
|
+
const pages = [...output.pages ?? []];
|
|
383
|
+
const prefix = options.output_key_prefix.replace(/\/+$/, "");
|
|
384
|
+
const basename = sourceName(loaded, "document").replace(/\.[^./]+$/, "");
|
|
385
|
+
for (const page of rendered) {
|
|
386
|
+
const image = await writeArtifact(`${prefix}/page-${page.page_number}.png`, page.bytes, "image/png", `${basename}-page-${page.page_number}.png`);
|
|
387
|
+
const index = pages.findIndex((existing) => existing.page_number === page.page_number);
|
|
388
|
+
if (index >= 0) {
|
|
389
|
+
const existing = pages[index];
|
|
390
|
+
if (existing) pages[index] = {
|
|
391
|
+
...existing,
|
|
392
|
+
image
|
|
393
|
+
};
|
|
394
|
+
} else pages.push({
|
|
395
|
+
page_number: page.page_number,
|
|
396
|
+
image
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
output.pages = pages.sort((left, right) => left.page_number - right.page_number);
|
|
400
|
+
}
|
|
401
|
+
//#endregion
|
|
402
|
+
export { assertReplacementApplied as A, documentReadOutputSchema as C, documentTextReplacementSchema as D, documentTableSchema as E, patchTextDocument as M, readHtml as N, readPdf as O, readJson as P, documentReadInputSchema as S, documentSourceSchema as T, documentEditTextInputSchema as _, MAX_PDF_PAGE_IMAGES as a, documentPageSchema as b, MAX_SHEETS as c, documentBuildDocumentInputSchema as d, documentBuildOutputSchema as f, documentEditSpreadsheetInputSchema as g, documentEditDocumentInputSchema as h, MAX_INLINE_CHARS as i, mediaTypeForTextFormat as j, readImageMetadata as k, MAX_SHEET_ROWS as l, documentBuildTextInputSchema as m, loadDocumentSource as n, MAX_REPLACEMENTS as o, documentBuildSpreadsheetInputSchema as p, sourceName as r, MAX_SECTIONS as s, attachPdfPageArtifacts as t, documentAuthSchema as u, documentFormatSchema as v, documentSectionSchema as w, documentPdfPageImagesSchema as x, documentImageMetadataSchema as y };
|
|
403
|
+
|
|
404
|
+
//# sourceMappingURL=artifacts-O8g-40Pw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts-O8g-40Pw.js","names":[],"sources":["../src/modules/document/formats/text.ts","../src/modules/document/formats/image.ts","../src/modules/document/formats/pdf.ts","../src/modules/document/contracts.ts","../src/modules/document/artifacts.ts"],"sourcesContent":["/** Text, Markdown, JSON, CSV, and HTML helpers for the document capability. */\nimport { compile } from 'html-to-text'\n\nimport { ToolError } from '../../../core/errors'\nimport { bytesToUtf8, utf8ToBytes } from '../../../shared/bytes'\nimport { mediaTypeFromPath } from '../../../shared/content-type'\nimport type { DocumentFormat, DocumentTextReplacement } from '../contracts'\n\nconst convertHtml = compile({\n\tdecodeEntities: true,\n\tpreserveNewlines: false,\n\twordwrap: false,\n\tselectors: [\n\t\t{ selector: 'script', format: 'skip' },\n\t\t{ selector: 'style', format: 'skip' },\n\t\t{ selector: 'h1', options: { uppercase: false } },\n\t\t{ selector: 'h2', options: { uppercase: false } },\n\t\t{ selector: 'h3', options: { uppercase: false } },\n\t\t{ selector: 'h4', options: { uppercase: false } },\n\t\t{ selector: 'h5', options: { uppercase: false } },\n\t\t{ selector: 'h6', options: { uppercase: false } }\n\t]\n})\n\nexport function readHtml(html: string): { html: string; text: string } {\n\treturn { html, text: convertHtml(html).trim() }\n}\n\nexport function readJson(bytes: Uint8Array): string {\n\tconst text = bytesToUtf8(bytes)\n\ttry {\n\t\tJSON.parse(text)\n\t\treturn text\n\t} catch (error) {\n\t\tthrow new ToolError('Invalid JSON document', { code: 'bad_input', cause: error })\n\t}\n}\n\nexport function replaceText(text: string, replacement: DocumentTextReplacement): { text: string; count: number } {\n\tif (replacement.match === 'first') {\n\t\tconst index = text.indexOf(replacement.find)\n\t\tif (index < 0) return { text, count: 0 }\n\t\treturn {\n\t\t\ttext: `${text.slice(0, index)}${replacement.replace}${text.slice(index + replacement.find.length)}`,\n\t\t\tcount: 1\n\t\t}\n\t}\n\n\tlet count = 0\n\tlet cursor = 0\n\tlet output = ''\n\twhile (true) {\n\t\tconst index = text.indexOf(replacement.find, cursor)\n\t\tif (index < 0) break\n\t\toutput += text.slice(cursor, index)\n\t\toutput += replacement.replace\n\t\tcursor = index + replacement.find.length\n\t\tcount += 1\n\t}\n\tif (count === 0) return { text, count: 0 }\n\treturn { text: `${output}${text.slice(cursor)}`, count }\n}\n\nexport function assertReplacementApplied(count: number, find: string): void {\n\tif (count > 0) return\n\tthrow new ToolError('A requested text replacement did not match the source document', {\n\t\tcode: 'bad_input',\n\t\tdetails: { find }\n\t})\n}\n\nexport function patchTextDocument(\n\tbytes: Uint8Array,\n\tformat: 'txt' | 'md' | 'json' | 'html',\n\treplacements: DocumentTextReplacement[]\n): Uint8Array {\n\tlet text = bytesToUtf8(bytes)\n\tfor (const replacement of replacements) {\n\t\tconst result = replaceText(text, replacement)\n\t\tassertReplacementApplied(result.count, replacement.find)\n\t\ttext = result.text\n\t}\n\tif (format === 'json') {\n\t\ttry {\n\t\t\tJSON.parse(text)\n\t\t} catch (error) {\n\t\t\tthrow new ToolError('Text replacements produced invalid JSON', { code: 'bad_input', cause: error })\n\t\t}\n\t}\n\treturn utf8ToBytes(text)\n}\n\nexport function mediaTypeForTextFormat(\n\tformat: Extract<DocumentFormat, 'txt' | 'md' | 'json' | 'csv' | 'html'>\n): string {\n\treturn mediaTypeFromPath(`document.${format}`) ?? 'text/plain'\n}\n","/** Image metadata reader used by the document capability. */\nimport { imageSize } from 'image-size'\n\nexport function readImageMetadata(bytes: Uint8Array): { width?: number; height?: number } | undefined {\n\ttry {\n\t\tconst dimensions = imageSize(bytes)\n\t\tif (!dimensions.width && !dimensions.height) return undefined\n\t\treturn {\n\t\t\t...(dimensions.width && { width: dimensions.width }),\n\t\t\t...(dimensions.height && { height: dimensions.height })\n\t\t}\n\t} catch {\n\t\treturn undefined\n\t}\n}\n","/** PDF text and page rendering implementation for the document capability. */\nimport { definePDFJSModule, extractText, renderPageAsImage } from 'unpdf'\n\nimport { ToolError } from '../../../core/errors'\nimport type { DocumentReadOutput } from '../contracts'\nimport { readImageMetadata } from './image'\n\nlet nodePdfJsReady: Promise<void> | undefined\n\nfunction ensurePdfJs(): Promise<void> {\n\tif (typeof process === 'undefined' || process.release?.name !== 'node') return Promise.resolve()\n\tnodePdfJsReady ??= definePDFJSModule(() => import('pdfjs-dist/legacy/build/pdf.mjs'))\n\treturn nodePdfJsReady\n}\n\nexport async function readPdf(bytes: Uint8Array): Promise<Pick<DocumentReadOutput, 'text' | 'page_count' | 'pages'>> {\n\ttry {\n\t\tawait ensurePdfJs()\n\t\tconst { text, totalPages } = await extractText(bytes.slice())\n\t\tconst pageText = Array.isArray(text) ? text : [text]\n\t\treturn {\n\t\t\ttext: pageText.join('\\n'),\n\t\t\tpage_count: totalPages,\n\t\t\tpages: pageText.map((page, index) => ({ page_number: index + 1, text: page }))\n\t\t}\n\t} catch (error) {\n\t\tthrow new ToolError('Failed to extract text from PDF', { code: 'upstream', cause: error })\n\t}\n}\n\nexport async function renderPdfPages(\n\tbytes: Uint8Array,\n\tpageNumbers: number[],\n\tscale = 1.5\n): Promise<Array<{ page_number: number; bytes: Uint8Array; width?: number; height?: number }>> {\n\tawait ensurePdfJs()\n\tconst pages: Array<{ page_number: number; bytes: Uint8Array; width?: number; height?: number }> = []\n\tfor (const pageNumber of pageNumbers) {\n\t\ttry {\n\t\t\tconst rendered = new Uint8Array(\n\t\t\t\tawait renderPageAsImage(bytes.slice(), pageNumber, {\n\t\t\t\t\tcanvasImport: () => import('@napi-rs/canvas'),\n\t\t\t\t\tscale\n\t\t\t\t})\n\t\t\t)\n\t\t\tconst dimensions = readImageMetadata(rendered)\n\t\t\tpages.push({\n\t\t\t\tpage_number: pageNumber,\n\t\t\t\tbytes: rendered,\n\t\t\t\t...(dimensions?.width && { width: dimensions.width }),\n\t\t\t\t...(dimensions?.height && { height: dimensions.height })\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tthrow new ToolError('Failed to render PDF page image', {\n\t\t\t\tcode: 'upstream',\n\t\t\t\tcause: error,\n\t\t\t\tdetails: { page_number: pageNumber }\n\t\t\t})\n\t\t}\n\t}\n\treturn pages\n}\n","/**\n * Document contracts for reading, building, and editing core native artifacts.\n * Auth: nested object storage for ArtifactRef IO.\n */\n\nimport { z } from 'zod'\n\nimport { artifactRefSchema } from '../../shared/artifact'\nimport { s3AuthSchema } from '../../vendors/s3'\n\nexport const MAX_INLINE_CHARS = 2_000_000\nexport const MAX_SECTIONS = 100\nexport const MAX_SHEET_ROWS = 5_000\nexport const MAX_SHEETS = 20\nexport const MAX_REPLACEMENTS = 200\nexport const MAX_PDF_PAGE_IMAGES = 20\n\nexport const documentAuthSchema = z.object({\n\tstorage: s3AuthSchema.describe('Object storage for document ArtifactRef read/write')\n})\n\nexport type DocumentAuth = z.infer<typeof documentAuthSchema>\n\nexport const documentFormatSchema = z.enum(['txt', 'md', 'json', 'csv', 'html', 'pdf', 'docx', 'xlsx', 'image'])\n\nexport type DocumentFormat = z.infer<typeof documentFormatSchema>\n\nexport const documentSourceSchema = z\n\t.object({\n\t\tartifact: artifactRefSchema.optional().describe('Object-store artifact to read (store must be object)'),\n\t\tbody_base64: z.string().min(1).optional().describe('Inline file bytes as base64 (small files only)'),\n\t\ttext: z.string().min(1).max(MAX_INLINE_CHARS).optional().describe('Inline utf8 text when the format is text-based'),\n\t\tfilename: z.string().min(1).optional().describe('Filename hint for format detection'),\n\t\tmedia_type: z.string().min(1).optional().describe('MIME type hint for format detection')\n\t})\n\t.superRefine((val, ctx) => {\n\t\tconst n = [val.artifact, val.body_base64, val.text].filter((x) => x !== undefined).length\n\t\tif (n !== 1) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: 'custom',\n\t\t\t\tmessage: 'Provide exactly one of artifact, body_base64, or text'\n\t\t\t})\n\t\t}\n\t})\n\nexport const documentTableSchema = z.object({\n\tname: z.string().optional().describe('Sheet or table name'),\n\trows: z\n\t\t.array(z.array(z.union([z.string(), z.number(), z.boolean(), z.null()])))\n\t\t.max(MAX_SHEET_ROWS)\n\t\t.describe('Row-major cell values')\n})\n\nexport const documentPageSchema = z.object({\n\tpage_number: z.int().min(1).describe('1-based page number'),\n\ttext: z.string().optional().describe('Text extracted from this page when available'),\n\timage: artifactRefSchema.optional().describe('Rendered page image when page images were requested')\n})\n\nexport const documentImageMetadataSchema = z.object({\n\twidth: z.int().positive().optional().describe('Pixel width when available'),\n\theight: z.int().positive().optional().describe('Pixel height when available')\n})\n\nexport const documentSectionSchema = z.object({\n\theading: z.string().max(500).optional().describe('Section heading'),\n\tparagraphs: z.array(z.string().max(20_000)).max(50).optional().describe('Body paragraphs')\n})\n\nexport const documentPdfPageImagesSchema = z.object({\n\tpage_numbers: z\n\t\t.array(z.int().min(1))\n\t\t.min(1)\n\t\t.max(MAX_PDF_PAGE_IMAGES)\n\t\t.describe('Specific 1-based PDF pages to render as images'),\n\toutput_key_prefix: z.string().min(1).describe('Object-key prefix for rendered page images'),\n\tscale: z.number().min(0.5).max(4).optional().describe('Render scale; defaults to 1.5')\n})\n\nexport const documentReadInputSchema = z.object({\n\tsource: documentSourceSchema.describe(\n\t\t'Document to read. For an ArtifactRef, pass { artifact: <ArtifactRef> }; do not pass the reference directly.'\n\t),\n\tformat: documentFormatSchema.optional().describe('Format override when filename/media_type is missing'),\n\tpdf_page_images: documentPdfPageImagesSchema\n\t\t.optional()\n\t\t.describe('Optional PDF pages to render for visual reasoning; valid only for PDF documents')\n})\n\nexport const documentReadOutputSchema = z.object({\n\tformat: documentFormatSchema,\n\ttext: z.string().optional().describe('Extracted plain text when available'),\n\thtml: z.string().optional().describe('HTML when available (e.g. from docx)'),\n\ttables: z.array(documentTableSchema).optional().describe('Spreadsheet / tabular data'),\n\tpage_count: z.int().nonnegative().optional().describe('Page count when available'),\n\tpages: z.array(documentPageSchema).optional().describe('Per-page text and requested page images'),\n\timage: documentImageMetadataSchema.optional().describe('Image dimensions when available'),\n\tfilename: z.string().optional(),\n\tmedia_type: z.string().optional(),\n\tbyte_length: z.int().nonnegative().optional()\n})\n\nexport const documentBuildTextInputSchema = z.object({\n\tformat: z.enum(['txt', 'md', 'json', 'csv', 'html']).describe('Text output format'),\n\tcontent: z.string().min(1).max(MAX_INLINE_CHARS).describe('Utf8 content to write'),\n\toutput_key: z.string().min(1).describe('Object key for the written artifact'),\n\tfilename: z.string().min(1).optional().describe('Display filename on the ArtifactRef')\n})\n\nexport const documentBuildOutputSchema = z.object({\n\tresult: artifactRefSchema\n})\n\nexport const documentBuildSpreadsheetInputSchema = z.object({\n\tsheets: z\n\t\t.array(documentTableSchema)\n\t\t.min(1)\n\t\t.max(MAX_SHEETS)\n\t\t.describe('Worksheets to create, with each rows field containing a row-major two-dimensional cell array'),\n\toutput_key: z.string().min(1).describe('Durable object key for the final .xlsx artifact'),\n\tfilename: z.string().min(1).optional().describe('Display filename (defaults to workbook.xlsx)')\n})\n\nexport const documentBuildDocumentInputSchema = z.object({\n\ttitle: z.string().max(500).optional().describe('Document title'),\n\tsections: z.array(documentSectionSchema).min(1).max(MAX_SECTIONS).describe('Document sections'),\n\toutput_key: z.string().min(1).describe('Object key for the .docx artifact'),\n\tfilename: z.string().min(1).optional().describe('Display filename (defaults to document.docx)')\n})\n\nexport const documentTextReplacementSchema = z.object({\n\tfind: z.string().min(1).max(20_000).describe('Exact existing text to find'),\n\treplace: z.string().max(20_000).describe('Replacement text'),\n\tmatch: z.enum(['first', 'all']).describe('Replace the first match or every match')\n})\n\nexport const documentEditTextInputSchema = z.object({\n\tsource: documentSourceSchema.describe(\n\t\t'Existing txt, md, json, or html document. For an ArtifactRef, pass { artifact: <ArtifactRef> }; do not pass the reference directly.'\n\t),\n\tformat: z.enum(['txt', 'md', 'json', 'html']).optional().describe('Format override when it cannot be detected'),\n\treplacements: z\n\t\t.array(documentTextReplacementSchema)\n\t\t.min(1)\n\t\t.max(MAX_REPLACEMENTS)\n\t\t.describe('Ordered exact-text replacements'),\n\toutput_key: z.string().min(1).describe('Object key for the written document'),\n\tfilename: z.string().min(1).optional().describe('Display filename')\n})\n\nexport const documentEditDocumentInputSchema = z.object({\n\tsource: documentSourceSchema.describe(\n\t\t'Existing docx document. For an ArtifactRef, pass { artifact: <ArtifactRef> }; do not pass the reference directly.'\n\t),\n\treplacements: z\n\t\t.array(documentTextReplacementSchema)\n\t\t.min(1)\n\t\t.max(MAX_REPLACEMENTS)\n\t\t.describe('Ordered layout-preserving text replacements'),\n\toutput_key: z.string().min(1).describe('Object key for the written docx document'),\n\tfilename: z.string().min(1).optional().describe('Display filename')\n})\n\nexport const documentEditSpreadsheetInputSchema = z.object({\n\tsource: documentSourceSchema.describe(\n\t\t'Existing xlsx or csv spreadsheet. For an ArtifactRef, pass { artifact: <ArtifactRef> }; do not pass the reference directly.'\n\t),\n\tpatches: z\n\t\t.array(\n\t\t\tz.object({\n\t\t\t\tsheet: z.string().min(1).optional().describe('Sheet name (default first sheet)'),\n\t\t\t\trow: z.int().min(1).describe('1-based row index'),\n\t\t\t\tcol: z.int().min(1).describe('1-based column index'),\n\t\t\t\tvalue: z.union([z.string(), z.number(), z.boolean(), z.null()]).describe('New cell value')\n\t\t\t})\n\t\t)\n\t\t.min(1)\n\t\t.max(2_000)\n\t\t.describe('Cell updates to apply using 1-based row and column positions'),\n\toutput_key: z.string().min(1).describe('Durable object key for the edited spreadsheet artifact'),\n\tfilename: z.string().min(1).optional().describe('Display filename')\n})\n\nexport type DocumentReadInput = z.infer<typeof documentReadInputSchema>\nexport type DocumentReadOutput = z.infer<typeof documentReadOutputSchema>\nexport type DocumentBuildTextInput = z.infer<typeof documentBuildTextInputSchema>\nexport type DocumentBuildSpreadsheetInput = z.infer<typeof documentBuildSpreadsheetInputSchema>\nexport type DocumentBuildDocumentInput = z.infer<typeof documentBuildDocumentInputSchema>\nexport type DocumentEditTextInput = z.infer<typeof documentEditTextInputSchema>\nexport type DocumentEditDocumentInput = z.infer<typeof documentEditDocumentInputSchema>\nexport type DocumentEditSpreadsheetInput = z.infer<typeof documentEditSpreadsheetInputSchema>\nexport type DocumentTable = z.infer<typeof documentTableSchema>\nexport type DocumentSection = z.infer<typeof documentSectionSchema>\nexport type DocumentPage = z.infer<typeof documentPageSchema>\nexport type DocumentTextReplacement = z.infer<typeof documentTextReplacementSchema>\n","/** Document source loading and ArtifactRef output helpers. */\nimport { ToolError } from '../../core/errors'\nimport type { ArtifactRef } from '../../shared/artifact'\nimport { base64ToBytes, utf8ToBytes } from '../../shared/bytes'\nimport type { DocumentFormat, DocumentReadInput, DocumentReadOutput } from './contracts'\nimport { renderPdfPages } from './domain'\n\nexport type LoadedDocument = {\n\tbytes: Uint8Array\n\tfilename?: string | undefined\n\tmedia_type?: string | undefined\n}\n\ntype ReadArtifact = (key: string) => Promise<Uint8Array>\ntype WriteArtifact = (key: string, bytes: Uint8Array, mediaType: string, filename: string) => Promise<ArtifactRef>\n\nexport function sourceName(loaded: LoadedDocument, fallback: string): string {\n\tconst filename = loaded.filename?.split('/').at(-1)\n\treturn filename || fallback\n}\n\nexport async function loadDocumentSource(\n\tsource: DocumentReadInput['source'],\n\treadArtifact: ReadArtifact\n): Promise<LoadedDocument> {\n\tif (source.text !== undefined) {\n\t\treturn {\n\t\t\tbytes: utf8ToBytes(source.text),\n\t\t\tfilename: source.filename,\n\t\t\tmedia_type: source.media_type ?? (source.filename ? undefined : 'text/plain')\n\t\t}\n\t}\n\tif (source.body_base64 !== undefined) {\n\t\treturn {\n\t\t\tbytes: base64ToBytes(source.body_base64),\n\t\t\tfilename: source.filename,\n\t\t\tmedia_type: source.media_type\n\t\t}\n\t}\n\tif (source.artifact) {\n\t\tif (source.artifact.store !== 'object') {\n\t\t\tthrow new ToolError('Document artifact store must be object', { code: 'bad_input' })\n\t\t}\n\t\treturn {\n\t\t\tbytes: await readArtifact(source.artifact.key),\n\t\t\tfilename: source.filename ?? source.artifact.filename,\n\t\t\tmedia_type: source.media_type ?? source.artifact.media_type\n\t\t}\n\t}\n\tthrow new ToolError('Missing document source', { code: 'bad_input' })\n}\n\nexport async function attachPdfPageArtifacts(\n\toutput: DocumentReadOutput,\n\tloaded: LoadedDocument,\n\tformat: DocumentFormat,\n\toptions: NonNullable<DocumentReadInput['pdf_page_images']>,\n\twriteArtifact: WriteArtifact\n): Promise<void> {\n\tif (format !== 'pdf') {\n\t\tthrow new ToolError('pdf_page_images is only valid for PDF documents', { code: 'bad_input' })\n\t}\n\tconst pageCount = output.page_count ?? 0\n\tconst invalidPage = options.page_numbers.find((page) => page > pageCount)\n\tif (invalidPage) {\n\t\tthrow new ToolError('Requested PDF page is outside the document', {\n\t\t\tcode: 'bad_input',\n\t\t\tdetails: { page_number: invalidPage, page_count: pageCount }\n\t\t})\n\t}\n\n\tconst rendered = await renderPdfPages(loaded.bytes, options.page_numbers, options.scale)\n\tconst pages = [...(output.pages ?? [])]\n\tconst prefix = options.output_key_prefix.replace(/\\/+$/, '')\n\tconst basename = sourceName(loaded, 'document').replace(/\\.[^./]+$/, '')\n\tfor (const page of rendered) {\n\t\tconst image = await writeArtifact(\n\t\t\t`${prefix}/page-${page.page_number}.png`,\n\t\t\tpage.bytes,\n\t\t\t'image/png',\n\t\t\t`${basename}-page-${page.page_number}.png`\n\t\t)\n\t\tconst index = pages.findIndex((existing) => existing.page_number === page.page_number)\n\t\tif (index >= 0) {\n\t\t\tconst existing = pages[index]\n\t\t\tif (existing) pages[index] = { ...existing, image }\n\t\t} else {\n\t\t\tpages.push({ page_number: page.page_number, image })\n\t\t}\n\t}\n\toutput.pages = pages.sort((left, right) => left.page_number - right.page_number)\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { isString } from "es-toolkit";
|
|
2
|
+
//#region src/transport/aws-json.ts
|
|
3
|
+
/**
|
|
4
|
+
* Parse AWS JSON protocol response bodies.
|
|
5
|
+
*
|
|
6
|
+
* ofetch only auto-parses `application/json`. Services that use
|
|
7
|
+
* `application/x-amz-json-1.0` / `1.1` (SQS, Textract, …) often leave a
|
|
8
|
+
* string or Blob in `HttpService` `data` — callers must re-parse.
|
|
9
|
+
*/
|
|
10
|
+
async function parseAwsJsonBody(data) {
|
|
11
|
+
let payload = data;
|
|
12
|
+
if (typeof Blob !== "undefined" && payload instanceof Blob) payload = await payload.text();
|
|
13
|
+
if (isString(payload)) try {
|
|
14
|
+
return payload.length === 0 ? {} : JSON.parse(payload);
|
|
15
|
+
} catch {
|
|
16
|
+
return { Message: payload };
|
|
17
|
+
}
|
|
18
|
+
return payload;
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { parseAwsJsonBody as t };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=aws-json-CecFqzqX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-json-CecFqzqX.js","names":[],"sources":["../src/transport/aws-json.ts"],"sourcesContent":["/**\n * Parse AWS JSON protocol response bodies.\n *\n * ofetch only auto-parses `application/json`. Services that use\n * `application/x-amz-json-1.0` / `1.1` (SQS, Textract, …) often leave a\n * string or Blob in `HttpService` `data` — callers must re-parse.\n */\n\nimport { isString } from 'es-toolkit'\n\nexport async function parseAwsJsonBody(data: unknown): Promise<unknown> {\n\tlet payload: unknown = data\n\tif (typeof Blob !== 'undefined' && payload instanceof Blob) {\n\t\tpayload = await payload.text()\n\t}\n\tif (isString(payload)) {\n\t\ttry {\n\t\t\treturn payload.length === 0 ? {} : JSON.parse(payload)\n\t\t} catch {\n\t\t\treturn { Message: payload }\n\t\t}\n\t}\n\treturn payload\n}\n"],"mappings":";;;;;;;;;AAUA,eAAsB,iBAAiB,MAAiC;CACvE,IAAI,UAAmB;CACvB,IAAI,OAAO,SAAS,eAAe,mBAAmB,MACrD,UAAU,MAAM,QAAQ,KAAK;CAE9B,IAAI,SAAS,OAAO,GACnB,IAAI;EACH,OAAO,QAAQ,WAAW,IAAI,CAAC,IAAI,KAAK,MAAM,OAAO;CACtD,QAAQ;EACP,OAAO,EAAE,SAAS,QAAQ;CAC3B;CAED,OAAO;AACR"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { t as ToolError } from "./errors-DoSpNHvs.js";
|
|
2
|
+
import { t as HttpService } from "./http-service-DDNCO1s4.js";
|
|
3
|
+
import { AwsClient } from "aws4fetch";
|
|
4
|
+
//#region src/transport/aws-service.ts
|
|
5
|
+
/**
|
|
6
|
+
* SigV4 HTTP client: HttpService + aws4fetch signing on every request.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Same surface as HttpService (query/bytes/get/post/…).
|
|
10
|
+
* Outbound requests are SigV4-signed; retries off (agent owns retry).
|
|
11
|
+
*/
|
|
12
|
+
var AwsService = class extends HttpService {
|
|
13
|
+
#aws;
|
|
14
|
+
#label;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
const { accessKeyId, secretAccessKey, region, service, sessionToken, fetch: userFetch, label: userLabel, ...http } = options;
|
|
17
|
+
const label = userLabel ?? service.toUpperCase();
|
|
18
|
+
const aws = new AwsClient({
|
|
19
|
+
accessKeyId,
|
|
20
|
+
secretAccessKey,
|
|
21
|
+
region,
|
|
22
|
+
service,
|
|
23
|
+
retries: 0,
|
|
24
|
+
...sessionToken && { sessionToken }
|
|
25
|
+
});
|
|
26
|
+
const baseFetch = userFetch ?? globalThis.fetch;
|
|
27
|
+
const fetch = async (input, init) => baseFetch(await aws.sign(input, init));
|
|
28
|
+
super({
|
|
29
|
+
...http,
|
|
30
|
+
fetch,
|
|
31
|
+
label
|
|
32
|
+
});
|
|
33
|
+
this.#aws = aws;
|
|
34
|
+
this.#label = label;
|
|
35
|
+
}
|
|
36
|
+
/** Query-string presign (does not perform the request). */
|
|
37
|
+
async sign(url, options = {}) {
|
|
38
|
+
const method = options.method ?? "GET";
|
|
39
|
+
try {
|
|
40
|
+
return {
|
|
41
|
+
url: (await this.#aws.sign(url, {
|
|
42
|
+
method,
|
|
43
|
+
aws: { signQuery: options.signQuery ?? true }
|
|
44
|
+
})).url,
|
|
45
|
+
method
|
|
46
|
+
};
|
|
47
|
+
} catch (error) {
|
|
48
|
+
throw new ToolError(`${this.#label} failed to sign URL`, {
|
|
49
|
+
code: "internal",
|
|
50
|
+
cause: error
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
//#endregion
|
|
56
|
+
export { AwsService as t };
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=aws-service-msttbPrz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-service-msttbPrz.js","names":["#aws","#label"],"sources":["../src/transport/aws-service.ts"],"sourcesContent":["/**\n * SigV4 HTTP client: HttpService + aws4fetch signing on every request.\n */\n\nimport { AwsClient } from 'aws4fetch'\n\nimport { ToolError } from '../core/errors'\nimport type { FetchLike } from '../core/types'\nimport { HttpService } from './http-service'\nimport type { HttpServiceOptions } from './http-service'\n\nexport type AwsCredentials = {\n\taccessKeyId: string\n\tsecretAccessKey: string\n\tregion: string\n\t/** AWS service name for SigV4 (s3, textract, sqs, …). */\n\tservice: string\n\tsessionToken?: string\n}\n\nexport type AwsServiceOptions = AwsCredentials & HttpServiceOptions\n\nexport type {\n\tHttpCallOptions as AwsCallOptions,\n\tHttpBytesOptions as AwsBytesOptions,\n\tHttpQueryResult as AwsQueryResult,\n\tHttpBytesResult as AwsBytesResult\n} from './http-service'\n\n/**\n * Same surface as HttpService (query/bytes/get/post/…).\n * Outbound requests are SigV4-signed; retries off (agent owns retry).\n */\nexport class AwsService extends HttpService {\n\treadonly #aws: AwsClient\n\treadonly #label: string\n\n\tconstructor(options: AwsServiceOptions) {\n\t\tconst {\n\t\t\taccessKeyId,\n\t\t\tsecretAccessKey,\n\t\t\tregion,\n\t\t\tservice,\n\t\t\tsessionToken,\n\t\t\tfetch: userFetch,\n\t\t\tlabel: userLabel,\n\t\t\t...http\n\t\t} = options\n\t\tconst label = userLabel ?? service.toUpperCase()\n\t\tconst aws = new AwsClient({\n\t\t\taccessKeyId,\n\t\t\tsecretAccessKey,\n\t\t\tregion,\n\t\t\tservice,\n\t\t\tretries: 0,\n\t\t\t...(sessionToken && { sessionToken })\n\t\t})\n\t\tconst baseFetch = userFetch ?? globalThis.fetch\n\t\tconst fetch: FetchLike = async (input, init) => baseFetch(await aws.sign(input, init))\n\t\tsuper({ ...http, fetch, label })\n\t\tthis.#aws = aws\n\t\tthis.#label = label\n\t}\n\n\t/** Query-string presign (does not perform the request). */\n\tasync sign(\n\t\turl: string,\n\t\toptions: { method?: string; signQuery?: boolean } = {}\n\t): Promise<{ url: string; method: string }> {\n\t\tconst method = options.method ?? 'GET'\n\t\ttry {\n\t\t\tconst signed = await this.#aws.sign(url, {\n\t\t\t\tmethod,\n\t\t\t\taws: { signQuery: options.signQuery ?? true }\n\t\t\t})\n\t\t\treturn { url: signed.url, method }\n\t\t} catch (error) {\n\t\t\tthrow new ToolError(`${this.#label} failed to sign URL`, {\n\t\t\t\tcode: 'internal',\n\t\t\t\tcause: error\n\t\t\t})\n\t\t}\n\t}\n}\n"],"mappings":";;;;;;;;;;;AAiCA,IAAa,aAAb,cAAgC,YAAY;CAC3C;CACA;CAEA,YAAY,SAA4B;EACvC,MAAM,EACL,aACA,iBACA,QACA,SACA,cACA,OAAO,WACP,OAAO,WACP,GAAG,SACA;EACJ,MAAM,QAAQ,aAAa,QAAQ,YAAY;EAC/C,MAAM,MAAM,IAAI,UAAU;GACzB;GACA;GACA;GACA;GACA,SAAS;GACT,GAAI,gBAAgB,EAAE,aAAa;EACpC,CAAC;EACD,MAAM,YAAY,aAAa,WAAW;EAC1C,MAAM,QAAmB,OAAO,OAAO,SAAS,UAAU,MAAM,IAAI,KAAK,OAAO,IAAI,CAAC;EACrF,MAAM;GAAE,GAAG;GAAM;GAAO;EAAM,CAAC;EAC/B,KAAKA,OAAO;EACZ,KAAKC,SAAS;CACf;;CAGA,MAAM,KACL,KACA,UAAoD,CAAC,GACV;EAC3C,MAAM,SAAS,QAAQ,UAAU;EACjC,IAAI;GAKH,OAAO;IAAE,MAAK,MAJO,KAAKD,KAAK,KAAK,KAAK;KACxC;KACA,KAAK,EAAE,WAAW,QAAQ,aAAa,KAAK;IAC7C,CAAC,EAAA,CACoB;IAAK;GAAO;EAClC,SAAS,OAAO;GACf,MAAM,IAAI,UAAU,GAAG,KAAKC,OAAO,sBAAsB;IACxD,MAAM;IACN,OAAO;GACR,CAAC;EACF;CACD;AACD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
//#region src/shared/batch.d.ts
|
|
3
|
+
declare const batchItemErrorSchema: z.ZodObject<{
|
|
4
|
+
code: z.ZodString;
|
|
5
|
+
message: z.ZodString;
|
|
6
|
+
retryable: z.ZodOptional<z.ZodBoolean>;
|
|
7
|
+
}, z.core.$strip>;
|
|
8
|
+
type BatchItemError = z.infer<typeof batchItemErrorSchema>;
|
|
9
|
+
type BatchItemResult<TValue> = {
|
|
10
|
+
index: number;
|
|
11
|
+
ok: boolean;
|
|
12
|
+
value?: TValue;
|
|
13
|
+
error?: BatchItemError;
|
|
14
|
+
};
|
|
15
|
+
type BatchResult<TValue> = {
|
|
16
|
+
results: Array<BatchItemResult<TValue>>;
|
|
17
|
+
succeeded: number;
|
|
18
|
+
failed: number;
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
export { BatchResult as t };
|
|
22
|
+
//# sourceMappingURL=batch-BMM5dXqL.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-BMM5dXqL.d.ts","names":[],"sources":["../src/shared/batch.ts"],"mappings":";;cAOa,sBAAoB,EAAA;;;;GAI/B,EAAA,KAAA;KAEU,iBAAiB,EAAE,aAAa;KAEhC,gBAAgB;EAC3B;EACA;EACA,QAAQ;EACR,QAAQ;;KAGG,YAAY;EACvB,SAAS,MAAM,gBAAgB;EAC/B;EACA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { n as isToolError, t as ToolError } from "./errors-DoSpNHvs.js";
|
|
2
|
+
import { isError, sumBy } from "es-toolkit";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import pMap from "p-map";
|
|
5
|
+
import pRetry from "p-retry";
|
|
6
|
+
//#region src/shared/batch.ts
|
|
7
|
+
const batchItemErrorSchema = z.object({
|
|
8
|
+
code: z.string(),
|
|
9
|
+
message: z.string(),
|
|
10
|
+
retryable: z.boolean().optional()
|
|
11
|
+
});
|
|
12
|
+
function batchResultSchema(valueSchema) {
|
|
13
|
+
return z.object({
|
|
14
|
+
results: z.array(z.object({
|
|
15
|
+
index: z.int(),
|
|
16
|
+
ok: z.boolean(),
|
|
17
|
+
value: valueSchema.optional(),
|
|
18
|
+
error: batchItemErrorSchema.optional()
|
|
19
|
+
})),
|
|
20
|
+
succeeded: z.int(),
|
|
21
|
+
failed: z.int()
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/** p-map + optional p-retry. Partial failures do not abort the batch. */
|
|
25
|
+
async function runBatchItems(items, runOne, { concurrency = 1, retries = 0 } = {}) {
|
|
26
|
+
const results = await pMap(items, async (item, index) => {
|
|
27
|
+
try {
|
|
28
|
+
const run = () => runOne(item, index);
|
|
29
|
+
return {
|
|
30
|
+
index,
|
|
31
|
+
ok: true,
|
|
32
|
+
value: retries === 0 ? await run() : await pRetry(run, {
|
|
33
|
+
retries,
|
|
34
|
+
minTimeout: 250,
|
|
35
|
+
shouldRetry: ({ error }) => isToolError(error) && error.retryable
|
|
36
|
+
})
|
|
37
|
+
};
|
|
38
|
+
} catch (error) {
|
|
39
|
+
const err = error instanceof ToolError ? error : new ToolError(isError(error) ? error.message : "Batch item failed", {
|
|
40
|
+
code: "internal",
|
|
41
|
+
cause: error
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
index,
|
|
45
|
+
ok: false,
|
|
46
|
+
error: {
|
|
47
|
+
code: err.code,
|
|
48
|
+
message: err.message,
|
|
49
|
+
retryable: err.retryable
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}, {
|
|
54
|
+
concurrency,
|
|
55
|
+
stopOnError: false
|
|
56
|
+
});
|
|
57
|
+
const succeeded = sumBy(results, (r) => r.ok ? 1 : 0);
|
|
58
|
+
return {
|
|
59
|
+
results,
|
|
60
|
+
succeeded,
|
|
61
|
+
failed: results.length - succeeded
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//#endregion
|
|
65
|
+
export { runBatchItems as n, batchResultSchema as t };
|
|
66
|
+
|
|
67
|
+
//# sourceMappingURL=batch-Co1ujeAW.js.map
|