@vm0/cli 9.278.0 → 9.278.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/{agent-HUDTEGLK.js → agent-4F3XAJWN.js} +12 -6
- package/agent-4F3XAJWN.js.map +1 -0
- package/{banking-BMZONEXP.js → banking-CWQFQKZB.js} +61 -7
- package/banking-CWQFQKZB.js.map +1 -0
- package/{browser-LQP445CU.js → browser-BI6UFWPH.js} +4 -5
- package/browser-BI6UFWPH.js.map +1 -0
- package/{chat-UF7QAWUT.js → chat-MKIW4FPP.js} +24 -16
- package/chat-MKIW4FPP.js.map +1 -0
- package/chunk-2SJTFDC2.js +189 -0
- package/chunk-2SJTFDC2.js.map +1 -0
- package/chunk-4FTIKZKP.js +64 -0
- package/chunk-4FTIKZKP.js.map +1 -0
- package/chunk-7UZXNER2.js +568 -0
- package/chunk-7UZXNER2.js.map +1 -0
- package/chunk-A6ZRMNM3.js +102 -0
- package/chunk-A6ZRMNM3.js.map +1 -0
- package/{chunk-QC63TUJC.js → chunk-C62A6LD6.js} +2 -2
- package/chunk-CCTF3YVW.js +52 -0
- package/chunk-CCTF3YVW.js.map +1 -0
- package/chunk-CD2BLKGC.js +188 -0
- package/chunk-CD2BLKGC.js.map +1 -0
- package/chunk-CEJGHPF3.js +55 -0
- package/chunk-CEJGHPF3.js.map +1 -0
- package/chunk-DUA6CF7E.js +2053 -0
- package/chunk-DUA6CF7E.js.map +1 -0
- package/chunk-E2TQAKNL.js +1300 -0
- package/chunk-E2TQAKNL.js.map +1 -0
- package/{chunk-5ZZI2LSO.js → chunk-GHKWW4NC.js} +5 -5
- package/chunk-GV3PG6CZ.js +114 -0
- package/chunk-GV3PG6CZ.js.map +1 -0
- package/chunk-GY7D76EZ.js +81 -0
- package/chunk-GY7D76EZ.js.map +1 -0
- package/chunk-HHHHZMTA.js +434 -0
- package/chunk-HHHHZMTA.js.map +1 -0
- package/chunk-HZYOJTEE.js +1275 -0
- package/chunk-HZYOJTEE.js.map +1 -0
- package/chunk-J3ZRXVI6.js +740 -0
- package/chunk-J3ZRXVI6.js.map +1 -0
- package/chunk-JJWFO27K.js +31 -0
- package/chunk-JJWFO27K.js.map +1 -0
- package/chunk-JV6LM2YC.js +39 -0
- package/chunk-JV6LM2YC.js.map +1 -0
- package/chunk-KER77KJB.js +105 -0
- package/chunk-KER77KJB.js.map +1 -0
- package/{chunk-V5ZVB7RJ.js → chunk-KKO2XGLQ.js} +1 -6
- package/chunk-KKO2XGLQ.js.map +1 -0
- package/chunk-LIYPTQAO.js +198 -0
- package/chunk-LIYPTQAO.js.map +1 -0
- package/chunk-LYLDVUHT.js +131 -0
- package/chunk-LYLDVUHT.js.map +1 -0
- package/chunk-PFWBO2VK.js +801 -0
- package/chunk-PFWBO2VK.js.map +1 -0
- package/chunk-RTCRU35A.js +194 -0
- package/chunk-RTCRU35A.js.map +1 -0
- package/{chunk-F2AM4RWA.js → chunk-RTEEWZUT.js} +2 -2
- package/{chunk-F2AM4RWA.js.map → chunk-RTEEWZUT.js.map} +1 -1
- package/{chunk-BRV4D3P2.js → chunk-RUKMHBNQ.js} +2 -2
- package/chunk-SA4DYSBR.js +31 -0
- package/chunk-SA4DYSBR.js.map +1 -0
- package/chunk-SJPOFQJU.js +792 -0
- package/chunk-SJPOFQJU.js.map +1 -0
- package/{chunk-V7A6ZFHR.js → chunk-SMPSKBAP.js} +25 -774
- package/chunk-SMPSKBAP.js.map +1 -0
- package/{chunk-E53W6UVQ.js → chunk-T2X2EGV2.js} +4 -4
- package/chunk-T2X2EGV2.js.map +1 -0
- package/chunk-U2GQH6AD.js +309 -0
- package/chunk-U2GQH6AD.js.map +1 -0
- package/chunk-U6A2RPHO.js +66 -0
- package/chunk-U6A2RPHO.js.map +1 -0
- package/chunk-UIXUGVZB.js +362 -0
- package/chunk-UIXUGVZB.js.map +1 -0
- package/chunk-XRZKJACM.js +49 -0
- package/chunk-XRZKJACM.js.map +1 -0
- package/chunk-YDS3X7KB.js +202 -0
- package/chunk-YDS3X7KB.js.map +1 -0
- package/{chunk-A6TMOGPR.js → chunk-ZKNJW4K6.js} +1412 -334
- package/chunk-ZKNJW4K6.js.map +1 -0
- package/chunk-ZXSCBS77.js +90 -0
- package/chunk-ZXSCBS77.js.map +1 -0
- package/{computer-use-RRD7BCCK.js → computer-use-6AEVW47F.js} +9 -7
- package/computer-use-6AEVW47F.js.map +1 -0
- package/{connector-XX7UU6XE.js → connector-XDQ6JEBU.js} +25 -13
- package/connector-XDQ6JEBU.js.map +1 -0
- package/{credit-GDNNAQRO.js → credit-JPQA5XPA.js} +8 -10
- package/credit-JPQA5XPA.js.map +1 -0
- package/{developer-support-IISP5UBI.js → developer-support-V7NZOU2P.js} +27 -7
- package/developer-support-V7NZOU2P.js.map +1 -0
- package/{doctor-IZM2TJOH.js → doctor-FJO24TG3.js} +13 -11
- package/doctor-FJO24TG3.js.map +1 -0
- package/{feishu-XB7SQBSI.js → feishu-PNOAM33Q.js} +99 -9
- package/feishu-PNOAM33Q.js.map +1 -0
- package/{finance-OGWHKQLU.js → finance-55OJ6GYP.js} +49 -9
- package/finance-55OJ6GYP.js.map +1 -0
- package/{generate-AA2PVOYQ.js → generate-XUKBK523.js} +26 -21
- package/generate-XUKBK523.js.map +1 -0
- package/{github-VJVIBTVF.js → github-V4MD2PMM.js} +83 -8
- package/github-V4MD2PMM.js.map +1 -0
- package/{goal-7SYVHDTK.js → goal-FS5FJKVU.js} +69 -13
- package/goal-FS5FJKVU.js.map +1 -0
- package/{host-UVQMIOBA.js → host-GITTJ6PR.js} +124 -10
- package/host-GITTJ6PR.js.map +1 -0
- package/{logs-PIS4X24E.js → logs-EEUIGYUD.js} +51 -11
- package/logs-EEUIGYUD.js.map +1 -0
- package/{mail-L33OSQ2R.js → mail-G4SAJSBD.js} +39 -8
- package/mail-G4SAJSBD.js.map +1 -0
- package/{maps-D5XTXU5U.js → maps-7ANNU3BX.js} +65 -11
- package/maps-7ANNU3BX.js.map +1 -0
- package/{model-ZFMRECDM.js → model-DSPDCJLB.js} +6 -6
- package/model-DSPDCJLB.js.map +1 -0
- package/{model-provider-EZZ2DRYZ.js → model-provider-RZQ45PNG.js} +6 -6
- package/model-provider-RZQ45PNG.js.map +1 -0
- package/package.json +1 -1
- package/{people-search-PFTIO2QS.js → people-search-I7PUMF5M.js} +22 -6
- package/people-search-I7PUMF5M.js.map +1 -0
- package/{phone-6SG5ZUNL.js → phone-SSAPGMTW.js} +90 -9
- package/phone-SSAPGMTW.js.map +1 -0
- package/{recognize-LLU6J3SW.js → recognize-D7VORZBN.js} +27 -9
- package/recognize-D7VORZBN.js.map +1 -0
- package/{resource-FGUSXS4G.js → resource-76IV3TMW.js} +21 -7
- package/resource-76IV3TMW.js.map +1 -0
- package/{scrape-BAUZ2YFD.js → scrape-JBDLNTLB.js} +22 -6
- package/scrape-JBDLNTLB.js.map +1 -0
- package/{search-DLO5RXRM.js → search-UNZNUTZX.js} +29 -9
- package/search-UNZNUTZX.js.map +1 -0
- package/{slack-CVATPKP3.js → slack-AAH6GG2W.js} +103 -11
- package/slack-AAH6GG2W.js.map +1 -0
- package/{teams-ZZYO6YIK.js → teams-6OPXE4TX.js} +90 -9
- package/teams-6OPXE4TX.js.map +1 -0
- package/{telegram-VY7T4YAR.js → telegram-RRZG73RT.js} +101 -10
- package/telegram-RRZG73RT.js.map +1 -0
- package/{upgrade-GFA4ZUU4.js → upgrade-I5IL4UQL.js} +3 -4
- package/upgrade-I5IL4UQL.js.map +1 -0
- package/{video-STFG7BET.js → video-HV44W4X7.js} +5 -4
- package/video-HV44W4X7.js.map +1 -0
- package/{weather-ISJEHJWR.js → weather-EQ7CSADB.js} +70 -16
- package/weather-EQ7CSADB.js.map +1 -0
- package/{web-YN4CVHK7.js → web-6LIMWEOZ.js} +5 -5
- package/web-6LIMWEOZ.js.map +1 -0
- package/{web-search-PC7IECND.js → web-search-AT7WONZN.js} +22 -6
- package/web-search-AT7WONZN.js.map +1 -0
- package/{whoami-KXFXZGM6.js → whoami-RKTLLSI4.js} +16 -7
- package/whoami-RKTLLSI4.js.map +1 -0
- package/{workflow-O7YZHB7A.js → workflow-ZH32P622.js} +135 -39
- package/workflow-ZH32P622.js.map +1 -0
- package/zero.js +40 -40
- package/agent-HUDTEGLK.js.map +0 -1
- package/banking-BMZONEXP.js.map +0 -1
- package/browser-LQP445CU.js.map +0 -1
- package/chat-UF7QAWUT.js.map +0 -1
- package/chunk-2W73DZDW.js +0 -32
- package/chunk-2W73DZDW.js.map +0 -1
- package/chunk-6PN6QGIM.js +0 -11405
- package/chunk-6PN6QGIM.js.map +0 -1
- package/chunk-A6TMOGPR.js.map +0 -1
- package/chunk-ANOLYIPL.js +0 -10
- package/chunk-ANOLYIPL.js.map +0 -1
- package/chunk-E53W6UVQ.js.map +0 -1
- package/chunk-V5ZVB7RJ.js.map +0 -1
- package/chunk-V7A6ZFHR.js.map +0 -1
- package/computer-use-RRD7BCCK.js.map +0 -1
- package/connector-XX7UU6XE.js.map +0 -1
- package/credit-GDNNAQRO.js.map +0 -1
- package/developer-support-IISP5UBI.js.map +0 -1
- package/doctor-IZM2TJOH.js.map +0 -1
- package/feishu-XB7SQBSI.js.map +0 -1
- package/finance-OGWHKQLU.js.map +0 -1
- package/generate-AA2PVOYQ.js.map +0 -1
- package/github-VJVIBTVF.js.map +0 -1
- package/goal-7SYVHDTK.js.map +0 -1
- package/host-UVQMIOBA.js.map +0 -1
- package/logs-PIS4X24E.js.map +0 -1
- package/mail-L33OSQ2R.js.map +0 -1
- package/maps-D5XTXU5U.js.map +0 -1
- package/model-ZFMRECDM.js.map +0 -1
- package/model-provider-EZZ2DRYZ.js.map +0 -1
- package/people-search-PFTIO2QS.js.map +0 -1
- package/phone-6SG5ZUNL.js.map +0 -1
- package/recognize-LLU6J3SW.js.map +0 -1
- package/resource-FGUSXS4G.js.map +0 -1
- package/scrape-BAUZ2YFD.js.map +0 -1
- package/search-DLO5RXRM.js.map +0 -1
- package/slack-CVATPKP3.js.map +0 -1
- package/teams-ZZYO6YIK.js.map +0 -1
- package/telegram-VY7T4YAR.js.map +0 -1
- package/upgrade-GFA4ZUU4.js.map +0 -1
- package/video-STFG7BET.js.map +0 -1
- package/weather-ISJEHJWR.js.map +0 -1
- package/web-YN4CVHK7.js.map +0 -1
- package/web-search-PC7IECND.js.map +0 -1
- package/whoami-KXFXZGM6.js.map +0 -1
- package/workflow-O7YZHB7A.js.map +0 -1
- /package/{chunk-QC63TUJC.js.map → chunk-C62A6LD6.js.map} +0 -0
- /package/{chunk-5ZZI2LSO.js.map → chunk-GHKWW4NC.js.map} +0 -0
- /package/{chunk-BRV4D3P2.js.map → chunk-RUKMHBNQ.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../packages/api-contracts/src/contracts/integrations.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { authHeadersSchema, initContract } from \"./base\";\nimport { apiErrorSchema } from \"./errors\";\n\nconst c = initContract();\n\nconst directUploadCapabilityShape = {\n supportsUploadHeaders: z.literal(true).optional(),\n};\n\nconst directUploadResponseShape = {\n uploadHeaders: z.record(z.string(), z.string()).optional(),\n};\n\n/**\n * Integration Slack message contract\n * POST /api/zero/integrations/slack/message\n *\n * Sends a Slack message via the org's installed bot token.\n * Requires `slack:write` capability (via ZERO_TOKEN).\n */\nconst sendSlackMessageBodySchema = z\n .object({\n channel: z.string().min(1, \"Channel ID is required\").optional(),\n user: z.string().min(1, \"User ID is required\").optional(),\n text: z.string().optional(),\n threadTs: z.string().optional(),\n blocks: z.array(z.object({ type: z.string() }).passthrough()).optional(),\n })\n .refine(\n (data) => {\n return Boolean(data.channel) !== Boolean(data.user);\n },\n { message: \"Exactly one of 'channel' or 'user' must be provided\" },\n );\n\nexport type SendSlackMessageBody = z.infer<typeof sendSlackMessageBodySchema>;\n\nconst sendSlackMessageResponseSchema = z.object({\n ok: z.literal(true),\n ts: z.string().optional(),\n channel: z.string().optional(),\n});\n\nexport type SendSlackMessageResponse = z.infer<\n typeof sendSlackMessageResponseSchema\n>;\n\nexport const integrationsSlackMessageContract = c.router({\n sendMessage: {\n method: \"POST\",\n path: \"/api/zero/integrations/slack/message\",\n headers: authHeadersSchema,\n body: sendSlackMessageBodySchema,\n responses: {\n 200: sendSlackMessageResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n },\n summary: \"Send a Slack message via org bot token\",\n },\n});\n\nexport type IntegrationsSlackMessageContract =\n typeof integrationsSlackMessageContract;\n\n/**\n * Integration Feishu message contract\n * POST /api/zero/integrations/feishu/message\n *\n * Sends a Feishu message via an org-owned custom app.\n * Requires `feishu:write` capability (via ZERO_TOKEN).\n */\nconst feishuCardSchema = z.record(z.string(), z.unknown());\n\nconst sendFeishuMessageBodySchema = z\n .object({\n installationId: z.string().uuid().optional(),\n chat: z.string().min(1, \"Chat ID is required\").optional(),\n user: z.string().min(1, \"Feishu open ID is required\").optional(),\n replyToMessageId: z.string().min(1, \"Message ID is required\").optional(),\n replyInThread: z.boolean().optional(),\n text: z.string().min(1, \"Message text is required\").optional(),\n card: feishuCardSchema.optional(),\n })\n .refine(\n (body) => {\n return (\n [body.chat, body.user, body.replyToMessageId].filter(Boolean).length ===\n 1\n );\n },\n {\n message: \"Exactly one of chat, user, or replyToMessageId is required\",\n path: [\"chat\"],\n },\n )\n .refine(\n (body) => {\n return Boolean(body.text) !== Boolean(body.card);\n },\n {\n message: \"Exactly one of text or card is required\",\n path: [\"text\"],\n },\n )\n .refine(\n (body) => {\n return !body.replyInThread || Boolean(body.replyToMessageId);\n },\n {\n message: \"replyInThread requires replyToMessageId\",\n path: [\"replyInThread\"],\n },\n );\n\nexport type SendFeishuMessageBody = z.infer<typeof sendFeishuMessageBodySchema>;\n\nconst sendFeishuMessageResponseSchema = z.object({\n ok: z.literal(true),\n messageId: z.string(),\n chatId: z.string().nullable(),\n});\n\nexport type SendFeishuMessageResponse = z.infer<\n typeof sendFeishuMessageResponseSchema\n>;\n\nexport const integrationsFeishuMessageContract = c.router({\n sendMessage: {\n method: \"POST\",\n path: \"/api/zero/integrations/feishu/message\",\n headers: authHeadersSchema,\n body: sendFeishuMessageBodySchema,\n responses: {\n 200: sendFeishuMessageResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 502: apiErrorSchema,\n },\n summary: \"Send a Feishu message via an organization custom app\",\n },\n});\n\nexport type IntegrationsFeishuMessageContract =\n typeof integrationsFeishuMessageContract;\n\nexport const FEISHU_FILE_UPLOAD_MAX_BYTES = 30 * 1024 * 1024;\n\n/**\n * Integration Feishu message resource download contract.\n * Requires `feishu:write` because Feishu currently uses one capability for\n * bot-backed messaging and file access.\n */\nconst feishuResourceTypeSchema = z.enum([\"file\", \"image\"]);\n\nexport type FeishuResourceType = z.infer<typeof feishuResourceTypeSchema>;\n\nexport const integrationsFeishuDownloadFileContract = c.router({\n download: {\n method: \"GET\",\n path: \"/api/zero/integrations/feishu/download-file\",\n headers: authHeadersSchema,\n query: z.object({\n installation_id: z.string().uuid().optional(),\n message_id: z.string().min(1, \"Message ID is required\"),\n file_key: z.string().min(1, \"File key is required\"),\n type: feishuResourceTypeSchema,\n }),\n responses: {\n 200: c.otherResponse({\n contentType: \"application/octet-stream\",\n body: z.unknown(),\n }),\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 413: apiErrorSchema,\n 502: apiErrorSchema,\n },\n summary: \"Download a file from a Feishu message\",\n },\n});\n\nexport type IntegrationsFeishuDownloadFileContract =\n typeof integrationsFeishuDownloadFileContract;\n\n/**\n * Integration Feishu file upload — init contract.\n *\n * The CLI uploads to temporary VM0 storage before the API forwards the bytes\n * to Feishu with the organization bot's tenant token.\n */\nconst feishuUploadInitBodySchema = z.object({\n filename: z.string().min(1, \"Filename is required\").max(255),\n contentType: z.string().min(1, \"Content type is required\").max(200),\n length: z\n .number()\n .int()\n .positive(\"File length must be a positive integer\")\n .max(\n FEISHU_FILE_UPLOAD_MAX_BYTES,\n `File must not exceed ${FEISHU_FILE_UPLOAD_MAX_BYTES} bytes`,\n ),\n ...directUploadCapabilityShape,\n});\n\nexport type FeishuUploadInitBody = z.infer<typeof feishuUploadInitBodySchema>;\n\nconst feishuUploadInitResponseSchema = z.object({\n uploadId: z.string().uuid(),\n uploadUrl: z.string(),\n fileUrl: z.string(),\n filename: z.string(),\n contentType: z.string(),\n size: z.number().int().nonnegative(),\n ...directUploadResponseShape,\n});\n\nexport type FeishuUploadInitResponse = z.infer<\n typeof feishuUploadInitResponseSchema\n>;\n\nexport const integrationsFeishuUploadInitContract = c.router({\n init: {\n method: \"POST\",\n path: \"/api/zero/integrations/feishu/upload-file/init\",\n headers: authHeadersSchema,\n body: feishuUploadInitBodySchema,\n responses: {\n 200: feishuUploadInitResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n },\n summary: \"Get a pre-signed upload URL for Feishu file delivery\",\n },\n});\n\n/**\n * Integration Feishu file upload — complete contract.\n *\n * Uploads the stored bytes to Feishu and sends the resulting file key to one\n * chat, user, or reply target.\n */\nconst feishuUploadCompleteBodySchema = z\n .object({\n uploadId: z.string().uuid(\"Upload ID must be a UUID\"),\n installationId: z.string().uuid().optional(),\n chat: z.string().min(1, \"Chat ID is required\").optional(),\n user: z.string().min(1, \"Feishu open ID is required\").optional(),\n replyToMessageId: z.string().min(1, \"Message ID is required\").optional(),\n replyInThread: z.boolean().optional(),\n contentType: z.string().min(1).max(200).optional(),\n })\n .refine(\n (body) => {\n return (\n [body.chat, body.user, body.replyToMessageId].filter(Boolean).length ===\n 1\n );\n },\n {\n message: \"Exactly one of chat, user, or replyToMessageId is required\",\n path: [\"chat\"],\n },\n )\n .refine(\n (body) => {\n return !body.replyInThread || Boolean(body.replyToMessageId);\n },\n {\n message: \"replyInThread requires replyToMessageId\",\n path: [\"replyInThread\"],\n },\n );\n\nexport type FeishuUploadCompleteBody = z.infer<\n typeof feishuUploadCompleteBodySchema\n>;\n\nconst feishuUploadCompleteResponseSchema = z.object({\n messageId: z.string(),\n chatId: z.string().nullable(),\n fileKey: z.string(),\n filename: z.string(),\n mimetype: z.string(),\n size: z.number().int().nonnegative(),\n url: z.string(),\n});\n\nexport type FeishuUploadCompleteResponse = z.infer<\n typeof feishuUploadCompleteResponseSchema\n>;\n\nexport const integrationsFeishuUploadCompleteContract = c.router({\n complete: {\n method: \"POST\",\n path: \"/api/zero/integrations/feishu/upload-file/complete\",\n headers: authHeadersSchema,\n body: feishuUploadCompleteBodySchema,\n responses: {\n 200: feishuUploadCompleteResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 413: apiErrorSchema,\n 502: apiErrorSchema,\n },\n summary: \"Finalize Feishu file upload and send it to a conversation\",\n },\n});\n\n/**\n * Integration Telegram message contract\n * POST /api/zero/integrations/telegram/message\n *\n * Sends a Telegram message via an org-owned bot token.\n * Requires `telegram:write` capability (via ZERO_TOKEN).\n */\nconst sendTelegramMessageBodySchema = z.object({\n botId: z.string().min(1, \"Bot ID is required\"),\n chatId: z.string().min(1, \"Chat ID is required\"),\n text: z.string().min(1, \"Message text is required\"),\n replyToMessageId: z.number().int().positive().optional(),\n messageThreadId: z.number().int().positive().optional(),\n});\n\nexport type SendTelegramMessageBody = z.infer<\n typeof sendTelegramMessageBodySchema\n>;\n\nconst sendTelegramMessageResponseSchema = z.object({\n ok: z.literal(true),\n messageId: z.number().int(),\n chatId: z.string(),\n});\n\nexport type SendTelegramMessageResponse = z.infer<\n typeof sendTelegramMessageResponseSchema\n>;\n\nexport const integrationsTelegramMessageContract = c.router({\n sendMessage: {\n method: \"POST\",\n path: \"/api/zero/integrations/telegram/message\",\n headers: authHeadersSchema,\n body: sendTelegramMessageBodySchema,\n responses: {\n 200: sendTelegramMessageResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 502: apiErrorSchema,\n },\n summary: \"Send a Telegram message via org bot token\",\n },\n});\n\nexport type IntegrationsTelegramMessageContract =\n typeof integrationsTelegramMessageContract;\n\n/**\n * Integration Microsoft Teams message contract\n * POST /api/zero/integrations/teams/message\n *\n * Sends a Microsoft Teams message via the org's installed Teams bot.\n * Requires `teams:write` capability (via ZERO_TOKEN).\n */\nconst teamsAdaptiveCardSchema = z\n .object({\n type: z.literal(\"AdaptiveCard\"),\n version: z.string().min(1),\n body: z.array(z.record(z.string(), z.unknown())).optional(),\n actions: z.array(z.record(z.string(), z.unknown())).optional(),\n })\n .passthrough();\n\nconst sendTeamsMessageBodySchema = z\n .object({\n conversationId: z.string().min(1, \"Conversation ID is required\").optional(),\n user: z.string().min(1, \"Teams user ID is required\").optional(),\n text: z.string().min(1, \"Message text is required\").optional(),\n activityId: z.string().min(1, \"Activity ID is required\").optional(),\n card: teamsAdaptiveCardSchema.optional(),\n })\n .refine(\n (body) => {\n return Boolean(body.conversationId) !== Boolean(body.user);\n },\n {\n message: \"Exactly one of conversationId or user is required\",\n path: [\"conversationId\"],\n },\n )\n .refine(\n (body) => {\n return Boolean(body.text) || Boolean(body.card);\n },\n {\n message: \"Message text or card is required\",\n path: [\"text\"],\n },\n )\n .refine(\n (body) => {\n return !(body.user && body.activityId);\n },\n {\n message: \"activityId can only be used with conversationId\",\n path: [\"activityId\"],\n },\n );\n\nexport type SendTeamsMessageBody = z.infer<typeof sendTeamsMessageBodySchema>;\n\nconst sendTeamsMessageResponseSchema = z.object({\n ok: z.literal(true),\n activityId: z.string().optional(),\n conversationId: z.string(),\n});\n\nexport type SendTeamsMessageResponse = z.infer<\n typeof sendTeamsMessageResponseSchema\n>;\n\nexport const integrationsTeamsMessageContract = c.router({\n sendMessage: {\n method: \"POST\",\n path: \"/api/zero/integrations/teams/message\",\n headers: authHeadersSchema,\n body: sendTeamsMessageBodySchema,\n responses: {\n 200: sendTeamsMessageResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 502: apiErrorSchema,\n },\n summary: \"Send a Microsoft Teams message via org bot\",\n },\n});\n\nexport type IntegrationsTeamsMessageContract =\n typeof integrationsTeamsMessageContract;\n\n/**\n * Integration AgentPhone message contract\n * POST /api/zero/integrations/phone/message\n *\n * Sends an AgentPhone text message to the connected phone handle.\n * Requires `phone:write` capability (via ZERO_TOKEN).\n */\nconst sendPhoneMessageBodySchema = z.object({\n agentphoneAgentId: z\n .string()\n .min(1, \"AgentPhone agent ID is required\")\n .optional(),\n toNumber: z.string().min(1, \"Phone number is required\"),\n text: z.string().min(1, \"Message text is required\"),\n});\n\nexport type SendPhoneMessageBody = z.infer<typeof sendPhoneMessageBodySchema>;\n\nconst sendPhoneMessageResponseSchema = z.object({\n ok: z.literal(true),\n messageId: z.string(),\n channel: z.string().nullable(),\n toNumber: z.string(),\n});\n\nexport type SendPhoneMessageResponse = z.infer<\n typeof sendPhoneMessageResponseSchema\n>;\n\nexport const integrationsPhoneMessageContract = c.router({\n sendMessage: {\n method: \"POST\",\n path: \"/api/zero/integrations/phone/message\",\n headers: authHeadersSchema,\n body: sendPhoneMessageBodySchema,\n responses: {\n 200: sendPhoneMessageResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 502: apiErrorSchema,\n },\n summary: \"Send an AgentPhone message\",\n },\n});\n\nexport type IntegrationsPhoneMessageContract =\n typeof integrationsPhoneMessageContract;\n\nconst phoneDownloadFileQuerySchema = z.object({\n file_id: z.string().min(1, \"file_id query parameter is required\"),\n});\n\nexport const integrationsPhoneDownloadFileContract = c.router({\n download: {\n method: \"GET\",\n path: \"/api/zero/integrations/phone/download-file\",\n headers: authHeadersSchema,\n query: phoneDownloadFileQuerySchema,\n responses: {\n 200: c.type<Blob>(),\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 413: apiErrorSchema,\n 502: apiErrorSchema,\n },\n summary: \"Download an AgentPhone media attachment\",\n },\n});\n\nexport type IntegrationsPhoneDownloadFileContract =\n typeof integrationsPhoneDownloadFileContract;\n\n/**\n * Integration Telegram bot list contract\n * GET /api/zero/integrations/telegram/bots\n *\n * Lists Telegram bots available in the authenticated user's org.\n * Requires `telegram:read` capability (via ZERO_TOKEN).\n */\nconst telegramBotTokenStatusSchema = z.enum([\"valid\", \"invalid\", \"unknown\"]);\n\nconst telegramConnectedUserSchema = z.object({\n telegramUserId: z.string(),\n telegramUsername: z.string().nullable(),\n telegramDisplayName: z.string().nullable(),\n});\n\nconst telegramBotListItemSchema = z.object({\n id: z.string(),\n kind: z.enum([\"custom\", \"official\"]).optional(),\n username: z.string().nullable(),\n agent: z.object({ id: z.string(), name: z.string() }).nullable(),\n isOwner: z.boolean(),\n isConnected: z.boolean(),\n connectedUser: telegramConnectedUserSchema.nullable().optional(),\n tokenStatus: telegramBotTokenStatusSchema,\n official: z\n .object({\n configured: z.boolean(),\n usesDefaultAgent: z.boolean(),\n linkedTelegramUserId: z.string().nullable(),\n })\n .optional(),\n});\n\nconst listTelegramBotsResponseSchema = z.object({\n bots: z.array(telegramBotListItemSchema),\n});\n\nexport type TelegramBotListItem = z.infer<typeof telegramBotListItemSchema>;\nexport type ListTelegramBotsResponse = z.infer<\n typeof listTelegramBotsResponseSchema\n>;\n\nexport const integrationsTelegramBotListContract = c.router({\n listBots: {\n method: \"GET\",\n path: \"/api/zero/integrations/telegram/bots\",\n headers: authHeadersSchema,\n responses: {\n 200: listTelegramBotsResponseSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n },\n summary: \"List Telegram bots available in the authenticated user's org\",\n },\n});\n\nexport type IntegrationsTelegramBotListContract =\n typeof integrationsTelegramBotListContract;\n\n/**\n * Integration Slack file upload — init contract\n * POST /api/zero/integrations/slack/upload-file/init\n *\n * Requests a pre-signed upload URL from Slack via the org's bot token.\n * The CLI then uploads the file directly to that URL (no auth needed).\n * Requires `slack:write` capability (via ZERO_TOKEN).\n */\nconst slackUploadInitBodySchema = z.object({\n filename: z.string().min(1, \"Filename is required\"),\n length: z.number().int().positive(\"File length must be a positive integer\"),\n ...directUploadCapabilityShape,\n canonical: z\n .object({\n operationId: z.string().uuid(),\n contentType: z.string().min(1).max(200),\n checksumSha256: z.string().regex(/^[a-f0-9]{64}$/),\n channel: z.string().min(1, \"Channel ID is required\"),\n threadTs: z.string().optional(),\n title: z.string().optional(),\n initialComment: z.string().optional(),\n })\n .optional(),\n});\n\nexport type SlackUploadInitBody = z.infer<typeof slackUploadInitBodySchema>;\n\nconst directSlackUploadInitResponseSchema = z.object({\n uploadUrl: z.string(),\n fileId: z.string(),\n});\n\nconst canonicalSlackUploadInitResponseSchema = z.object({\n kind: z.literal(\"canonical\"),\n assetId: z.string().uuid(),\n operationId: z.string().uuid(),\n uploadUrl: z.string().url().optional(),\n url: z.string().url(),\n ...directUploadResponseShape,\n});\n\nconst slackUploadInitResponseSchema = z.union([\n directSlackUploadInitResponseSchema,\n canonicalSlackUploadInitResponseSchema,\n]);\n\nexport type SlackUploadInitResponse = z.infer<\n typeof slackUploadInitResponseSchema\n>;\n\nexport const integrationsSlackUploadInitContract = c.router({\n init: {\n method: \"POST\",\n path: \"/api/zero/integrations/slack/upload-file/init\",\n headers: authHeadersSchema,\n body: slackUploadInitBodySchema,\n responses: {\n 200: slackUploadInitResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n },\n summary: \"Get a pre-signed Slack upload URL via org bot token\",\n },\n});\n\nconst slackUploadMaterializeBodySchema = z.object({\n assetId: z.string().uuid(),\n operationId: z.string().uuid(),\n});\n\nconst slackUploadMaterializeResponseSchema = z.object({\n assetId: z.string().uuid(),\n url: z.string().url(),\n delivery: z.discriminatedUnion(\"status\", [\n z.object({\n status: z.literal(\"pending\"),\n uploadUrl: z.string(),\n fileId: z.string(),\n }),\n z.object({\n status: z.literal(\"delivered\"),\n fileId: z.string(),\n permalink: z.string(),\n }),\n z.object({\n status: z.literal(\"failed\"),\n message: z.string(),\n retryable: z.boolean(),\n }),\n ]),\n});\n\nexport type SlackUploadMaterializeBody = z.infer<\n typeof slackUploadMaterializeBodySchema\n>;\nexport type SlackUploadMaterializeResponse = z.infer<\n typeof slackUploadMaterializeResponseSchema\n>;\n\nexport const integrationsSlackUploadMaterializeContract = c.router({\n materialize: {\n method: \"POST\",\n path: \"/api/zero/integrations/slack/upload-file/materialize\",\n headers: authHeadersSchema,\n body: slackUploadMaterializeBodySchema,\n responses: {\n 200: slackUploadMaterializeResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n },\n summary: \"Materialize a canonical Slack publication before delivery\",\n },\n});\n\n/**\n * Integration Telegram file upload — init contract\n * POST /api/zero/integrations/telegram/upload-file/init\n *\n * Requests a pre-signed upload URL for a temporary VM0-hosted file. The CLI\n * uploads the file body directly to R2, then the complete route asks Telegram\n * to fetch that file URL with the org-owned bot token.\n * Requires `telegram:write` capability (via ZERO_TOKEN).\n */\nconst telegramUploadInitBodySchema = z.object({\n filename: z.string().min(1, \"Filename is required\").max(255),\n contentType: z.string().min(1, \"Content type is required\").max(200),\n length: z.number().int().positive(\"File length must be a positive integer\"),\n ...directUploadCapabilityShape,\n});\n\nexport type TelegramUploadInitBody = z.infer<\n typeof telegramUploadInitBodySchema\n>;\n\nconst telegramUploadInitResponseSchema = z.object({\n uploadId: z.string().uuid(),\n uploadUrl: z.string(),\n fileUrl: z.string(),\n filename: z.string(),\n contentType: z.string(),\n size: z.number().int().nonnegative(),\n ...directUploadResponseShape,\n});\n\nexport type TelegramUploadInitResponse = z.infer<\n typeof telegramUploadInitResponseSchema\n>;\n\nexport const integrationsTelegramUploadInitContract = c.router({\n init: {\n method: \"POST\",\n path: \"/api/zero/integrations/telegram/upload-file/init\",\n headers: authHeadersSchema,\n body: telegramUploadInitBodySchema,\n responses: {\n 200: telegramUploadInitResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n },\n summary: \"Get a pre-signed upload URL for Telegram file delivery\",\n },\n});\n\n/**\n * Integration Microsoft Teams file upload — init contract\n * POST /api/zero/integrations/teams/upload-file/init\n *\n * Requests a pre-signed upload URL for a temporary VM0-hosted file. The CLI\n * uploads the file body directly to R2, then the complete route sends a Teams\n * message with the file attachment and public file URL.\n * Requires `teams:write` capability (via ZERO_TOKEN).\n */\nconst teamsUploadInitBodySchema = z.object({\n filename: z.string().min(1, \"Filename is required\").max(255),\n contentType: z.string().min(1, \"Content type is required\").max(200),\n length: z.number().int().positive(\"File length must be a positive integer\"),\n ...directUploadCapabilityShape,\n});\n\nexport type TeamsUploadInitBody = z.infer<typeof teamsUploadInitBodySchema>;\n\nconst teamsUploadInitResponseSchema = z.object({\n uploadId: z.string().uuid(),\n uploadUrl: z.string(),\n fileUrl: z.string(),\n filename: z.string(),\n contentType: z.string(),\n size: z.number().int().nonnegative(),\n ...directUploadResponseShape,\n});\n\nexport type TeamsUploadInitResponse = z.infer<\n typeof teamsUploadInitResponseSchema\n>;\n\nexport const integrationsTeamsUploadInitContract = c.router({\n init: {\n method: \"POST\",\n path: \"/api/zero/integrations/teams/upload-file/init\",\n headers: authHeadersSchema,\n body: teamsUploadInitBodySchema,\n responses: {\n 200: teamsUploadInitResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n },\n summary: \"Get a pre-signed upload URL for Microsoft Teams file delivery\",\n },\n});\n\n/**\n * Integration Telegram file upload — complete contract\n * POST /api/zero/integrations/telegram/upload-file/complete\n *\n * Sends an uploaded file URL to a Telegram chat via sendDocument using the\n * requested org-owned bot token.\n * Requires `telegram:write` capability (via ZERO_TOKEN).\n */\nconst telegramUploadCompleteBodySchema = z.object({\n uploadId: z.string().uuid(\"Upload ID must be a UUID\"),\n botId: z.string().min(1, \"Bot ID is required\"),\n chatId: z.string().min(1, \"Chat ID is required\"),\n contentType: z.string().min(1).max(200).optional(),\n caption: z.string().max(1024).optional(),\n messageThreadId: z.number().int().positive().optional(),\n});\n\nexport type TelegramUploadCompleteBody = z.infer<\n typeof telegramUploadCompleteBodySchema\n>;\n\nconst telegramUploadCompleteResponseSchema = z.object({\n messageId: z.number().int(),\n chatId: z.string(),\n fileId: z.string().optional(),\n filename: z.string(),\n mimetype: z.string(),\n size: z.number().int().nonnegative(),\n url: z.string(),\n});\n\nexport type TelegramUploadCompleteResponse = z.infer<\n typeof telegramUploadCompleteResponseSchema\n>;\n\nexport const integrationsTelegramUploadCompleteContract = c.router({\n complete: {\n method: \"POST\",\n path: \"/api/zero/integrations/telegram/upload-file/complete\",\n headers: authHeadersSchema,\n body: telegramUploadCompleteBodySchema,\n responses: {\n 200: telegramUploadCompleteResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 502: apiErrorSchema,\n },\n summary: \"Finalize Telegram file upload and send it to a chat\",\n },\n});\n\n/**\n * Integration Microsoft Teams file upload — complete contract\n * POST /api/zero/integrations/teams/upload-file/complete\n *\n * Sends an uploaded file URL to a Microsoft Teams conversation using the org's\n * installed Teams bot.\n * Requires `teams:write` capability (via ZERO_TOKEN).\n */\nconst teamsUploadCompleteBodySchema = z.object({\n uploadId: z.string().uuid(\"Upload ID must be a UUID\"),\n conversationId: z.string().min(1, \"Conversation ID is required\"),\n activityId: z.string().min(1, \"Activity ID is required\").optional(),\n contentType: z.string().min(1).max(200).optional(),\n text: z.string().max(4000).optional(),\n});\n\nexport type TeamsUploadCompleteBody = z.infer<\n typeof teamsUploadCompleteBodySchema\n>;\n\nconst teamsUploadCompleteResponseSchema = z.object({\n activityId: z.string().optional(),\n conversationId: z.string(),\n filename: z.string(),\n mimetype: z.string(),\n size: z.number().int().nonnegative(),\n url: z.string(),\n});\n\nexport type TeamsUploadCompleteResponse = z.infer<\n typeof teamsUploadCompleteResponseSchema\n>;\n\nexport const integrationsTeamsUploadCompleteContract = c.router({\n complete: {\n method: \"POST\",\n path: \"/api/zero/integrations/teams/upload-file/complete\",\n headers: authHeadersSchema,\n body: teamsUploadCompleteBodySchema,\n responses: {\n 200: teamsUploadCompleteResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 502: apiErrorSchema,\n },\n summary:\n \"Finalize Microsoft Teams file upload and send it to a conversation\",\n },\n});\n\n/**\n * Integration GitHub file upload — init contract\n * POST /api/zero/integrations/github/upload-file/init\n *\n * Requests a pre-signed upload URL for a temporary VM0-hosted file. The CLI\n * uploads the file body directly to R2, then the complete route posts the file\n * URL back to a GitHub issue or pull request comment.\n * Requires `github:write` capability (via ZERO_TOKEN).\n */\nconst githubUploadInitBodySchema = z.object({\n filename: z.string().min(1, \"Filename is required\").max(255),\n contentType: z.string().min(1, \"Content type is required\").max(200),\n length: z.number().int().positive(\"File length must be a positive integer\"),\n ...directUploadCapabilityShape,\n});\n\nexport type GithubUploadInitBody = z.infer<typeof githubUploadInitBodySchema>;\n\nconst githubUploadInitResponseSchema = z.object({\n uploadId: z.string().uuid(),\n uploadUrl: z.string(),\n fileUrl: z.string(),\n filename: z.string(),\n contentType: z.string(),\n size: z.number().int().nonnegative(),\n ...directUploadResponseShape,\n});\n\nexport type GithubUploadInitResponse = z.infer<\n typeof githubUploadInitResponseSchema\n>;\n\nexport const integrationsGithubUploadInitContract = c.router({\n init: {\n method: \"POST\",\n path: \"/api/zero/integrations/github/upload-file/init\",\n headers: authHeadersSchema,\n body: githubUploadInitBodySchema,\n responses: {\n 200: githubUploadInitResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 500: apiErrorSchema,\n 502: apiErrorSchema,\n },\n summary: \"Get a pre-signed upload URL for GitHub file delivery\",\n },\n});\n\n/**\n * Integration GitHub file upload — complete contract\n * POST /api/zero/integrations/github/upload-file/complete\n *\n * Posts an uploaded file URL to a GitHub issue or pull request comment using\n * the organization GitHub App installation token.\n * Requires `github:write` capability (via ZERO_TOKEN).\n */\nconst githubUploadCompleteBodySchema = z.object({\n uploadId: z.string().uuid(\"Upload ID must be a UUID\"),\n repo: z\n .string()\n .min(1, \"Repository is required\")\n .regex(/^[^/\\s]+\\/[^/\\s]+$/, \"Repository must be owner/name\"),\n issueNumber: z\n .number()\n .int()\n .positive(\"Issue or pull request number must be positive\"),\n contentType: z.string().min(1).max(200).optional(),\n caption: z.string().max(65_536).optional(),\n});\n\nexport type GithubUploadCompleteBody = z.infer<\n typeof githubUploadCompleteBodySchema\n>;\n\nconst githubUploadCompleteResponseSchema = z.object({\n commentId: z.string(),\n repo: z.string(),\n issueNumber: z.number().int(),\n filename: z.string(),\n mimetype: z.string(),\n size: z.number().int().nonnegative(),\n url: z.string(),\n});\n\nexport type GithubUploadCompleteResponse = z.infer<\n typeof githubUploadCompleteResponseSchema\n>;\n\nexport const integrationsGithubUploadCompleteContract = c.router({\n complete: {\n method: \"POST\",\n path: \"/api/zero/integrations/github/upload-file/complete\",\n headers: authHeadersSchema,\n body: githubUploadCompleteBodySchema,\n responses: {\n 200: githubUploadCompleteResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 502: apiErrorSchema,\n 500: apiErrorSchema,\n },\n summary: \"Finalize GitHub file upload and post it to an issue or PR\",\n },\n});\n\n/**\n * Integration AgentPhone file upload — init contract\n * POST /api/zero/integrations/phone/upload-file/init\n *\n * Requests a pre-signed upload URL for a VM0-hosted file. The CLI uploads the\n * file body directly to R2, then complete sends the public file URL through\n * AgentPhone.\n * Requires `phone:write` capability (via ZERO_TOKEN).\n */\nconst phoneUploadInitBodySchema = z.object({\n filename: z.string().min(1, \"Filename is required\").max(255),\n contentType: z.string().min(1, \"Content type is required\").max(200),\n length: z.number().int().positive(\"File length must be a positive integer\"),\n ...directUploadCapabilityShape,\n});\n\nexport type PhoneUploadInitBody = z.infer<typeof phoneUploadInitBodySchema>;\n\nconst phoneUploadInitResponseSchema = z.object({\n uploadId: z.string().uuid(),\n uploadUrl: z.string(),\n fileUrl: z.string(),\n filename: z.string(),\n contentType: z.string(),\n size: z.number().int().nonnegative(),\n ...directUploadResponseShape,\n});\n\nexport type PhoneUploadInitResponse = z.infer<\n typeof phoneUploadInitResponseSchema\n>;\n\nexport const integrationsPhoneUploadInitContract = c.router({\n init: {\n method: \"POST\",\n path: \"/api/zero/integrations/phone/upload-file/init\",\n headers: authHeadersSchema,\n body: phoneUploadInitBodySchema,\n responses: {\n 200: phoneUploadInitResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n },\n summary: \"Get a pre-signed upload URL for AgentPhone file delivery\",\n },\n});\n\n/**\n * Integration AgentPhone file upload — complete contract\n * POST /api/zero/integrations/phone/upload-file/complete\n *\n * Sends an uploaded file URL to a connected phone handle through AgentPhone.\n * Requires `phone:write` capability (via ZERO_TOKEN).\n */\nconst phoneUploadCompleteBodySchema = z.object({\n uploadId: z.string().uuid(\"Upload ID must be a UUID\"),\n agentphoneAgentId: z\n .string()\n .min(1, \"AgentPhone agent ID is required\")\n .optional(),\n toNumber: z.string().min(1, \"Phone number is required\"),\n contentType: z.string().min(1).max(200).optional(),\n caption: z.string().max(1024).optional(),\n});\n\nexport type PhoneUploadCompleteBody = z.infer<\n typeof phoneUploadCompleteBodySchema\n>;\n\nconst phoneUploadCompleteResponseSchema = z.object({\n messageId: z.string(),\n channel: z.string().nullable(),\n toNumber: z.string(),\n filename: z.string(),\n mimetype: z.string(),\n size: z.number().int().nonnegative(),\n url: z.string(),\n});\n\nexport type PhoneUploadCompleteResponse = z.infer<\n typeof phoneUploadCompleteResponseSchema\n>;\n\nexport const integrationsPhoneUploadCompleteContract = c.router({\n complete: {\n method: \"POST\",\n path: \"/api/zero/integrations/phone/upload-file/complete\",\n headers: authHeadersSchema,\n body: phoneUploadCompleteBodySchema,\n responses: {\n 200: phoneUploadCompleteResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 502: apiErrorSchema,\n },\n summary: \"Finalize AgentPhone file upload and send it to a phone handle\",\n },\n});\n\n/**\n * Integration Slack file upload — complete contract\n * POST /api/zero/integrations/slack/upload-file/complete\n *\n * Finalizes a Slack file upload and shares it to a channel/thread.\n * Requires `slack:write` capability (via ZERO_TOKEN).\n */\nconst slackUploadCompleteBodySchema = z.object({\n fileId: z.string().min(1, \"File ID is required\"),\n channel: z.string().min(1, \"Channel ID is required\"),\n threadTs: z.string().optional(),\n title: z.string().optional(),\n initialComment: z.string().optional(),\n canonicalAssetId: z.string().uuid().optional(),\n operationId: z.string().uuid().optional(),\n uploadError: z.string().max(2000).optional(),\n});\n\nexport type SlackUploadCompleteBody = z.infer<\n typeof slackUploadCompleteBodySchema\n>;\n\nconst slackUploadCompleteResponseSchema = z.object({\n fileId: z.string(),\n permalink: z.string(),\n assetId: z.string().uuid().optional(),\n assetUrl: z.string().url().optional(),\n deliveryStatus: z.enum([\"delivered\", \"failed\"]).optional(),\n deliveryError: z.string().optional(),\n});\n\nexport type SlackUploadCompleteResponse = z.infer<\n typeof slackUploadCompleteResponseSchema\n>;\n\nexport const integrationsSlackUploadCompleteContract = c.router({\n complete: {\n method: \"POST\",\n path: \"/api/zero/integrations/slack/upload-file/complete\",\n headers: authHeadersSchema,\n body: slackUploadCompleteBodySchema,\n responses: {\n 200: slackUploadCompleteResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n },\n summary: \"Finalize Slack file upload and share to channel\",\n },\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __createRequire } from "node:module";
|
|
3
|
+
const require = __createRequire(import.meta.url);
|
|
4
|
+
import {
|
|
5
|
+
authHeadersSchema
|
|
6
|
+
} from "./chunk-JV6LM2YC.js";
|
|
7
|
+
import {
|
|
8
|
+
apiErrorSchema,
|
|
9
|
+
external_exports,
|
|
10
|
+
initContract
|
|
11
|
+
} from "./chunk-GHKWW4NC.js";
|
|
12
|
+
import {
|
|
13
|
+
init_esm_shims
|
|
14
|
+
} from "./chunk-AUWSMG4F.js";
|
|
15
|
+
|
|
16
|
+
// ../../packages/api-contracts/src/contracts/zero-mail.ts
|
|
17
|
+
init_esm_shims();
|
|
18
|
+
var c = initContract();
|
|
19
|
+
var zeroMailProviderSchema = external_exports.enum(["gmail", "outlook"]);
|
|
20
|
+
var zeroMailDraftStatusSchema = external_exports.enum(["draft", "sent", "deleted"]);
|
|
21
|
+
var zeroMailAttachmentSchema = external_exports.object({
|
|
22
|
+
filename: external_exports.string(),
|
|
23
|
+
contentType: external_exports.string(),
|
|
24
|
+
size: external_exports.number().int().nonnegative(),
|
|
25
|
+
partId: external_exports.string().optional()
|
|
26
|
+
});
|
|
27
|
+
var zeroMailInlineImageSchema = external_exports.object({
|
|
28
|
+
contentId: external_exports.string().min(1),
|
|
29
|
+
partId: external_exports.string().min(1),
|
|
30
|
+
alt: external_exports.string()
|
|
31
|
+
});
|
|
32
|
+
var zeroMailFollowUpSchema = external_exports.discriminatedUnion("status", [
|
|
33
|
+
external_exports.object({
|
|
34
|
+
status: external_exports.literal("active"),
|
|
35
|
+
automationId: external_exports.string().uuid()
|
|
36
|
+
}),
|
|
37
|
+
external_exports.object({
|
|
38
|
+
status: external_exports.literal("paused"),
|
|
39
|
+
automationId: external_exports.string().uuid()
|
|
40
|
+
})
|
|
41
|
+
]);
|
|
42
|
+
var zeroMailDraftBaseSchema = external_exports.object({
|
|
43
|
+
provider: external_exports.literal("gmail"),
|
|
44
|
+
from: external_exports.email(),
|
|
45
|
+
fromName: external_exports.string().optional(),
|
|
46
|
+
to: external_exports.array(external_exports.email()),
|
|
47
|
+
cc: external_exports.array(external_exports.email()),
|
|
48
|
+
bcc: external_exports.array(external_exports.email()),
|
|
49
|
+
subject: external_exports.string(),
|
|
50
|
+
body: external_exports.string(),
|
|
51
|
+
bodyHtml: external_exports.string().optional(),
|
|
52
|
+
inlineImages: external_exports.array(zeroMailInlineImageSchema).optional(),
|
|
53
|
+
accessStatus: external_exports.enum(["ready", "reconnect"]).optional(),
|
|
54
|
+
replyTo: external_exports.string().optional(),
|
|
55
|
+
inReplyTo: external_exports.string().optional(),
|
|
56
|
+
references: external_exports.array(external_exports.string()),
|
|
57
|
+
status: zeroMailDraftStatusSchema,
|
|
58
|
+
detailAvailable: external_exports.boolean(),
|
|
59
|
+
gmailDraftId: external_exports.string(),
|
|
60
|
+
gmailThreadId: external_exports.string(),
|
|
61
|
+
gmailMessageId: external_exports.string(),
|
|
62
|
+
sentGmailMessageId: external_exports.string().optional(),
|
|
63
|
+
followUp: zeroMailFollowUpSchema.optional(),
|
|
64
|
+
createdAt: external_exports.string(),
|
|
65
|
+
updatedAt: external_exports.string(),
|
|
66
|
+
sentAt: external_exports.string().optional()
|
|
67
|
+
});
|
|
68
|
+
var zeroMailDraftSchema = zeroMailDraftBaseSchema.extend({
|
|
69
|
+
version: external_exports.literal(3),
|
|
70
|
+
attachments: external_exports.array(zeroMailAttachmentSchema)
|
|
71
|
+
});
|
|
72
|
+
var zeroMailDraftResponseSchema = external_exports.object({
|
|
73
|
+
mailDraftId: external_exports.string().uuid(),
|
|
74
|
+
mailDraftUrl: external_exports.url(),
|
|
75
|
+
mailDraft: zeroMailDraftSchema
|
|
76
|
+
});
|
|
77
|
+
var zeroMailLinkResponseSchema = zeroMailDraftResponseSchema.pick({
|
|
78
|
+
mailDraftId: true,
|
|
79
|
+
mailDraftUrl: true
|
|
80
|
+
});
|
|
81
|
+
var zeroMailDraftPathParamsSchema = external_exports.object({
|
|
82
|
+
mailDraftId: external_exports.string().uuid()
|
|
83
|
+
});
|
|
84
|
+
var zeroMailDraftAttachmentPathParamsSchema = zeroMailDraftPathParamsSchema.extend({
|
|
85
|
+
partId: external_exports.string().min(1)
|
|
86
|
+
});
|
|
87
|
+
var zeroMailContract = c.router({
|
|
88
|
+
linkDraft: {
|
|
89
|
+
method: "POST",
|
|
90
|
+
path: "/api/zero/mail/drafts/link",
|
|
91
|
+
headers: authHeadersSchema,
|
|
92
|
+
body: external_exports.object({
|
|
93
|
+
threadId: external_exports.string().uuid(),
|
|
94
|
+
agentId: external_exports.string().uuid().optional(),
|
|
95
|
+
gmailDraftId: external_exports.string().min(1)
|
|
96
|
+
}),
|
|
97
|
+
responses: {
|
|
98
|
+
200: zeroMailLinkResponseSchema,
|
|
99
|
+
401: apiErrorSchema,
|
|
100
|
+
403: apiErrorSchema,
|
|
101
|
+
404: apiErrorSchema,
|
|
102
|
+
409: apiErrorSchema
|
|
103
|
+
},
|
|
104
|
+
summary: "Link an existing Gmail draft to a web chat thread"
|
|
105
|
+
},
|
|
106
|
+
getDraft: {
|
|
107
|
+
method: "GET",
|
|
108
|
+
path: "/api/zero/mail/drafts/:mailDraftId",
|
|
109
|
+
headers: authHeadersSchema,
|
|
110
|
+
pathParams: zeroMailDraftPathParamsSchema,
|
|
111
|
+
responses: {
|
|
112
|
+
200: zeroMailDraftResponseSchema,
|
|
113
|
+
401: apiErrorSchema,
|
|
114
|
+
403: apiErrorSchema,
|
|
115
|
+
404: apiErrorSchema,
|
|
116
|
+
409: apiErrorSchema
|
|
117
|
+
},
|
|
118
|
+
summary: "Get an email draft by ID"
|
|
119
|
+
},
|
|
120
|
+
getAttachment: {
|
|
121
|
+
method: "GET",
|
|
122
|
+
path: "/api/zero/mail/drafts/:mailDraftId/attachments/:partId",
|
|
123
|
+
headers: authHeadersSchema,
|
|
124
|
+
pathParams: zeroMailDraftAttachmentPathParamsSchema,
|
|
125
|
+
responses: {
|
|
126
|
+
200: c.otherResponse({
|
|
127
|
+
contentType: "application/octet-stream",
|
|
128
|
+
body: c.type()
|
|
129
|
+
}),
|
|
130
|
+
401: apiErrorSchema,
|
|
131
|
+
403: apiErrorSchema,
|
|
132
|
+
404: apiErrorSchema,
|
|
133
|
+
409: apiErrorSchema
|
|
134
|
+
},
|
|
135
|
+
summary: "Get a Gmail draft attachment"
|
|
136
|
+
},
|
|
137
|
+
deleteDraft: {
|
|
138
|
+
method: "DELETE",
|
|
139
|
+
path: "/api/zero/mail/drafts/:mailDraftId",
|
|
140
|
+
headers: authHeadersSchema,
|
|
141
|
+
pathParams: zeroMailDraftPathParamsSchema,
|
|
142
|
+
body: c.noBody(),
|
|
143
|
+
responses: {
|
|
144
|
+
204: c.noBody(),
|
|
145
|
+
401: apiErrorSchema,
|
|
146
|
+
403: apiErrorSchema,
|
|
147
|
+
404: apiErrorSchema,
|
|
148
|
+
409: apiErrorSchema
|
|
149
|
+
},
|
|
150
|
+
summary: "Permanently delete a Gmail draft and its vm0 record"
|
|
151
|
+
},
|
|
152
|
+
sendDraft: {
|
|
153
|
+
method: "POST",
|
|
154
|
+
path: "/api/zero/mail/drafts/:mailDraftId/send",
|
|
155
|
+
headers: authHeadersSchema,
|
|
156
|
+
pathParams: zeroMailDraftPathParamsSchema,
|
|
157
|
+
body: c.noBody(),
|
|
158
|
+
responses: {
|
|
159
|
+
200: zeroMailDraftResponseSchema,
|
|
160
|
+
400: apiErrorSchema,
|
|
161
|
+
401: apiErrorSchema,
|
|
162
|
+
403: apiErrorSchema,
|
|
163
|
+
404: apiErrorSchema,
|
|
164
|
+
409: apiErrorSchema
|
|
165
|
+
},
|
|
166
|
+
summary: "Send a linked Gmail draft"
|
|
167
|
+
},
|
|
168
|
+
// Compatibility contract for Platform bundles loaded before the Mail
|
|
169
|
+
// follow-up action was removed. Delete after that frontend release drains.
|
|
170
|
+
createFollowUp: {
|
|
171
|
+
method: "POST",
|
|
172
|
+
path: "/api/zero/mail/drafts/:mailDraftId/follow-up",
|
|
173
|
+
headers: authHeadersSchema,
|
|
174
|
+
pathParams: external_exports.object({ mailDraftId: external_exports.string().uuid() }),
|
|
175
|
+
body: external_exports.object({}),
|
|
176
|
+
responses: {
|
|
177
|
+
200: external_exports.object({
|
|
178
|
+
mailDraftId: external_exports.string().uuid(),
|
|
179
|
+
automationId: external_exports.string().uuid()
|
|
180
|
+
}),
|
|
181
|
+
400: apiErrorSchema,
|
|
182
|
+
401: apiErrorSchema,
|
|
183
|
+
403: apiErrorSchema,
|
|
184
|
+
404: apiErrorSchema,
|
|
185
|
+
409: apiErrorSchema
|
|
186
|
+
},
|
|
187
|
+
summary: "Enable reply tracking for a sent Gmail message"
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
export {
|
|
192
|
+
zeroMailContract
|
|
193
|
+
};
|
|
194
|
+
//# sourceMappingURL=chunk-RTCRU35A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../packages/api-contracts/src/contracts/zero-mail.ts"],"sourcesContent":["import { z } from \"zod\";\n\nimport { authHeadersSchema, initContract } from \"./base\";\nimport { apiErrorSchema } from \"./errors\";\n\nconst c = initContract();\n\nexport const zeroMailProviderSchema = z.enum([\"gmail\", \"outlook\"]);\n\nexport const zeroMailDraftStatusSchema = z.enum([\"draft\", \"sent\", \"deleted\"]);\n\nexport const zeroMailAttachmentSchema = z.object({\n filename: z.string(),\n contentType: z.string(),\n size: z.number().int().nonnegative(),\n partId: z.string().optional(),\n});\n\nexport const zeroMailInlineImageSchema = z.object({\n contentId: z.string().min(1),\n partId: z.string().min(1),\n alt: z.string(),\n});\n\nexport const zeroMailFollowUpSchema = z.discriminatedUnion(\"status\", [\n z.object({\n status: z.literal(\"active\"),\n automationId: z.string().uuid(),\n }),\n z.object({\n status: z.literal(\"paused\"),\n automationId: z.string().uuid(),\n }),\n]);\n\nconst zeroMailDraftBaseSchema = z.object({\n provider: z.literal(\"gmail\"),\n from: z.email(),\n fromName: z.string().optional(),\n to: z.array(z.email()),\n cc: z.array(z.email()),\n bcc: z.array(z.email()),\n subject: z.string(),\n body: z.string(),\n bodyHtml: z.string().optional(),\n inlineImages: z.array(zeroMailInlineImageSchema).optional(),\n accessStatus: z.enum([\"ready\", \"reconnect\"]).optional(),\n replyTo: z.string().optional(),\n inReplyTo: z.string().optional(),\n references: z.array(z.string()),\n status: zeroMailDraftStatusSchema,\n detailAvailable: z.boolean(),\n gmailDraftId: z.string(),\n gmailThreadId: z.string(),\n gmailMessageId: z.string(),\n sentGmailMessageId: z.string().optional(),\n followUp: zeroMailFollowUpSchema.optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n sentAt: z.string().optional(),\n});\n\nexport const zeroMailDraftSchema = zeroMailDraftBaseSchema.extend({\n version: z.literal(3),\n attachments: z.array(zeroMailAttachmentSchema),\n});\n\nconst zeroMailDraftResponseSchema = z.object({\n mailDraftId: z.string().uuid(),\n mailDraftUrl: z.url(),\n mailDraft: zeroMailDraftSchema,\n});\n\nconst zeroMailLinkResponseSchema = zeroMailDraftResponseSchema.pick({\n mailDraftId: true,\n mailDraftUrl: true,\n});\n\nconst zeroMailDraftPathParamsSchema = z.object({\n mailDraftId: z.string().uuid(),\n});\n\nconst zeroMailDraftAttachmentPathParamsSchema =\n zeroMailDraftPathParamsSchema.extend({\n partId: z.string().min(1),\n });\n\nexport const zeroMailContract = c.router({\n linkDraft: {\n method: \"POST\",\n path: \"/api/zero/mail/drafts/link\",\n headers: authHeadersSchema,\n body: z.object({\n threadId: z.string().uuid(),\n agentId: z.string().uuid().optional(),\n gmailDraftId: z.string().min(1),\n }),\n responses: {\n 200: zeroMailLinkResponseSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 409: apiErrorSchema,\n },\n summary: \"Link an existing Gmail draft to a web chat thread\",\n },\n getDraft: {\n method: \"GET\",\n path: \"/api/zero/mail/drafts/:mailDraftId\",\n headers: authHeadersSchema,\n pathParams: zeroMailDraftPathParamsSchema,\n responses: {\n 200: zeroMailDraftResponseSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 409: apiErrorSchema,\n },\n summary: \"Get an email draft by ID\",\n },\n getAttachment: {\n method: \"GET\",\n path: \"/api/zero/mail/drafts/:mailDraftId/attachments/:partId\",\n headers: authHeadersSchema,\n pathParams: zeroMailDraftAttachmentPathParamsSchema,\n responses: {\n 200: c.otherResponse({\n contentType: \"application/octet-stream\",\n body: c.type<Blob>(),\n }),\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 409: apiErrorSchema,\n },\n summary: \"Get a Gmail draft attachment\",\n },\n deleteDraft: {\n method: \"DELETE\",\n path: \"/api/zero/mail/drafts/:mailDraftId\",\n headers: authHeadersSchema,\n pathParams: zeroMailDraftPathParamsSchema,\n body: c.noBody(),\n responses: {\n 204: c.noBody(),\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 409: apiErrorSchema,\n },\n summary: \"Permanently delete a Gmail draft and its vm0 record\",\n },\n sendDraft: {\n method: \"POST\",\n path: \"/api/zero/mail/drafts/:mailDraftId/send\",\n headers: authHeadersSchema,\n pathParams: zeroMailDraftPathParamsSchema,\n body: c.noBody(),\n responses: {\n 200: zeroMailDraftResponseSchema,\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 409: apiErrorSchema,\n },\n summary: \"Send a linked Gmail draft\",\n },\n // Compatibility contract for Platform bundles loaded before the Mail\n // follow-up action was removed. Delete after that frontend release drains.\n createFollowUp: {\n method: \"POST\",\n path: \"/api/zero/mail/drafts/:mailDraftId/follow-up\",\n headers: authHeadersSchema,\n pathParams: z.object({ mailDraftId: z.string().uuid() }),\n body: z.object({}),\n responses: {\n 200: z.object({\n mailDraftId: z.string().uuid(),\n automationId: z.string().uuid(),\n }),\n 400: apiErrorSchema,\n 401: apiErrorSchema,\n 403: apiErrorSchema,\n 404: apiErrorSchema,\n 409: apiErrorSchema,\n },\n summary: \"Enable reply tracking for a sent Gmail message\",\n },\n});\n\nexport type ZeroMailProvider = z.infer<typeof zeroMailProviderSchema>;\nexport type ZeroMailDraftStatus = z.infer<typeof zeroMailDraftStatusSchema>;\nexport type ZeroMailAttachment = z.infer<typeof zeroMailAttachmentSchema>;\nexport type ZeroMailInlineImage = z.infer<typeof zeroMailInlineImageSchema>;\nexport type ZeroMailFollowUp = z.infer<typeof zeroMailFollowUpSchema>;\nexport type ZeroMailDraft = z.infer<typeof zeroMailDraftSchema>;\nexport type ZeroMailContract = typeof zeroMailContract;\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAKA,IAAM,IAAI,aAAa;AAEhB,IAAM,yBAAyB,iBAAE,KAAK,CAAC,SAAS,SAAS,CAAC;AAE1D,IAAM,4BAA4B,iBAAE,KAAK,CAAC,SAAS,QAAQ,SAAS,CAAC;AAErE,IAAM,2BAA2B,iBAAE,OAAO;AAAA,EAC/C,UAAU,iBAAE,OAAO;AAAA,EACnB,aAAa,iBAAE,OAAO;AAAA,EACtB,MAAM,iBAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACnC,QAAQ,iBAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAEM,IAAM,4BAA4B,iBAAE,OAAO;AAAA,EAChD,WAAW,iBAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,QAAQ,iBAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,KAAK,iBAAE,OAAO;AAChB,CAAC;AAEM,IAAM,yBAAyB,iBAAE,mBAAmB,UAAU;AAAA,EACnE,iBAAE,OAAO;AAAA,IACP,QAAQ,iBAAE,QAAQ,QAAQ;AAAA,IAC1B,cAAc,iBAAE,OAAO,EAAE,KAAK;AAAA,EAChC,CAAC;AAAA,EACD,iBAAE,OAAO;AAAA,IACP,QAAQ,iBAAE,QAAQ,QAAQ;AAAA,IAC1B,cAAc,iBAAE,OAAO,EAAE,KAAK;AAAA,EAChC,CAAC;AACH,CAAC;AAED,IAAM,0BAA0B,iBAAE,OAAO;AAAA,EACvC,UAAU,iBAAE,QAAQ,OAAO;AAAA,EAC3B,MAAM,iBAAE,MAAM;AAAA,EACd,UAAU,iBAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,IAAI,iBAAE,MAAM,iBAAE,MAAM,CAAC;AAAA,EACrB,IAAI,iBAAE,MAAM,iBAAE,MAAM,CAAC;AAAA,EACrB,KAAK,iBAAE,MAAM,iBAAE,MAAM,CAAC;AAAA,EACtB,SAAS,iBAAE,OAAO;AAAA,EAClB,MAAM,iBAAE,OAAO;AAAA,EACf,UAAU,iBAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,cAAc,iBAAE,MAAM,yBAAyB,EAAE,SAAS;AAAA,EAC1D,cAAc,iBAAE,KAAK,CAAC,SAAS,WAAW,CAAC,EAAE,SAAS;AAAA,EACtD,SAAS,iBAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAW,iBAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,YAAY,iBAAE,MAAM,iBAAE,OAAO,CAAC;AAAA,EAC9B,QAAQ;AAAA,EACR,iBAAiB,iBAAE,QAAQ;AAAA,EAC3B,cAAc,iBAAE,OAAO;AAAA,EACvB,eAAe,iBAAE,OAAO;AAAA,EACxB,gBAAgB,iBAAE,OAAO;AAAA,EACzB,oBAAoB,iBAAE,OAAO,EAAE,SAAS;AAAA,EACxC,UAAU,uBAAuB,SAAS;AAAA,EAC1C,WAAW,iBAAE,OAAO;AAAA,EACpB,WAAW,iBAAE,OAAO;AAAA,EACpB,QAAQ,iBAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAEM,IAAM,sBAAsB,wBAAwB,OAAO;AAAA,EAChE,SAAS,iBAAE,QAAQ,CAAC;AAAA,EACpB,aAAa,iBAAE,MAAM,wBAAwB;AAC/C,CAAC;AAED,IAAM,8BAA8B,iBAAE,OAAO;AAAA,EAC3C,aAAa,iBAAE,OAAO,EAAE,KAAK;AAAA,EAC7B,cAAc,iBAAE,IAAI;AAAA,EACpB,WAAW;AACb,CAAC;AAED,IAAM,6BAA6B,4BAA4B,KAAK;AAAA,EAClE,aAAa;AAAA,EACb,cAAc;AAChB,CAAC;AAED,IAAM,gCAAgC,iBAAE,OAAO;AAAA,EAC7C,aAAa,iBAAE,OAAO,EAAE,KAAK;AAC/B,CAAC;AAED,IAAM,0CACJ,8BAA8B,OAAO;AAAA,EACnC,QAAQ,iBAAE,OAAO,EAAE,IAAI,CAAC;AAC1B,CAAC;AAEI,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,iBAAE,OAAO;AAAA,MACb,UAAU,iBAAE,OAAO,EAAE,KAAK;AAAA,MAC1B,SAAS,iBAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,MACpC,cAAc,iBAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAChC,CAAC;AAAA,IACD,WAAW;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,SAAS;AAAA,EACX;AAAA,EACA,eAAe;AAAA,IACb,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,MACT,KAAK,EAAE,cAAc;AAAA,QACnB,aAAa;AAAA,QACb,MAAM,EAAE,KAAW;AAAA,MACrB,CAAC;AAAA,MACD,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,MAAM,EAAE,OAAO;AAAA,IACf,WAAW;AAAA,MACT,KAAK,EAAE,OAAO;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,SAAS;AAAA,EACX;AAAA,EACA,WAAW;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,MAAM,EAAE,OAAO;AAAA,IACf,WAAW;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,SAAS;AAAA,EACX;AAAA;AAAA;AAAA,EAGA,gBAAgB;AAAA,IACd,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,iBAAE,OAAO,EAAE,aAAa,iBAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAAA,IACvD,MAAM,iBAAE,OAAO,CAAC,CAAC;AAAA,IACjB,WAAW;AAAA,MACT,KAAK,iBAAE,OAAO;AAAA,QACZ,aAAa,iBAAE,OAAO,EAAE,KAAK;AAAA,QAC7B,cAAc,iBAAE,OAAO,EAAE,KAAK;AAAA,MAChC,CAAC;AAAA,MACD,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,SAAS;AAAA,EACX;AACF,CAAC;","names":[]}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
getZeroAgent,
|
|
6
6
|
getZeroAgentCustomConnectors,
|
|
7
7
|
getZeroAgentUserConnectors
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-U2GQH6AD.js";
|
|
9
9
|
import {
|
|
10
10
|
init_esm_shims
|
|
11
11
|
} from "./chunk-AUWSMG4F.js";
|
|
@@ -355,4 +355,4 @@ export {
|
|
|
355
355
|
resolveAgentContext,
|
|
356
356
|
resolveConnectorDiscoveryAgentContext
|
|
357
357
|
};
|
|
358
|
-
//# sourceMappingURL=chunk-
|
|
358
|
+
//# sourceMappingURL=chunk-RTEEWZUT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/zero/connector/action-url.ts","../src/commands/zero/connector/public-catalog.ts","../src/commands/zero/connector/agent-context.ts"],"sourcesContent":["export const CALLBACK_PROMPT_PLACEHOLDER =\n \"SOMETHING_AGENT_WANT_TO_BE_CALLBACK\";\n\nexport function connectorActionCallbackAvailable(): boolean {\n return Boolean(process.env.ZERO_CHAT_THREAD_ID?.trim());\n}\n\nfunction currentChatThreadId(agentId: string | undefined): string | null {\n const threadId = process.env.ZERO_CHAT_THREAD_ID?.trim();\n const currentAgentId = process.env.ZERO_AGENT_ID?.trim();\n if (!threadId || !currentAgentId || agentId !== currentAgentId) {\n return null;\n }\n return threadId;\n}\n\nexport function currentChatSupportsActionCallback(\n agentId: string | undefined,\n): boolean {\n return currentChatThreadId(agentId) !== null;\n}\n\nfunction addCallbackSearchParams(\n params: URLSearchParams,\n threadId: string,\n callbackPrompt: string,\n): void {\n params.set(\"threadId\", threadId);\n params.set(\"callbackPrompt\", callbackPrompt);\n}\n\nexport function addRequestedCallbackSearchParams(\n params: URLSearchParams,\n callbackPrompt: string | undefined,\n agentId: string | undefined,\n): void {\n if (callbackPrompt === undefined) {\n return;\n }\n\n const normalizedPrompt = callbackPrompt.trim();\n if (!normalizedPrompt) {\n throw new Error(\"--callback-prompt cannot be empty\");\n }\n\n const threadId = currentChatThreadId(agentId);\n if (!threadId) {\n throw new Error(\n \"--callback-prompt can only target the current Zero web chat thread and agent\",\n );\n }\n addCallbackSearchParams(params, threadId, normalizedPrompt);\n}\n\nexport function connectorActionUrl(args: {\n readonly origin: string;\n readonly path: string;\n readonly agentId?: string;\n}): string {\n const url = new URL(args.path, args.origin);\n if (args.agentId) {\n url.searchParams.set(\"agentId\", args.agentId);\n }\n return url.toString();\n}\n\nfunction callbackActionUrlExample(\n actionUrl: string,\n agentId: string | undefined,\n): string | null {\n const threadId = currentChatThreadId(agentId);\n if (!threadId) {\n return null;\n }\n\n const url = new URL(actionUrl);\n addCallbackSearchParams(\n url.searchParams,\n threadId,\n CALLBACK_PROMPT_PLACEHOLDER,\n );\n return url.toString();\n}\n\nexport function printCallbackActionUrlExample(\n actionUrl: string,\n agentId: string | undefined,\n): void {\n const callbackUrl = callbackActionUrlExample(actionUrl, agentId);\n if (!callbackUrl) {\n return;\n }\n\n console.log(\"\");\n console.log(\n \"Or, if this is the only connector or permission action needed, use the callback URL below. After the user completes this action, Zero will automatically start the next round with the callback prompt:\",\n );\n console.log(callbackUrl);\n}\n\nexport function printCallbackTurnInstruction(): void {\n console.log(\"\");\n console.log(\n \"After sharing this callback URL, end the current turn. When the user completes the action, Zero will automatically start the next round with the callback prompt.\",\n );\n}\n","import type { PublicConnectorCatalogAuthMethodDetail } from \"@vm0/api-contracts/contracts/zero-connector-catalog\";\nimport type { ZeroConnectorCatalogStatus } from \"../../../lib/api/domains/zero-connectors\";\n\nexport type PublicConnectorStatus = ZeroConnectorCatalogStatus;\n\ninterface ConnectorSearchItem {\n readonly slug: string;\n readonly label: string;\n readonly description: string;\n readonly category: string;\n readonly tags: readonly string[];\n readonly generation: readonly string[];\n readonly authMethods: readonly {\n readonly id: string;\n readonly label: string;\n readonly description: string | null;\n }[];\n}\n\ninterface ConnectorSearchResult<T extends ConnectorSearchItem> {\n readonly connector: T;\n readonly score: number;\n readonly matchedField: string;\n}\n\ninterface ConnectorSearchOutput<T extends ConnectorSearchItem> {\n readonly results: readonly ConnectorSearchResult<T>[];\n readonly total: number;\n}\n\nconst TOKEN_BOUNDARY = /[_\\-\\s]+/;\nconst CASE_BOUNDARY = /(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/;\nconst MIN_SCORE = 10;\n\nfunction tokenize(input: string): Set<string> {\n const tokens = new Set<string>();\n for (const chunk of input.split(TOKEN_BOUNDARY)) {\n if (!chunk) continue;\n for (const sub of chunk.split(CASE_BOUNDARY)) {\n const lower = sub.toLowerCase();\n if (lower) tokens.add(lower);\n }\n }\n return tokens;\n}\n\nfunction publicStrings(connector: ConnectorSearchItem): string[] {\n return [\n connector.slug,\n connector.label,\n connector.description,\n connector.category,\n ...connector.tags,\n ...connector.generation,\n ...connector.authMethods.flatMap((authMethod) => {\n return [\n authMethod.id,\n authMethod.label,\n ...(authMethod.description ? [authMethod.description] : []),\n ];\n }),\n ];\n}\n\ntype ScoreHit = { score: number; matchedField: string };\n\nfunction best(candidates: readonly (ScoreHit | null)[]): ScoreHit | null {\n return candidates.reduce<ScoreHit | null>((bestHit, hit) => {\n if (!hit) return bestHit;\n if (!bestHit || hit.score > bestHit.score) return hit;\n return bestHit;\n }, null);\n}\n\nfunction scoreExact(\n keywordLower: string,\n skipPrivateIdentifierMatches: boolean,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n if (connector.slug.toLowerCase() === keywordLower) {\n return { score: 100, matchedField: \"slug\" };\n }\n if (connector.label.toLowerCase() === keywordLower) {\n return { score: 80, matchedField: \"label\" };\n }\n for (const tag of connector.tags) {\n if (skipPrivateIdentifierMatches && tag.includes(\"_\")) continue;\n if (tag.toLowerCase() === keywordLower) {\n return { score: 70, matchedField: `tag:${tag}` };\n }\n }\n for (const generationType of connector.generation) {\n if (generationType.toLowerCase() === keywordLower) {\n return { score: 65, matchedField: `generation:${generationType}` };\n }\n }\n for (const authMethod of connector.authMethods) {\n if (authMethod.id.toLowerCase() === keywordLower) {\n return { score: 60, matchedField: `auth-method:${authMethod.id}` };\n }\n if (authMethod.label.toLowerCase() === keywordLower) {\n return { score: 60, matchedField: `auth-method:${authMethod.label}` };\n }\n }\n if (connector.category.toLowerCase() === keywordLower) {\n return { score: 55, matchedField: \"category\" };\n }\n return null;\n}\n\nfunction scoreSubstring(\n keywordLower: string,\n skipPrivateIdentifierMatches: boolean,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n const candidates: ScoreHit[] = [];\n if (connector.slug.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 50, matchedField: \"slug\" });\n }\n if (connector.label.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 50, matchedField: \"label\" });\n }\n for (const tag of connector.tags) {\n if (skipPrivateIdentifierMatches && tag.includes(\"_\")) continue;\n if (tag.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 25, matchedField: `tag:${tag}` });\n }\n }\n for (const generationType of connector.generation) {\n if (generationType.toLowerCase().includes(keywordLower)) {\n candidates.push({\n score: 25,\n matchedField: `generation:${generationType}`,\n });\n }\n }\n for (const authMethod of connector.authMethods) {\n if (\n authMethod.id.toLowerCase().includes(keywordLower) ||\n authMethod.label.toLowerCase().includes(keywordLower)\n ) {\n candidates.push({\n score: 20,\n matchedField: `auth-method:${authMethod.id}`,\n });\n }\n }\n if (connector.category.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 20, matchedField: \"category\" });\n }\n if (connector.description.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 15, matchedField: \"description\" });\n }\n\n return best(candidates);\n}\n\nfunction scoreTokens(\n keywordTokens: ReadonlySet<string>,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n const candidateTokens = new Set<string>();\n for (const source of publicStrings(connector)) {\n for (const token of tokenize(source)) {\n candidateTokens.add(token);\n }\n }\n\n let intersection = 0;\n let firstCommon = \"\";\n for (const token of keywordTokens) {\n if (candidateTokens.has(token)) {\n intersection++;\n if (!firstCommon) firstCommon = token;\n }\n }\n if (intersection === 0) return null;\n return { score: 10 * intersection, matchedField: `token:${firstCommon}` };\n}\n\nfunction scoreConnector(\n keywordLower: string,\n keyword: string,\n keywordTokens: ReadonlySet<string>,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n const skipPrivateIdentifierMatches =\n /^[A-Za-z0-9_]+$/.test(keyword) && keyword.includes(\"_\");\n const tokenHit = skipPrivateIdentifierMatches\n ? null\n : scoreTokens(keywordTokens, connector);\n const hit = best([\n scoreExact(keywordLower, skipPrivateIdentifierMatches, connector),\n scoreSubstring(keywordLower, skipPrivateIdentifierMatches, connector),\n tokenHit,\n ]);\n if (!hit || hit.score < MIN_SCORE) return null;\n return hit;\n}\n\nexport function searchConnectorCatalog<T extends ConnectorSearchItem>(\n connectors: readonly T[],\n keyword: string,\n limit: number,\n): ConnectorSearchOutput<T> {\n const trimmed = keyword.trim();\n if (!trimmed) return { results: [], total: 0 };\n\n const keywordLower = trimmed.toLowerCase();\n const keywordTokens = tokenize(trimmed);\n const hits = connectors.flatMap((connector): ConnectorSearchResult<T>[] => {\n const hit = scoreConnector(keywordLower, trimmed, keywordTokens, connector);\n if (!hit) return [];\n return [\n {\n connector,\n score: hit.score,\n matchedField: hit.matchedField,\n },\n ];\n });\n\n hits.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.connector.slug.localeCompare(b.connector.slug);\n });\n\n return {\n results: hits.slice(0, limit),\n total: hits.length,\n };\n}\n\nexport function findConnectorStatusItem(\n connectors: readonly PublicConnectorStatus[],\n connectorSlug: string,\n): PublicConnectorStatus | null {\n const exact = connectors.find((connector) => {\n return connector.slug === connectorSlug;\n });\n if (exact) return exact;\n\n const lower = connectorSlug.toLowerCase();\n return (\n connectors.find((connector) => {\n return connector.slug.toLowerCase() === lower;\n }) ?? null\n );\n}\n\nexport function availableConnectorSlugs(\n connectors: readonly PublicConnectorStatus[],\n): string {\n return connectors\n .map((connector) => {\n return connector.slug;\n })\n .join(\", \");\n}\n\nexport function resolveManualGrantAuthMethod(\n connector: PublicConnectorStatus,\n rawAuthMethod: string | undefined,\n): PublicConnectorCatalogAuthMethodDetail {\n if (rawAuthMethod) {\n const authMethod = connector.authMethods.find((method) => {\n return method.id === rawAuthMethod;\n });\n if (!authMethod) {\n throw new Error(\n `${connector.slug} connector does not have ${rawAuthMethod} auth method`,\n {\n cause: new Error(\n `Available auth methods: ${connector.authMethods\n .map((method) => {\n return method.id;\n })\n .join(\", \")}`,\n ),\n },\n );\n }\n\n if (authMethod.grantKind === \"manual\") {\n return authMethod;\n }\n\n throw new Error(\n `${connector.slug} ${authMethod.id} auth method does not use a manual grant`,\n );\n }\n\n const manualAuthMethods = connector.authMethods.filter((method) => {\n return method.grantKind === \"manual\";\n });\n const authMethod = manualAuthMethods[0];\n if (manualAuthMethods.length === 1 && authMethod) {\n return authMethod;\n }\n if (manualAuthMethods.length === 0) {\n throw new Error(`${connector.slug} connector does not use a manual grant`);\n }\n\n throw new Error(\n `${connector.slug} connector has multiple manual grant auth methods`,\n {\n cause: new Error(\n `Pass --auth-method ${manualAuthMethods\n .map((method) => {\n return method.id;\n })\n .join(\"|\")}`,\n ),\n },\n );\n}\n","import {\n getZeroAgent,\n getZeroAgentCustomConnectors,\n getZeroAgentUserConnectors,\n} from \"../../../lib/api\";\n\ninterface AgentContext {\n agentId: string;\n displayName: string;\n authorizedConnectorSlugs: Set<string>;\n}\n\nexport interface ConnectorDiscoveryAgentContext extends AgentContext {\n authorizedCustomConnectorIds: Set<string>;\n}\n\nexport async function resolveAgentContext(\n flagAgentId: string | undefined,\n): Promise<AgentContext | null> {\n const agentId = flagAgentId ?? process.env.ZERO_AGENT_ID;\n if (!agentId) return null;\n\n const [agent, enabledConnectorSlugs] = await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n ]);\n\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedConnectorSlugs: new Set(enabledConnectorSlugs),\n };\n}\n\nexport async function resolveConnectorDiscoveryAgentContext(\n flagAgentId: string | undefined,\n): Promise<ConnectorDiscoveryAgentContext | null> {\n const agentId = flagAgentId ?? process.env.ZERO_AGENT_ID;\n if (!agentId) return null;\n\n const [agent, enabledConnectorSlugs, enabledCustomConnectorIds] =\n await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n getZeroAgentCustomConnectors(agentId),\n ]);\n\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedConnectorSlugs: new Set(enabledConnectorSlugs),\n authorizedCustomConnectorIds: new Set(enabledCustomConnectorIds),\n };\n}\n"],"mappings":"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","names":["authMethod"]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/connector/action-url.ts","../src/commands/zero/connector/public-catalog.ts","../src/commands/zero/connector/agent-context.ts"],"sourcesContent":["export const CALLBACK_PROMPT_PLACEHOLDER =\n \"SOMETHING_AGENT_WANT_TO_BE_CALLBACK\";\n\nexport function connectorActionCallbackAvailable(): boolean {\n return Boolean(process.env.ZERO_CHAT_THREAD_ID?.trim());\n}\n\nfunction currentChatThreadId(agentId: string | undefined): string | null {\n const threadId = process.env.ZERO_CHAT_THREAD_ID?.trim();\n const currentAgentId = process.env.ZERO_AGENT_ID?.trim();\n if (!threadId || !currentAgentId || agentId !== currentAgentId) {\n return null;\n }\n return threadId;\n}\n\nexport function currentChatSupportsActionCallback(\n agentId: string | undefined,\n): boolean {\n return currentChatThreadId(agentId) !== null;\n}\n\nfunction addCallbackSearchParams(\n params: URLSearchParams,\n threadId: string,\n callbackPrompt: string,\n): void {\n params.set(\"threadId\", threadId);\n params.set(\"callbackPrompt\", callbackPrompt);\n}\n\nexport function addRequestedCallbackSearchParams(\n params: URLSearchParams,\n callbackPrompt: string | undefined,\n agentId: string | undefined,\n): void {\n if (callbackPrompt === undefined) {\n return;\n }\n\n const normalizedPrompt = callbackPrompt.trim();\n if (!normalizedPrompt) {\n throw new Error(\"--callback-prompt cannot be empty\");\n }\n\n const threadId = currentChatThreadId(agentId);\n if (!threadId) {\n throw new Error(\n \"--callback-prompt can only target the current Zero web chat thread and agent\",\n );\n }\n addCallbackSearchParams(params, threadId, normalizedPrompt);\n}\n\nexport function connectorActionUrl(args: {\n readonly origin: string;\n readonly path: string;\n readonly agentId?: string;\n}): string {\n const url = new URL(args.path, args.origin);\n if (args.agentId) {\n url.searchParams.set(\"agentId\", args.agentId);\n }\n return url.toString();\n}\n\nfunction callbackActionUrlExample(\n actionUrl: string,\n agentId: string | undefined,\n): string | null {\n const threadId = currentChatThreadId(agentId);\n if (!threadId) {\n return null;\n }\n\n const url = new URL(actionUrl);\n addCallbackSearchParams(\n url.searchParams,\n threadId,\n CALLBACK_PROMPT_PLACEHOLDER,\n );\n return url.toString();\n}\n\nexport function printCallbackActionUrlExample(\n actionUrl: string,\n agentId: string | undefined,\n): void {\n const callbackUrl = callbackActionUrlExample(actionUrl, agentId);\n if (!callbackUrl) {\n return;\n }\n\n console.log(\"\");\n console.log(\n \"Or, if this is the only connector or permission action needed, use the callback URL below. After the user completes this action, Zero will automatically start the next round with the callback prompt:\",\n );\n console.log(callbackUrl);\n}\n\nexport function printCallbackTurnInstruction(): void {\n console.log(\"\");\n console.log(\n \"After sharing this callback URL, end the current turn. When the user completes the action, Zero will automatically start the next round with the callback prompt.\",\n );\n}\n","import type { PublicConnectorCatalogAuthMethodDetail } from \"@vm0/api-contracts/contracts/zero-connector-catalog\";\nimport type { ZeroConnectorCatalogStatus } from \"../../../lib/api/domains/zero-connectors\";\n\nexport type PublicConnectorStatus = ZeroConnectorCatalogStatus;\n\ninterface ConnectorSearchItem {\n readonly slug: string;\n readonly label: string;\n readonly description: string;\n readonly category: string;\n readonly tags: readonly string[];\n readonly generation: readonly string[];\n readonly authMethods: readonly {\n readonly id: string;\n readonly label: string;\n readonly description: string | null;\n }[];\n}\n\ninterface ConnectorSearchResult<T extends ConnectorSearchItem> {\n readonly connector: T;\n readonly score: number;\n readonly matchedField: string;\n}\n\ninterface ConnectorSearchOutput<T extends ConnectorSearchItem> {\n readonly results: readonly ConnectorSearchResult<T>[];\n readonly total: number;\n}\n\nconst TOKEN_BOUNDARY = /[_\\-\\s]+/;\nconst CASE_BOUNDARY = /(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/;\nconst MIN_SCORE = 10;\n\nfunction tokenize(input: string): Set<string> {\n const tokens = new Set<string>();\n for (const chunk of input.split(TOKEN_BOUNDARY)) {\n if (!chunk) continue;\n for (const sub of chunk.split(CASE_BOUNDARY)) {\n const lower = sub.toLowerCase();\n if (lower) tokens.add(lower);\n }\n }\n return tokens;\n}\n\nfunction publicStrings(connector: ConnectorSearchItem): string[] {\n return [\n connector.slug,\n connector.label,\n connector.description,\n connector.category,\n ...connector.tags,\n ...connector.generation,\n ...connector.authMethods.flatMap((authMethod) => {\n return [\n authMethod.id,\n authMethod.label,\n ...(authMethod.description ? [authMethod.description] : []),\n ];\n }),\n ];\n}\n\ntype ScoreHit = { score: number; matchedField: string };\n\nfunction best(candidates: readonly (ScoreHit | null)[]): ScoreHit | null {\n return candidates.reduce<ScoreHit | null>((bestHit, hit) => {\n if (!hit) return bestHit;\n if (!bestHit || hit.score > bestHit.score) return hit;\n return bestHit;\n }, null);\n}\n\nfunction scoreExact(\n keywordLower: string,\n skipPrivateIdentifierMatches: boolean,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n if (connector.slug.toLowerCase() === keywordLower) {\n return { score: 100, matchedField: \"slug\" };\n }\n if (connector.label.toLowerCase() === keywordLower) {\n return { score: 80, matchedField: \"label\" };\n }\n for (const tag of connector.tags) {\n if (skipPrivateIdentifierMatches && tag.includes(\"_\")) continue;\n if (tag.toLowerCase() === keywordLower) {\n return { score: 70, matchedField: `tag:${tag}` };\n }\n }\n for (const generationType of connector.generation) {\n if (generationType.toLowerCase() === keywordLower) {\n return { score: 65, matchedField: `generation:${generationType}` };\n }\n }\n for (const authMethod of connector.authMethods) {\n if (authMethod.id.toLowerCase() === keywordLower) {\n return { score: 60, matchedField: `auth-method:${authMethod.id}` };\n }\n if (authMethod.label.toLowerCase() === keywordLower) {\n return { score: 60, matchedField: `auth-method:${authMethod.label}` };\n }\n }\n if (connector.category.toLowerCase() === keywordLower) {\n return { score: 55, matchedField: \"category\" };\n }\n return null;\n}\n\nfunction scoreSubstring(\n keywordLower: string,\n skipPrivateIdentifierMatches: boolean,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n const candidates: ScoreHit[] = [];\n if (connector.slug.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 50, matchedField: \"slug\" });\n }\n if (connector.label.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 50, matchedField: \"label\" });\n }\n for (const tag of connector.tags) {\n if (skipPrivateIdentifierMatches && tag.includes(\"_\")) continue;\n if (tag.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 25, matchedField: `tag:${tag}` });\n }\n }\n for (const generationType of connector.generation) {\n if (generationType.toLowerCase().includes(keywordLower)) {\n candidates.push({\n score: 25,\n matchedField: `generation:${generationType}`,\n });\n }\n }\n for (const authMethod of connector.authMethods) {\n if (\n authMethod.id.toLowerCase().includes(keywordLower) ||\n authMethod.label.toLowerCase().includes(keywordLower)\n ) {\n candidates.push({\n score: 20,\n matchedField: `auth-method:${authMethod.id}`,\n });\n }\n }\n if (connector.category.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 20, matchedField: \"category\" });\n }\n if (connector.description.toLowerCase().includes(keywordLower)) {\n candidates.push({ score: 15, matchedField: \"description\" });\n }\n\n return best(candidates);\n}\n\nfunction scoreTokens(\n keywordTokens: ReadonlySet<string>,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n const candidateTokens = new Set<string>();\n for (const source of publicStrings(connector)) {\n for (const token of tokenize(source)) {\n candidateTokens.add(token);\n }\n }\n\n let intersection = 0;\n let firstCommon = \"\";\n for (const token of keywordTokens) {\n if (candidateTokens.has(token)) {\n intersection++;\n if (!firstCommon) firstCommon = token;\n }\n }\n if (intersection === 0) return null;\n return { score: 10 * intersection, matchedField: `token:${firstCommon}` };\n}\n\nfunction scoreConnector(\n keywordLower: string,\n keyword: string,\n keywordTokens: ReadonlySet<string>,\n connector: ConnectorSearchItem,\n): ScoreHit | null {\n const skipPrivateIdentifierMatches =\n /^[A-Za-z0-9_]+$/.test(keyword) && keyword.includes(\"_\");\n const tokenHit = skipPrivateIdentifierMatches\n ? null\n : scoreTokens(keywordTokens, connector);\n const hit = best([\n scoreExact(keywordLower, skipPrivateIdentifierMatches, connector),\n scoreSubstring(keywordLower, skipPrivateIdentifierMatches, connector),\n tokenHit,\n ]);\n if (!hit || hit.score < MIN_SCORE) return null;\n return hit;\n}\n\nexport function searchConnectorCatalog<T extends ConnectorSearchItem>(\n connectors: readonly T[],\n keyword: string,\n limit: number,\n): ConnectorSearchOutput<T> {\n const trimmed = keyword.trim();\n if (!trimmed) return { results: [], total: 0 };\n\n const keywordLower = trimmed.toLowerCase();\n const keywordTokens = tokenize(trimmed);\n const hits = connectors.flatMap((connector): ConnectorSearchResult<T>[] => {\n const hit = scoreConnector(keywordLower, trimmed, keywordTokens, connector);\n if (!hit) return [];\n return [\n {\n connector,\n score: hit.score,\n matchedField: hit.matchedField,\n },\n ];\n });\n\n hits.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.connector.slug.localeCompare(b.connector.slug);\n });\n\n return {\n results: hits.slice(0, limit),\n total: hits.length,\n };\n}\n\nexport function findConnectorStatusItem(\n connectors: readonly PublicConnectorStatus[],\n connectorSlug: string,\n): PublicConnectorStatus | null {\n const exact = connectors.find((connector) => {\n return connector.slug === connectorSlug;\n });\n if (exact) return exact;\n\n const lower = connectorSlug.toLowerCase();\n return (\n connectors.find((connector) => {\n return connector.slug.toLowerCase() === lower;\n }) ?? null\n );\n}\n\nexport function availableConnectorSlugs(\n connectors: readonly PublicConnectorStatus[],\n): string {\n return connectors\n .map((connector) => {\n return connector.slug;\n })\n .join(\", \");\n}\n\nexport function resolveManualGrantAuthMethod(\n connector: PublicConnectorStatus,\n rawAuthMethod: string | undefined,\n): PublicConnectorCatalogAuthMethodDetail {\n if (rawAuthMethod) {\n const authMethod = connector.authMethods.find((method) => {\n return method.id === rawAuthMethod;\n });\n if (!authMethod) {\n throw new Error(\n `${connector.slug} connector does not have ${rawAuthMethod} auth method`,\n {\n cause: new Error(\n `Available auth methods: ${connector.authMethods\n .map((method) => {\n return method.id;\n })\n .join(\", \")}`,\n ),\n },\n );\n }\n\n if (authMethod.grantKind === \"manual\") {\n return authMethod;\n }\n\n throw new Error(\n `${connector.slug} ${authMethod.id} auth method does not use a manual grant`,\n );\n }\n\n const manualAuthMethods = connector.authMethods.filter((method) => {\n return method.grantKind === \"manual\";\n });\n const authMethod = manualAuthMethods[0];\n if (manualAuthMethods.length === 1 && authMethod) {\n return authMethod;\n }\n if (manualAuthMethods.length === 0) {\n throw new Error(`${connector.slug} connector does not use a manual grant`);\n }\n\n throw new Error(\n `${connector.slug} connector has multiple manual grant auth methods`,\n {\n cause: new Error(\n `Pass --auth-method ${manualAuthMethods\n .map((method) => {\n return method.id;\n })\n .join(\"|\")}`,\n ),\n },\n );\n}\n","import {\n getZeroAgent,\n getZeroAgentCustomConnectors,\n getZeroAgentUserConnectors,\n} from \"../../../lib/api/domains/zero-agents\";\n\ninterface AgentContext {\n agentId: string;\n displayName: string;\n authorizedConnectorSlugs: Set<string>;\n}\n\nexport interface ConnectorDiscoveryAgentContext extends AgentContext {\n authorizedCustomConnectorIds: Set<string>;\n}\n\nexport async function resolveAgentContext(\n flagAgentId: string | undefined,\n): Promise<AgentContext | null> {\n const agentId = flagAgentId ?? process.env.ZERO_AGENT_ID;\n if (!agentId) return null;\n\n const [agent, enabledConnectorSlugs] = await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n ]);\n\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedConnectorSlugs: new Set(enabledConnectorSlugs),\n };\n}\n\nexport async function resolveConnectorDiscoveryAgentContext(\n flagAgentId: string | undefined,\n): Promise<ConnectorDiscoveryAgentContext | null> {\n const agentId = flagAgentId ?? process.env.ZERO_AGENT_ID;\n if (!agentId) return null;\n\n const [agent, enabledConnectorSlugs, enabledCustomConnectorIds] =\n await Promise.all([\n getZeroAgent(agentId),\n getZeroAgentUserConnectors(agentId),\n getZeroAgentCustomConnectors(agentId),\n ]);\n\n return {\n agentId: agent.agentId,\n displayName: agent.displayName ?? agent.agentId,\n authorizedConnectorSlugs: new Set(enabledConnectorSlugs),\n authorizedCustomConnectorIds: new Set(enabledCustomConnectorIds),\n };\n}\n"],"mappings":"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","names":["authMethod"]}
|
|
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from "node:module";
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
getApiUrl
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-GHKWW4NC.js";
|
|
7
7
|
import {
|
|
8
8
|
init_esm_shims
|
|
9
9
|
} from "./chunk-AUWSMG4F.js";
|
|
@@ -46,4 +46,4 @@ export {
|
|
|
46
46
|
toPlatformUrl,
|
|
47
47
|
getPlatformOrigin
|
|
48
48
|
};
|
|
49
|
-
//# sourceMappingURL=chunk-
|
|
49
|
+
//# sourceMappingURL=chunk-RUKMHBNQ.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __createRequire } from "node:module";
|
|
3
|
+
const require = __createRequire(import.meta.url);
|
|
4
|
+
import {
|
|
5
|
+
zeroModelPoliciesMainContract
|
|
6
|
+
} from "./chunk-CEJGHPF3.js";
|
|
7
|
+
import {
|
|
8
|
+
getClientConfig,
|
|
9
|
+
handleError,
|
|
10
|
+
initClient
|
|
11
|
+
} from "./chunk-GHKWW4NC.js";
|
|
12
|
+
import {
|
|
13
|
+
init_esm_shims
|
|
14
|
+
} from "./chunk-AUWSMG4F.js";
|
|
15
|
+
|
|
16
|
+
// src/lib/api/domains/zero-model-policies.ts
|
|
17
|
+
init_esm_shims();
|
|
18
|
+
async function listZeroModelPolicies() {
|
|
19
|
+
const config = await getClientConfig();
|
|
20
|
+
const client = initClient(zeroModelPoliciesMainContract, config);
|
|
21
|
+
const result = await client.list({ headers: {} });
|
|
22
|
+
if (result.status === 200) {
|
|
23
|
+
return result.body;
|
|
24
|
+
}
|
|
25
|
+
handleError(result, "Failed to list model policies");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export {
|
|
29
|
+
listZeroModelPolicies
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=chunk-SA4DYSBR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/api/domains/zero-model-policies.ts"],"sourcesContent":["import { initClient } from \"@vm0/api-contracts/contracts/trpc-contract\";\nimport { zeroModelPoliciesMainContract } from \"@vm0/api-contracts/contracts/zero-model-policies\";\nimport type { OrgModelPoliciesResponse } from \"@vm0/api-contracts/contracts/model-providers\";\nimport { getClientConfig, handleError } from \"../core/client-factory\";\n\n/**\n * List the current organization's model-first policies.\n */\nexport async function listZeroModelPolicies(): Promise<OrgModelPoliciesResponse> {\n const config = await getClientConfig();\n const client = initClient(zeroModelPoliciesMainContract, config);\n\n const result = await client.list({ headers: {} });\n\n if (result.status === 200) {\n return result.body;\n }\n\n handleError(result, \"Failed to list model policies\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAQA,eAAsB,wBAA2D;AAC/E,QAAM,SAAS,MAAM,gBAAgB;AACrC,QAAM,SAAS,WAAW,+BAA+B,MAAM;AAE/D,QAAM,SAAS,MAAM,OAAO,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;AAEhD,MAAI,OAAO,WAAW,KAAK;AACzB,WAAO,OAAO;AAAA,EAChB;AAEA,cAAY,QAAQ,+BAA+B;AACrD;","names":[]}
|