@tangle-network/agent-integrations 0.70.0 → 0.71.0
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/data/bundled-adapter-manifests.json +1 -1
- package/dist/{adapters-Cyo2DsIw.js → adapters-CURjrtYm.js} +237 -18
- package/dist/{adapters-Cyo2DsIw.js.map → adapters-CURjrtYm.js.map} +1 -1
- package/dist/{bundled-manifest-data-CwAju2Nc.js → bundled-manifest-data-DUxxlN37.js} +137 -1
- package/dist/{bundled-manifest-data-CwAju2Nc.js.map → bundled-manifest-data-DUxxlN37.js.map} +1 -1
- package/dist/connectors/adapters/index.d.ts +2 -2
- package/dist/connectors/adapters/index.js +2 -2
- package/dist/connectors/index.d.ts +3 -3
- package/dist/connectors/index.js +3 -3
- package/dist/{consumer-sWg-n7bk.d.ts → consumer-DaKqPDG-.d.ts} +2 -2
- package/dist/{consumer-sWg-n7bk.d.ts.map → consumer-DaKqPDG-.d.ts.map} +1 -1
- package/dist/consumer.d.ts +1 -1
- package/dist/{index-xviDgOK9.d.ts → index-b05PzTtX.d.ts} +2 -2
- package/dist/{index-xviDgOK9.d.ts.map → index-b05PzTtX.d.ts.map} +1 -1
- package/dist/{index-pK_3vBC7.d.ts → index-udV3gGjx.d.ts} +11 -2
- package/dist/index-udV3gGjx.d.ts.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +5 -5
- package/dist/internal/bundled-manifest-runtime.js +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.js +1 -1
- package/dist/registry.js +1 -1
- package/dist/runtime.d.ts +1 -1
- package/dist/sandbox.d.ts +1 -1
- package/dist/{specs-By1F6mFV.js → specs-61KwR2bK.js} +2 -2
- package/dist/{specs-By1F6mFV.js.map → specs-61KwR2bK.js.map} +1 -1
- package/dist/specs.js +1 -1
- package/dist/{src-CfhhSno8.js → src-iUK2d9AZ.js} +3 -3
- package/dist/{src-CfhhSno8.js.map → src-iUK2d9AZ.js.map} +1 -1
- package/dist/triggers/index.d.ts +78 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +730 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/webhooks/index.d.ts +1 -1
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/index.js +76 -1
- package/dist/webhooks/index.js.map +1 -1
- package/docs/integration-execution-audit.md +17 -8
- package/docs/integration-execution-matrix.json +537 -28
- package/package.json +6 -1
- package/dist/index-pK_3vBC7.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/triggers/definitions.ts","../../src/triggers/index.ts"],"sourcesContent":["import type { HostedTriggerDefinition, HostedTriggerPerson, HostedTriggerRead, PolledRecord } from './types.js'\n\n/**\n * The hosted triggers, one per (connector, event), each over that connector's\n * existing READ capabilities. A definition lists candidate records created at\n * or after `since`; `pollHostedTrigger` filters, orders and caps them.\n */\n\nconst EMAIL = /^[^\\s@<>()[\\]\\\\,;:\"]{1,64}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)+$/i\nconst POLL_SECONDS = 120\n\nfunction object(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n}\n\nfunction list(value: unknown): Record<string, unknown>[] {\n return Array.isArray(value) ? value.map(object) : []\n}\n\nfunction text(value: unknown, max = 500): string | null {\n return typeof value === 'string' && value.trim() ? value.trim().slice(0, max) : null\n}\n\n/** `Ada Lovelace <ada@example.com>` and bare addresses alike. */\nfunction email(value: unknown): string | null {\n const raw = text(value, 400)\n if (!raw) return null\n const candidate = (/<([^<>]+)>/.exec(raw)?.[1] ?? raw).trim().toLowerCase()\n return EMAIL.test(candidate) ? candidate : null\n}\n\nfunction displayName(value: unknown): string | null {\n const raw = text(value, 400)\n return raw && raw.includes('<') ? text(raw.slice(0, raw.indexOf('<')).replace(/^\"|\"$/g, '')) : null\n}\n\n/** An ISO time from epoch seconds or milliseconds, a numeric string, or a date string. */\nfunction isoTime(value: unknown): string | null {\n if (typeof value === 'number' && Number.isFinite(value)) return new Date(value > 1e12 ? value : value * 1000).toISOString()\n const raw = text(value, 100)\n if (!raw) return null\n if (/^\\d{10,13}$/.test(raw)) {\n const n = Number(raw)\n return new Date(n > 1e12 ? n : n * 1000).toISOString()\n }\n // Pipedrive writes UTC times without a zone: `2026-10-09 10:00:00`.\n const parsed = Date.parse(/^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$/.test(raw) ? `${raw.replace(' ', 'T')}Z` : raw)\n return Number.isFinite(parsed) ? new Date(parsed).toISOString() : null\n}\n\nfunction person(input: { email?: unknown; name?: unknown; company?: unknown }): HostedTriggerPerson | null {\n const address = email(input.email)\n const name = text(input.name, 200)\n const company = text(input.company, 200)\n return address || name || company ? { email: address, name, company } : null\n}\n\nfunction seconds(isoValue: string): number {\n return Math.floor(Date.parse(isoValue) / 1000)\n}\n\n/** Senders that are never a person writing in. */\nconst AUTOMATED_SENDER = /^(no-?reply|do-?not-?reply|mailer-daemon|postmaster|notifications?|bounces?)([+.\\-_][^@]*)?@/i\n\nfunction mailRecord(input: { key: string; at: unknown; from: unknown; fromName?: unknown; to: unknown; subject: unknown; preview: unknown; threadId?: unknown }): PolledRecord | null {\n const occurredAt = isoTime(input.at)\n const from = email(input.from)\n if (!occurredAt || !from || AUTOMATED_SENDER.test(from)) return null\n const subject = text(input.subject, 300)\n const to = (Array.isArray(input.to) ? input.to : typeof input.to === 'string' ? input.to.split(',') : []).map(email).filter((value): value is string => Boolean(value))\n return {\n key: input.key, occurredAt,\n person: { email: from, name: text(input.fromName, 200) ?? displayName(input.from), company: null },\n summary: subject ? `Email: ${subject}` : 'Email with no subject',\n record: { messageId: input.key, threadId: text(input.threadId, 200), from, to, subject, preview: text(input.preview, 1000) },\n }\n}\n\nconst gmail: HostedTriggerDefinition = {\n provider: 'gmail',\n event: 'gmail.message.received',\n description: 'A new message arrived in the inbox from someone other than the account itself.',\n intervalSeconds: POLL_SECONDS,\n reads: ['list_messages'],\n async list({ read, since }) {\n const data = object(await read('list_messages', { query: `in:inbox -from:me after:${seconds(since)}`, maxResults: 50 }))\n return list(data.messages).flatMap((message) => {\n const id = text(message.id, 200)\n const record = id ? mailRecord({ key: id, at: message.internalDate, from: message.from, to: message.to, subject: message.subject, preview: message.snippet, threadId: message.threadId }) : null\n return record ? [record] : []\n })\n },\n}\n\nconst outlook: HostedTriggerDefinition = {\n provider: 'outlook-mail',\n event: 'outlook-mail.message.received',\n description: 'A new message arrived in the inbox.',\n intervalSeconds: POLL_SECONDS,\n reads: ['list_messages'],\n async list({ read }) {\n const data = object(await read('list_messages', { folder: 'inbox', top: 50 }))\n return list(data.messages).flatMap((message) => {\n const id = text(message.id, 400)\n const record = id ? mailRecord({ key: id, at: message.receivedDateTime, from: message.from, fromName: message.fromName, to: message.to, subject: message.subject, preview: message.bodyPreview, threadId: message.conversationId }) : null\n return record ? [record] : []\n })\n },\n}\n\nasync function hubspotPages(read: HostedTriggerRead, capability: string, key: 'contacts' | 'deals', since: string): Promise<Record<string, unknown>[]> {\n const rows: Record<string, unknown>[] = []\n let after: string | null = null\n for (let page = 0; page < 3; page++) {\n const data = object(await read(capability, { createdAfter: since, limit: 100, ...(after ? { after } : {}) }))\n rows.push(...list(data[key]))\n after = text(data.after, 200)\n if (!after) break\n }\n return rows\n}\n\nconst hubspotContact: HostedTriggerDefinition = {\n provider: 'hubspot',\n event: 'hubspot.contact.created',\n description: 'A contact was created, from a form, an import or an integration.',\n intervalSeconds: POLL_SECONDS,\n reads: ['list_new_contacts'],\n async list({ read, since }) {\n return (await hubspotPages(read, 'list_new_contacts', 'contacts', since)).flatMap((contact) => {\n const id = text(contact.id, 100)\n const occurredAt = isoTime(contact.createdAt)\n if (!id || !occurredAt) return []\n return [{ key: `contact:${id}`, occurredAt, person: person({ email: contact.email, name: contact.name, company: contact.company }),\n summary: `New HubSpot contact${contact.source ? ` from ${String(contact.source).toLowerCase().replaceAll('_', ' ')}` : ''}`,\n record: { contactId: id, jobTitle: text(contact.jobTitle, 200), lifecycleStage: text(contact.lifecycleStage, 100), source: text(contact.source, 100) } }]\n })\n },\n}\n\nconst hubspotDeal: HostedTriggerDefinition = {\n provider: 'hubspot',\n event: 'hubspot.deal.created',\n description: 'A deal was created.',\n intervalSeconds: POLL_SECONDS,\n reads: ['list_new_deals'],\n async list({ read, since }) {\n return (await hubspotPages(read, 'list_new_deals', 'deals', since)).flatMap((deal) => {\n const id = text(deal.id, 100)\n const occurredAt = isoTime(deal.createdAt)\n if (!id || !occurredAt) return []\n return [{ key: `deal:${id}`, occurredAt, person: null, summary: `New HubSpot deal: ${text(deal.name, 200) ?? id}`,\n record: { dealId: id, name: text(deal.name, 200), stage: text(deal.stage, 100), pipeline: text(deal.pipeline, 100), amount: deal.amount ?? null, ownerId: deal.ownerId ?? null } }]\n })\n },\n}\n\nfunction attioValue(values: Record<string, unknown>, slug: string, field: string): unknown {\n return object(list(values[slug])[0])[field]\n}\n\nconst attioPerson: HostedTriggerDefinition = {\n provider: 'attio',\n event: 'attio.person.created',\n description: 'A person record was created.',\n intervalSeconds: POLL_SECONDS,\n reads: ['records.query'],\n async list({ read, since }) {\n const data = object(await read('records.query', { object: 'people', filter: { created_at: { $gte: since } },\n sorts: [{ attribute: 'created_at', direction: 'asc' }], limit: 100 }))\n return list(data.data).flatMap((row) => {\n const id = text(object(row.id).record_id, 100)\n const occurredAt = isoTime(row.created_at)\n if (!id || !occurredAt) return []\n const values = object(row.values)\n const name = attioValue(values, 'name', 'full_name')\n return [{ key: `person:${id}`, occurredAt,\n person: person({ email: attioValue(values, 'email_addresses', 'email_address'), name, company: null }),\n summary: `New Attio person${typeof name === 'string' ? `: ${name}` : ''}`,\n record: { recordId: id, jobTitle: text(attioValue(values, 'job_title', 'value'), 200) } }]\n })\n },\n}\n\nasync function pipedriveRecent(read: HostedTriggerRead, capability: string, since: string): Promise<Record<string, unknown>[]> {\n const rows: Record<string, unknown>[] = []\n const sinceMs = Date.parse(since)\n for (let start = 0; start < 300; start += 100) {\n const page = list(object(await read(capability, { sort: 'add_time DESC', start, limit: 100 })).data)\n rows.push(...page)\n const oldest = page.at(-1)\n if (page.length < 100 || !oldest || Date.parse(isoTime(oldest.add_time) ?? '') < sinceMs) break\n }\n return rows\n}\n\nfunction pipedriveEmail(value: unknown): unknown {\n const entries = list(value)\n return (entries.find((entry) => entry.primary === true) ?? entries[0])?.value\n}\n\nconst pipedrivePerson: HostedTriggerDefinition = {\n provider: 'pipedrive',\n event: 'pipedrive.person.created',\n description: 'A person was added.',\n intervalSeconds: POLL_SECONDS,\n reads: ['persons.list'],\n async list({ read, since }) {\n return (await pipedriveRecent(read, 'persons.list', since)).flatMap((row) => {\n const id = row.id !== undefined ? String(row.id) : null\n const occurredAt = isoTime(row.add_time)\n if (!id || !occurredAt) return []\n const company = text(row.org_name, 200) ?? text(object(row.org_id).name, 200)\n return [{ key: `person:${id}`, occurredAt, person: person({ email: pipedriveEmail(row.email), name: row.name, company }),\n summary: `New Pipedrive person${row.name ? `: ${String(row.name)}` : ''}`, record: { personId: id, ownerId: object(row.owner_id).id ?? row.owner_id ?? null } }]\n })\n },\n}\n\nconst pipedriveDeal: HostedTriggerDefinition = {\n provider: 'pipedrive',\n event: 'pipedrive.deal.created',\n description: 'A deal was added.',\n intervalSeconds: POLL_SECONDS,\n reads: ['deals.list'],\n async list({ read, since }) {\n return (await pipedriveRecent(read, 'deals.list', since)).flatMap((row) => {\n const id = row.id !== undefined ? String(row.id) : null\n const occurredAt = isoTime(row.add_time)\n if (!id || !occurredAt) return []\n const contact = object(row.person_id)\n return [{ key: `deal:${id}`, occurredAt,\n person: person({ email: pipedriveEmail(contact.email), name: contact.name ?? row.person_name, company: text(object(row.org_id).name, 200) ?? row.org_name }),\n summary: `New Pipedrive deal: ${text(row.title, 200) ?? id}`,\n record: { dealId: id, title: text(row.title, 200), value: row.value ?? null, currency: text(row.currency, 10), stageId: row.stage_id ?? null } }]\n })\n },\n}\n\n/** A form answer's value as text, whatever its type. */\nfunction answerText(answer: Record<string, unknown>): string | null {\n const choice = object(answer.choice)\n const choices = object(answer.choices)\n const value = answer.email ?? answer.text ?? answer.url ?? answer.phone_number ?? answer.number ?? answer.date ?? answer.boolean\n ?? choice.label ?? (Array.isArray(choices.labels) ? choices.labels.join(', ') : undefined)\n return value === undefined || value === null ? null : String(value).slice(0, 1000)\n}\n\n/** Name, company and title from a form's answers, matched on the question titles. */\nfunction formPerson(fields: Array<{ title: string; value: string; isEmail: boolean }>): HostedTriggerPerson | null {\n const pick = (pattern: RegExp) => fields.find((field) => pattern.test(field.title))?.value ?? null\n return person({\n email: fields.find((field) => field.isEmail)?.value ?? fields.map((field) => email(field.value)).find(Boolean),\n name: pick(/\\bname\\b/i), company: pick(/company|organi[sz]ation|business|team/i),\n })\n}\n\nconst typeform: HostedTriggerDefinition = {\n provider: 'typeform',\n event: 'typeform.response.submitted',\n description: 'A completed response was submitted to any of the account\\'s forms.',\n intervalSeconds: POLL_SECONDS,\n reads: ['forms.list', 'forms.get', 'responses.list'],\n async list({ read, since }) {\n const forms = list(object(await read('forms.list', { page_size: 20 })).items).slice(0, 10)\n const records: PolledRecord[] = []\n for (const form of forms) {\n const formId = text(form.id, 100)\n if (!formId) continue\n const responses = list(object(await read('responses.list', { form_id: formId, since, completed: true, sort: 'submitted_at,asc', page_size: 50 })).items)\n if (responses.length === 0) continue\n const definition = object(await read('forms.get', { form_id: formId }))\n const titles = new Map(list(definition.fields).map((field) => [String(field.id), text(field.title, 200) ?? String(field.ref ?? '')]))\n for (const response of responses) {\n const token = text(response.token, 200) ?? text(response.response_id, 200)\n const occurredAt = isoTime(response.submitted_at)\n if (!token || !occurredAt) continue\n const fields = list(response.answers).flatMap((answer) => {\n const value = answerText(answer)\n const field = object(answer.field)\n return value ? [{ title: titles.get(String(field.id)) ?? String(field.ref ?? 'answer'), value, isEmail: answer.type === 'email' }] : []\n })\n records.push({ key: `response:${token}`, occurredAt, person: formPerson(fields),\n summary: `Typeform response to \"${text(form.title, 200) ?? formId}\"`,\n record: { formId, formTitle: text(form.title, 200), responseId: token, answers: fields.map(({ title, value }) => ({ question: title, answer: value })) } })\n }\n }\n return records\n },\n}\n\nconst tally: HostedTriggerDefinition = {\n provider: 'tally',\n event: 'tally.submission.created',\n description: 'A completed submission arrived on any of the account\\'s forms.',\n intervalSeconds: POLL_SECONDS,\n reads: ['forms.list', 'submissions.list'],\n async list({ read, since }) {\n const forms = list(object(await read('forms.list', { limit: 20 })).items).slice(0, 10)\n const records: PolledRecord[] = []\n for (const form of forms) {\n const formId = text(form.id, 100)\n if (!formId) continue\n const data = object(await read('submissions.list', { formId, filter: 'completed', startDate: since, limit: 50 }))\n const questions = new Map(list(data.questions).map((question) => [String(question.id), { title: text(question.title, 200) ?? 'answer', type: String(question.type ?? '') }]))\n for (const submission of list(data.submissions)) {\n const id = text(submission.id, 100)\n const occurredAt = isoTime(submission.submittedAt ?? submission.createdAt)\n if (!id || !occurredAt) continue\n const fields = list(submission.responses).flatMap((response) => {\n const question = questions.get(String(response.questionId))\n const raw = response.value ?? response.answer\n const value = raw === undefined || raw === null ? null : (Array.isArray(raw) ? raw.join(', ') : typeof raw === 'object' ? JSON.stringify(raw) : String(raw)).slice(0, 1000)\n return value ? [{ title: question?.title ?? 'answer', value, isEmail: question?.type === 'INPUT_EMAIL' }] : []\n })\n records.push({ key: `submission:${id}`, occurredAt, person: formPerson(fields),\n summary: `Tally submission to \"${text(form.name, 200) ?? formId}\"`,\n record: { formId, formName: text(form.name, 200), submissionId: id, answers: fields.map(({ title, value }) => ({ question: title, answer: value })) } })\n }\n }\n return records\n },\n}\n\nconst webflow: HostedTriggerDefinition = {\n provider: 'webflow',\n event: 'webflow.form.submitted',\n description: 'A form on any of the account\\'s sites was submitted.',\n intervalSeconds: POLL_SECONDS,\n reads: ['sites.list', 'forms.list', 'forms.submissions'],\n async list({ read }) {\n const sites = list(object(await read('sites.list', {})).sites).slice(0, 5)\n const records: PolledRecord[] = []\n for (const site of sites) {\n const siteId = text(site.id, 100)\n if (!siteId) continue\n const forms = list(object(await read('forms.list', { siteId, limit: 20 })).forms).slice(0, 10)\n for (const form of forms) {\n const formId = text(form.id, 100)\n if (!formId) continue\n const submissions: Record<string, unknown>[] = []\n for (let offset = 0; offset < 1000; offset += 100) {\n const page = list(object(await read('forms.submissions', { formId, offset, limit: 100 })).formSubmissions)\n submissions.push(...page)\n if (page.length < 100) break\n }\n for (const submission of submissions) {\n const id = text(submission.id, 100)\n const occurredAt = isoTime(submission.dateSubmitted)\n if (!id || !occurredAt) continue\n const fields = Object.entries(object(submission.formResponse)).flatMap(([title, value]) =>\n value === null || value === undefined || value === '' ? [] : [{ title, value: String(value).slice(0, 1000), isEmail: /e-?mail/i.test(title) }])\n records.push({ key: `submission:${id}`, occurredAt, person: formPerson(fields),\n summary: `Webflow form \"${text(form.displayName, 200) ?? formId}\" submitted on ${text(site.displayName, 200) ?? siteId}`,\n record: { siteId, formId, submissionId: id, answers: fields.map(({ title, value }) => ({ question: title, answer: value })) } })\n }\n }\n }\n return records\n },\n}\n\nconst calendly: HostedTriggerDefinition = {\n provider: 'calendly',\n event: 'calendly.invitee.created',\n description: 'Someone booked a meeting.',\n intervalSeconds: POLL_SECONDS,\n reads: ['user.get-current', 'scheduled-events.list', 'scheduled-events.list-invitees'],\n async list({ read, since }) {\n const me = object(await read('user.get-current', {}))\n const user = text(object(me.resource).uri, 300) ?? text(me.uri, 300)\n if (!user) throw new Error('calendly.invitee.created: Calendly returned no current user')\n // A meeting starts at or after it is booked, so bookings made since `since` start after it too.\n const events = list(object(await read('scheduled-events.list', { user, status: 'active', min_start_time: since, count: 100 })).collection)\n const records: PolledRecord[] = []\n const sinceMs = Date.parse(since)\n for (const event of events) {\n const uri = text(event.uri, 300)\n const created = isoTime(event.created_at)\n if (!uri || !created || Date.parse(created) < sinceMs) continue\n const uuid = uri.split('/').pop()!\n for (const invitee of list(object(await read('scheduled-events.list-invitees', { uuid, count: 25 })).collection)) {\n const occurredAt = isoTime(invitee.created_at) ?? created\n const answers = list(invitee.questions_and_answers).map((qa) => ({ question: text(qa.question, 200) ?? '', answer: text(qa.answer, 1000) ?? '' }))\n const inviteeKey = text(invitee.uri, 300) ?? `${uuid}:${email(invitee.email) ?? ''}`\n records.push({ key: `invitee:${inviteeKey}`, occurredAt,\n person: person({ email: invitee.email, name: invitee.name, company: answers.find((qa) => /company|organi[sz]ation/i.test(qa.question))?.answer }),\n summary: `Booked \"${text(event.name, 200) ?? 'a meeting'}\" for ${text(event.start_time, 40) ?? 'a future time'}`,\n record: { eventUri: uri, start: text(event.start_time, 40), end: text(event.end_time, 40), answers } })\n }\n }\n return records\n },\n}\n\nconst calCom: HostedTriggerDefinition = {\n provider: 'cal-com',\n event: 'cal-com.booking.created',\n description: 'Someone booked a meeting.',\n intervalSeconds: POLL_SECONDS,\n reads: ['bookings.list'],\n async list({ read }) {\n const bookings: Record<string, unknown>[] = []\n let cursor: string | null = null\n for (let page = 0; page < 3; page++) {\n const data = object(await read('bookings.list', { status: 'upcoming', limit: 100, ...(cursor ? { cursor } : {}) }))\n bookings.push(...list(Array.isArray(data.data) ? data.data : object(data.data).bookings ?? data.bookings))\n cursor = text(object(data.pagination).nextCursor, 500)\n if (!cursor) break\n }\n return bookings.flatMap((booking) => {\n const uid = text(booking.uid, 200) ?? (booking.id !== undefined ? String(booking.id) : null)\n const occurredAt = isoTime(booking.createdAt)\n if (!uid || !occurredAt) return []\n const attendee = list(booking.attendees)[0] ?? {}\n return [{ key: `booking:${uid}`, occurredAt, person: person({ email: attendee.email, name: attendee.name, company: null }),\n summary: `Booked \"${text(booking.title, 200) ?? 'a meeting'}\" for ${text(booking.start ?? booking.startTime, 40) ?? 'a future time'}`,\n record: { bookingUid: uid, start: text(booking.start ?? booking.startTime, 40), end: text(booking.end ?? booking.endTime, 40),\n description: text(booking.description, 2000), eventTypeId: booking.eventTypeId ?? object(booking.eventType).id ?? null } }]\n })\n },\n}\n\nconst intercom: HostedTriggerDefinition = {\n provider: 'intercom',\n event: 'intercom.conversation.created',\n description: 'A customer or lead started a new conversation.',\n intervalSeconds: POLL_SECONDS,\n reads: ['tickets.search'],\n async list({ read, since }) {\n const data = object(await read('tickets.search', { body: {\n query: { field: 'created_at', operator: '>', value: seconds(since) - 1 },\n pagination: { per_page: 50 },\n } }))\n return list(data.conversations).flatMap((conversation) => {\n const id = text(conversation.id, 100)\n const occurredAt = isoTime(conversation.created_at)\n if (!id || !occurredAt) return []\n const source = object(conversation.source)\n const author = object(source.author)\n if (author.type === 'admin' || author.type === 'bot') return []\n const body = text(String(source.body ?? '').replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' '), 2000)\n return [{ key: `conversation:${id}`, occurredAt, person: person({ email: author.email, name: author.name, company: null }),\n summary: `New Intercom conversation${text(source.subject, 200) ? `: ${text(source.subject, 200)}` : ''}`,\n record: { conversationId: id, subject: text(source.subject, 300), body, deliveredAs: text(source.delivered_as, 50) } }]\n })\n },\n}\n\nexport const HOSTED_TRIGGER_DEFINITIONS: readonly HostedTriggerDefinition[] = [\n gmail, outlook, hubspotContact, hubspotDeal, attioPerson, pipedrivePerson, pipedriveDeal,\n typeform, tally, webflow, calendly, calCom, intercom,\n]\n","/**\n * Hosted triggers: provider events for connectors whose provider cannot push\n * to a Hub without a customer configuring something, so the host reads the\n * connector on a schedule instead. Each trigger is defined once, here, over the\n * connector's own READ capabilities, and runs on any host that can invoke a\n * connection's reads (the Tangle Hub polls them for every subscribed\n * workflow). A run is a pure function of the reads and a cursor:\n *\n * - the first poll after a subscription records a baseline and emits\n * nothing, so turning a trigger on never replays history;\n * - each later poll emits the records created at or after the cursor that it\n * has not already emitted, oldest first, at most {@link MAX_EVENTS_PER_POLL};\n * - the cursor advances only past emitted records, so a capped or failed\n * poll resumes where it stopped.\n *\n * Events are normalized: a stable `id` (the delivery id), the trigger's\n * `type`, when the record was created, the person it names (email, name,\n * company) when there is one, a one-line summary and the trimmed record.\n * Providers that push signed webhooks keep their webhook provider in\n * `../webhooks`; a trigger here never duplicates one.\n */\n\nimport type { TriggerEventCatalog } from '../webhooks/router.js'\nimport { HOSTED_TRIGGER_DEFINITIONS } from './definitions.js'\nimport type { HostedTriggerCursor, HostedTriggerDefinition, HostedTriggerEvent, HostedTriggerRead } from './types.js'\n\nexport type * from './types.js'\nexport { HOSTED_TRIGGER_DEFINITIONS }\n\nexport const MAX_EVENTS_PER_POLL = 50\nconst SEEN_KEYS = 200\n\nexport interface HostedTriggerPollResult {\n events: HostedTriggerEvent[]\n cursor: HostedTriggerCursor\n /** True when more new records remain than one poll emits. */\n more: boolean\n}\n\n/** Poll one subscription once. `cursor` is null on the first poll after it is created. */\nexport async function pollHostedTrigger(\n trigger: HostedTriggerDefinition,\n context: { read: HostedTriggerRead; cursor: HostedTriggerCursor | null; now: Date },\n): Promise<HostedTriggerPollResult> {\n if (!context.cursor) return { events: [], cursor: { since: context.now.toISOString(), seen: [] }, more: false }\n const cursor = context.cursor\n const sinceMs = Date.parse(cursor.since)\n const seen = new Set(cursor.seen)\n const records = await trigger.list({ read: context.read, since: cursor.since, now: context.now })\n const fresh = records\n .filter((record) => !seen.has(record.key) && Number.isFinite(Date.parse(record.occurredAt)) && Date.parse(record.occurredAt) >= sinceMs)\n .sort((a, b) => Date.parse(a.occurredAt) - Date.parse(b.occurredAt))\n const emitted = fresh.slice(0, MAX_EVENTS_PER_POLL)\n const since = emitted.reduce((latest, record) => Date.parse(record.occurredAt) > Date.parse(latest) ? new Date(Date.parse(record.occurredAt)).toISOString() : latest, cursor.since)\n const keys = [...cursor.seen.filter((key) => !emitted.some((record) => record.key === key)), ...emitted.map((record) => record.key)]\n return {\n events: emitted.map((record) => ({\n id: `${trigger.provider}:${record.key}`,\n type: trigger.event,\n occurredAt: new Date(Date.parse(record.occurredAt)).toISOString(),\n person: record.person,\n summary: record.summary,\n record: record.record,\n })),\n cursor: { since, seen: keys.slice(-SEEN_KEYS) },\n more: fresh.length > emitted.length,\n }\n}\n\nexport function hostedTrigger(provider: string, event: string): HostedTriggerDefinition | undefined {\n return HOSTED_TRIGGER_DEFINITIONS.find((trigger) => trigger.provider === provider && trigger.event === event)\n}\n\n/** Providers with at least one hosted trigger. */\nexport const HOSTED_TRIGGER_PROVIDER_IDS: readonly string[] = [...new Set(HOSTED_TRIGGER_DEFINITIONS.map((trigger) => trigger.provider))]\n\n/** The closed catalog of a provider's hosted trigger events, for validating `on.provider_event.event`. */\nexport function hostedTriggerEventCatalog(provider: string): TriggerEventCatalog | undefined {\n const events = HOSTED_TRIGGER_DEFINITIONS.filter((trigger) => trigger.provider === provider)\n if (events.length === 0) return undefined\n return { namespace: `${provider}.`, closed: true, events: events.map((trigger) => ({ id: trigger.event })) }\n}\n"],"mappings":"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"}
|
package/dist/webhooks/index.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ export declare function slackHandshakeResponse(rawBody: string): {
|
|
|
18
18
|
challenge: string;
|
|
19
19
|
} | null;
|
|
20
20
|
export declare const slackWebhookProvider: WebhookProvider;
|
|
21
|
-
|
|
21
|
+
export declare const clerkWebhookProvider: WebhookProvider;
|
|
22
22
|
export declare const docusealWebhookProvider: WebhookProvider;
|
|
23
23
|
/** Tangle inbound-email provider. Our own Cloudflare Email Routing worker parses
|
|
24
24
|
* the MIME, JSON-serializes it, timestamped-HMAC signs it with the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/webhooks/providers.ts","../../src/webhooks/twilio.ts","../../src/webhooks/messaging.ts","../../src/webhooks/whatsapp.ts"],"mappings":";;;;qBA2Ba,uBAAuB;;;;;;;;;;;;wBAyDpB,uBAAuB;EAAoB;;qBAO9C,sBAAsB
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/webhooks/providers.ts","../../src/webhooks/twilio.ts","../../src/webhooks/messaging.ts","../../src/webhooks/whatsapp.ts"],"mappings":";;;;qBA2Ba,uBAAuB;;;;;;;;;;;;wBAyDpB,uBAAuB;EAAoB;;qBAO9C,sBAAsB;qBAgEtB,sBAAsB;qBAwDtB,yBAAyB;;;;;;qBA+CzB,sBAAsB;;;;;;;qBAyCtB,sBAAsB;;;;qBAwCtB,uBAAuB;;;;;qBAoEvB,yBAAyB;;;;;;qBAuCzB,0BAA0B;;;;;;;;;;qBAgF1B,qBAAqB;;;;wBAgGlB,2BAA2B;EACzC;EACA;EACA;EACA;;;EAGA,QAAQ;IACN;;;;wBClnBY,4BAA4B;EAC1C;EACA;EACA;EACA;IACE;;wBA+BY,+BAA+B;EAC7C;EACA;EACA;IACE;;;;wBCzBY,oBAAoB,iBAAiB,SAAS,gBAAgB,gBAAgB;;wBAyB9E,kBAAkB,iBAAiB,SAAS,gBAAgB,gBAAgB;;wBAK5E,oBAAoB,iBAAiB,SAAS,gBAAgB,gBAAgB;qBAoBjF,uBAAuB;qBAUvB,qBAAqB;qBAarB,2BAA2B;qBAc3B,6BAA6B;qBAY7B,uBAAuB;;qBAoBvB,yBAAyB;;;YCvI1B;;;wBAMI,8BAA8B;EAC5C,YAAY;EACZ;EACA;IACE"}
|
package/dist/webhooks/index.js
CHANGED
|
@@ -342,6 +342,81 @@ const slackWebhookProvider = {
|
|
|
342
342
|
}
|
|
343
343
|
};
|
|
344
344
|
/** DocuSeal webhook provider. Signature header `X-Docuseal-Signature`. */
|
|
345
|
+
/**
|
|
346
|
+
* Clerk webhooks, delivered by Svix. The signing secret is the `whsec_`
|
|
347
|
+
* value Clerk shows for the endpoint; its base64 tail is the HMAC key. Svix
|
|
348
|
+
* signs `${svix-id}.${svix-timestamp}.${body}` with HMAC-SHA256 and sends one
|
|
349
|
+
* or more space-separated `v1,<base64>` signatures. Deliveries older than five
|
|
350
|
+
* minutes are refused, so a captured request cannot be replayed later.
|
|
351
|
+
*/
|
|
352
|
+
const SVIX_TOLERANCE_SECONDS = 300;
|
|
353
|
+
const clerkWebhookProvider = {
|
|
354
|
+
id: "clerk",
|
|
355
|
+
verifySignature({ rawBody, headers, secret }) {
|
|
356
|
+
const id = firstHeader(headers, "svix-id");
|
|
357
|
+
const timestamp = firstHeader(headers, "svix-timestamp");
|
|
358
|
+
const signatures = firstHeader(headers, "svix-signature");
|
|
359
|
+
if (!id || !timestamp || !signatures) return {
|
|
360
|
+
valid: false,
|
|
361
|
+
reason: "missing_svix_headers"
|
|
362
|
+
};
|
|
363
|
+
const sent = Number(timestamp);
|
|
364
|
+
if (!Number.isFinite(sent) || Math.abs(Date.now() / 1e3 - sent) > SVIX_TOLERANCE_SECONDS) return {
|
|
365
|
+
valid: false,
|
|
366
|
+
reason: "stale_svix_timestamp"
|
|
367
|
+
};
|
|
368
|
+
const encodedKey = secret.startsWith("whsec_") ? secret.slice(6) : secret;
|
|
369
|
+
let key;
|
|
370
|
+
try {
|
|
371
|
+
key = Buffer.from(encodedKey, "base64");
|
|
372
|
+
} catch {
|
|
373
|
+
return {
|
|
374
|
+
valid: false,
|
|
375
|
+
reason: "invalid_secret"
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
if (key.length === 0) return {
|
|
379
|
+
valid: false,
|
|
380
|
+
reason: "invalid_secret"
|
|
381
|
+
};
|
|
382
|
+
const expected = Buffer.from(createHmac("sha256", key).update(`${id}.${timestamp}.${rawBody}`).digest("base64"));
|
|
383
|
+
for (const entry of signatures.split(" ")) {
|
|
384
|
+
const [version, signature] = entry.split(",", 2);
|
|
385
|
+
if (version !== "v1" || !signature) continue;
|
|
386
|
+
const actual = Buffer.from(signature);
|
|
387
|
+
if (actual.length === expected.length && timingSafeEqual(actual, expected)) return { valid: true };
|
|
388
|
+
}
|
|
389
|
+
return {
|
|
390
|
+
valid: false,
|
|
391
|
+
reason: "invalid_signature"
|
|
392
|
+
};
|
|
393
|
+
},
|
|
394
|
+
parse({ rawBody, headers, now }) {
|
|
395
|
+
const evt = safeJson(rawBody);
|
|
396
|
+
if (!evt || typeof evt !== "object" || typeof evt.type !== "string") return [];
|
|
397
|
+
return [{
|
|
398
|
+
provider: "clerk",
|
|
399
|
+
eventType: `clerk.${evt.type}`,
|
|
400
|
+
providerEventId: firstHeader(headers, "svix-id") ?? void 0,
|
|
401
|
+
receivedAt: now ?? Date.now(),
|
|
402
|
+
payload: evt,
|
|
403
|
+
headers: normalizeHeaders(headers)
|
|
404
|
+
}];
|
|
405
|
+
},
|
|
406
|
+
eventCatalog: {
|
|
407
|
+
namespace: "clerk.",
|
|
408
|
+
closed: false,
|
|
409
|
+
events: [
|
|
410
|
+
{ id: "clerk.user.created" },
|
|
411
|
+
{ id: "clerk.user.updated" },
|
|
412
|
+
{ id: "clerk.user.deleted" },
|
|
413
|
+
{ id: "clerk.session.created" },
|
|
414
|
+
{ id: "clerk.organization.created" },
|
|
415
|
+
{ id: "clerk.organizationMembership.created" },
|
|
416
|
+
{ id: "clerk.waitlistEntry.created" }
|
|
417
|
+
]
|
|
418
|
+
}
|
|
419
|
+
};
|
|
345
420
|
const docusealWebhookProvider = {
|
|
346
421
|
id: "docuseal",
|
|
347
422
|
verifySignature({ rawBody, headers, secret }) {
|
|
@@ -1124,6 +1199,6 @@ function createWhatsappWebhookProvider(options) {
|
|
|
1124
1199
|
};
|
|
1125
1200
|
}
|
|
1126
1201
|
//#endregion
|
|
1127
|
-
export { FileSystemWebhookIdempotencyStore, InMemoryWebhookIdempotencyStore, WebhookRouter, clayWebhookProvider, contiguityWebhookProvider, createTwilioSmsWebhookProvider, createTwilioWebhookProvider, createWhatsappWebhookProvider, docusealWebhookProvider, emailWebhookProvider, gdriveWebhookProvider, genericHmacWebhookProvider, gmailWebhookProvider, hellosignWebhookProvider, inkboxWebhookProvider, linqWebhookProvider, linqWhatsappWebhookProvider, resendWebhookProvider, sendblueWebhookProvider, slackHandshakeResponse, slackWebhookProvider, stripeWebhookProvider, telegramWebhookProvider, verifyInkboxWebhook, verifyLinqWebhook, verifyResendWebhook };
|
|
1202
|
+
export { FileSystemWebhookIdempotencyStore, InMemoryWebhookIdempotencyStore, WebhookRouter, clayWebhookProvider, clerkWebhookProvider, contiguityWebhookProvider, createTwilioSmsWebhookProvider, createTwilioWebhookProvider, createWhatsappWebhookProvider, docusealWebhookProvider, emailWebhookProvider, gdriveWebhookProvider, genericHmacWebhookProvider, gmailWebhookProvider, hellosignWebhookProvider, inkboxWebhookProvider, linqWebhookProvider, linqWhatsappWebhookProvider, resendWebhookProvider, sendblueWebhookProvider, slackHandshakeResponse, slackWebhookProvider, stripeWebhookProvider, telegramWebhookProvider, verifyInkboxWebhook, verifyLinqWebhook, verifyResendWebhook };
|
|
1128
1203
|
|
|
1129
1204
|
//# sourceMappingURL=index.js.map
|