veryfront 0.1.919 → 0.1.921

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.
@@ -424,9 +424,12 @@ declare namespace _default {
424
424
  "app/api/auth/outlook/callback/route.ts": string;
425
425
  "app/api/auth/outlook/route.ts": string;
426
426
  "lib/outlook-client.ts": string;
427
+ "tools/create-draft.ts": string;
427
428
  "tools/get-email.ts": string;
429
+ "tools/get-thread.ts": string;
428
430
  "tools/list-emails.ts": string;
429
431
  "tools/list-folders.ts": string;
432
+ "tools/list-threads.ts": string;
430
433
  "tools/search-emails.ts": string;
431
434
  "tools/send-email.ts": string;
432
435
  };
@@ -423,11 +423,14 @@ export default {
423
423
  ".env.example": "# Microsoft Outlook Integration\n# Get these from: https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade\n\n# Your Microsoft Azure App Client ID (Application ID)\nMICROSOFT_CLIENT_ID=your_client_id_here\n\n# Your Microsoft Azure App Client Secret\nMICROSOFT_CLIENT_SECRET=your_client_secret_here\n",
424
424
  "app/api/auth/outlook/callback/route.ts": "import { createOAuthCallbackHandler, outlookConfig } from \"veryfront/oauth\";\nimport { tokenStore } from \"../../../../../lib/token-store.ts\";\nimport { oauthMemoryTokenStore } from \"../../../../../lib/oauth-memory-store.ts\";\n\nconst hybridTokenStore = {\n getTokens(serviceId: string, userId: string) {\n return tokenStore.getToken(userId, serviceId);\n },\n async setTokens(\n serviceId: string,\n userId: string,\n tokens: { accessToken: string; refreshToken?: string; expiresAt?: number },\n ) {\n await tokenStore.setToken(userId, serviceId, tokens);\n },\n async clearTokens(serviceId: string, userId: string) {\n await tokenStore.revokeToken(userId, serviceId);\n },\n setState(\n state: string,\n meta: {\n userId: string;\n serviceId: string;\n codeVerifier?: string;\n redirectUri?: string;\n scopes?: string[];\n createdAt: number;\n },\n ) {\n return oauthMemoryTokenStore.setState(state, meta);\n },\n consumeState(state: string) {\n return oauthMemoryTokenStore.consumeState(state);\n },\n};\n\nexport const GET = createOAuthCallbackHandler(outlookConfig, { tokenStore: hybridTokenStore });\n",
425
425
  "app/api/auth/outlook/route.ts": "import { createOAuthInitHandler, outlookConfig } from \"veryfront/oauth\";\nimport { oauthMemoryTokenStore } from \"../../../../../lib/oauth-memory-store.ts\";\nimport { requireUserIdFromRequest } from \"../../../../../lib/user-id.ts\";\n\nfunction getUserId(request: Request): string {\n return requireUserIdFromRequest(request);\n}\n\nexport const GET = createOAuthInitHandler(outlookConfig, {\n tokenStore: oauthMemoryTokenStore,\n getUserId,\n});",
426
- "lib/outlook-client.ts": "import { getAccessToken } from \"./token-store.ts\";\n\nconst GRAPH_BASE_URL = \"https://graph.microsoft.com/v1.0\";\n\ninterface GraphResponse<T> {\n value?: T[];\n \"@odata.nextLink\"?: string;\n}\n\nexport interface OutlookMessage {\n id: string;\n subject: string;\n bodyPreview: string;\n body: {\n contentType: \"text\" | \"html\";\n content: string;\n };\n from: {\n emailAddress: {\n name: string;\n address: string;\n };\n };\n toRecipients: Array<{\n emailAddress: {\n name: string;\n address: string;\n };\n }>;\n ccRecipients?: Array<{\n emailAddress: {\n name: string;\n address: string;\n };\n }>;\n receivedDateTime: string;\n sentDateTime: string;\n isRead: boolean;\n hasAttachments: boolean;\n importance: \"low\" | \"normal\" | \"high\";\n conversationId: string;\n webLink: string;\n}\n\nexport interface OutlookFolder {\n id: string;\n displayName: string;\n parentFolderId: string;\n childFolderCount: number;\n unreadItemCount: number;\n totalItemCount: number;\n}\n\nexport interface SendEmailOptions {\n to: string[];\n subject: string;\n body: string;\n cc?: string[];\n bcc?: string[];\n importance?: \"low\" | \"normal\" | \"high\";\n bodyType?: \"text\" | \"html\";\n}\n\nasync function graphFetch<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const token = await getAccessToken();\n if (!token) {\n throw new Error(\"Not authenticated with Microsoft. Please connect your account.\");\n }\n\n const response = await fetch(`${GRAPH_BASE_URL}${endpoint}`, {\n ...options,\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(\n `Microsoft Graph API error: ${response.status} ${error.error?.message ?? response.statusText}`,\n );\n }\n\n return response.json();\n}\n\nexport async function listEmails(options?: {\n folderId?: string;\n top?: number;\n skip?: number;\n filter?: string;\n orderBy?: string;\n}): Promise<OutlookMessage[]> {\n const params = new URLSearchParams();\n\n if (options?.top != null) params.set(\"$top\", options.top.toString());\n if (options?.skip != null) params.set(\"$skip\", options.skip.toString());\n if (options?.filter) params.set(\"$filter\", options.filter);\n if (options?.orderBy) params.set(\"$orderby\", options.orderBy);\n\n const folderPath = options?.folderId\n ? `/mailFolders/${options.folderId}/messages`\n : \"/messages\";\n\n const queryString = params.toString();\n const endpoint = queryString ? `${folderPath}?${queryString}` : folderPath;\n\n const response = await graphFetch<GraphResponse<OutlookMessage>>(endpoint);\n return response.value ?? [];\n}\n\nexport function getEmail(messageId: string): Promise<OutlookMessage> {\n return graphFetch<OutlookMessage>(`/messages/${messageId}`);\n}\n\nexport async function sendEmail(options: SendEmailOptions): Promise<void> {\n const message = {\n subject: options.subject,\n body: {\n contentType: options.bodyType ?? \"text\",\n content: options.body,\n },\n toRecipients: options.to.map((email) => ({\n emailAddress: { address: email },\n })),\n ccRecipients: options.cc?.map((email) => ({\n emailAddress: { address: email },\n })),\n bccRecipients: options.bcc?.map((email) => ({\n emailAddress: { address: email },\n })),\n importance: options.importance ?? \"normal\",\n };\n\n await graphFetch(\"/sendMail\", {\n method: \"POST\",\n body: JSON.stringify({ message }),\n });\n}\n\nexport async function searchEmails(options: {\n query: string;\n top?: number;\n skip?: number;\n}): Promise<OutlookMessage[]> {\n const params = new URLSearchParams({ $search: `\"${options.query}\"` });\n\n if (options.top != null) params.set(\"$top\", options.top.toString());\n if (options.skip != null) params.set(\"$skip\", options.skip.toString());\n\n const response = await graphFetch<GraphResponse<OutlookMessage>>(`/messages?${params.toString()}`);\n return response.value ?? [];\n}\n\nexport async function listFolders(): Promise<OutlookFolder[]> {\n const response = await graphFetch<GraphResponse<OutlookFolder>>(\"/mailFolders\");\n return response.value ?? [];\n}\n\nasync function setReadState(messageId: string, isRead: boolean): Promise<void> {\n await graphFetch(`/messages/${messageId}`, {\n method: \"PATCH\",\n body: JSON.stringify({ isRead }),\n });\n}\n\nexport async function markAsRead(messageId: string): Promise<void> {\n await setReadState(messageId, true);\n}\n\nexport async function markAsUnread(messageId: string): Promise<void> {\n await setReadState(messageId, false);\n}\n\nexport async function deleteEmail(messageId: string): Promise<void> {\n await graphFetch(`/messages/${messageId}`, { method: \"DELETE\" });\n}\n\nexport async function moveEmail(messageId: string, destinationFolderId: string): Promise<void> {\n await graphFetch(`/messages/${messageId}/move`, {\n method: \"POST\",\n body: JSON.stringify({ destinationId: destinationFolderId }),\n });\n}\n\nexport function formatEmail(message: OutlookMessage): string {\n const from = message.from.emailAddress.name || message.from.emailAddress.address;\n const to = message.toRecipients.map((r) => r.emailAddress.address).join(\", \");\n const date = new Date(message.receivedDateTime).toLocaleString();\n const read = message.isRead ? \"Yes\" : \"No\";\n\n return `From: ${from}\nTo: ${to}\nSubject: ${message.subject}\nDate: ${date}\nRead: ${read}\n\n${message.bodyPreview}`;\n}\n",
427
- "tools/get-email.ts": "import { tool } from \"veryfront/tool\";\nimport { defineSchema } from \"veryfront/schemas\";\nimport { getEmail } from \"../../lib/outlook-client.ts\";\n\nexport default tool({\n id: \"get-email\",\n description:\n \"Get detailed information about a specific email, including full body content, recipients, and metadata.\",\n inputSchema: defineSchema((v) => v.object({\n messageId: v.string().describe(\"The ID of the email message to retrieve\"),\n includeBody: v\n .boolean()\n .default(true)\n .describe(\"Include full email body content\"),\n }))(),\n async execute({ messageId, includeBody }) {\n const message = await getEmail(messageId);\n\n const body = includeBody\n ? {\n contentType: message.body.contentType,\n content: message.body.content,\n }\n : undefined;\n\n return {\n id: message.id,\n subject: message.subject,\n from: {\n name: message.from.emailAddress.name,\n email: message.from.emailAddress.address,\n },\n to: message.toRecipients.map(({ emailAddress }) => ({\n name: emailAddress.name,\n email: emailAddress.address,\n })),\n cc: message.ccRecipients?.map(({ emailAddress }) => ({\n name: emailAddress.name,\n email: emailAddress.address,\n })),\n body,\n bodyPreview: message.bodyPreview,\n receivedAt: message.receivedDateTime,\n sentAt: message.sentDateTime,\n isRead: message.isRead,\n hasAttachments: message.hasAttachments,\n importance: message.importance,\n conversationId: message.conversationId,\n webLink: message.webLink,\n };\n },\n});\n",
428
- "tools/list-emails.ts": "import { tool } from \"veryfront/tool\";\nimport { defineSchema } from \"veryfront/schemas\";\nimport { listEmails } from \"../../lib/outlook-client.ts\";\n\nexport default tool({\n id: \"list-emails\",\n description:\n \"List recent emails from inbox or a specific folder. Returns email metadata including subject, sender, date, and preview.\",\n inputSchema: defineSchema((v) => v.object({\n folderId: v\n .string()\n .optional()\n .describe(\"Folder ID to list emails from (default: inbox)\"),\n limit: v\n .number()\n .min(1)\n .max(50)\n .default(10)\n .describe(\"Maximum number of emails to return\"),\n unreadOnly: v.boolean().default(false).describe(\"Only return unread emails\"),\n orderBy: v\n .enum([\"receivedDateTime desc\", \"receivedDateTime asc\", \"subject\"])\n .default(\"receivedDateTime desc\")\n .describe(\"Sort order for emails\"),\n }))(),\n async execute({ folderId, limit, unreadOnly, orderBy }) {\n const messages = await listEmails({\n folderId,\n top: limit,\n filter: unreadOnly ? \"isRead eq false\" : undefined,\n orderBy,\n });\n\n return messages.map((msg) => ({\n id: msg.id,\n subject: msg.subject,\n from: {\n name: msg.from.emailAddress.name,\n email: msg.from.emailAddress.address,\n },\n to: msg.toRecipients.map((r) => ({\n name: r.emailAddress.name,\n email: r.emailAddress.address,\n })),\n preview: msg.bodyPreview,\n receivedAt: msg.receivedDateTime,\n isRead: msg.isRead,\n hasAttachments: msg.hasAttachments,\n importance: msg.importance,\n webLink: msg.webLink,\n }));\n },\n});\n",
426
+ "lib/outlook-client.ts": "import { getAccessToken } from \"./token-store.ts\";\n\nconst GRAPH_BASE_URL = \"https://graph.microsoft.com/v1.0\";\n\ninterface GraphResponse<T> {\n value?: T[];\n \"@odata.nextLink\"?: string;\n}\n\ninterface OutlookEmailAddress {\n name?: string;\n address?: string;\n}\n\nexport interface OutlookContact {\n emailAddress?: OutlookEmailAddress | null;\n}\n\nexport interface OutlookMessage {\n id: string;\n subject: string;\n bodyPreview: string;\n body: {\n contentType: \"text\" | \"html\";\n content: string;\n };\n from?: OutlookContact | null;\n toRecipients: OutlookContact[];\n ccRecipients?: OutlookContact[] | null;\n receivedDateTime: string;\n sentDateTime: string;\n isRead: boolean;\n hasAttachments: boolean;\n importance: \"low\" | \"normal\" | \"high\";\n conversationId: string;\n webLink: string;\n}\n\nexport interface OutlookFolder {\n id: string;\n displayName: string;\n parentFolderId: string;\n childFolderCount: number;\n unreadItemCount: number;\n totalItemCount: number;\n}\n\nexport interface SendEmailOptions {\n to: string[];\n subject: string;\n body: string;\n cc?: string[];\n bcc?: string[];\n importance?: \"low\" | \"normal\" | \"high\";\n bodyType?: \"text\" | \"html\";\n}\n\nexport interface CreateDraftOptions extends SendEmailOptions {\n replyTo?: string[];\n categories?: string[];\n}\n\nasync function graphFetch<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const token = await getAccessToken();\n if (!token) {\n throw new Error(\"Not authenticated with Microsoft. Please connect your account.\");\n }\n\n const response = await fetch(`${GRAPH_BASE_URL}${endpoint}`, {\n ...options,\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(\n `Microsoft Graph API error: ${response.status} ${error.error?.message ?? response.statusText}`,\n );\n }\n\n return response.json();\n}\n\nexport async function listEmails(options?: {\n folderId?: string;\n top?: number;\n skip?: number;\n filter?: string;\n orderBy?: string;\n}): Promise<OutlookMessage[]> {\n const params = new URLSearchParams();\n\n if (options?.top != null) params.set(\"$top\", options.top.toString());\n if (options?.skip != null) params.set(\"$skip\", options.skip.toString());\n if (options?.filter) params.set(\"$filter\", options.filter);\n if (options?.orderBy) params.set(\"$orderby\", options.orderBy);\n\n const folderPath = options?.folderId\n ? `/mailFolders/${options.folderId}/messages`\n : \"/messages\";\n\n const queryString = params.toString();\n const endpoint = queryString ? `${folderPath}?${queryString}` : folderPath;\n\n const response = await graphFetch<GraphResponse<OutlookMessage>>(endpoint);\n return response.value ?? [];\n}\n\nexport function getEmail(messageId: string): Promise<OutlookMessage> {\n return graphFetch<OutlookMessage>(`/messages/${messageId}`);\n}\n\nexport async function sendEmail(options: SendEmailOptions): Promise<void> {\n const message = buildMessage(options);\n\n await graphFetch(\"/sendMail\", {\n method: \"POST\",\n body: JSON.stringify({ message }),\n });\n}\n\nfunction buildMessage(options: CreateDraftOptions) {\n return {\n subject: options.subject,\n body: {\n contentType: options.bodyType ?? \"text\",\n content: options.body,\n },\n toRecipients: options.to.map((email) => ({\n emailAddress: { address: email },\n })),\n ccRecipients: options.cc?.map((email) => ({\n emailAddress: { address: email },\n })),\n bccRecipients: options.bcc?.map((email) => ({\n emailAddress: { address: email },\n })),\n replyTo: options.replyTo?.map((email) => ({\n emailAddress: { address: email },\n })),\n importance: options.importance ?? \"normal\",\n categories: options.categories,\n };\n}\n\nexport async function createDraft(options: CreateDraftOptions): Promise<OutlookMessage> {\n return graphFetch<OutlookMessage>(\"/messages\", {\n method: \"POST\",\n body: JSON.stringify(buildMessage(options)),\n });\n}\n\nexport async function searchEmails(options: {\n query: string;\n top?: number;\n skip?: number;\n}): Promise<OutlookMessage[]> {\n const params = new URLSearchParams({ $search: `\"${options.query}\"` });\n\n if (options.top != null) params.set(\"$top\", options.top.toString());\n if (options.skip != null) params.set(\"$skip\", options.skip.toString());\n\n const response = await graphFetch<GraphResponse<OutlookMessage>>(`/messages?${params.toString()}`);\n return response.value ?? [];\n}\n\nexport async function listFolders(): Promise<OutlookFolder[]> {\n const response = await graphFetch<GraphResponse<OutlookFolder>>(\"/mailFolders\");\n return response.value ?? [];\n}\n\nexport async function listThreads(options?: {\n folderId?: string;\n top?: number;\n filter?: string;\n orderBy?: string;\n}): Promise<OutlookMessage[]> {\n const messages = await listEmails({\n folderId: options?.folderId ?? \"inbox\",\n top: options?.top,\n filter: options?.filter,\n orderBy: options?.orderBy ?? \"receivedDateTime desc\",\n });\n\n const seenConversationIds = new Set<string>();\n return messages.filter((message) => {\n const conversationId = message.conversationId || message.id;\n if (seenConversationIds.has(conversationId)) return false;\n seenConversationIds.add(conversationId);\n return true;\n });\n}\n\nexport async function getThread(threadId: string, limit = 25): Promise<OutlookMessage[]> {\n const safeThreadId = threadId.replaceAll(\"'\", \"''\");\n const params = new URLSearchParams({\n $filter: `conversationId eq '${safeThreadId}'`,\n $top: String(limit),\n $select:\n \"id,conversationId,internetMessageId,subject,body,bodyPreview,from,sender,toRecipients,ccRecipients,bccRecipients,replyTo,receivedDateTime,sentDateTime,categories,isRead,importance,hasAttachments,webLink,flag\",\n });\n\n const response = await graphFetch<GraphResponse<OutlookMessage>>(`/messages?${params}`);\n return response.value ?? [];\n}\n\nasync function setReadState(messageId: string, isRead: boolean): Promise<void> {\n await graphFetch(`/messages/${messageId}`, {\n method: \"PATCH\",\n body: JSON.stringify({ isRead }),\n });\n}\n\nexport async function markAsRead(messageId: string): Promise<void> {\n await setReadState(messageId, true);\n}\n\nexport async function markAsUnread(messageId: string): Promise<void> {\n await setReadState(messageId, false);\n}\n\nexport async function deleteEmail(messageId: string): Promise<void> {\n await graphFetch(`/messages/${messageId}`, { method: \"DELETE\" });\n}\n\nexport async function moveEmail(messageId: string, destinationFolderId: string): Promise<void> {\n await graphFetch(`/messages/${messageId}/move`, {\n method: \"POST\",\n body: JSON.stringify({ destinationId: destinationFolderId }),\n });\n}\n\nexport function formatEmail(message: OutlookMessage): string {\n const fromContact = summarizeContact(message.from);\n const from = fromContact.name || fromContact.email || \"Unknown sender\";\n const to = summarizeContacts(message.toRecipients).map((r) => r.email).filter(Boolean).join(\", \");\n const date = new Date(message.receivedDateTime).toLocaleString();\n const read = message.isRead ? \"Yes\" : \"No\";\n\n return `From: ${from}\nTo: ${to}\nSubject: ${message.subject}\nDate: ${date}\nRead: ${read}\n\n${message.bodyPreview}`;\n}\n\nexport function summarizeContact(contact?: OutlookContact | null): { name: string; email: string } {\n const emailAddress = contact?.emailAddress;\n const email = emailAddress?.address ?? \"\";\n return {\n name: emailAddress?.name ?? email,\n email,\n };\n}\n\nexport function summarizeContacts(contacts?: OutlookContact[] | null): Array<{\n name: string;\n email: string;\n}> {\n return (contacts ?? []).map(summarizeContact);\n}\n",
427
+ "tools/create-draft.ts": "import { tool } from \"veryfront/tool\";\nimport { defineSchema } from \"veryfront/schemas\";\nimport { createDraft, summarizeContacts } from \"../../lib/outlook-client.ts\";\n\nexport default tool({\n id: \"create-draft\",\n description:\n \"Create an Outlook email draft for human approval. This does not send the message.\",\n inputSchema: defineSchema((v) => v.object({\n to: v.array(v.string().email()).min(1).describe(\"Email addresses of recipients\"),\n subject: v.string().min(1).describe(\"Email subject line\"),\n body: v.string().min(1).describe(\"Email body content\"),\n cc: v.array(v.string().email()).optional().describe(\"Email addresses to CC\"),\n bcc: v.array(v.string().email()).optional().describe(\"Email addresses to BCC\"),\n replyTo: v.array(v.string().email()).optional().describe(\"Reply-to addresses\"),\n importance: v\n .enum([\"low\", \"normal\", \"high\"])\n .default(\"normal\")\n .describe(\"Email importance level\"),\n bodyType: v\n .enum([\"text\", \"html\"])\n .default(\"text\")\n .describe(\"Body content type\"),\n categories: v.array(v.string()).optional().describe(\"Outlook category names\"),\n }))(),\n async execute({ to, subject, body, cc, bcc, replyTo, importance, bodyType, categories }) {\n const draft = await createDraft({\n to,\n subject,\n body,\n cc,\n bcc,\n replyTo,\n importance,\n bodyType,\n categories,\n });\n\n return {\n draft: {\n id: draft.id,\n thread_id: draft.conversationId,\n subject: draft.subject,\n to: summarizeContacts(draft.toRecipients),\n preview: draft.bodyPreview,\n webLink: draft.webLink,\n isDraft: true,\n },\n };\n },\n});\n",
428
+ "tools/get-email.ts": "import { tool } from \"veryfront/tool\";\nimport { defineSchema } from \"veryfront/schemas\";\nimport { getEmail, summarizeContact, summarizeContacts } from \"../../lib/outlook-client.ts\";\n\nexport default tool({\n id: \"get-email\",\n description:\n \"Get detailed information about a specific email, including full body content, recipients, and metadata.\",\n inputSchema: defineSchema((v) => v.object({\n messageId: v.string().describe(\"The ID of the email message to retrieve\"),\n includeBody: v\n .boolean()\n .default(true)\n .describe(\"Include full email body content\"),\n }))(),\n async execute({ messageId, includeBody }) {\n const message = await getEmail(messageId);\n\n const body = includeBody\n ? {\n contentType: message.body.contentType,\n content: message.body.content,\n }\n : undefined;\n\n return {\n id: message.id,\n subject: message.subject,\n from: summarizeContact(message.from),\n to: summarizeContacts(message.toRecipients),\n cc: summarizeContacts(message.ccRecipients),\n body,\n bodyPreview: message.bodyPreview,\n receivedAt: message.receivedDateTime,\n sentAt: message.sentDateTime,\n isRead: message.isRead,\n hasAttachments: message.hasAttachments,\n importance: message.importance,\n conversationId: message.conversationId,\n webLink: message.webLink,\n };\n },\n});\n",
429
+ "tools/get-thread.ts": "import { tool } from \"veryfront/tool\";\nimport { defineSchema } from \"veryfront/schemas\";\nimport { getThread, summarizeContact, summarizeContacts } from \"../../lib/outlook-client.ts\";\n\nexport default tool({\n id: \"get-thread\",\n description:\n \"Get all Outlook messages in a conversation thread by thread_id. thread_id is the conversationId returned by list-threads.\",\n inputSchema: defineSchema((v) => v.object({\n thread_id: v\n .string()\n .min(1)\n .describe(\"Outlook conversationId returned by list-threads\"),\n limit: v\n .number()\n .min(1)\n .max(50)\n .default(25)\n .describe(\"Maximum messages to return for the thread\"),\n }))(),\n async execute({ thread_id, limit }) {\n const messages = await getThread(thread_id, limit);\n const firstMessage = messages[0];\n\n return {\n thread: {\n thread_id,\n subject: firstMessage?.subject ?? \"\",\n messages: messages.map((message) => ({\n id: message.id,\n subject: message.subject,\n from: summarizeContact(message.from),\n to: summarizeContacts(message.toRecipients),\n cc: summarizeContacts(message.ccRecipients),\n body: message.body,\n bodyPreview: message.bodyPreview,\n receivedAt: message.receivedDateTime,\n sentAt: message.sentDateTime,\n isRead: message.isRead,\n hasAttachments: message.hasAttachments,\n importance: message.importance,\n webLink: message.webLink,\n })),\n },\n };\n },\n});\n",
430
+ "tools/list-emails.ts": "import { tool } from \"veryfront/tool\";\nimport { defineSchema } from \"veryfront/schemas\";\nimport { listEmails, summarizeContact, summarizeContacts } from \"../../lib/outlook-client.ts\";\n\nexport default tool({\n id: \"list-emails\",\n description:\n \"List recent emails from inbox or a specific folder. Returns email metadata including subject, sender, date, and preview.\",\n inputSchema: defineSchema((v) => v.object({\n folderId: v\n .string()\n .optional()\n .describe(\"Folder ID to list emails from (default: inbox)\"),\n limit: v\n .number()\n .min(1)\n .max(50)\n .default(10)\n .describe(\"Maximum number of emails to return\"),\n unreadOnly: v.boolean().default(false).describe(\"Only return unread emails\"),\n orderBy: v\n .enum([\"receivedDateTime desc\", \"receivedDateTime asc\", \"subject\"])\n .default(\"receivedDateTime desc\")\n .describe(\"Sort order for emails\"),\n }))(),\n async execute({ folderId, limit, unreadOnly, orderBy }) {\n const messages = await listEmails({\n folderId,\n top: limit,\n filter: unreadOnly ? \"isRead eq false\" : undefined,\n orderBy,\n });\n\n return messages.map((msg) => ({\n id: msg.id,\n subject: msg.subject,\n from: summarizeContact(msg.from),\n to: summarizeContacts(msg.toRecipients),\n preview: msg.bodyPreview,\n receivedAt: msg.receivedDateTime,\n isRead: msg.isRead,\n hasAttachments: msg.hasAttachments,\n importance: msg.importance,\n webLink: msg.webLink,\n }));\n },\n});\n",
429
431
  "tools/list-folders.ts": "import { tool } from \"veryfront/tool\";\nimport { defineSchema } from \"veryfront/schemas\";\nimport { listFolders } from \"../../lib/outlook-client.ts\";\n\nexport default tool({\n id: \"list-folders\",\n description:\n \"List all mail folders in the mailbox, including inbox, sent items, drafts, and custom folders.\",\n inputSchema: defineSchema((v) => v.object({}))(),\n async execute() {\n const folders = await listFolders();\n\n return folders.map((folder) => ({\n id: folder.id,\n name: folder.displayName,\n parentFolderId: folder.parentFolderId,\n childFolderCount: folder.childFolderCount,\n unreadItemCount: folder.unreadItemCount,\n totalItemCount: folder.totalItemCount,\n }));\n },\n});\n",
430
- "tools/search-emails.ts": "import { tool } from \"veryfront/tool\";\nimport { defineSchema } from \"veryfront/schemas\";\nimport { searchEmails } from \"../../lib/outlook-client.ts\";\n\nexport default tool({\n id: \"search-emails\",\n description:\n \"Search emails by query string. Searches across subject, body, sender, and recipients. Supports advanced search syntax.\",\n inputSchema: defineSchema((v) => v.object({\n query: v\n .string()\n .min(1)\n .describe(\"Search query (searches subject, body, from, to fields)\"),\n limit: v\n .number()\n .min(1)\n .max(50)\n .default(10)\n .describe(\"Maximum number of results to return\"),\n }))(),\n async execute({ query, limit }) {\n const messages = await searchEmails({ query, top: limit });\n\n return {\n totalResults: messages.length,\n emails: messages.map((msg) => ({\n id: msg.id,\n subject: msg.subject,\n from: {\n name: msg.from.emailAddress.name,\n email: msg.from.emailAddress.address,\n },\n to: msg.toRecipients.map((r) => ({\n name: r.emailAddress.name,\n email: r.emailAddress.address,\n })),\n preview: msg.bodyPreview,\n receivedAt: msg.receivedDateTime,\n isRead: msg.isRead,\n hasAttachments: msg.hasAttachments,\n importance: msg.importance,\n webLink: msg.webLink,\n })),\n };\n },\n});\n",
432
+ "tools/list-threads.ts": "import { tool } from \"veryfront/tool\";\nimport { defineSchema } from \"veryfront/schemas\";\nimport { listThreads, summarizeContact } from \"../../lib/outlook-client.ts\";\n\nexport default tool({\n id: \"list-threads\",\n description:\n \"List recent Outlook conversation threads for request-desk triage. Returns representative messages with thread_id values that can be passed to get-thread.\",\n inputSchema: defineSchema((v) => v.object({\n folderId: v\n .string()\n .default(\"inbox\")\n .describe(\"Folder ID or well-known folder name to inspect\"),\n limit: v\n .number()\n .min(1)\n .max(50)\n .default(10)\n .describe(\"Maximum recent messages to inspect as thread representatives\"),\n unreadOnly: v.boolean().default(false).describe(\"Only return unread messages\"),\n orderBy: v\n .enum([\"receivedDateTime desc\", \"receivedDateTime asc\", \"subject\"])\n .default(\"receivedDateTime desc\")\n .describe(\"Sort order for representative messages\"),\n }))(),\n async execute({ folderId, limit, unreadOnly, orderBy }) {\n const messages = await listThreads({\n folderId,\n top: limit,\n filter: unreadOnly ? \"isRead eq false\" : undefined,\n orderBy,\n });\n\n return {\n threads: messages.map((message) => ({\n thread_id: message.conversationId,\n messageId: message.id,\n subject: message.subject,\n from: summarizeContact(message.from),\n preview: message.bodyPreview,\n receivedAt: message.receivedDateTime,\n isRead: message.isRead,\n hasAttachments: message.hasAttachments,\n importance: message.importance,\n webLink: message.webLink,\n })),\n };\n },\n});\n",
433
+ "tools/search-emails.ts": "import { tool } from \"veryfront/tool\";\nimport { defineSchema } from \"veryfront/schemas\";\nimport { searchEmails, summarizeContact, summarizeContacts } from \"../../lib/outlook-client.ts\";\n\nexport default tool({\n id: \"search-emails\",\n description:\n \"Search emails by query string. Searches across subject, body, sender, and recipients. Supports advanced search syntax.\",\n inputSchema: defineSchema((v) => v.object({\n query: v\n .string()\n .min(1)\n .describe(\"Search query (searches subject, body, from, to fields)\"),\n limit: v\n .number()\n .min(1)\n .max(50)\n .default(10)\n .describe(\"Maximum number of results to return\"),\n }))(),\n async execute({ query, limit }) {\n const messages = await searchEmails({ query, top: limit });\n\n return {\n totalResults: messages.length,\n emails: messages.map((msg) => ({\n id: msg.id,\n subject: msg.subject,\n from: summarizeContact(msg.from),\n to: summarizeContacts(msg.toRecipients),\n preview: msg.bodyPreview,\n receivedAt: msg.receivedDateTime,\n isRead: msg.isRead,\n hasAttachments: msg.hasAttachments,\n importance: msg.importance,\n webLink: msg.webLink,\n })),\n };\n },\n});\n",
431
434
  "tools/send-email.ts": "import { tool } from \"veryfront/tool\";\nimport { defineSchema } from \"veryfront/schemas\";\nimport { sendEmail } from \"../../lib/outlook-client.ts\";\n\nexport default tool({\n id: \"send-email\",\n description:\n \"Send a new email message. Supports multiple recipients, CC, BCC, and importance levels.\",\n inputSchema: defineSchema((v) => v.object({\n to: v.array(v.string().email()).min(1).describe(\"Email addresses of recipients\"),\n subject: v.string().min(1).describe(\"Email subject line\"),\n body: v.string().min(1).describe(\"Email body content\"),\n cc: v.array(v.string().email()).optional().describe(\"Email addresses to CC\"),\n bcc: v.array(v.string().email()).optional().describe(\"Email addresses to BCC\"),\n importance: v\n .enum([\"low\", \"normal\", \"high\"])\n .default(\"normal\")\n .describe(\"Email importance level\"),\n bodyType: v\n .enum([\"text\", \"html\"])\n .default(\"text\")\n .describe(\"Body content type (text or html)\"),\n }))(),\n async execute({ to, subject, body, cc, bcc, importance, bodyType }) {\n await sendEmail({ to, subject, body, cc, bcc, importance, bodyType });\n\n return {\n success: true,\n message: `Email sent successfully to ${to.join(\", \")}`,\n recipients: { to, cc, bcc },\n };\n },\n});\n"
432
435
  }
