@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 @@
|
|
|
1
|
+
{"version":3,"file":"client-CCKGsTeI.js","names":["#auth","#fetch","#signal","#session","#refreshIfNeeded","#expiresAtMs","#refresh","#mint","#auth","#options","#spectrum","#grpcAddress","#sdk","#im","#ready","#createSdk"],"sources":["../src/vendors/imessage/contracts.ts","../src/vendors/imessage/domain.ts","../src/vendors/imessage/spectrum-cloud.ts","../src/vendors/imessage/client.ts"],"sourcesContent":["import { z } from 'zod'\n\n/**\n * Host auth for Photon iMessage over **gRPC** (Node/Bun only), aligned with spectrum-ts cloud.\n *\n * Two layers (do not conflate):\n * 1. **Spectrum Cloud** — `project_id` + `project_secret` → temporary tokens\n * (`POST /projects/{id}/imessage/tokens`), then gRPC to Photon’s managed hosts.\n * 2. **Direct gRPC** — `address` + temporary `token` when the host already has line credentials\n * (same shape as spectrum-ts explicit `clients[]`).\n *\n * Flat object (not a Zod union) so seams can `.extend` for `provider` / `storage`.\n *\n * @see https://github.com/photon-hq/spectrum-ts/blob/main/packages/imessage/src/auth.ts\n * @see https://github.com/photon-hq/advanced-imessage-ts\n */\nexport const imessageAuthSchema = z\n\t.object({\n\t\t/** Spectrum Cloud project id (with project_secret). Preferred production path. */\n\t\tproject_id: z.string().min(1).optional().describe('Spectrum / Photon project id'),\n\t\tproject_secret: z\n\t\t\t.string()\n\t\t\t.min(1)\n\t\t\t.optional()\n\t\t\t.describe('Spectrum / Photon project secret (Basic auth to Spectrum Cloud)'),\n\t\t/**\n\t\t * gRPC host:port for direct line access (e.g. imessage.spectrum.photon.codes:443 or\n\t\t * {instanceId}.imsg.photon.codes:443). Required with `token`; omitted when using Spectrum Cloud\n\t\t * (address is derived like spectrum-ts).\n\t\t */\n\t\taddress: z.string().min(1).optional().describe('gRPC host:port for direct Advanced iMessage connection'),\n\t\t/** Temporary iMessage bearer (not the project secret). Required for direct gRPC; Spectrum mints this. */\n\t\ttoken: z.string().min(1).optional().describe('Temporary iMessage gRPC bearer token'),\n\t\t/**\n\t\t * Dedicated instance id. With Spectrum Cloud multi-instance responses, required to pick a line;\n\t\t * gRPC address becomes `{server}.imsg.photon.codes:443`.\n\t\t */\n\t\tserver: z.string().min(1).optional().describe('Dedicated iMessage instance id (Spectrum dedicated routing)'),\n\t\tspectrum_cloud_url: z.url().optional().describe('Spectrum Cloud origin (default https://spectrum.photon.codes)'),\n\t\t/**\n\t\t * Override shared gRPC host (spectrum-ts `SPECTRUM_IMESSAGE_ADDRESS`).\n\t\t * Default `imessage.spectrum.photon.codes:443`.\n\t\t */\n\t\tspectrum_imessage_address: z\n\t\t\t.string()\n\t\t\t.min(1)\n\t\t\t.optional()\n\t\t\t.describe('Shared gRPC host override (default imessage.spectrum.photon.codes:443)'),\n\t\ttls: z.boolean().optional().describe('gRPC TLS (default true; set false only for local plaintext)')\n\t})\n\t.superRefine((value, ctx) => {\n\t\tconst hasProjectId = Boolean(value.project_id)\n\t\tconst hasProjectSecret = Boolean(value.project_secret)\n\t\tif (hasProjectId !== hasProjectSecret) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: 'custom',\n\t\t\t\tmessage: 'project_id and project_secret must be provided together for Spectrum Cloud auth'\n\t\t\t})\n\t\t}\n\t\tif (hasProjectId) return\n\t\tif (!value.token || !value.address) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: 'custom',\n\t\t\t\tmessage:\n\t\t\t\t\t'Provide project_id + project_secret (Spectrum Cloud) or address + token (direct gRPC, spectrum-ts clients shape)'\n\t\t\t})\n\t\t}\n\t})\n\nexport type ImessageAuth = z.infer<typeof imessageAuthSchema>\n\nexport type ImessageSpectrumAuth = ImessageAuth & {\n\tproject_id: string\n\tproject_secret: string\n}\n\n/** Direct gRPC line credentials (host already minted a token). */\nexport type ImessageGrpcAuth = ImessageAuth & {\n\taddress: string\n\ttoken: string\n}\n\nexport function isImessageSpectrumAuth(auth: ImessageAuth): auth is ImessageSpectrumAuth {\n\treturn Boolean(auth.project_id && auth.project_secret)\n}\n\n/** Aliases for hosts that want a named schema export (same base + refine). */\nexport const imessageSpectrumAuthSchema = imessageAuthSchema\nexport const imessageGrpcAuthSchema = imessageAuthSchema\n/** @deprecated Use imessageGrpcAuthSchema — pack is gRPC-only. */\nexport const imessageMiddlewareAuthSchema = imessageAuthSchema\n\nexport const imessageChatActionSchema = z.enum([\n\t'typing',\n\t'upload_photo',\n\t'record_video',\n\t'upload_video',\n\t'record_voice',\n\t'upload_voice',\n\t'upload_document',\n\t'choose_sticker',\n\t'find_location',\n\t'record_video_note',\n\t'upload_video_note'\n])\n\nexport const imessageSendTextInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('iMessage chat guid (e.g. any;-;alice@example.com)'),\n\ttext: z.string().min(1).describe('Message text')\n})\n\nexport const imessageMessageOutputSchema = z.object({\n\tmessage_id: z.string().min(1).describe('Message guid (provider id for journaling)'),\n\tspace_id: z.string().describe('Chat guid (same as chat_id)')\n})\n\nexport const imessageEditTextInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('iMessage chat guid'),\n\tmessage_id: z.string().min(1).describe('Message guid to edit'),\n\ttext: z.string().min(1).describe('Replacement text')\n})\n\nexport const imessageSendChatActionInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('iMessage chat guid'),\n\taction: imessageChatActionSchema.describe('Chat action; non-typing values map to typing start')\n})\n\nexport const imessageSetReactionInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('iMessage chat guid'),\n\tmessage_id: z.string().min(1).describe('Message guid to react to'),\n\temoji: z\n\t\t.string()\n\t\t.min(1)\n\t\t.max(64)\n\t\t.describe(\n\t\t\t'Tapback name (love, like, dislike, laugh, emphasize, question) or an emoji character (maps to kind emoji)'\n\t\t)\n})\n\nexport const imessageUnsendInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('iMessage chat guid'),\n\tmessage_id: z.string().min(1).describe('Message guid to unsend')\n})\n\nexport const imessageReadInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('iMessage chat guid'),\n\tmessage_id: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe('Optional; Advanced iMessage markRead marks the whole chat (field kept for seam parity)')\n})\n\nexport const imessageOkOutputSchema = z.object({\n\tok: z.boolean(),\n\tspace_id: z.string().optional()\n})\n\nexport const MAX_MEDIA_BYTES = 20 * 1024 * 1024\n\n/**\n * Clear a reaction via setReaction(isSet=false).\n * `message_id` is the **target** message guid (not a reaction-message id).\n * `emoji` must match what was set (tapback name or emoji character).\n */\nexport const imessageClearReactionInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('iMessage chat guid'),\n\tmessage_id: z.string().min(1).describe('Target message guid that was reacted to'),\n\temoji: z.string().min(1).max(64).describe('Same tapback name or emoji used when setting the reaction')\n})\n\nexport const imessageSendMediaInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('iMessage chat guid'),\n\tkind: z.enum(['photo', 'document']).describe('Media kind (presentation)'),\n\tbody_base64: z.string().min(1).describe('File body as base64'),\n\tfile_name: z.string().min(1).describe('File name including extension'),\n\tcaption: z.string().optional().describe('Optional caption sent as a follow-up text message'),\n\tcontent_type: z.string().optional().describe('Optional MIME type; inferred from file_name when omitted')\n})\n\nexport const imessageDownloadFileInputSchema = z.object({\n\tfile_id: z.string().min(1).describe('Attachment guid (from inbound payload or upload)'),\n\tfile_name: z.string().min(1).optional().describe('Preferred file name for the download result'),\n\tchat_id: z.string().min(1).optional().describe('Chat guid (optional for attachment download; kept for seam parity)')\n})\n\nexport const imessageDownloadFileOutputSchema = z.object({\n\tfile_name: z.string(),\n\tfile_size: z.number().optional(),\n\tbody_base64: z.string().describe('Downloaded file body as base64')\n})\n\n/**\n * Create (or resolve) a chat via Photon `chats.create`.\n * Host-only proactive / contact-delivery path — not auto-run before sendText.\n * One address = 1:1; two or more = group.\n */\nexport const imessageEnsureChatInputSchema = z.object({\n\taddresses: z\n\t\t.array(z.string().min(1))\n\t\t.min(1)\n\t\t.describe('Peer phone number(s) or email(s). One address creates a 1:1 chat; two or more create a group'),\n\tmessage: z.string().min(1).optional().describe('Optional opening text sent in the same create call'),\n\tclient_message_id: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe('Optional idempotency key for chat creation and the optional opening send')\n})\n\nexport const imessageEnsureChatOutputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Chat guid for later send, edit, react, or unsend'),\n\tmessage_id: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe('Guid of the opening message when message was provided and the server returned one')\n})\n\nexport type ImessageSendTextInput = z.infer<typeof imessageSendTextInputSchema>\nexport type ImessageMessageOutput = z.infer<typeof imessageMessageOutputSchema>\nexport type ImessageEditTextInput = z.infer<typeof imessageEditTextInputSchema>\nexport type ImessageSendChatActionInput = z.infer<typeof imessageSendChatActionInputSchema>\nexport type ImessageSetReactionInput = z.infer<typeof imessageSetReactionInputSchema>\nexport type ImessageUnsendInput = z.infer<typeof imessageUnsendInputSchema>\nexport type ImessageReadInput = z.infer<typeof imessageReadInputSchema>\nexport type ImessageClearReactionInput = z.infer<typeof imessageClearReactionInputSchema>\nexport type ImessageSendMediaInput = z.infer<typeof imessageSendMediaInputSchema>\nexport type ImessageDownloadFileInput = z.infer<typeof imessageDownloadFileInputSchema>\nexport type ImessageDownloadFileOutput = z.infer<typeof imessageDownloadFileOutputSchema>\nexport type ImessageEnsureChatInput = z.infer<typeof imessageEnsureChatInputSchema>\nexport type ImessageEnsureChatOutput = z.infer<typeof imessageEnsureChatOutputSchema>\n","/**\n * Advanced iMessage helpers (no transport).\n * Maps package shapes ↔ Advanced iMessage SDK types.\n *\n * Error classes are matched by name (not `instanceof`) so this module does not\n * statically import `@photon-ai/advanced-imessage/grpc` (Node-only peers).\n */\n\nimport type { SettableMessageReaction } from '@photon-ai/advanced-imessage/grpc'\n\nimport { isToolError, ToolError } from '../../core/errors'\nimport { isPlainObject } from 'es-toolkit'\nimport { base64ToBytes, bytesToBase64 } from '../../shared/bytes'\nimport type { ImessageDownloadFileInput, ImessageDownloadFileOutput, ImessageMessageOutput } from './contracts'\nimport { MAX_MEDIA_BYTES } from './contracts'\n\nexport type ImessageFailureKind = 'definite_rejection' | 'outcome_unknown'\n\nexport class ImessageClientError extends ToolError {\n\treadonly failureKind: ImessageFailureKind\n\n\tconstructor(input: {\n\t\tmessage: string\n\t\tfailureKind: ImessageFailureKind\n\t\tcode?: ToolError['code']\n\t\tcause?: unknown\n\t\tdetails?: Record<string, unknown>\n\t}) {\n\t\tsuper(input.message, {\n\t\t\tcode: input.code ?? 'upstream',\n\t\t\tretryable: input.failureKind === 'outcome_unknown',\n\t\t\tcause: input.cause,\n\t\t\tdetails: {\n\t\t\t\tfailure_kind: input.failureKind,\n\t\t\t\t...input.details\n\t\t\t}\n\t\t})\n\t\tthis.name = 'ImessageClientError'\n\t\tthis.failureKind = input.failureKind\n\t}\n}\n\nexport function isImessageDefiniteRejection(error: unknown): boolean {\n\treturn error instanceof ImessageClientError && error.failureKind === 'definite_rejection'\n}\n\nexport function isImessageOutcomeUnknown(error: unknown): boolean {\n\treturn error instanceof ImessageClientError && error.failureKind === 'outcome_unknown'\n}\n\n/**\n * Map free-form emoji / tapback string to Photon SettableMessageReaction.\n * Known tapback names → kind; anything else → { kind: 'emoji', emoji }.\n */\nexport function toSettableReaction(emoji: string): SettableMessageReaction {\n\tconst trimmed = emoji.trim()\n\tconst lower = trimmed.toLowerCase()\n\tswitch (lower) {\n\t\tcase 'love':\n\t\t\treturn { kind: 'love' }\n\t\tcase 'like':\n\t\t\treturn { kind: 'like' }\n\t\tcase 'dislike':\n\t\t\treturn { kind: 'dislike' }\n\t\tcase 'laugh':\n\t\t\treturn { kind: 'laugh' }\n\t\tcase 'emphasize':\n\t\t\treturn { kind: 'emphasize' }\n\t\tcase 'question':\n\t\t\treturn { kind: 'question' }\n\t\tdefault:\n\t\t\treturn { kind: 'emoji', emoji: trimmed }\n\t}\n}\n\nexport function messageToOutput(\n\tchatId: string,\n\tmessage: { guid: string; chatGuids?: readonly string[] }\n): ImessageMessageOutput {\n\tconst space =\n\t\tmessage.chatGuids && message.chatGuids.length > 0 && message.chatGuids[0] ? message.chatGuids[0] : chatId\n\treturn {\n\t\tmessage_id: message.guid,\n\t\tspace_id: space\n\t}\n}\n\n/** Decode and size-check media base64 for sendMedia. */\nexport function decodeMediaBytes(bodyBase64: string): Uint8Array {\n\tlet bytes: Uint8Array\n\ttry {\n\t\tbytes = base64ToBytes(bodyBase64)\n\t} catch (error) {\n\t\tthrow new ToolError('Invalid base64 body', { code: 'bad_input', cause: error })\n\t}\n\tif (bytes.byteLength === 0) {\n\t\tthrow new ToolError('Media body must not be empty', { code: 'bad_input' })\n\t}\n\tif (bytes.byteLength > MAX_MEDIA_BYTES) {\n\t\tthrow new ToolError('Media exceeds 20 MiB limit', {\n\t\t\tcode: 'too_large',\n\t\t\tdetails: { max_bytes: MAX_MEDIA_BYTES, content_length: bytes.byteLength }\n\t\t})\n\t}\n\treturn bytes\n}\n\nexport function parseDownloadChunks(\n\tinput: ImessageDownloadFileInput,\n\tchunks: readonly { type: string; data?: Uint8Array; info?: { fileName?: string; totalBytes?: number } }[]\n): ImessageDownloadFileOutput {\n\tconst parts: Uint8Array[] = []\n\tlet fileName: string | undefined\n\tlet totalBytes: number | undefined\n\tfor (const frame of chunks) {\n\t\tif (frame.type === 'header' && frame.info) {\n\t\t\tif (frame.info.fileName) fileName = frame.info.fileName\n\t\t\tif (typeof frame.info.totalBytes === 'number') totalBytes = frame.info.totalBytes\n\t\t}\n\t\tif (frame.type === 'primaryChunk' && frame.data) {\n\t\t\tparts.push(frame.data)\n\t\t}\n\t}\n\tconst total = parts.reduce((n, p) => n + p.byteLength, 0)\n\tconst merged = new Uint8Array(total)\n\tlet offset = 0\n\tfor (const p of parts) {\n\t\tmerged.set(p, offset)\n\t\toffset += p.byteLength\n\t}\n\treturn {\n\t\tfile_name: input.file_name ?? fileName ?? input.file_id,\n\t\t...(totalBytes !== undefined ? { file_size: totalBytes } : total > 0 ? { file_size: total } : {}),\n\t\tbody_base64: bytesToBase64(merged)\n\t}\n}\n\nfunction errorName(error: unknown): string | undefined {\n\treturn error instanceof Error ? error.name : undefined\n}\n\nfunction sdkCode(error: unknown): string | undefined {\n\tif (!isPlainObject(error)) return undefined\n\tconst code = error['code']\n\treturn typeof code === 'string' ? code : undefined\n}\n\nfunction sdkRetryable(error: unknown): boolean | undefined {\n\tif (!isPlainObject(error)) return undefined\n\tconst retryable = error['retryable']\n\treturn typeof retryable === 'boolean' ? retryable : undefined\n}\n\n/** Map Photon SDK errors to ImessageClientError (definite vs unknown). */\nexport function mapSdkError(label: string, error: unknown): never {\n\tif (error instanceof ImessageClientError) throw error\n\t// Preserve Spectrum / auth preflight ToolErrors (do not reclassify as SDK upstream).\n\tif (isToolError(error)) throw error\n\n\tconst name = errorName(error)\n\tif (name === 'AuthenticationError') {\n\t\tthrow new ImessageClientError({\n\t\t\tmessage: (error instanceof Error && error.message) || `${label}: authentication failed`,\n\t\t\tfailureKind: 'definite_rejection',\n\t\t\tcode: 'bad_auth',\n\t\t\tcause: error\n\t\t})\n\t}\n\tif (name === 'NotFoundError') {\n\t\tthrow new ImessageClientError({\n\t\t\tmessage: (error instanceof Error && error.message) || `${label}: not found`,\n\t\t\tfailureKind: 'definite_rejection',\n\t\t\tcode: 'not_found',\n\t\t\tcause: error\n\t\t})\n\t}\n\tif (name === 'ValidationError') {\n\t\tthrow new ImessageClientError({\n\t\t\tmessage: (error instanceof Error && error.message) || `${label}: invalid request`,\n\t\t\tfailureKind: 'definite_rejection',\n\t\t\tcode: 'bad_input',\n\t\t\tcause: error\n\t\t})\n\t}\n\tif (name === 'RateLimitError') {\n\t\tthrow new ImessageClientError({\n\t\t\tmessage: (error instanceof Error && error.message) || `${label}: rate limited`,\n\t\t\tfailureKind: 'outcome_unknown',\n\t\t\tcode: 'rate_limited',\n\t\t\tcause: error\n\t\t})\n\t}\n\tif (name === 'ConnectionError') {\n\t\tthrow new ImessageClientError({\n\t\t\tmessage: (error instanceof Error && error.message) || `${label}: connection failed`,\n\t\t\tfailureKind: 'outcome_unknown',\n\t\t\tcode: 'upstream',\n\t\t\tcause: error\n\t\t})\n\t}\n\tif (name === 'IMessageError' || sdkCode(error) !== undefined) {\n\t\tconst retryable = sdkRetryable(error) === true\n\t\tthrow new ImessageClientError({\n\t\t\tmessage: (error instanceof Error && error.message) || `${label} failed`,\n\t\t\tfailureKind: retryable ? 'outcome_unknown' : 'definite_rejection',\n\t\t\tcode: 'upstream',\n\t\t\tcause: error,\n\t\t\tdetails: { ...(sdkCode(error) && { sdk_code: sdkCode(error) }) }\n\t\t})\n\t}\n\n\tconst message = error instanceof Error ? error.message : `${label} request failed`\n\tthrow new ImessageClientError({\n\t\tmessage,\n\t\tfailureKind: 'outcome_unknown',\n\t\tcause: error\n\t})\n}\n","/**\n * Spectrum Cloud iMessage token exchange + gRPC host resolution (spectrum-ts cloud path).\n *\n * project_id + project_secret → POST /projects/{id}/imessage/tokens → temporary bearer\n * (+ dedicated instance map) → createGrpcClient({ address, token }).\n *\n * @see https://github.com/photon-hq/spectrum-ts/blob/main/packages/core/src/utils/cloud.ts\n * @see https://github.com/photon-hq/spectrum-ts/blob/main/packages/imessage/src/auth.ts\n */\n\nimport { isPlainObject, isString } from 'es-toolkit'\n\nimport { ToolError } from '../../core/errors'\nimport { HttpService } from '../../transport/http-service'\nimport type { FetchLike } from '../../core/types'\nimport type { ImessageSpectrumAuth } from './contracts'\n\nexport const DEFAULT_SPECTRUM_CLOUD_URL = 'https://spectrum.photon.codes'\n\n/**\n * Shared-line gRPC host used by spectrum-ts (`SPECTRUM_IMESSAGE_ADDRESS` override).\n * @see packages/imessage/src/auth.ts in spectrum-ts\n */\nexport const DEFAULT_SPECTRUM_IMESSAGE_GRPC_ADDRESS = 'imessage.spectrum.photon.codes:443'\n\n/** Refresh when less than this many ms remain (or 10% of TTL, whichever is larger, capped by TTL). */\nconst REFRESH_SKEW_MS = 60_000\n\nexport type SpectrumSharedTokenData = {\n\ttype: 'shared'\n\ttoken: string\n\texpiresIn: number\n}\n\nexport type SpectrumDedicatedTokenData = {\n\ttype: 'dedicated'\n\tauth: Record<string, string>\n\tnumbers: Record<string, string | null>\n\texpiresIn: number\n}\n\nexport type SpectrumImessageTokenData = SpectrumSharedTokenData | SpectrumDedicatedTokenData\n\nexport type ResolvedSpectrumSession = {\n\t/** Temporary Advanced iMessage bearer. */\n\ttoken: string\n\t/** Dedicated instance id for x-photon-server; omit for shared. */\n\tserver?: string\n\texpiresIn: number\n\ttype: 'shared' | 'dedicated'\n\t/** Phone numbers by instance when dedicated (informational). */\n\tnumbers?: Record<string, string | null>\n}\n\nexport type SpectrumTokenSourceOptions = {\n\t/** Must include project_id + project_secret (Spectrum path). */\n\tauth: ImessageSpectrumAuth\n\tfetch?: FetchLike | undefined\n\tsignal?: AbortSignal | undefined\n}\n\nfunction basicAuthHeader(projectId: string, projectSecret: string): string {\n\tconst raw = `${projectId}:${projectSecret}`\n\tconst encoded = typeof btoa === 'function' ? btoa(raw) : Buffer.from(raw, 'utf8').toString('base64')\n\treturn `Basic ${encoded}`\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn isPlainObject(value) ? value : undefined\n}\n\nfunction parseExpiresIn(value: unknown): number {\n\tif (typeof value === 'number' && Number.isFinite(value) && value > 0) return Math.floor(value)\n\tif (isString(value) && /^\\d+$/.test(value)) {\n\t\tconst n = Number(value)\n\t\tif (n > 0) return n\n\t}\n\t// Conservative default if the cloud omits expiresIn\n\treturn 3_600\n}\n\n/**\n * Parse Spectrum Cloud success body (`{ succeed, data }` or bare token payload).\n */\nexport function parseSpectrumTokenResponse(body: unknown): SpectrumImessageTokenData {\n\tconst root = asRecord(body)\n\tif (!root) {\n\t\tthrow new ToolError('Spectrum Cloud returned a non-object token response', { code: 'upstream' })\n\t}\n\n\tconst payload = asRecord(root['data']) ?? root\n\tconst type = payload['type']\n\n\tif (type === 'shared') {\n\t\tconst token = payload['token']\n\t\tif (!isString(token) || token.length === 0) {\n\t\t\tthrow new ToolError('Spectrum Cloud shared token response missing token', { code: 'upstream' })\n\t\t}\n\t\treturn { type: 'shared', token, expiresIn: parseExpiresIn(payload['expiresIn'] ?? payload['expires_in']) }\n\t}\n\n\tif (type === 'dedicated') {\n\t\tconst authRaw = asRecord(payload['auth'])\n\t\tif (!authRaw) {\n\t\t\tthrow new ToolError('Spectrum Cloud dedicated token response missing auth map', { code: 'upstream' })\n\t\t}\n\t\tconst auth: Record<string, string> = {}\n\t\tfor (const [instanceId, token] of Object.entries(authRaw)) {\n\t\t\tif (isString(token) && token.length > 0) auth[instanceId] = token\n\t\t}\n\t\tif (Object.keys(auth).length === 0) {\n\t\t\tthrow new ToolError('Spectrum Cloud dedicated token response has no instance tokens', {\n\t\t\t\tcode: 'upstream'\n\t\t\t})\n\t\t}\n\t\tconst numbersRaw = asRecord(payload['numbers'])\n\t\tconst numbers: Record<string, string | null> = {}\n\t\tif (numbersRaw) {\n\t\t\tfor (const [instanceId, phone] of Object.entries(numbersRaw)) {\n\t\t\t\tnumbers[instanceId] = isString(phone) ? phone : null\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\ttype: 'dedicated',\n\t\t\tauth,\n\t\t\tnumbers,\n\t\t\texpiresIn: parseExpiresIn(payload['expiresIn'] ?? payload['expires_in'])\n\t\t}\n\t}\n\n\tthrow new ToolError('Spectrum Cloud token response missing type shared|dedicated', {\n\t\tcode: 'upstream',\n\t\tdetails: { type: type ?? null }\n\t})\n}\n\n/**\n * Map Spectrum token payload + optional preferred instance → session fields for createGrpcClient.\n */\nexport function resolveSpectrumSession(\n\tdata: SpectrumImessageTokenData,\n\tpreferredServer: string | undefined\n): ResolvedSpectrumSession {\n\tif (data.type === 'shared') {\n\t\tif (preferredServer) {\n\t\t\tthrow new ToolError('Spectrum Cloud returned shared routing; server (dedicated instance id) must be omitted', {\n\t\t\t\tcode: 'bad_auth',\n\t\t\t\tdetails: { server: preferredServer }\n\t\t\t})\n\t\t}\n\t\treturn { type: 'shared', token: data.token, expiresIn: data.expiresIn }\n\t}\n\n\tconst instanceIds = Object.keys(data.auth)\n\tconst server = preferredServer ?? (instanceIds.length === 1 ? instanceIds[0] : undefined)\n\tif (!server) {\n\t\tthrow new ToolError('Spectrum Cloud returned multiple dedicated instances; set auth.server to the instance id', {\n\t\t\tcode: 'bad_auth',\n\t\t\tdetails: { instance_ids: instanceIds }\n\t\t})\n\t}\n\tconst token = data.auth[server]\n\tif (!token) {\n\t\tthrow new ToolError('Spectrum Cloud dedicated response has no token for auth.server', {\n\t\t\tcode: 'bad_auth',\n\t\t\tdetails: { server, instance_ids: instanceIds }\n\t\t})\n\t}\n\treturn {\n\t\ttype: 'dedicated',\n\t\ttoken,\n\t\tserver,\n\t\texpiresIn: data.expiresIn,\n\t\t...(Object.keys(data.numbers).length > 0 && { numbers: data.numbers })\n\t}\n}\n\n/**\n * gRPC `address` spectrum-ts uses after token mint.\n * - shared → `imessage.spectrum.photon.codes:443` (or `spectrum_imessage_address`)\n * - dedicated → `{instanceId}.imsg.photon.codes:443`\n */\nexport function spectrumImessageGrpcAddress(\n\tsession: ResolvedSpectrumSession,\n\toptions: { sharedAddress?: string | undefined } = {}\n): string {\n\tif (session.type === 'dedicated' && session.server) {\n\t\treturn `${session.server}.imsg.photon.codes:443`\n\t}\n\treturn options.sharedAddress?.trim() || DEFAULT_SPECTRUM_IMESSAGE_GRPC_ADDRESS\n}\n\nexport async function issueImessageTokens(\n\tauth: ImessageSpectrumAuth,\n\toptions: { fetch?: FetchLike; signal?: AbortSignal } = {}\n): Promise<SpectrumImessageTokenData> {\n\tconst baseURL = (auth.spectrum_cloud_url ?? DEFAULT_SPECTRUM_CLOUD_URL).replace(/\\/$/, '')\n\tconst http = new HttpService({\n\t\tbaseURL,\n\t\theaders: {\n\t\t\tAuthorization: basicAuthHeader(auth.project_id, auth.project_secret),\n\t\t\tAccept: 'application/json'\n\t\t},\n\t\tlabel: 'Spectrum Cloud',\n\t\t...(options.fetch && { fetch: options.fetch }),\n\t\t...(options.signal && { signal: options.signal })\n\t})\n\n\tconst path = `/projects/${encodeURIComponent(auth.project_id)}/imessage/tokens`\n\ttry {\n\t\tconst { data } = await http.post(path, undefined, { label: 'Spectrum Cloud iMessage tokens' })\n\t\treturn parseSpectrumTokenResponse(data)\n\t} catch (error) {\n\t\tif (error instanceof ToolError) throw error\n\t\tthrow new ToolError('Spectrum Cloud iMessage token exchange failed', {\n\t\t\tcode: 'upstream',\n\t\t\tcause: error\n\t\t})\n\t}\n}\n\n/**\n * Caches Spectrum temporary tokens and refreshes before expiry.\n * `getBearer` is safe to pass as createGrpcClient `token: async () => …`.\n */\nexport class SpectrumImessageTokenSource {\n\treadonly #auth: ImessageSpectrumAuth\n\treadonly #fetch: FetchLike | undefined\n\treadonly #signal: AbortSignal | undefined\n\n\t#session: ResolvedSpectrumSession | undefined\n\t#expiresAtMs = 0\n\t#refresh: Promise<ResolvedSpectrumSession> | undefined\n\n\tconstructor(options: SpectrumTokenSourceOptions) {\n\t\tthis.#auth = options.auth\n\t\tthis.#fetch = options.fetch\n\t\tthis.#signal = options.signal\n\t}\n\n\t/** Dedicated instance id after the first successful mint (undefined for shared). */\n\tget server(): string | undefined {\n\t\treturn this.#session?.server\n\t}\n\n\t/** gRPC host:port for the current session (spectrum-ts routing). */\n\tget grpcAddress(): string | undefined {\n\t\tif (!this.#session) return undefined\n\t\treturn spectrumImessageGrpcAddress(this.#session, {\n\t\t\tsharedAddress: this.#auth.spectrum_imessage_address\n\t\t})\n\t}\n\n\t/** Ensure a session exists; returns routing fields for createGrpcClient. */\n\tasync ensureReady(): Promise<ResolvedSpectrumSession> {\n\t\treturn this.#refreshIfNeeded()\n\t}\n\n\t/** Temporary bearer for Advanced iMessage gRPC. */\n\tasync getBearer(): Promise<string> {\n\t\tconst session = await this.#refreshIfNeeded()\n\t\treturn session.token\n\t}\n\n\tasync #refreshIfNeeded(): Promise<ResolvedSpectrumSession> {\n\t\tconst now = Date.now()\n\t\tif (this.#session && now < this.#expiresAtMs) {\n\t\t\treturn this.#session\n\t\t}\n\t\tif (!this.#refresh) {\n\t\t\tthis.#refresh = this.#mint()\n\t\t\t\t.then((session) => {\n\t\t\t\t\tthis.#session = session\n\t\t\t\t\tconst skew = Math.min(REFRESH_SKEW_MS, Math.max(5_000, Math.floor(session.expiresIn * 100)))\n\t\t\t\t\tthis.#expiresAtMs = Date.now() + Math.max(1_000, session.expiresIn * 1_000 - skew)\n\t\t\t\t\treturn session\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tthis.#refresh = undefined\n\t\t\t\t})\n\t\t}\n\t\treturn this.#refresh\n\t}\n\n\tasync #mint(): Promise<ResolvedSpectrumSession> {\n\t\tconst data = await issueImessageTokens(this.#auth, {\n\t\t\t...(this.#fetch && { fetch: this.#fetch }),\n\t\t\t...(this.#signal && { signal: this.#signal })\n\t\t})\n\t\t// Keep the same dedicated instance across refreshes when we already resolved one.\n\t\tconst preferred = this.#session?.server ?? this.#auth.server\n\t\treturn resolveSpectrumSession(data, preferred)\n\t}\n}\n","/**\n * iMessage vendor client via @photon-ai/advanced-imessage **gRPC** (Node/Bun only).\n * Host: `new ImessageClient(auth)`. Agent tools: `fromContext(ctx)`.\n *\n * Auth (spectrum-ts cloud shape):\n * - Spectrum Cloud: `project_id` + `project_secret` → temporary tokens → managed gRPC hosts\n * - Direct gRPC: `address` + `token` (explicit line, spectrum-ts `clients[]` shape)\n *\n * Requires optional peers: `nice-grpc`, `nice-grpc-common`, `@grpc/grpc-js`.\n * @see https://github.com/photon-hq/spectrum-ts/blob/main/packages/imessage/src/auth.ts\n * @see https://github.com/photon-hq/advanced-imessage-ts\n */\n\nimport type { AdvancedIMessage } from '@photon-ai/advanced-imessage/grpc'\n\nimport { ToolError } from '../../core/errors'\nimport { requireAuth } from '../../core/provider'\nimport type { FetchLike, ToolContext } from '../../core/types'\nimport type {\n\tImessageAuth,\n\tImessageClearReactionInput,\n\tImessageDownloadFileInput,\n\tImessageDownloadFileOutput,\n\tImessageEditTextInput,\n\tImessageEnsureChatInput,\n\tImessageEnsureChatOutput,\n\tImessageMessageOutput,\n\tImessageReadInput,\n\tImessageSendChatActionInput,\n\tImessageSendMediaInput,\n\tImessageSendTextInput,\n\tImessageSetReactionInput,\n\tImessageUnsendInput\n} from './contracts'\nimport { imessageAuthSchema, isImessageSpectrumAuth } from './contracts'\nimport {\n\tdecodeMediaBytes,\n\tisImessageDefiniteRejection,\n\tisImessageOutcomeUnknown,\n\tImessageClientError,\n\tmapSdkError,\n\tmessageToOutput,\n\tparseDownloadChunks,\n\ttoSettableReaction\n} from './domain'\nimport { spectrumImessageGrpcAddress, SpectrumImessageTokenSource } from './spectrum-cloud'\n\n/**\n * Spectrum Cloud token HTTP uses injectable `fetch` (tests).\n * gRPC plane uses native Node/Bun channels (not Workers/edge).\n */\nexport type ImessageClientOptions = {\n\tfetch?: FetchLike | undefined\n\tsignal?: AbortSignal | undefined\n}\n\nexport class ImessageClient {\n\treadonly #auth: ImessageAuth\n\treadonly #options: ImessageClientOptions\n\t#im: AdvancedIMessage | undefined\n\t#ready: Promise<AdvancedIMessage> | undefined\n\t#spectrum: SpectrumImessageTokenSource | undefined\n\t#grpcAddress: string | undefined\n\n\tconstructor(auth: ImessageAuth, options: ImessageClientOptions = {}) {\n\t\tconst parsed = imessageAuthSchema.safeParse(auth)\n\t\tif (!parsed.success) {\n\t\t\tthrow new ToolError('Invalid iMessage 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\tthis.#auth = parsed.data\n\t\tthis.#options = options\n\t}\n\n\tstatic fromContext(ctx: ToolContext): ImessageClient {\n\t\tconst auth = requireAuth(ctx, imessageAuthSchema)\n\t\treturn new ImessageClient(auth, {\n\t\t\t...(ctx.fetch && { fetch: ctx.fetch }),\n\t\t\t...(ctx.signal && { signal: ctx.signal })\n\t\t})\n\t}\n\n\t/**\n\t * Dedicated instance id after Spectrum mint (undefined for shared / direct gRPC).\n\t * Available after the first outbound call (or after `ready()`).\n\t */\n\tget server(): string | undefined {\n\t\tif (this.#spectrum) return this.#spectrum.server\n\t\tif (!isImessageSpectrumAuth(this.#auth)) return this.#auth.server\n\t\treturn undefined\n\t}\n\n\t/** Resolved gRPC host:port after `ready()` / first call. */\n\tget grpcAddress(): string | undefined {\n\t\treturn this.#grpcAddress ?? this.#spectrum?.grpcAddress\n\t}\n\n\t/** Resolve Spectrum tokens (if needed) and construct the gRPC SDK client. */\n\tasync ready(): Promise<void> {\n\t\tawait this.#sdk()\n\t}\n\n\t/** Release SDK resources. */\n\tasync close(): Promise<void> {\n\t\tif (this.#im) await this.#im.close()\n\t}\n\n\tasync #sdk(): Promise<AdvancedIMessage> {\n\t\tif (this.#im) return this.#im\n\t\t// Clear a failed init so a later call can retry (transient mint/network errors).\n\t\tthis.#ready ??= this.#createSdk().catch((error: unknown) => {\n\t\t\tthis.#ready = undefined\n\t\t\tthrow error\n\t\t})\n\t\tthis.#im = await this.#ready\n\t\treturn this.#im\n\t}\n\n\tasync #createSdk(): Promise<AdvancedIMessage> {\n\t\t// Dynamic import keeps messaging/edge graphs free of gRPC Node peers until call time.\n\t\tconst { createGrpcClient } = await import('@photon-ai/advanced-imessage/grpc')\n\t\tconst auth = this.#auth\n\t\tconst tls = auth.tls !== false\n\n\t\tif (isImessageSpectrumAuth(auth)) {\n\t\t\tconst spectrum = new SpectrumImessageTokenSource({\n\t\t\t\tauth,\n\t\t\t\t...(this.#options.fetch && { fetch: this.#options.fetch }),\n\t\t\t\t...(this.#options.signal && { signal: this.#options.signal })\n\t\t\t})\n\t\t\tthis.#spectrum = spectrum\n\t\t\tconst session = await spectrum.ensureReady()\n\t\t\tconst address = spectrumImessageGrpcAddress(session, {\n\t\t\t\tsharedAddress: auth.spectrum_imessage_address\n\t\t\t})\n\t\t\tthis.#grpcAddress = address\n\t\t\t// Same options spectrum-ts uses for cloud lines.\n\t\t\treturn createGrpcClient({\n\t\t\t\taddress,\n\t\t\t\ttoken: async () => spectrum.getBearer(),\n\t\t\t\ttls: true,\n\t\t\t\tautoIdempotency: true,\n\t\t\t\tretry: true\n\t\t\t})\n\t\t}\n\n\t\tconst token = auth.token\n\t\tconst address = auth.address\n\t\tif (!token || !address) {\n\t\t\tthrow new ToolError(\n\t\t\t\t'iMessage direct gRPC auth requires address and token when Spectrum credentials are omitted',\n\t\t\t\t{\n\t\t\t\t\tcode: 'bad_auth'\n\t\t\t\t}\n\t\t\t)\n\t\t}\n\t\tthis.#grpcAddress = address\n\t\treturn createGrpcClient({\n\t\t\taddress,\n\t\t\ttoken,\n\t\t\ttls,\n\t\t\tautoIdempotency: true,\n\t\t\tretry: true\n\t\t})\n\t}\n\n\t/**\n\t * Create a chat (1:1 or group) via Photon `chats.create`.\n\t * Host-only: call once for contact / proactive delivery, store `chat_id`, then sendText.\n\t * Does **not** run automatically before sendText — most threads already exist from inbound user messages.\n\t */\n\tasync ensureChat(input: ImessageEnsureChatInput): Promise<ImessageEnsureChatOutput> {\n\t\ttry {\n\t\t\tconst im = await this.#sdk()\n\t\t\tconst created = await im.chats.create(input.addresses, {\n\t\t\t\t...(input.message && { message: input.message }),\n\t\t\t\t...(input.client_message_id && { clientMessageId: input.client_message_id })\n\t\t\t})\n\t\t\tconst out: ImessageEnsureChatOutput = { chat_id: created.chat.guid }\n\t\t\tif (created.initialMessage?.guid) {\n\t\t\t\tout.message_id = created.initialMessage.guid\n\t\t\t}\n\t\t\treturn out\n\t\t} catch (error) {\n\t\t\tmapSdkError('iMessage ensureChat', error)\n\t\t}\n\t}\n\n\tasync sendText(input: ImessageSendTextInput): Promise<ImessageMessageOutput> {\n\t\ttry {\n\t\t\tconst im = await this.#sdk()\n\t\t\tconst message = await im.messages.sendText(input.chat_id, input.text)\n\t\t\treturn messageToOutput(input.chat_id, message)\n\t\t} catch (error) {\n\t\t\tmapSdkError('iMessage sendText', error)\n\t\t}\n\t}\n\n\tasync editText(input: ImessageEditTextInput): Promise<ImessageMessageOutput> {\n\t\ttry {\n\t\t\tconst im = await this.#sdk()\n\t\t\tconst message = await im.messages.edit(input.chat_id, input.message_id, input.text)\n\t\t\treturn messageToOutput(input.chat_id, message)\n\t\t} catch (error) {\n\t\t\tmapSdkError('iMessage editText', error)\n\t\t}\n\t}\n\n\t/**\n\t * Non-typing chat actions map to typing start (presentation parity with other channels).\n\t */\n\tasync sendChatAction(input: ImessageSendChatActionInput): Promise<void> {\n\t\ttry {\n\t\t\tconst im = await this.#sdk()\n\t\t\tawait im.chats.setTyping(input.chat_id, true)\n\t\t} catch (error) {\n\t\t\tmapSdkError('iMessage sendChatAction', error)\n\t\t}\n\t}\n\n\tasync stopTyping(input: { chat_id: string }): Promise<void> {\n\t\ttry {\n\t\t\tconst im = await this.#sdk()\n\t\t\tawait im.chats.setTyping(input.chat_id, false)\n\t\t} catch (error) {\n\t\t\tmapSdkError('iMessage stopTyping', error)\n\t\t}\n\t}\n\n\t/**\n\t * Add a tapback/emoji reaction. Returns the resulting message guid (store for journaling).\n\t * Clear with clearReaction using the **same target message_id + emoji** (setReaction isSet=false).\n\t */\n\tasync setReaction(input: ImessageSetReactionInput): Promise<ImessageMessageOutput> {\n\t\ttry {\n\t\t\tconst im = await this.#sdk()\n\t\t\tconst message = await im.messages.setReaction(\n\t\t\t\tinput.chat_id,\n\t\t\t\tinput.message_id,\n\t\t\t\ttoSettableReaction(input.emoji),\n\t\t\t\ttrue\n\t\t\t)\n\t\t\treturn messageToOutput(input.chat_id, message)\n\t\t} catch (error) {\n\t\t\tmapSdkError('iMessage setReaction', error)\n\t\t}\n\t}\n\n\t/**\n\t * Remove a reaction. `message_id` is the **target** message; `emoji` must match setReaction.\n\t */\n\tasync clearReaction(input: ImessageClearReactionInput): Promise<void> {\n\t\ttry {\n\t\t\tconst im = await this.#sdk()\n\t\t\tawait im.messages.setReaction(input.chat_id, input.message_id, toSettableReaction(input.emoji), false)\n\t\t} catch (error) {\n\t\t\tmapSdkError('iMessage clearReaction', error)\n\t\t}\n\t}\n\n\tasync unsend(input: ImessageUnsendInput): Promise<void> {\n\t\ttry {\n\t\t\tconst im = await this.#sdk()\n\t\t\tawait im.messages.unsend(input.chat_id, input.message_id)\n\t\t} catch (error) {\n\t\t\tmapSdkError('iMessage unsend', error)\n\t\t}\n\t}\n\n\t/** Mark the chat read (Advanced iMessage marks the whole conversation). */\n\tasync read(input: ImessageReadInput): Promise<void> {\n\t\ttry {\n\t\t\tconst im = await this.#sdk()\n\t\t\tawait im.chats.markRead(input.chat_id)\n\t\t} catch (error) {\n\t\t\tmapSdkError('iMessage read', error)\n\t\t}\n\t}\n\n\t/**\n\t * Upload bytes then send attachment by GUID. Optional caption as follow-up text.\n\t */\n\tasync sendMedia(input: ImessageSendMediaInput): Promise<ImessageMessageOutput> {\n\t\ttry {\n\t\t\tconst im = await this.#sdk()\n\t\t\tconst data = decodeMediaBytes(input.body_base64)\n\t\t\tconst uploaded = await im.attachments.upload({\n\t\t\t\tfileName: input.file_name,\n\t\t\t\tdata\n\t\t\t})\n\t\t\tconst message = await im.messages.sendAttachment(input.chat_id, uploaded.attachment.guid)\n\t\t\tif (input.caption) {\n\t\t\t\tawait im.messages.sendText(input.chat_id, input.caption)\n\t\t\t}\n\t\t\treturn messageToOutput(input.chat_id, message)\n\t\t} catch (error) {\n\t\t\tmapSdkError('iMessage sendMedia', error)\n\t\t}\n\t}\n\n\t/**\n\t * Download attachment bytes by attachment guid (`file_id`).\n\t */\n\tasync downloadFile(input: ImessageDownloadFileInput): Promise<ImessageDownloadFileOutput> {\n\t\ttry {\n\t\t\tconst im = await this.#sdk()\n\t\t\tconst frames: { type: string; data?: Uint8Array; info?: { fileName?: string; totalBytes?: number } }[] = []\n\t\t\tfor await (const frame of im.attachments.downloadStream(input.file_id)) {\n\t\t\t\tif (frame.type === 'header') {\n\t\t\t\t\tframes.push({\n\t\t\t\t\t\ttype: 'header',\n\t\t\t\t\t\tinfo: {\n\t\t\t\t\t\t\t...(frame.info.fileName && { fileName: frame.info.fileName }),\n\t\t\t\t\t\t\t...(typeof frame.info.totalBytes === 'number' && { totalBytes: frame.info.totalBytes })\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t} else if (frame.type === 'primaryChunk') {\n\t\t\t\t\tframes.push({ type: 'primaryChunk', data: frame.data })\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn parseDownloadChunks(input, frames)\n\t\t} catch (error) {\n\t\t\tmapSdkError('iMessage downloadFile', error)\n\t\t}\n\t}\n\n\tasync answerCallback(_input: unknown): Promise<void> {\n\t\t// No interactive callbacks on iMessage.\n\t}\n}\n\nexport { isImessageDefiniteRejection, isImessageOutcomeUnknown, ImessageClientError }\n"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { g as ToolSource, o as ToolContext, s as ToolDefinition } from "../types-Ccb0DXY9.js";
|
|
2
|
+
//#region src/adapters/cloudflare/create-cloudflare-tool.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Traditional Workers AI / OpenAI-style tool definition (parameters JSON Schema).
|
|
5
|
+
* @see https://developers.cloudflare.com/workers-ai/features/function-calling/
|
|
6
|
+
*/
|
|
7
|
+
type CloudflareAiToolDefinition = {
|
|
8
|
+
description: string;
|
|
9
|
+
name: string;
|
|
10
|
+
parameters: Record<string, unknown>;
|
|
11
|
+
};
|
|
12
|
+
type CloudflareAiToolsOptions = {
|
|
13
|
+
/** Static base context merged into every execute (after call-site ctx). */
|
|
14
|
+
context?: ToolContext;
|
|
15
|
+
/** Build ToolContext per call (host ids, signal, …). Receives optional call-site ctx. */
|
|
16
|
+
createContext?: (ctx: ToolContext | undefined) => ToolContext | Promise<ToolContext>;
|
|
17
|
+
};
|
|
18
|
+
type CloudflareAiToolset = {
|
|
19
|
+
/** Pass to `env.AI.run(..., { tools })`. */
|
|
20
|
+
definitions: CloudflareAiToolDefinition[];
|
|
21
|
+
/**
|
|
22
|
+
* Run a model-selected tool by name with raw arguments.
|
|
23
|
+
* Host wires this after reading `response.tool_calls`.
|
|
24
|
+
*/
|
|
25
|
+
execute: (name: string, args: unknown, ctx?: ToolContext) => Promise<unknown>;
|
|
26
|
+
/** Direct map of name → execute for custom loops. */
|
|
27
|
+
executors: Record<string, (args: unknown, ctx?: ToolContext) => Promise<unknown>>;
|
|
28
|
+
};
|
|
29
|
+
declare function createCloudflareAiToolDefinition(tool: ToolDefinition): CloudflareAiToolDefinition;
|
|
30
|
+
/**
|
|
31
|
+
* Project kernel tools into Cloudflare Workers AI traditional function-calling shape
|
|
32
|
+
* plus host-side executors. No Cloudflare package dependency required.
|
|
33
|
+
*/
|
|
34
|
+
declare function createCloudflareAiTools(source: ToolSource, options?: CloudflareAiToolsOptions): CloudflareAiToolset;
|
|
35
|
+
//#endregion
|
|
36
|
+
export { type CloudflareAiToolDefinition, type CloudflareAiToolsOptions, type CloudflareAiToolset, createCloudflareAiToolDefinition, createCloudflareAiTools };
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/adapters/cloudflare/create-cloudflare-tool.ts"],"mappings":";;;;;;KAaY;EACX;EACA;EACA,YAAY;;KAGD;;EAEX,UAAU;;EAEV,iBAAiB,KAAK,4BAA4B,cAAc,QAAQ;;KAG7D;;EAEX,aAAa;;;;;EAKb,UAAU,cAAc,eAAe,MAAM,gBAAgB;;EAE7D,WAAW,gBAAgB,eAAe,MAAM,gBAAgB;;iBAGjD,iCAAiC,MAAM,iBAAiB;;;;;iBAYxD,wBACf,QAAQ,YACR,UAAS,2BACP"}
|
|
@@ -0,0 +1,41 @@
|
|
|
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 { keyBy, mapValues } from "es-toolkit";
|
|
4
|
+
import { toJSONSchema } from "zod";
|
|
5
|
+
//#region src/adapters/cloudflare/create-cloudflare-tool.ts
|
|
6
|
+
function createCloudflareAiToolDefinition(tool) {
|
|
7
|
+
return {
|
|
8
|
+
name: tool.id,
|
|
9
|
+
description: tool.description,
|
|
10
|
+
parameters: toJSONSchema(tool.inputSchema)
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Project kernel tools into Cloudflare Workers AI traditional function-calling shape
|
|
15
|
+
* plus host-side executors. No Cloudflare package dependency required.
|
|
16
|
+
*/
|
|
17
|
+
function createCloudflareAiTools(source, options = {}) {
|
|
18
|
+
const tools = resolveTools(source);
|
|
19
|
+
assertUniqueBy(tools, (t) => t.id, (id) => `Duplicate tool id when building Cloudflare tools: ${id}`);
|
|
20
|
+
const resolveCtx = async (ctx) => {
|
|
21
|
+
let next = mergeToolContext(options.context ?? {}, ctx ?? {});
|
|
22
|
+
if (options.createContext) next = mergeToolContext(next, await options.createContext(ctx));
|
|
23
|
+
return next;
|
|
24
|
+
};
|
|
25
|
+
const executors = mapValues(keyBy(tools, (t) => t.id), (tool) => async (args, ctx = {}) => {
|
|
26
|
+
return runTool(tool, args, await resolveCtx(ctx));
|
|
27
|
+
});
|
|
28
|
+
return {
|
|
29
|
+
definitions: tools.map(createCloudflareAiToolDefinition),
|
|
30
|
+
executors,
|
|
31
|
+
execute: async (name, args, ctx = {}) => {
|
|
32
|
+
const run = executors[name];
|
|
33
|
+
if (!run) throw new Error(`Unknown Cloudflare tool: ${name}`);
|
|
34
|
+
return run(args, ctx);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { createCloudflareAiToolDefinition, createCloudflareAiTools };
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/adapters/cloudflare/create-cloudflare-tool.ts"],"sourcesContent":["import { keyBy, mapValues } from 'es-toolkit'\nimport { toJSONSchema } from 'zod'\n\nimport { mergeToolContext } from '../../core/context'\nimport { resolveTools } from '../../core/resolve-tools'\nimport type { ToolContext, ToolDefinition, ToolSource } from '../../core/types'\nimport { assertUniqueBy } from '../../core/unique'\nimport { runTool } from '../../core/with-auth'\n\n/**\n * Traditional Workers AI / OpenAI-style tool definition (parameters JSON Schema).\n * @see https://developers.cloudflare.com/workers-ai/features/function-calling/\n */\nexport type CloudflareAiToolDefinition = {\n\tdescription: string\n\tname: string\n\tparameters: Record<string, unknown>\n}\n\nexport type CloudflareAiToolsOptions = {\n\t/** Static base context merged into every execute (after call-site ctx). */\n\tcontext?: ToolContext\n\t/** Build ToolContext per call (host ids, signal, …). Receives optional call-site ctx. */\n\tcreateContext?: (ctx: ToolContext | undefined) => ToolContext | Promise<ToolContext>\n}\n\nexport type CloudflareAiToolset = {\n\t/** Pass to `env.AI.run(..., { tools })`. */\n\tdefinitions: CloudflareAiToolDefinition[]\n\t/**\n\t * Run a model-selected tool by name with raw arguments.\n\t * Host wires this after reading `response.tool_calls`.\n\t */\n\texecute: (name: string, args: unknown, ctx?: ToolContext) => Promise<unknown>\n\t/** Direct map of name → execute for custom loops. */\n\texecutors: Record<string, (args: unknown, ctx?: ToolContext) => Promise<unknown>>\n}\n\nexport function createCloudflareAiToolDefinition(tool: ToolDefinition): CloudflareAiToolDefinition {\n\treturn {\n\t\tname: tool.id,\n\t\tdescription: tool.description,\n\t\tparameters: toJSONSchema(tool.inputSchema)\n\t}\n}\n\n/**\n * Project kernel tools into Cloudflare Workers AI traditional function-calling shape\n * plus host-side executors. No Cloudflare package dependency required.\n */\nexport function createCloudflareAiTools(\n\tsource: ToolSource,\n\toptions: CloudflareAiToolsOptions = {}\n): CloudflareAiToolset {\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 Cloudflare tools: ${id}`\n\t)\n\n\tconst resolveCtx = async (ctx: ToolContext | undefined): Promise<ToolContext> => {\n\t\tlet next = mergeToolContext(options.context ?? {}, ctx ?? {})\n\t\tif (options.createContext) {\n\t\t\tnext = mergeToolContext(next, await options.createContext(ctx))\n\t\t}\n\t\treturn next\n\t}\n\n\tconst executors = mapValues(\n\t\tkeyBy(tools, (t) => t.id),\n\t\t(tool) =>\n\t\t\tasync (args: unknown, ctx: ToolContext = {}) => {\n\t\t\t\tconst next = await resolveCtx(ctx)\n\t\t\t\treturn runTool(tool, args, next)\n\t\t\t}\n\t)\n\n\treturn {\n\t\tdefinitions: tools.map(createCloudflareAiToolDefinition),\n\t\texecutors,\n\t\texecute: async (name, args, ctx = {}) => {\n\t\t\tconst run = executors[name]\n\t\t\tif (!run) {\n\t\t\t\tthrow new Error(`Unknown Cloudflare tool: ${name}`)\n\t\t\t}\n\t\t\treturn run(args, ctx)\n\t\t}\n\t}\n}\n"],"mappings":";;;;;AAsCA,SAAgB,iCAAiC,MAAkD;CAClG,OAAO;EACN,MAAM,KAAK;EACX,aAAa,KAAK;EAClB,YAAY,aAAa,KAAK,WAAW;CAC1C;AACD;;;;;AAMA,SAAgB,wBACf,QACA,UAAoC,CAAC,GACf;CACtB,MAAM,QAAQ,aAAa,MAAM;CACjC,eACC,QACC,MAAM,EAAE,KACR,OAAO,qDAAqD,IAC9D;CAEA,MAAM,aAAa,OAAO,QAAuD;EAChF,IAAI,OAAO,iBAAiB,QAAQ,WAAW,CAAC,GAAG,OAAO,CAAC,CAAC;EAC5D,IAAI,QAAQ,eACX,OAAO,iBAAiB,MAAM,MAAM,QAAQ,cAAc,GAAG,CAAC;EAE/D,OAAO;CACR;CAEA,MAAM,YAAY,UACjB,MAAM,QAAQ,MAAM,EAAE,EAAE,IACvB,SACA,OAAO,MAAe,MAAmB,CAAC,MAAM;EAE/C,OAAO,QAAQ,MAAM,MAAM,MADR,WAAW,GAAG,CACF;CAChC,CACF;CAEA,OAAO;EACN,aAAa,MAAM,IAAI,gCAAgC;EACvD;EACA,SAAS,OAAO,MAAM,MAAM,MAAM,CAAC,MAAM;GACxC,MAAM,MAAM,UAAU;GACtB,IAAI,CAAC,KACJ,MAAM,IAAI,MAAM,4BAA4B,MAAM;GAEnD,OAAO,IAAI,MAAM,GAAG;EACrB;CACD;AACD"}
|