433
436
  },
package/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.919",
3
+ "version": "0.1.921",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "minimumDependencyAge": {
@@ -1 +1 @@
1
- {"version":3,"file":"_data.d.ts","sourceRoot":"","sources":["../../../src/src/integrations/_data.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,eAAO,MAAM,UAAU,EAAE,iBAAiB,EAg/1DzC,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyZxC,CAAC"}
1
+ {"version":3,"file":"_data.d.ts","sourceRoot":"","sources":["../../../src/src/integrations/_data.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,eAAO,MAAM,UAAU,EAAE,iBAAiB,EAsk3DzC,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyZxC,CAAC"}
@@ -37276,6 +37276,106 @@ export const connectors = [
37276
37276
  },
37277
37277
  },
37278
37278
  },
37279
+ }, {
37280
+ "id": "list_threads",
37281
+ "name": "List Threads",
37282
+ "description": "List recent Outlook conversation threads for request-desk triage. Returns one representative message per conversationId; pass that value as thread_id to the template get-thread tool or use it in get_thread's filter.",
37283
+ "requiresWrite": false,
37284
+ "endpoint": {
37285
+ "method": "GET",
37286
+ "url": "https://graph.microsoft.com/v1.0/me/mailFolders/{folderId}/messages",
37287
+ "params": {
37288
+ "folderId": {
37289
+ "type": "string",
37290
+ "in": "path",
37291
+ "description": "Mail folder ID or well-known folder name",
37292
+ "required": true,
37293
+ "default": "inbox",
37294
+ },
37295
+ "$top": {
37296
+ "type": "number",
37297
+ "in": "query",
37298
+ "description": "Maximum recent messages to inspect as thread representatives",
37299
+ "default": 25,
37300
+ },
37301
+ "$select": {
37302
+ "type": "string",
37303
+ "in": "query",
37304
+ "description": "Comma-separated message fields to return",
37305
+ "default": "id,conversationId,internetMessageId,subject,from,sender,toRecipients,ccRecipients,receivedDateTime,sentDateTime,bodyPreview,categories,isRead,importance,hasAttachments,webLink,flag",
37306
+ },
37307
+ "$orderby": {
37308
+ "type": "string",
37309
+ "in": "query",
37310
+ "description": "Sort expression",
37311
+ "default": "receivedDateTime desc",
37312
+ },
37313
+ "$filter": {
37314
+ "type": "string",
37315
+ "in": "query",
37316
+ "description": "Optional OData filter expression, e.g. isRead eq false",
37317
+ },
37318
+ },
37319
+ "response": {
37320
+ "transform": "value",
37321
+ "historicalSummary": {
37322
+ "collectionKeys": ["value", "data", "messages"],
37323
+ "collectionName": "threads",
37324
+ "itemFields": [
37325
+ { "name": "id" },
37326
+ { "name": "conversationId" },
37327
+ { "name": "internetMessageId" },
37328
+ { "name": "from", "kind": "contact" },
37329
+ { "name": "sender", "kind": "contact" },
37330
+ { "name": "toRecipients", "kind": "contact-array" },
37331
+ { "name": "ccRecipients", "kind": "contact-array" },
37332
+ { "name": "subject" },
37333
+ { "name": "receivedDateTime" },
37334
+ { "name": "sentDateTime" },
37335
+ { "name": "bodyPreview", "maxLength": 300 },
37336
+ { "name": "categories", "kind": "string-array" },
37337
+ { "name": "isRead" },
37338
+ { "name": "importance" },
37339
+ { "name": "hasAttachments" },
37340
+ { "name": "webLink" },
37341
+ { "name": "flag", "kind": "object" },
37342
+ ],
37343
+ "outputFields": [{ "name": "@odata.nextLink" }, { "name": "@odata.count" }],
37344
+ "omitted": "large email bodies and provider-specific message fields",
37345
+ },
37346
+ },
37347
+ },
37348
+ }, {
37349
+ "id": "get_thread",
37350
+ "name": "Get Thread",
37351
+ "description": "Get Outlook messages in a conversation. Pass a Microsoft Graph OData filter such as conversationId eq 'AAQk...'.",
37352
+ "requiresWrite": false,
37353
+ "endpoint": {
37354
+ "method": "GET",
37355
+ "url": "https://graph.microsoft.com/v1.0/me/messages",
37356
+ "params": {
37357
+ "filter": {
37358
+ "type": "string",
37359
+ "in": "query",
37360
+ "description": "Microsoft Graph OData filter, for example conversationId eq 'AAQk...'. Escape embedded single quotes by doubling them.",
37361
+ "required": true,
37362
+ "queryName": "$filter",
37363
+ },
37364
+ "$top": {
37365
+ "type": "number",
37366
+ "in": "query",
37367
+ "description": "Maximum messages to return",
37368
+ "default": 25,
37369
+ },
37370
+ "$select": {
37371
+ "type": "string",
37372
+ "in": "query",
37373
+ "description": "Comma-separated message fields to return",
37374
+ "default": "id,conversationId,internetMessageId,subject,body,bodyPreview,from,sender,toRecipients,ccRecipients,bccRecipients,replyTo,receivedDateTime,sentDateTime,categories,isRead,importance,hasAttachments,webLink,flag",
37375
+ },
37376
+ },
37377
+ "response": { "transform": "value" },
37378
+ },
37279
37379
  }, {
37280
37380
  "id": "list_shared_mailbox_emails",
37281
37381
  "name": "List Shared Mailbox Emails",
@@ -45415,7 +45515,7 @@ export const connectors = [
45415
45515
  "name": "salesforce",
45416
45516
  "displayName": "Salesforce",
45417
45517
  "icon": "salesforce.svg",
45418
- "description": "Manage accounts, contacts, opportunities, and leads in your Salesforce CRM",
45518
+ "description": "Connect Salesforce Service Cloud and Sales Cloud for customer support and CRM workflows",
45419
45519
  "auth": {
45420
45520
  "type": "oauth2",
45421
45521
  "provider": "salesforce",
@@ -45442,9 +45542,9 @@ export const connectors = [
45442
45542
  "docsUrl": "https://help.salesforce.com/s/articleView?id=sf.connected_app_create.htm",
45443
45543
  }],
45444
45544
  "tools": [{
45445
- "id": "list_accounts",
45446
- "name": "List Accounts",
45447
- "description": "List accounts from your Salesforce CRM",
45545
+ "id": "find_customer",
45546
+ "name": "Find Customer",
45547
+ "description": "Find customer contacts with account context for support triage. Pass a focused SOQL query when searching by email, name, phone, or account.",
45448
45548
  "requiresWrite": false,
45449
45549
  "endpoint": {
45450
45550
  "method": "GET",
@@ -45453,8 +45553,26 @@ export const connectors = [
45453
45553
  "q": {
45454
45554
  "type": "string",
45455
45555
  "in": "query",
45456
- "description": "SOQL query for accounts",
45457
- "default": "SELECT Id, Name, Type, Industry, Phone, Website FROM Account ORDER BY LastModifiedDate DESC LIMIT 50",
45556
+ "description": "SOQL Contact query. Include Account fields when the agent needs customer context.",
45557
+ "default": "SELECT Id, FirstName, LastName, Email, Phone, Title, AccountId, Account.Name, Account.Type, Account.Industry FROM Contact ORDER BY LastModifiedDate DESC LIMIT 25",
45558
+ },
45559
+ },
45560
+ "response": { "transform": "records" },
45561
+ },
45562
+ }, {
45563
+ "id": "search_accounts",
45564
+ "name": "Search Accounts",
45565
+ "description": "Search Salesforce accounts with business context for support or sales work",
45566
+ "requiresWrite": false,
45567
+ "endpoint": {
45568
+ "method": "GET",
45569
+ "url": "{{oauth.raw.instance_url}}/services/data/v61.0/query",
45570
+ "params": {
45571
+ "q": {
45572
+ "type": "string",
45573
+ "in": "query",
45574
+ "description": "SOQL Account query",
45575
+ "default": "SELECT Id, Name, Type, Industry, Phone, Website, OwnerId, LastModifiedDate FROM Account ORDER BY LastModifiedDate DESC LIMIT 50",
45458
45576
  },
45459
45577
  },
45460
45578
  "response": { "transform": "records" },
@@ -45477,9 +45595,9 @@ export const connectors = [
45477
45595
  },
45478
45596
  },
45479
45597
  }, {
45480
- "id": "list_contacts",
45481
- "name": "List Contacts",
45482
- "description": "List contacts from your Salesforce CRM",
45598
+ "id": "search_contacts",
45599
+ "name": "Search Contacts",
45600
+ "description": "Search contacts with account fields for CRM follow-up and support context",
45483
45601
  "requiresWrite": false,
45484
45602
  "endpoint": {
45485
45603
  "method": "GET",
@@ -45489,15 +45607,32 @@ export const connectors = [
45489
45607
  "type": "string",
45490
45608
  "in": "query",
45491
45609
  "description": "SOQL query for contacts",
45492
- "default": "SELECT Id, FirstName, LastName, Email, Phone, AccountId FROM Contact ORDER BY LastModifiedDate DESC LIMIT 50",
45610
+ "default": "SELECT Id, FirstName, LastName, Email, Phone, Title, AccountId, Account.Name FROM Contact ORDER BY LastModifiedDate DESC LIMIT 50",
45493
45611
  },
45494
45612
  },
45495
45613
  "response": { "transform": "records" },
45496
45614
  },
45497
45615
  }, {
45498
- "id": "list_opportunities",
45499
- "name": "List Opportunities",
45500
- "description": "List sales opportunities from your Salesforce CRM",
45616
+ "id": "get_contact",
45617
+ "name": "Get Contact",
45618
+ "description": "Get a Salesforce contact by ID",
45619
+ "requiresWrite": false,
45620
+ "endpoint": {
45621
+ "method": "GET",
45622
+ "url": "{{oauth.raw.instance_url}}/services/data/v61.0/sobjects/Contact/{contactId}",
45623
+ "params": {
45624
+ "contactId": {
45625
+ "type": "string",
45626
+ "in": "path",
45627
+ "description": "Salesforce Contact ID",
45628
+ "required": true,
45629
+ },
45630
+ },
45631
+ },
45632
+ }, {
45633
+ "id": "list_cases",
45634
+ "name": "List Cases",
45635
+ "description": "List Service Cloud cases for a customer, account, owner, status, or queue",
45501
45636
  "requiresWrite": false,
45502
45637
  "endpoint": {
45503
45638
  "method": "GET",
@@ -45506,33 +45641,33 @@ export const connectors = [
45506
45641
  "q": {
45507
45642
  "type": "string",
45508
45643
  "in": "query",
45509
- "description": "SOQL query for opportunities",
45510
- "default": "SELECT Id, Name, StageName, Amount, CloseDate, AccountId FROM Opportunity ORDER BY CloseDate DESC LIMIT 50",
45644
+ "description": "SOQL Case query. Filter by ContactId, AccountId, Status, OwnerId, Priority, or CreatedDate as needed.",
45645
+ "default": "SELECT Id, CaseNumber, Subject, Status, Priority, Origin, ContactId, AccountId, OwnerId, CreatedDate, LastModifiedDate FROM Case ORDER BY LastModifiedDate DESC LIMIT 50",
45511
45646
  },
45512
45647
  },
45513
45648
  "response": { "transform": "records" },
45514
45649
  },
45515
45650
  }, {
45516
- "id": "create_lead",
45517
- "name": "Create Lead",
45518
- "description": "Create a new lead in Salesforce CRM",
45519
- "requiresWrite": true,
45651
+ "id": "get_case",
45652
+ "name": "Get Case",
45653
+ "description": "Get a Service Cloud case by ID",
45654
+ "requiresWrite": false,
45520
45655
  "endpoint": {
45521
- "method": "POST",
45522
- "url": "{{oauth.raw.instance_url}}/services/data/v61.0/sobjects/Lead",
45523
- "body": {
45524
- "LastName": { "type": "string", "description": "Lead last name", "required": true },
45525
- "Company": { "type": "string", "description": "Lead company", "required": true },
45526
- "FirstName": { "type": "string", "description": "Lead first name" },
45527
- "Email": { "type": "string", "description": "Lead email address" },
45528
- "Phone": { "type": "string", "description": "Lead phone number" },
45529
- "Status": { "type": "string", "description": "Lead status" },
45656
+ "method": "GET",
45657
+ "url": "{{oauth.raw.instance_url}}/services/data/v61.0/sobjects/Case/{caseId}",
45658
+ "params": {
45659
+ "caseId": {
45660
+ "type": "string",
45661
+ "in": "path",
45662
+ "description": "Salesforce Case ID",
45663
+ "required": true,
45664
+ },
45530
45665
  },
45531
45666
  },
45532
45667
  }, {
45533
- "id": "soql_query",
45534
- "name": "Run SOQL Query",
45535
- "description": "Run an arbitrary SOQL query against any Salesforce object",
45668
+ "id": "list_case_activity",
45669
+ "name": "List Case Activity",
45670
+ "description": "List case comments for support handoff, timeline review, and resolution context",
45536
45671
  "requiresWrite": false,
45537
45672
  "endpoint": {
45538
45673
  "method": "GET",
@@ -45541,135 +45676,220 @@ export const connectors = [
45541
45676
  "q": {
45542
45677
  "type": "string",
45543
45678
  "in": "query",
45544
- "description": "SOQL query to execute, for example SELECT Id, Name FROM Account LIMIT 10",
45545
- "required": true,
45679
+ "description": "SOQL CaseComment query. Add WHERE ParentId = '<caseId>' to inspect one case.",
45680
+ "default": "SELECT Id, ParentId, CommentBody, CreatedDate, CreatedById, IsPublished FROM CaseComment ORDER BY CreatedDate DESC LIMIT 50",
45546
45681
  },
45547
45682
  },
45548
45683
  "response": { "transform": "records" },
45549
45684
  },
45550
45685
  }, {
45551
- "id": "describe_object",
45552
- "name": "Describe Object",
45553
- "description": "Get metadata and field definitions for a Salesforce object",
45686
+ "id": "search_knowledge_articles",
45687
+ "name": "Search Knowledge Articles",
45688
+ "description": "Search published Salesforce Knowledge articles that can help answer or deflect a support case",
45554
45689
  "requiresWrite": false,
45555
45690
  "endpoint": {
45556
45691
  "method": "GET",
45557
- "url": "{{oauth.raw.instance_url}}/services/data/v61.0/sobjects/{sobjectType}/describe",
45692
+ "url": "{{oauth.raw.instance_url}}/services/data/v61.0/query",
45558
45693
  "params": {
45559
- "sobjectType": {
45694
+ "q": {
45560
45695
  "type": "string",
45561
- "in": "path",
45562
- "description": "Salesforce object API name, for example Account, Contact, or Opportunity",
45563
- "required": true,
45696
+ "in": "query",
45697
+ "description": "SOQL KnowledgeArticleVersion query. Filter by Title, Summary, DataCategory, or language when needed.",
45698
+ "default": "SELECT Id, KnowledgeArticleId, Title, Summary, UrlName, Language, LastPublishedDate FROM KnowledgeArticleVersion WHERE PublishStatus = 'Online' ORDER BY LastPublishedDate DESC LIMIT 25",
45564
45699
  },
45565
45700
  },
45701
+ "response": { "transform": "records" },
45566
45702
  },
45567
45703
  }, {
45568
- "id": "create_record",
45569
- "name": "Create Record",
45570
- "description": "Create a record of any object type (use Describe Object to discover fields)",
45571
- "requiresWrite": true,
45704
+ "id": "list_opportunities",
45705
+ "name": "List Opportunities",
45706
+ "description": "List Sales Cloud opportunities for account planning and customer context",
45707
+ "requiresWrite": false,
45572
45708
  "endpoint": {
45573
- "method": "POST",
45574
- "url": "{{oauth.raw.instance_url}}/services/data/v61.0/sobjects/{sobjectType}",
45709
+ "method": "GET",
45710
+ "url": "{{oauth.raw.instance_url}}/services/data/v61.0/query",
45575
45711
  "params": {
45576
- "sobjectType": {
45712
+ "q": {
45577
45713
  "type": "string",
45578
- "in": "path",
45579
- "description": "Object API name, e.g. Account, Contact, Custom_Object__c",
45580
- "required": true,
45714
+ "in": "query",
45715
+ "description": "SOQL query for opportunities",
45716
+ "default": "SELECT Id, Name, StageName, Amount, CloseDate, AccountId, OwnerId, LastModifiedDate FROM Opportunity ORDER BY CloseDate DESC LIMIT 50",
45581
45717
  },
45582
45718
  },
45719
+ "response": { "transform": "records" },
45720
+ },
45721
+ }, {
45722
+ "id": "create_lead",
45723
+ "name": "Create Lead",
45724
+ "description": "Create a new lead in Salesforce CRM",
45725
+ "requiresWrite": true,
45726
+ "endpoint": {
45727
+ "method": "POST",
45728
+ "url": "{{oauth.raw.instance_url}}/services/data/v61.0/sobjects/Lead",
45583
45729
  "body": {
45584
- "record": {
45585
- "type": "object",
45586
- "description": 'Field map for the new record, e.g. {"Name":"Acme","Industry":"Technology"}',
45587
- "required": true,
45730
+ "LastName": { "type": "string", "description": "Lead last name", "required": true },
45731
+ "Company": { "type": "string", "description": "Lead company", "required": true },
45732
+ "FirstName": { "type": "string", "description": "Lead first name" },
45733
+ "Email": { "type": "string", "description": "Lead email address" },
45734
+ "Phone": { "type": "string", "description": "Lead phone number" },
45735
+ "Status": { "type": "string", "description": "Lead status" },
45736
+ },
45737
+ },
45738
+ }, {
45739
+ "id": "create_case",
45740
+ "name": "Create Case",
45741
+ "description": "Create a Service Cloud case for customer support",
45742
+ "requiresWrite": true,
45743
+ "endpoint": {
45744
+ "method": "POST",
45745
+ "url": "{{oauth.raw.instance_url}}/services/data/v61.0/sobjects/Case",
45746
+ "body": {
45747
+ "Subject": { "type": "string", "description": "Case subject", "required": true },
45748
+ "Description": { "type": "string", "description": "Case description" },
45749
+ "Status": { "type": "string", "description": "Case status", "default": "New" },
45750
+ "Priority": { "type": "string", "description": "Case priority" },
45751
+ "Origin": { "type": "string", "description": "Case origin", "default": "Web" },
45752
+ "ContactId": { "type": "string", "description": "Related Salesforce Contact ID" },
45753
+ "AccountId": { "type": "string", "description": "Related Salesforce Account ID" },
45754
+ "OwnerId": { "type": "string", "description": "Queue or user owner ID" },
45755
+ },
45756
+ },
45757
+ }, {
45758
+ "id": "add_case_comment",
45759
+ "name": "Add Case Comment",
45760
+ "description": "Add a support note or customer-visible comment to a Service Cloud case",
45761
+ "requiresWrite": true,
45762
+ "endpoint": {
45763
+ "method": "POST",
45764
+ "url": "{{oauth.raw.instance_url}}/services/data/v61.0/sobjects/CaseComment",
45765
+ "body": {
45766
+ "ParentId": { "type": "string", "description": "Salesforce Case ID", "required": true },
45767
+ "CommentBody": { "type": "string", "description": "Comment body", "required": true },
45768
+ "IsPublished": {
45769
+ "type": "boolean",
45770
+ "description": "Whether the comment is visible externally",
45771
+ "default": false,
45588
45772
  },
45589
45773
  },
45590
- "bodyMode": "passthrough",
45591
45774
  },
45592
45775
  }, {
45593
- "id": "update_record",
45594
- "name": "Update Record",
45595
- "description": "Update fields on a record of any object type",
45776
+ "id": "update_case",
45777
+ "name": "Update Case",
45778
+ "description": "Update status, priority, owner, or resolution fields on a Service Cloud case",
45596
45779
  "requiresWrite": true,
45597
45780
  "endpoint": {
45598
45781
  "method": "PATCH",
45599
- "url": "{{oauth.raw.instance_url}}/services/data/v61.0/sobjects/{sobjectType}/{recordId}",
45782
+ "url": "{{oauth.raw.instance_url}}/services/data/v61.0/sobjects/Case/{caseId}",
45600
45783
  "params": {
45601
- "sobjectType": {
45602
- "type": "string",
45603
- "in": "path",
45604
- "description": "Object API name, e.g. Account, Contact, Custom_Object__c",
45605
- "required": true,
45606
- },
45607
- "recordId": {
45784
+ "caseId": {
45608
45785
  "type": "string",
45609
45786
  "in": "path",
45610
- "description": "Salesforce record ID (15 or 18 chars)",
45787
+ "description": "Salesforce Case ID",
45611
45788
  "required": true,
45612
45789
  },
45613
45790
  },
45614
45791
  "body": {
45615
- "record": {
45616
- "type": "object",
45617
- "description": "Field map of fields to update",
45618
- "required": true,
45619
- },
45792
+ "Status": { "type": "string", "description": "New case status" },
45793
+ "Priority": { "type": "string", "description": "New case priority" },
45794
+ "OwnerId": { "type": "string", "description": "Queue or user owner ID" },
45795
+ "Reason": { "type": "string", "description": "Case reason" },
45796
+ "SuppliedEmail": { "type": "string", "description": "Customer supplied email" },
45797
+ "Description": { "type": "string", "description": "Updated case description" },
45620
45798
  },
45621
- "bodyMode": "passthrough",
45622
45799
  },
45623
45800
  }, {
45624
- "id": "delete_record",
45625
- "name": "Delete Record",
45626
- "description": "Delete a record of any object type",
45627
- "requiresWrite": true,
45801
+ "id": "describe_object",
45802
+ "name": "Describe Object",
45803
+ "description": "Get metadata and field definitions for a Salesforce object",
45804
+ "requiresWrite": false,
45628
45805
  "endpoint": {
45629
- "method": "DELETE",
45630
- "url": "{{oauth.raw.instance_url}}/services/data/v61.0/sobjects/{sobjectType}/{recordId}",
45806
+ "method": "GET",
45807
+ "url": "{{oauth.raw.instance_url}}/services/data/v61.0/sobjects/{sobjectType}/describe",
45631
45808
  "params": {
45632
45809
  "sobjectType": {
45633
45810
  "type": "string",
45634
45811
  "in": "path",
45635
- "description": "Object API name, e.g. Account, Contact, Custom_Object__c",
45812
+ "description": "Salesforce object API name, for example Case, Account, Contact, Opportunity, or a custom object",
45636
45813
  "required": true,
45637
45814
  },
45638
- "recordId": {
45815
+ },
45816
+ },
45817
+ }, {
45818
+ "id": "run_soql_query",
45819
+ "name": "Run SOQL Query",
45820
+ "description": "Run a read-only SOQL query for expert inspection when curated tools are not enough",
45821
+ "requiresWrite": false,
45822
+ "endpoint": {
45823
+ "method": "GET",
45824
+ "url": "{{oauth.raw.instance_url}}/services/data/v61.0/query",
45825
+ "params": {
45826
+ "q": {
45639
45827
  "type": "string",
45640
- "in": "path",
45641
- "description": "Salesforce record ID (15 or 18 chars)",
45828
+ "in": "query",
45829
+ "description": "Read-only SOQL query, for example SELECT Id, Subject FROM Case LIMIT 10",
45642
45830
  "required": true,
45643
45831
  },
45644
45832
  },
45833
+ "response": { "transform": "records" },
45645
45834
  },
45646
45835
  }],
45647
45836
  "prompts": [{
45648
- "id": "find_accounts",
45649
- "title": "Find accounts",
45650
- "prompt": "Search for accounts in my Salesforce CRM and show me their key information.",
45651
- "category": "crm",
45837
+ "id": "support_triage",
45838
+ "title": "Support triage",
45839
+ "prompt": "Find the customer in Salesforce, summarize their open cases, and suggest the next support action.",
45840
+ "category": "support",
45652
45841
  "icon": "search",
45653
45842
  }, {
45654
- "id": "create_lead",
45655
- "title": "Create a lead",
45656
- "prompt": "Create a new lead in Salesforce CRM with the information I provide.",
45657
- "category": "crm",
45843
+ "id": "create_case",
45844
+ "title": "Create a support case",
45845
+ "prompt": "Create a Salesforce Service Cloud case with the customer, subject, priority, and issue summary I provide.",
45846
+ "category": "support",
45658
45847
  "icon": "plus",
45848
+ }, {
45849
+ "id": "knowledge_search",
45850
+ "title": "Search Knowledge",
45851
+ "prompt": "Search Salesforce Knowledge for articles that answer this customer support issue.",
45852
+ "category": "support",
45853
+ "icon": "book",
45659
45854
  }, {
45660
45855
  "id": "pipeline_summary",
45661
45856
  "title": "Pipeline summary",
45662
- "prompt": "Show me a summary of my current sales opportunities and pipeline status.",
45857
+ "prompt": "Summarize Salesforce opportunities for this account and highlight any renewal or expansion context relevant to support.",
45663
45858
  "category": "crm",
45664
45859
  "icon": "chart",
45665
- }, {
45666
- "id": "contact_lookup",
45667
- "title": "Contact lookup",
45668
- "prompt": "Find and display information about specific contacts in my Salesforce CRM.",
45669
- "category": "crm",
45670
- "icon": "user",
45671
45860
  }],
45672
45861
  "suggestedWith": ["gmail", "slack", "calendar"],
45862
+ "setupGuide": {
45863
+ "title": "Salesforce Connected App Setup",
45864
+ "steps": [{
45865
+ "step": 1,
45866
+ "title": "Create a Salesforce test org",
45867
+ "description": "Use a sandbox or free Developer Edition org for staging. Enable Service Cloud, Cases, and Knowledge if the demo needs support workflows.",
45868
+ }, {
45869
+ "step": 2,
45870
+ "title": "Create a Connected App",
45871
+ "description": "In Salesforce Setup, create a Connected App with OAuth enabled. Add the Veryfront callback URL for the target environment.",
45872
+ "docsUrl": "https://help.salesforce.com/s/articleView?id=sf.connected_app_create.htm",
45873
+ }, {
45874
+ "step": 3,
45875
+ "title": "Configure OAuth scopes",
45876
+ "description": "Add api, refresh_token, and offline_access scopes. Use the Web Server Flow with a client secret for Veryfront API environments.",
45877
+ }, {
45878
+ "step": 4,
45879
+ "title": "Store Veryfront environment credentials",
45880
+ "description": "Set SALESFORCE_CLIENT_ID and SALESFORCE_CLIENT_SECRET for the matching Veryfront environment. Keep staging and production credentials separate.",
45881
+ }, {
45882
+ "step": 5,
45883
+ "title": "Grant least-privilege Salesforce permissions",
45884
+ "description": "Assign the connected user access to Account, Contact, Case, CaseComment, Opportunity, Lead, and Knowledge objects required by the enabled tools.",
45885
+ }],
45886
+ "notes": [
45887
+ "Staging callback: https://api.veryfront.org/oauth/callback/salesforce",
45888
+ "Production callback: https://api.veryfront.com/oauth/callback/salesforce",
45889
+ "Write tools should be explicitly enabled for an agent or project; read tools are the default demo surface.",
45890
+ ],
45891
+ "documentation": "https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/intro_rest.htm",
45892
+ },
45673
45893
  },
45674
45894
  {
45675
45895
  "name": "sap",
@@ -46974,6 +47194,9 @@ export const connectors = [
46974
47194
  "requiredApis": [{
46975
47195
  "name": "ServiceNow Table API",
46976
47196
  "enableUrl": "https://developer.servicenow.com/dev.do",
47197
+ }, {
47198
+ "name": "ServiceNow Service Catalog API",
47199
+ "enableUrl": "https://www.servicenow.com/docs/r/api-reference/rest-apis/c_ServiceCatalogAPI.html",
46977
47200
  }],
46978
47201
  "keyName": "SERVICENOW_ACCESS_TOKEN",
46979
47202
  "headerName": "Authorization",
@@ -47123,6 +47346,346 @@ export const connectors = [
47123
47346
  },
47124
47347
  "response": { "transform": "result" },
47125
47348
  },
47349
+ }, {
47350
+ "id": "list_interactions",
47351
+ "name": "List Interactions",
47352
+ "description": "List ServiceNow Interaction records used for request-desk intake and routing",
47353
+ "requiresWrite": false,
47354
+ "endpoint": {
47355
+ "method": "GET",
47356
+ "url": "https://{instanceHost}/api/now/v1/table/interaction",
47357
+ "params": {
47358
+ "instanceHost": {
47359
+ "type": "string",
47360
+ "in": "path",
47361
+ "description": "ServiceNow instance host, for example example.service-now.com",
47362
+ "required": true,
47363
+ },
47364
+ "sysparm_query": {
47365
+ "type": "string",
47366
+ "in": "query",
47367
+ "description": "Encoded ServiceNow query",
47368
+ "default": "active=true^ORDERBYDESCsys_updated_on",
47369
+ },
47370
+ "sysparm_limit": {
47371
+ "type": "number",
47372
+ "in": "query",
47373
+ "description": "Maximum interactions to return",
47374
+ "default": 25,
47375
+ },
47376
+ "sysparm_fields": {
47377
+ "type": "string",
47378
+ "in": "query",
47379
+ "description": "Comma-separated interaction fields to return",
47380
+ "default": "sys_id,number,short_description,description,state,type,opened_for,opened_by,parent,sys_created_on,sys_updated_on",
47381
+ },
47382
+ },
47383
+ "response": { "transform": "result" },
47384
+ },
47385
+ }, {
47386
+ "id": "get_interaction",
47387
+ "name": "Get Interaction",
47388
+ "description": "Get details of a specific ServiceNow Interaction record",
47389
+ "requiresWrite": false,
47390
+ "endpoint": {
47391
+ "method": "GET",
47392
+ "url": "https://{instanceHost}/api/now/v1/table/interaction/{sysId}",
47393
+ "params": {
47394
+ "instanceHost": {
47395
+ "type": "string",
47396
+ "in": "path",
47397
+ "description": "ServiceNow instance host, for example example.service-now.com",
47398
+ "required": true,
47399
+ },
47400
+ "sysId": {
47401
+ "type": "string",
47402
+ "in": "path",
47403
+ "description": "Interaction sys_id",
47404
+ "required": true,
47405
+ },
47406
+ "sysparm_display_value": {
47407
+ "type": "string",
47408
+ "in": "query",
47409
+ "description": "Display value mode",
47410
+ "default": "all",
47411
+ },
47412
+ },
47413
+ "response": { "transform": "result" },
47414
+ },
47415
+ }, {
47416
+ "id": "create_interaction",
47417
+ "name": "Create Interaction",
47418
+ "description": "Create a ServiceNow Interaction intake record before converting or linking it to an incident or request",
47419
+ "requiresWrite": true,
47420
+ "endpoint": {
47421
+ "method": "POST",
47422
+ "url": "https://{instanceHost}/api/now/v1/table/interaction",
47423
+ "params": {
47424
+ "instanceHost": {
47425
+ "type": "string",
47426
+ "in": "path",
47427
+ "description": "ServiceNow instance host, for example example.service-now.com",
47428
+ "required": true,
47429
+ },
47430
+ },
47431
+ "body": {
47432
+ "short_description": {
47433
+ "type": "string",
47434
+ "description": "Interaction short description",
47435
+ "required": true,
47436
+ },
47437
+ "description": { "type": "string", "description": "Interaction details" },
47438
+ "opened_for": { "type": "string", "description": "Requester sys_id or display value" },
47439
+ "opened_by": { "type": "string", "description": "Opener sys_id or display value" },
47440
+ "type": {
47441
+ "type": "string",
47442
+ "description": "Interaction channel or type, for example email, phone, chat, or portal",
47443
+ },
47444
+ "parent": { "type": "string", "description": "Optional parent record sys_id" },
47445
+ "work_notes": { "type": "string", "description": "Internal work notes" },
47446
+ },
47447
+ "response": { "transform": "result" },
47448
+ },
47449
+ }, {
47450
+ "id": "update_interaction",
47451
+ "name": "Update Interaction",
47452
+ "description": "Update an existing ServiceNow Interaction with routing status, parent record, notes, or comments",
47453
+ "requiresWrite": true,
47454
+ "endpoint": {
47455
+ "method": "PATCH",
47456
+ "url": "https://{instanceHost}/api/now/v1/table/interaction/{sysId}",
47457
+ "params": {
47458
+ "instanceHost": {
47459
+ "type": "string",
47460
+ "in": "path",
47461
+ "description": "ServiceNow instance host, for example example.service-now.com",
47462
+ "required": true,
47463
+ },
47464
+ "sysId": {
47465
+ "type": "string",
47466
+ "in": "path",
47467
+ "description": "Interaction sys_id",
47468
+ "required": true,
47469
+ },
47470
+ },
47471
+ "body": {
47472
+ "state": { "type": "string", "description": "Interaction state" },
47473
+ "parent": { "type": "string", "description": "Parent incident, request, or task sys_id" },
47474
+ "short_description": { "type": "string", "description": "Updated short description" },
47475
+ "description": { "type": "string", "description": "Updated interaction details" },
47476
+ "work_notes": { "type": "string", "description": "Internal work notes" },
47477
+ "comments": { "type": "string", "description": "Customer-visible comments" },
47478
+ },
47479
+ "response": { "transform": "result" },
47480
+ },
47481
+ }, {
47482
+ "id": "list_requests",
47483
+ "name": "List Requests",
47484
+ "description": "List ServiceNow service request records from the sc_request table",
47485
+ "requiresWrite": false,
47486
+ "endpoint": {
47487
+ "method": "GET",
47488
+ "url": "https://{instanceHost}/api/now/v1/table/sc_request",
47489
+ "params": {
47490
+ "instanceHost": {
47491
+ "type": "string",
47492
+ "in": "path",
47493
+ "description": "ServiceNow instance host, for example example.service-now.com",
47494
+ "required": true,
47495
+ },
47496
+ "sysparm_query": {
47497
+ "type": "string",
47498
+ "in": "query",
47499
+ "description": "Encoded ServiceNow query",
47500
+ "default": "ORDERBYDESCsys_updated_on",
47501
+ },
47502
+ "sysparm_limit": {
47503
+ "type": "number",
47504
+ "in": "query",
47505
+ "description": "Maximum requests to return",
47506
+ "default": 25,
47507
+ },
47508
+ "sysparm_fields": {
47509
+ "type": "string",
47510
+ "in": "query",
47511
+ "description": "Comma-separated request fields to return",
47512
+ "default": "sys_id,number,short_description,description,request_state,stage,approval,requested_for,opened_by,assignment_group,sys_created_on,sys_updated_on",
47513
+ },
47514
+ },
47515
+ "response": { "transform": "result" },
47516
+ },
47517
+ }, {
47518
+ "id": "get_request",
47519
+ "name": "Get Request",
47520
+ "description": "Get details of a specific ServiceNow service request",
47521
+ "requiresWrite": false,
47522
+ "endpoint": {
47523
+ "method": "GET",
47524
+ "url": "https://{instanceHost}/api/now/v1/table/sc_request/{sysId}",
47525
+ "params": {
47526
+ "instanceHost": {
47527
+ "type": "string",
47528
+ "in": "path",
47529
+ "description": "ServiceNow instance host, for example example.service-now.com",
47530
+ "required": true,
47531
+ },
47532
+ "sysId": {
47533
+ "type": "string",
47534
+ "in": "path",
47535
+ "description": "Request sys_id",
47536
+ "required": true,
47537
+ },
47538
+ "sysparm_display_value": {
47539
+ "type": "string",
47540
+ "in": "query",
47541
+ "description": "Display value mode",
47542
+ "default": "all",
47543
+ },
47544
+ },
47545
+ "response": { "transform": "result" },
47546
+ },
47547
+ }, {
47548
+ "id": "create_request",
47549
+ "name": "Create Request",
47550
+ "description": "Order a Service Catalog item to create a workflow-backed ServiceNow request",
47551
+ "requiresWrite": true,
47552
+ "endpoint": {
47553
+ "method": "POST",
47554
+ "url": "https://{instanceHost}/api/sn_sc/v1/servicecatalog/items/{catalogItemSysId}/order_now",
47555
+ "params": {
47556
+ "instanceHost": {
47557
+ "type": "string",
47558
+ "in": "path",
47559
+ "description": "ServiceNow instance host, for example example.service-now.com",
47560
+ "required": true,
47561
+ },
47562
+ "catalogItemSysId": {
47563
+ "type": "string",
47564
+ "in": "path",
47565
+ "description": "Service Catalog item sys_id to order",
47566
+ "required": true,
47567
+ },
47568
+ },
47569
+ "body": {
47570
+ "sysparm_quantity": {
47571
+ "type": "number",
47572
+ "description": "Quantity to order",
47573
+ "default": 1,
47574
+ },
47575
+ "variables": {
47576
+ "type": "object",
47577
+ "description": "Catalog item variables, for example requested_for, business_justification, or short_description",
47578
+ },
47579
+ },
47580
+ "response": { "transform": "result" },
47581
+ },
47582
+ }, {
47583
+ "id": "list_request_items",
47584
+ "name": "List Request Items",
47585
+ "description": "List ServiceNow requested item records from the sc_req_item table",
47586
+ "requiresWrite": false,
47587
+ "endpoint": {
47588
+ "method": "GET",
47589
+ "url": "https://{instanceHost}/api/now/v1/table/sc_req_item",
47590
+ "params": {
47591
+ "instanceHost": {
47592
+ "type": "string",
47593
+ "in": "path",
47594
+ "description": "ServiceNow instance host, for example example.service-now.com",
47595
+ "required": true,
47596
+ },
47597
+ "sysparm_query": {
47598
+ "type": "string",
47599
+ "in": "query",
47600
+ "description": "Encoded ServiceNow query",
47601
+ "default": "ORDERBYDESCsys_updated_on",
47602
+ },
47603
+ "sysparm_limit": {
47604
+ "type": "number",
47605
+ "in": "query",
47606
+ "description": "Maximum requested items to return",
47607
+ "default": 25,
47608
+ },
47609
+ "sysparm_fields": {
47610
+ "type": "string",
47611
+ "in": "query",
47612
+ "description": "Comma-separated requested item fields to return",
47613
+ "default": "sys_id,number,request,cat_item,short_description,description,state,stage,approval,requested_for,assignment_group,sys_created_on,sys_updated_on",
47614
+ },
47615
+ },
47616
+ "response": { "transform": "result" },
47617
+ },
47618
+ }, {
47619
+ "id": "get_request_item",
47620
+ "name": "Get Request Item",
47621
+ "description": "Get details of a specific ServiceNow requested item",
47622
+ "requiresWrite": false,
47623
+ "endpoint": {
47624
+ "method": "GET",
47625
+ "url": "https://{instanceHost}/api/now/v1/table/sc_req_item/{sysId}",
47626
+ "params": {
47627
+ "instanceHost": {
47628
+ "type": "string",
47629
+ "in": "path",
47630
+ "description": "ServiceNow instance host, for example example.service-now.com",
47631
+ "required": true,
47632
+ },
47633
+ "sysId": {
47634
+ "type": "string",
47635
+ "in": "path",
47636
+ "description": "Requested item sys_id",
47637
+ "required": true,
47638
+ },
47639
+ "sysparm_display_value": {
47640
+ "type": "string",
47641
+ "in": "query",
47642
+ "description": "Display value mode",
47643
+ "default": "all",
47644
+ },
47645
+ },
47646
+ "response": { "transform": "result" },
47647
+ },
47648
+ }, {
47649
+ "id": "create_request_item",
47650
+ "name": "Create Request Item",
47651
+ "description": "Create a requested item table record when direct sc_req_item writes are allowed",
47652
+ "requiresWrite": true,
47653
+ "endpoint": {
47654
+ "method": "POST",
47655
+ "url": "https://{instanceHost}/api/now/v1/table/sc_req_item",
47656
+ "params": {
47657
+ "instanceHost": {
47658
+ "type": "string",
47659
+ "in": "path",
47660
+ "description": "ServiceNow instance host, for example example.service-now.com",
47661
+ "required": true,
47662
+ },
47663
+ },
47664
+ "body": {
47665
+ "request": {
47666
+ "type": "string",
47667
+ "description": "Parent sc_request sys_id",
47668
+ "required": true,
47669
+ },
47670
+ "cat_item": { "type": "string", "description": "Catalog item sys_id" },
47671
+ "short_description": {
47672
+ "type": "string",
47673
+ "description": "Requested item short description",
47674
+ "required": true,
47675
+ },
47676
+ "description": { "type": "string", "description": "Requested item details" },
47677
+ "requested_for": { "type": "string", "description": "Requester sys_id or display value" },
47678
+ "assignment_group": {
47679
+ "type": "string",
47680
+ "description": "Assignment group sys_id or display value",
47681
+ },
47682
+ "state": { "type": "string", "description": "Requested item state" },
47683
+ "stage": { "type": "string", "description": "Requested item stage" },
47684
+ "work_notes": { "type": "string", "description": "Internal work notes" },
47685
+ "comments": { "type": "string", "description": "Customer-visible comments" },
47686
+ },
47687
+ "response": { "transform": "result" },
47688
+ },
47126
47689
  }, {
47127
47690
  "id": "search_knowledge",
47128
47691
  "name": "Search Knowledge Base",
@@ -1 +1 @@
1
- {"version":3,"file":"_tool_summaries.d.ts","sourceRoot":"","sources":["../../../src/src/integrations/_tool_summaries.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,aAAa,CAAC;AAExE,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,oCAAoC,CA2kHxF,CAAC"}
1
+ {"version":3,"file":"_tool_summaries.d.ts","sourceRoot":"","sources":["../../../src/src/integrations/_tool_summaries.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,aAAa,CAAC;AAExE,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,oCAAoC,CAomHxF,CAAC"}
@@ -2654,6 +2654,31 @@ export const historicalToolSummaries = {
2654
2654
  "outputFields": [{ "name": "@odata.nextLink" }, { "name": "@odata.count" }],
2655
2655
  "omitted": "large email bodies and provider-specific message fields",
2656
2656
  },
2657
+ "outlook__list_threads": {
2658
+ "collectionKeys": ["value", "data", "messages"],
2659
+ "collectionName": "threads",
2660
+ "itemFields": [
2661
+ { "name": "id" },
2662
+ { "name": "conversationId" },
2663
+ { "name": "internetMessageId" },
2664
+ { "name": "from", "kind": "contact" },
2665
+ { "name": "sender", "kind": "contact" },
2666
+ { "name": "toRecipients", "kind": "contact-array" },
2667
+ { "name": "ccRecipients", "kind": "contact-array" },
2668
+ { "name": "subject" },
2669
+ { "name": "receivedDateTime" },
2670
+ { "name": "sentDateTime" },
2671
+ { "name": "bodyPreview", "maxLength": 300 },
2672
+ { "name": "categories", "kind": "string-array" },
2673
+ { "name": "isRead" },
2674
+ { "name": "importance" },
2675
+ { "name": "hasAttachments" },
2676
+ { "name": "webLink" },
2677
+ { "name": "flag", "kind": "object" },
2678
+ ],
2679
+ "outputFields": [{ "name": "@odata.nextLink" }, { "name": "@odata.count" }],
2680
+ "omitted": "large email bodies and provider-specific message fields",
2681
+ },
2657
2682
  "outlook__search_emails": {
2658
2683
  "collectionKeys": ["value", "data", "messages"],
2659
2684
  "collectionName": "messages",
@@ -1,3 +1,3 @@
1
1
  /** Shared version value. */
2
- export declare const VERSION = "0.1.919";
2
+ export declare const VERSION = "0.1.921";
3
3
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
3
  /** Shared version value. */
4
- export const VERSION = "0.1.919";
4
+ export const VERSION = "0.1.921";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.919",
3
+ "version": "0.1.921",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",