@kelpie/server 0.7.0 → 0.9.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/dist/lib/consumerEmailDomains.d.ts +2 -0
- package/dist/lib/consumerEmailDomains.d.ts.map +1 -0
- package/dist/lib/consumerEmailDomains.js +62 -0
- package/dist/lib/consumerEmailDomains.js.map +1 -0
- package/dist/lib/email.d.ts +7 -0
- package/dist/lib/email.d.ts.map +1 -1
- package/dist/lib/email.js.map +1 -1
- package/dist/lib/emailContent.d.ts +33 -0
- package/dist/lib/emailContent.d.ts.map +1 -0
- package/dist/lib/emailContent.js +54 -0
- package/dist/lib/emailContent.js.map +1 -0
- package/dist/lib/emailDomainAutoLink.d.ts +27 -0
- package/dist/lib/emailDomainAutoLink.d.ts.map +1 -0
- package/dist/lib/emailDomainAutoLink.js +119 -0
- package/dist/lib/emailDomainAutoLink.js.map +1 -0
- package/dist/lib/ids.d.ts +13 -0
- package/dist/lib/ids.d.ts.map +1 -1
- package/dist/lib/ids.js +13 -0
- package/dist/lib/ids.js.map +1 -1
- package/dist/modules/activities/repository.d.ts.map +1 -1
- package/dist/modules/activities/repository.js +19 -20
- package/dist/modules/activities/repository.js.map +1 -1
- package/dist/modules/activities/wording.d.ts +12 -0
- package/dist/modules/activities/wording.d.ts.map +1 -1
- package/dist/modules/activities/wording.js +16 -0
- package/dist/modules/activities/wording.js.map +1 -1
- package/dist/modules/agent-tasks/catalog.d.ts.map +1 -1
- package/dist/modules/agent-tasks/catalog.js +62 -0
- package/dist/modules/agent-tasks/catalog.js.map +1 -1
- package/dist/modules/agent-tasks/resolve.d.ts.map +1 -1
- package/dist/modules/agent-tasks/resolve.js +42 -9
- package/dist/modules/agent-tasks/resolve.js.map +1 -1
- package/dist/modules/agent-tasks/routes.d.ts +2 -0
- package/dist/modules/agent-tasks/routes.d.ts.map +1 -1
- package/dist/modules/attachedRecords.d.ts +6 -1
- package/dist/modules/attachedRecords.d.ts.map +1 -1
- package/dist/modules/attachedRecords.js +18 -2
- package/dist/modules/attachedRecords.js.map +1 -1
- package/dist/modules/auth/preferences.d.ts +11 -1
- package/dist/modules/auth/preferences.d.ts.map +1 -1
- package/dist/modules/auth/preferences.js +11 -0
- package/dist/modules/auth/preferences.js.map +1 -1
- package/dist/modules/auth/routes.d.ts.map +1 -1
- package/dist/modules/auth/routes.js +18 -0
- package/dist/modules/auth/routes.js.map +1 -1
- package/dist/modules/auth/schema.d.ts +20 -0
- package/dist/modules/auth/schema.d.ts.map +1 -1
- package/dist/modules/auth/schema.js +11 -1
- package/dist/modules/auth/schema.js.map +1 -1
- package/dist/modules/auth/service.d.ts.map +1 -1
- package/dist/modules/auth/service.js +27 -3
- package/dist/modules/auth/service.js.map +1 -1
- package/dist/modules/companies/index.d.ts.map +1 -1
- package/dist/modules/companies/index.js +3 -1
- package/dist/modules/companies/index.js.map +1 -1
- package/dist/modules/companies/repository.d.ts +2 -0
- package/dist/modules/companies/repository.d.ts.map +1 -1
- package/dist/modules/companies/repository.js +1 -0
- package/dist/modules/companies/repository.js.map +1 -1
- package/dist/modules/companies/routes.d.ts +16 -0
- package/dist/modules/companies/routes.d.ts.map +1 -1
- package/dist/modules/companies/routes.js +18 -0
- package/dist/modules/companies/routes.js.map +1 -1
- package/dist/modules/companies/schema.d.ts +37 -0
- package/dist/modules/companies/schema.d.ts.map +1 -1
- package/dist/modules/companies/schema.js +10 -1
- package/dist/modules/companies/schema.js.map +1 -1
- package/dist/modules/companies/service.d.ts +6 -0
- package/dist/modules/companies/service.d.ts.map +1 -1
- package/dist/modules/companies/service.js +45 -11
- package/dist/modules/companies/service.js.map +1 -1
- package/dist/modules/consent-purposes/capabilities.d.ts +7 -0
- package/dist/modules/consent-purposes/capabilities.d.ts.map +1 -0
- package/dist/modules/consent-purposes/capabilities.js +10 -0
- package/dist/modules/consent-purposes/capabilities.js.map +1 -0
- package/dist/modules/consent-purposes/events.d.ts +38 -0
- package/dist/modules/consent-purposes/events.d.ts.map +1 -0
- package/dist/modules/consent-purposes/events.js +17 -0
- package/dist/modules/consent-purposes/events.js.map +1 -0
- package/dist/modules/consent-purposes/index.d.ts +13 -0
- package/dist/modules/consent-purposes/index.d.ts.map +1 -0
- package/dist/modules/consent-purposes/index.js +41 -0
- package/dist/modules/consent-purposes/index.js.map +1 -0
- package/dist/modules/consent-purposes/repository.d.ts +21 -0
- package/dist/modules/consent-purposes/repository.d.ts.map +1 -0
- package/dist/modules/consent-purposes/repository.js +98 -0
- package/dist/modules/consent-purposes/repository.js.map +1 -0
- package/dist/modules/consent-purposes/routes.d.ts +39 -0
- package/dist/modules/consent-purposes/routes.d.ts.map +1 -0
- package/dist/modules/consent-purposes/routes.js +79 -0
- package/dist/modules/consent-purposes/routes.js.map +1 -0
- package/dist/modules/consent-purposes/schema.d.ts +175 -0
- package/dist/modules/consent-purposes/schema.d.ts.map +1 -0
- package/dist/modules/consent-purposes/schema.js +35 -0
- package/dist/modules/consent-purposes/schema.js.map +1 -0
- package/dist/modules/consent-purposes/service.d.ts +50 -0
- package/dist/modules/consent-purposes/service.d.ts.map +1 -0
- package/dist/modules/consent-purposes/service.js +263 -0
- package/dist/modules/consent-purposes/service.js.map +1 -0
- package/dist/modules/consent-purposes/starters.d.ts +17 -0
- package/dist/modules/consent-purposes/starters.d.ts.map +1 -0
- package/dist/modules/consent-purposes/starters.js +15 -0
- package/dist/modules/consent-purposes/starters.js.map +1 -0
- package/dist/modules/consent-purposes/tools.d.ts +4 -0
- package/dist/modules/consent-purposes/tools.d.ts.map +1 -0
- package/dist/modules/consent-purposes/tools.js +29 -0
- package/dist/modules/consent-purposes/tools.js.map +1 -0
- package/dist/modules/core.d.ts.map +1 -1
- package/dist/modules/core.js +21 -0
- package/dist/modules/core.js.map +1 -1
- package/dist/modules/custom-fields/capabilities.d.ts +12 -0
- package/dist/modules/custom-fields/capabilities.d.ts.map +1 -0
- package/dist/modules/custom-fields/capabilities.js +15 -0
- package/dist/modules/custom-fields/capabilities.js.map +1 -0
- package/dist/modules/custom-fields/events.d.ts +49 -0
- package/dist/modules/custom-fields/events.d.ts.map +1 -0
- package/dist/modules/custom-fields/events.js +25 -0
- package/dist/modules/custom-fields/events.js.map +1 -0
- package/dist/modules/custom-fields/index.d.ts +19 -0
- package/dist/modules/custom-fields/index.d.ts.map +1 -0
- package/dist/modules/custom-fields/index.js +46 -0
- package/dist/modules/custom-fields/index.js.map +1 -0
- package/dist/modules/custom-fields/repository.d.ts +37 -0
- package/dist/modules/custom-fields/repository.d.ts.map +1 -0
- package/dist/modules/custom-fields/repository.js +144 -0
- package/dist/modules/custom-fields/repository.js.map +1 -0
- package/dist/modules/custom-fields/routes.d.ts +44 -0
- package/dist/modules/custom-fields/routes.d.ts.map +1 -0
- package/dist/modules/custom-fields/routes.js +103 -0
- package/dist/modules/custom-fields/routes.js.map +1 -0
- package/dist/modules/custom-fields/schema.d.ts +215 -0
- package/dist/modules/custom-fields/schema.d.ts.map +1 -0
- package/dist/modules/custom-fields/schema.js +43 -0
- package/dist/modules/custom-fields/schema.js.map +1 -0
- package/dist/modules/custom-fields/service.d.ts +57 -0
- package/dist/modules/custom-fields/service.d.ts.map +1 -0
- package/dist/modules/custom-fields/service.js +273 -0
- package/dist/modules/custom-fields/service.js.map +1 -0
- package/dist/modules/custom-fields/tools.d.ts +4 -0
- package/dist/modules/custom-fields/tools.d.ts.map +1 -0
- package/dist/modules/custom-fields/tools.js +38 -0
- package/dist/modules/custom-fields/tools.js.map +1 -0
- package/dist/modules/custom-fields/values.d.ts +49 -0
- package/dist/modules/custom-fields/values.d.ts.map +1 -0
- package/dist/modules/custom-fields/values.js +249 -0
- package/dist/modules/custom-fields/values.js.map +1 -0
- package/dist/modules/custom-fields/wire.d.ts +12 -0
- package/dist/modules/custom-fields/wire.d.ts.map +1 -0
- package/dist/modules/custom-fields/wire.js +30 -0
- package/dist/modules/custom-fields/wire.js.map +1 -0
- package/dist/modules/dashboard/repository.d.ts.map +1 -1
- package/dist/modules/dashboard/repository.js +4 -3
- package/dist/modules/dashboard/repository.js.map +1 -1
- package/dist/modules/deals/index.d.ts +2 -1
- package/dist/modules/deals/index.d.ts.map +1 -1
- package/dist/modules/deals/index.js +5 -2
- package/dist/modules/deals/index.js.map +1 -1
- package/dist/modules/deals/repository.d.ts +0 -16
- package/dist/modules/deals/repository.d.ts.map +1 -1
- package/dist/modules/deals/repository.js +6 -76
- package/dist/modules/deals/repository.js.map +1 -1
- package/dist/modules/deals/routes.d.ts +14 -0
- package/dist/modules/deals/routes.d.ts.map +1 -1
- package/dist/modules/deals/routes.js +7 -0
- package/dist/modules/deals/routes.js.map +1 -1
- package/dist/modules/deals/schema.d.ts +20 -42
- package/dist/modules/deals/schema.d.ts.map +1 -1
- package/dist/modules/deals/schema.js +6 -11
- package/dist/modules/deals/schema.js.map +1 -1
- package/dist/modules/deals/service.d.ts +13 -2
- package/dist/modules/deals/service.d.ts.map +1 -1
- package/dist/modules/deals/service.js +43 -20
- package/dist/modules/deals/service.js.map +1 -1
- package/dist/modules/decisions/repository.d.ts.map +1 -1
- package/dist/modules/decisions/repository.js +2 -0
- package/dist/modules/decisions/repository.js.map +1 -1
- package/dist/modules/decisions/routes.d.ts +1 -0
- package/dist/modules/decisions/routes.d.ts.map +1 -1
- package/dist/modules/email-domain-linker/index.d.ts +12 -0
- package/dist/modules/email-domain-linker/index.d.ts.map +1 -0
- package/dist/modules/email-domain-linker/index.js +34 -0
- package/dist/modules/email-domain-linker/index.js.map +1 -0
- package/dist/modules/email-domain-linker/routes.d.ts +14 -0
- package/dist/modules/email-domain-linker/routes.d.ts.map +1 -0
- package/dist/modules/email-domain-linker/routes.js +15 -0
- package/dist/modules/email-domain-linker/routes.js.map +1 -0
- package/dist/modules/email-domain-linker/service.d.ts +37 -0
- package/dist/modules/email-domain-linker/service.d.ts.map +1 -0
- package/dist/modules/email-domain-linker/service.js +63 -0
- package/dist/modules/email-domain-linker/service.js.map +1 -0
- package/dist/modules/enquiries/events.d.ts +44 -0
- package/dist/modules/enquiries/events.d.ts.map +1 -0
- package/dist/modules/enquiries/events.js +19 -0
- package/dist/modules/enquiries/events.js.map +1 -0
- package/dist/modules/enquiries/index.d.ts +13 -0
- package/dist/modules/enquiries/index.d.ts.map +1 -0
- package/dist/modules/enquiries/index.js +44 -0
- package/dist/modules/enquiries/index.js.map +1 -0
- package/dist/modules/enquiries/repository.d.ts +30 -0
- package/dist/modules/enquiries/repository.d.ts.map +1 -0
- package/dist/modules/enquiries/repository.js +94 -0
- package/dist/modules/enquiries/repository.js.map +1 -0
- package/dist/modules/enquiries/routes.d.ts +52 -0
- package/dist/modules/enquiries/routes.d.ts.map +1 -0
- package/dist/modules/enquiries/routes.js +127 -0
- package/dist/modules/enquiries/routes.js.map +1 -0
- package/dist/modules/enquiries/schema.d.ts +290 -0
- package/dist/modules/enquiries/schema.d.ts.map +1 -0
- package/dist/modules/enquiries/schema.js +52 -0
- package/dist/modules/enquiries/schema.js.map +1 -0
- package/dist/modules/enquiries/service.d.ts +85 -0
- package/dist/modules/enquiries/service.d.ts.map +1 -0
- package/dist/modules/enquiries/service.js +370 -0
- package/dist/modules/enquiries/service.js.map +1 -0
- package/dist/modules/enquiries/tools.d.ts +4 -0
- package/dist/modules/enquiries/tools.d.ts.map +1 -0
- package/dist/modules/enquiries/tools.js +50 -0
- package/dist/modules/enquiries/tools.js.map +1 -0
- package/dist/modules/eventCatalogs.d.ts +4 -0
- package/dist/modules/eventCatalogs.d.ts.map +1 -1
- package/dist/modules/eventCatalogs.js +4 -0
- package/dist/modules/eventCatalogs.js.map +1 -1
- package/dist/modules/forms/embed.d.ts +20 -6
- package/dist/modules/forms/embed.d.ts.map +1 -1
- package/dist/modules/forms/embed.js +359 -43
- package/dist/modules/forms/embed.js.map +1 -1
- package/dist/modules/forms/events.d.ts +20 -7
- package/dist/modules/forms/events.d.ts.map +1 -1
- package/dist/modules/forms/events.js +20 -2
- package/dist/modules/forms/events.js.map +1 -1
- package/dist/modules/forms/fields.d.ts +14 -1
- package/dist/modules/forms/fields.d.ts.map +1 -1
- package/dist/modules/forms/fields.js +87 -3
- package/dist/modules/forms/fields.js.map +1 -1
- package/dist/modules/forms/index.d.ts.map +1 -1
- package/dist/modules/forms/index.js +12 -1
- package/dist/modules/forms/index.js.map +1 -1
- package/dist/modules/forms/mapping.d.ts +62 -5
- package/dist/modules/forms/mapping.d.ts.map +1 -1
- package/dist/modules/forms/mapping.js +139 -5
- package/dist/modules/forms/mapping.js.map +1 -1
- package/dist/modules/forms/publicRoutes.d.ts.map +1 -1
- package/dist/modules/forms/publicRoutes.js +29 -1
- package/dist/modules/forms/publicRoutes.js.map +1 -1
- package/dist/modules/forms/repository.d.ts +31 -0
- package/dist/modules/forms/repository.d.ts.map +1 -1
- package/dist/modules/forms/repository.js +90 -1
- package/dist/modules/forms/repository.js.map +1 -1
- package/dist/modules/forms/routes.d.ts +83 -1
- package/dist/modules/forms/routes.d.ts.map +1 -1
- package/dist/modules/forms/routes.js +185 -2
- package/dist/modules/forms/routes.js.map +1 -1
- package/dist/modules/forms/schema.d.ts +672 -1
- package/dist/modules/forms/schema.d.ts.map +1 -1
- package/dist/modules/forms/schema.js +146 -3
- package/dist/modules/forms/schema.js.map +1 -1
- package/dist/modules/forms/service.d.ts +54 -1
- package/dist/modules/forms/service.d.ts.map +1 -1
- package/dist/modules/forms/service.js +338 -28
- package/dist/modules/forms/service.js.map +1 -1
- package/dist/modules/forms/submission.d.ts +15 -0
- package/dist/modules/forms/submission.d.ts.map +1 -1
- package/dist/modules/forms/submission.js +418 -40
- package/dist/modules/forms/submission.js.map +1 -1
- package/dist/modules/import-export/drafts.d.ts +10 -0
- package/dist/modules/import-export/drafts.d.ts.map +1 -1
- package/dist/modules/import-export/drafts.js +16 -2
- package/dist/modules/import-export/drafts.js.map +1 -1
- package/dist/modules/import-export/exportRows.d.ts +7 -4
- package/dist/modules/import-export/exportRows.d.ts.map +1 -1
- package/dist/modules/import-export/exportRows.js +20 -5
- package/dist/modules/import-export/exportRows.js.map +1 -1
- package/dist/modules/import-export/plan.d.ts +12 -1
- package/dist/modules/import-export/plan.d.ts.map +1 -1
- package/dist/modules/import-export/plan.js +29 -2
- package/dist/modules/import-export/plan.js.map +1 -1
- package/dist/modules/import-export/presets.d.ts.map +1 -1
- package/dist/modules/import-export/presets.js +10 -0
- package/dist/modules/import-export/presets.js.map +1 -1
- package/dist/modules/import-export/repository.d.ts +11 -1
- package/dist/modules/import-export/repository.d.ts.map +1 -1
- package/dist/modules/import-export/repository.js +42 -9
- package/dist/modules/import-export/repository.js.map +1 -1
- package/dist/modules/import-export/routes.d.ts.map +1 -1
- package/dist/modules/import-export/routes.js +4 -0
- package/dist/modules/import-export/routes.js.map +1 -1
- package/dist/modules/import-export/schema.d.ts +17 -0
- package/dist/modules/import-export/schema.d.ts.map +1 -1
- package/dist/modules/import-export/schema.js +11 -0
- package/dist/modules/import-export/schema.js.map +1 -1
- package/dist/modules/import-export/service.d.ts +6 -0
- package/dist/modules/import-export/service.d.ts.map +1 -1
- package/dist/modules/import-export/service.js +14 -2
- package/dist/modules/import-export/service.js.map +1 -1
- package/dist/modules/import-export/streams.d.ts.map +1 -1
- package/dist/modules/import-export/streams.js +3 -3
- package/dist/modules/import-export/streams.js.map +1 -1
- package/dist/modules/import-export/tools.d.ts.map +1 -1
- package/dist/modules/import-export/tools.js +8 -0
- package/dist/modules/import-export/tools.js.map +1 -1
- package/dist/modules/import-export/validation.d.ts.map +1 -1
- package/dist/modules/import-export/validation.js +22 -1
- package/dist/modules/import-export/validation.js.map +1 -1
- package/dist/modules/import-export/writes.d.ts.map +1 -1
- package/dist/modules/import-export/writes.js +37 -4
- package/dist/modules/import-export/writes.js.map +1 -1
- package/dist/modules/lists/events.d.ts +42 -0
- package/dist/modules/lists/events.d.ts.map +1 -0
- package/dist/modules/lists/events.js +16 -0
- package/dist/modules/lists/events.js.map +1 -0
- package/dist/modules/lists/index.d.ts +10 -0
- package/dist/modules/lists/index.d.ts.map +1 -0
- package/dist/modules/lists/index.js +35 -0
- package/dist/modules/lists/index.js.map +1 -0
- package/dist/modules/lists/repository.d.ts +80 -0
- package/dist/modules/lists/repository.d.ts.map +1 -0
- package/dist/modules/lists/repository.js +178 -0
- package/dist/modules/lists/repository.js.map +1 -0
- package/dist/modules/lists/routes.d.ts +55 -0
- package/dist/modules/lists/routes.d.ts.map +1 -0
- package/dist/modules/lists/routes.js +168 -0
- package/dist/modules/lists/routes.js.map +1 -0
- package/dist/modules/lists/schema.d.ts +281 -0
- package/dist/modules/lists/schema.d.ts.map +1 -0
- package/dist/modules/lists/schema.js +83 -0
- package/dist/modules/lists/schema.js.map +1 -0
- package/dist/modules/lists/service.d.ts +82 -0
- package/dist/modules/lists/service.d.ts.map +1 -0
- package/dist/modules/lists/service.js +262 -0
- package/dist/modules/lists/service.js.map +1 -0
- package/dist/modules/lists/tools.d.ts +4 -0
- package/dist/modules/lists/tools.d.ts.map +1 -0
- package/dist/modules/lists/tools.js +86 -0
- package/dist/modules/lists/tools.js.map +1 -0
- package/dist/modules/mcp/index.d.ts.map +1 -1
- package/dist/modules/mcp/index.js +5 -0
- package/dist/modules/mcp/index.js.map +1 -1
- package/dist/modules/notes/routes.d.ts +1 -0
- package/dist/modules/notes/routes.d.ts.map +1 -1
- package/dist/modules/opportunities/index.d.ts.map +1 -1
- package/dist/modules/opportunities/index.js +3 -1
- package/dist/modules/opportunities/index.js.map +1 -1
- package/dist/modules/opportunities/repository.d.ts +2 -0
- package/dist/modules/opportunities/repository.d.ts.map +1 -1
- package/dist/modules/opportunities/repository.js +4 -0
- package/dist/modules/opportunities/repository.js.map +1 -1
- package/dist/modules/opportunities/routes.d.ts +16 -0
- package/dist/modules/opportunities/routes.d.ts.map +1 -1
- package/dist/modules/opportunities/routes.js +13 -0
- package/dist/modules/opportunities/routes.js.map +1 -1
- package/dist/modules/opportunities/schema.d.ts +20 -0
- package/dist/modules/opportunities/schema.d.ts.map +1 -1
- package/dist/modules/opportunities/schema.js +6 -1
- package/dist/modules/opportunities/schema.js.map +1 -1
- package/dist/modules/opportunities/service.d.ts +20 -3
- package/dist/modules/opportunities/service.d.ts.map +1 -1
- package/dist/modules/opportunities/service.js +99 -18
- package/dist/modules/opportunities/service.js.map +1 -1
- package/dist/modules/opportunities/tools.d.ts.map +1 -1
- package/dist/modules/opportunities/tools.js +2 -0
- package/dist/modules/opportunities/tools.js.map +1 -1
- package/dist/modules/partnerships/index.d.ts.map +1 -1
- package/dist/modules/partnerships/index.js +3 -1
- package/dist/modules/partnerships/index.js.map +1 -1
- package/dist/modules/partnerships/repository.d.ts +0 -17
- package/dist/modules/partnerships/repository.d.ts.map +1 -1
- package/dist/modules/partnerships/repository.js +6 -82
- package/dist/modules/partnerships/repository.js.map +1 -1
- package/dist/modules/partnerships/routes.d.ts +14 -0
- package/dist/modules/partnerships/routes.d.ts.map +1 -1
- package/dist/modules/partnerships/routes.js +7 -0
- package/dist/modules/partnerships/routes.js.map +1 -1
- package/dist/modules/partnerships/schema.d.ts +20 -41
- package/dist/modules/partnerships/schema.d.ts.map +1 -1
- package/dist/modules/partnerships/schema.js +6 -10
- package/dist/modules/partnerships/schema.js.map +1 -1
- package/dist/modules/partnerships/service.d.ts +11 -1
- package/dist/modules/partnerships/service.d.ts.map +1 -1
- package/dist/modules/partnerships/service.js +43 -20
- package/dist/modules/partnerships/service.js.map +1 -1
- package/dist/modules/people/consentHydration.d.ts +26 -0
- package/dist/modules/people/consentHydration.d.ts.map +1 -0
- package/dist/modules/people/consentHydration.js +100 -0
- package/dist/modules/people/consentHydration.js.map +1 -0
- package/dist/modules/people/index.d.ts.map +1 -1
- package/dist/modules/people/index.js +3 -1
- package/dist/modules/people/index.js.map +1 -1
- package/dist/modules/people/personConsentWrites.d.ts +40 -0
- package/dist/modules/people/personConsentWrites.d.ts.map +1 -0
- package/dist/modules/people/personConsentWrites.js +98 -0
- package/dist/modules/people/personConsentWrites.js.map +1 -0
- package/dist/modules/people/repository.d.ts +11 -0
- package/dist/modules/people/repository.d.ts.map +1 -1
- package/dist/modules/people/repository.js +21 -1
- package/dist/modules/people/repository.js.map +1 -1
- package/dist/modules/people/routes.d.ts +57 -4
- package/dist/modules/people/routes.d.ts.map +1 -1
- package/dist/modules/people/routes.js +104 -5
- package/dist/modules/people/routes.js.map +1 -1
- package/dist/modules/people/schema.d.ts +366 -1
- package/dist/modules/people/schema.d.ts.map +1 -1
- package/dist/modules/people/schema.js +92 -2
- package/dist/modules/people/schema.js.map +1 -1
- package/dist/modules/people/service.d.ts +30 -1
- package/dist/modules/people/service.d.ts.map +1 -1
- package/dist/modules/people/service.js +131 -36
- package/dist/modules/people/service.js.map +1 -1
- package/dist/modules/people/tools.d.ts.map +1 -1
- package/dist/modules/people/tools.js +4 -1
- package/dist/modules/people/tools.js.map +1 -1
- package/dist/modules/personLinks.d.ts +79 -0
- package/dist/modules/personLinks.d.ts.map +1 -0
- package/dist/modules/personLinks.js +155 -0
- package/dist/modules/personLinks.js.map +1 -0
- package/dist/modules/pipelines/routes.d.ts +1 -0
- package/dist/modules/pipelines/routes.d.ts.map +1 -1
- package/dist/modules/plans/routes.d.ts +1 -0
- package/dist/modules/plans/routes.d.ts.map +1 -1
- package/dist/modules/positions/routes.d.ts.map +1 -1
- package/dist/modules/positions/routes.js +4 -2
- package/dist/modules/positions/routes.js.map +1 -1
- package/dist/modules/raises/index.d.ts.map +1 -1
- package/dist/modules/raises/index.js +3 -1
- package/dist/modules/raises/index.js.map +1 -1
- package/dist/modules/raises/repository.d.ts +0 -17
- package/dist/modules/raises/repository.d.ts.map +1 -1
- package/dist/modules/raises/repository.js +6 -77
- package/dist/modules/raises/repository.js.map +1 -1
- package/dist/modules/raises/routes.d.ts +14 -0
- package/dist/modules/raises/routes.d.ts.map +1 -1
- package/dist/modules/raises/routes.js +7 -0
- package/dist/modules/raises/routes.js.map +1 -1
- package/dist/modules/raises/schema.d.ts +20 -41
- package/dist/modules/raises/schema.d.ts.map +1 -1
- package/dist/modules/raises/schema.js +6 -10
- package/dist/modules/raises/schema.js.map +1 -1
- package/dist/modules/raises/service.d.ts +11 -1
- package/dist/modules/raises/service.d.ts.map +1 -1
- package/dist/modules/raises/service.js +41 -18
- package/dist/modules/raises/service.js.map +1 -1
- package/dist/modules/recordTargets.d.ts.map +1 -1
- package/dist/modules/recordTargets.js +2 -0
- package/dist/modules/recordTargets.js.map +1 -1
- package/dist/modules/references.d.ts +10 -0
- package/dist/modules/references.d.ts.map +1 -1
- package/dist/modules/references.js +27 -4
- package/dist/modules/references.js.map +1 -1
- package/dist/modules/sample-data/fixture.d.ts +160 -0
- package/dist/modules/sample-data/fixture.d.ts.map +1 -0
- package/dist/modules/sample-data/fixture.js +501 -0
- package/dist/modules/sample-data/fixture.js.map +1 -0
- package/dist/modules/sample-data/index.d.ts +11 -0
- package/dist/modules/sample-data/index.d.ts.map +1 -0
- package/dist/modules/sample-data/index.js +44 -0
- package/dist/modules/sample-data/index.js.map +1 -0
- package/dist/modules/sample-data/routes.d.ts +15 -0
- package/dist/modules/sample-data/routes.d.ts.map +1 -0
- package/dist/modules/sample-data/routes.js +25 -0
- package/dist/modules/sample-data/routes.js.map +1 -0
- package/dist/modules/sample-data/service.d.ts +39 -0
- package/dist/modules/sample-data/service.d.ts.map +1 -0
- package/dist/modules/sample-data/service.js +481 -0
- package/dist/modules/sample-data/service.js.map +1 -0
- package/dist/modules/sample-data/tools.d.ts +4 -0
- package/dist/modules/sample-data/tools.d.ts.map +1 -0
- package/dist/modules/sample-data/tools.js +22 -0
- package/dist/modules/sample-data/tools.js.map +1 -0
- package/dist/modules/search/index.d.ts +1 -1
- package/dist/modules/search/index.d.ts.map +1 -1
- package/dist/modules/search/index.js +2 -1
- package/dist/modules/search/index.js.map +1 -1
- package/dist/modules/search/repository.d.ts +1 -0
- package/dist/modules/search/repository.d.ts.map +1 -1
- package/dist/modules/search/repository.js +23 -0
- package/dist/modules/search/repository.js.map +1 -1
- package/dist/modules/search/service.d.ts +3 -3
- package/dist/modules/search/service.d.ts.map +1 -1
- package/dist/modules/search/service.js +5 -4
- package/dist/modules/search/service.js.map +1 -1
- package/dist/modules/smtp-email/index.d.ts +1 -0
- package/dist/modules/smtp-email/index.d.ts.map +1 -1
- package/dist/modules/smtp-email/index.js +1 -0
- package/dist/modules/smtp-email/index.js.map +1 -1
- package/dist/modules/stagedRecords.d.ts +3 -3
- package/dist/modules/stagedRecords.d.ts.map +1 -1
- package/dist/modules/stagedRecords.js +9 -0
- package/dist/modules/stagedRecords.js.map +1 -1
- package/dist/modules/webhooks/payloads.d.ts.map +1 -1
- package/dist/modules/webhooks/payloads.js +15 -2
- package/dist/modules/webhooks/payloads.js.map +1 -1
- package/dist/modules/workspace/repository.d.ts +2 -0
- package/dist/modules/workspace/repository.d.ts.map +1 -1
- package/dist/modules/workspace/repository.js +7 -0
- package/dist/modules/workspace/repository.js.map +1 -1
- package/dist/modules/workspace/service.d.ts.map +1 -1
- package/dist/modules/workspace/service.js +20 -1
- package/dist/modules/workspace/service.js.map +1 -1
- package/dist/modules/workspace/starters.d.ts.map +1 -1
- package/dist/modules/workspace/starters.js +5 -0
- package/dist/modules/workspace/starters.js.map +1 -1
- package/dist/runtime/events.d.ts +1 -1
- package/dist/runtime/events.d.ts.map +1 -1
- package/dist/runtime/events.js +1 -0
- package/dist/runtime/events.js.map +1 -1
- package/dist/schema/index.d.ts +4 -0
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +4 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/testing/database.d.ts +5 -1
- package/dist/testing/database.d.ts.map +1 -1
- package/dist/testing/database.js +81 -10
- package/dist/testing/database.js.map +1 -1
- package/migrations/0021_certain_maggott.sql +30 -0
- package/migrations/0022_stormy_manta.sql +1 -0
- package/migrations/0023_funny_maddog.sql +1 -0
- package/migrations/0024_third_king_cobra.sql +46 -0
- package/migrations/0025_worthless_chimera.sql +3 -0
- package/migrations/0026_late_aqueduct.sql +46 -0
- package/migrations/0027_brainy_silver_sable.sql +3 -0
- package/migrations/0028_freezing_scrambler.sql +19 -0
- package/migrations/0029_custom_fields.sql +26 -0
- package/migrations/0030_enquiries.sql +79 -0
- package/migrations/0031_consent.sql +45 -0
- package/migrations/0032_form_field_statement.sql +1 -0
- package/migrations/0033_form_field_consent_purpose_ids.sql +5 -0
- package/migrations/0034_drop_form_field_consent_purpose_id.sql +1 -0
- package/migrations/0035_form_field_consent_purpose_labels.sql +1 -0
- package/migrations/0036_form_field_notice_type.sql +2 -0
- package/migrations/meta/0021_snapshot.json +5389 -0
- package/migrations/meta/0022_snapshot.json +5396 -0
- package/migrations/meta/0023_snapshot.json +5403 -0
- package/migrations/meta/0024_snapshot.json +5516 -0
- package/migrations/meta/0025_snapshot.json +5336 -0
- package/migrations/meta/0026_snapshot.json +5710 -0
- package/migrations/meta/0027_snapshot.json +5716 -0
- package/migrations/meta/0028_snapshot.json +5740 -0
- package/migrations/meta/0029_snapshot.json +5935 -0
- package/migrations/meta/0030_snapshot.json +6245 -0
- package/migrations/meta/0031_snapshot.json +6572 -0
- package/migrations/meta/0032_snapshot.json +6578 -0
- package/migrations/meta/0033_snapshot.json +6572 -0
- package/migrations/meta/0034_snapshot.json +6566 -0
- package/migrations/meta/0035_snapshot.json +6573 -0
- package/migrations/meta/0036_snapshot.json +6573 -0
- package/migrations/meta/_journal.json +112 -0
- package/package.json +3 -2
- package/src/lib/consumerEmailDomains.ts +62 -0
- package/src/lib/email.ts +7 -0
- package/src/lib/emailContent.ts +91 -0
- package/src/lib/emailDomainAutoLink.ts +165 -0
- package/src/lib/ids.ts +13 -0
- package/src/modules/activities/repository.ts +22 -23
- package/src/modules/activities/wording.ts +18 -0
- package/src/modules/agent-tasks/catalog.ts +63 -0
- package/src/modules/agent-tasks/resolve.ts +64 -24
- package/src/modules/attachedRecords.ts +37 -3
- package/src/modules/auth/preferences.ts +13 -1
- package/src/modules/auth/routes.ts +22 -0
- package/src/modules/auth/schema.ts +12 -2
- package/src/modules/auth/service.ts +37 -3
- package/src/modules/companies/index.ts +3 -1
- package/src/modules/companies/repository.ts +3 -0
- package/src/modules/companies/routes.ts +20 -0
- package/src/modules/companies/schema.ts +11 -1
- package/src/modules/companies/service.ts +72 -12
- package/src/modules/consent-purposes/capabilities.ts +12 -0
- package/src/modules/consent-purposes/events.ts +38 -0
- package/src/modules/consent-purposes/index.ts +48 -0
- package/src/modules/consent-purposes/repository.ts +163 -0
- package/src/modules/consent-purposes/routes.ts +122 -0
- package/src/modules/consent-purposes/schema.ts +46 -0
- package/src/modules/consent-purposes/service.ts +423 -0
- package/src/modules/consent-purposes/starters.ts +32 -0
- package/src/modules/consent-purposes/tools.ts +44 -0
- package/src/modules/core.ts +21 -0
- package/src/modules/custom-fields/capabilities.ts +17 -0
- package/src/modules/custom-fields/events.ts +51 -0
- package/src/modules/custom-fields/index.ts +61 -0
- package/src/modules/custom-fields/repository.ts +225 -0
- package/src/modules/custom-fields/routes.ts +155 -0
- package/src/modules/custom-fields/schema.ts +61 -0
- package/src/modules/custom-fields/service.ts +439 -0
- package/src/modules/custom-fields/tools.ts +53 -0
- package/src/modules/custom-fields/values.ts +352 -0
- package/src/modules/custom-fields/wire.ts +32 -0
- package/src/modules/dashboard/repository.ts +4 -3
- package/src/modules/deals/index.ts +5 -2
- package/src/modules/deals/repository.ts +6 -106
- package/src/modules/deals/routes.ts +7 -0
- package/src/modules/deals/schema.ts +7 -15
- package/src/modules/deals/service.ts +92 -23
- package/src/modules/decisions/repository.ts +2 -0
- package/src/modules/email-domain-linker/index.ts +40 -0
- package/src/modules/email-domain-linker/routes.ts +40 -0
- package/src/modules/email-domain-linker/service.ts +122 -0
- package/src/modules/enquiries/events.ts +45 -0
- package/src/modules/enquiries/index.ts +50 -0
- package/src/modules/enquiries/repository.ts +164 -0
- package/src/modules/enquiries/routes.ts +172 -0
- package/src/modules/enquiries/schema.ts +59 -0
- package/src/modules/enquiries/service.ts +644 -0
- package/src/modules/enquiries/tools.ts +66 -0
- package/src/modules/eventCatalogs.ts +4 -0
- package/src/modules/forms/embed.ts +391 -44
- package/src/modules/forms/events.ts +30 -2
- package/src/modules/forms/fields.ts +102 -2
- package/src/modules/forms/index.ts +12 -1
- package/src/modules/forms/mapping.ts +183 -6
- package/src/modules/forms/publicRoutes.ts +43 -1
- package/src/modules/forms/repository.ts +162 -1
- package/src/modules/forms/routes.ts +212 -2
- package/src/modules/forms/schema.ts +166 -4
- package/src/modules/forms/service.ts +565 -41
- package/src/modules/forms/submission.ts +718 -44
- package/src/modules/import-export/drafts.ts +20 -1
- package/src/modules/import-export/exportRows.ts +21 -5
- package/src/modules/import-export/plan.ts +47 -2
- package/src/modules/import-export/presets.ts +10 -0
- package/src/modules/import-export/repository.ts +73 -8
- package/src/modules/import-export/routes.ts +4 -0
- package/src/modules/import-export/schema.ts +11 -0
- package/src/modules/import-export/service.ts +28 -2
- package/src/modules/import-export/streams.ts +3 -1
- package/src/modules/import-export/tools.ts +10 -0
- package/src/modules/import-export/validation.ts +28 -0
- package/src/modules/import-export/writes.ts +70 -5
- package/src/modules/lists/events.ts +41 -0
- package/src/modules/lists/index.ts +41 -0
- package/src/modules/lists/repository.ts +343 -0
- package/src/modules/lists/routes.ts +255 -0
- package/src/modules/lists/schema.ts +95 -0
- package/src/modules/lists/service.ts +505 -0
- package/src/modules/lists/tools.ts +128 -0
- package/src/modules/mcp/index.ts +5 -0
- package/src/modules/opportunities/index.ts +3 -1
- package/src/modules/opportunities/repository.ts +11 -0
- package/src/modules/opportunities/routes.ts +13 -0
- package/src/modules/opportunities/schema.ts +7 -1
- package/src/modules/opportunities/service.ts +188 -22
- package/src/modules/opportunities/tools.ts +2 -0
- package/src/modules/partnerships/index.ts +3 -1
- package/src/modules/partnerships/repository.ts +6 -117
- package/src/modules/partnerships/routes.ts +7 -0
- package/src/modules/partnerships/schema.ts +7 -14
- package/src/modules/partnerships/service.ts +93 -22
- package/src/modules/people/consentHydration.ts +167 -0
- package/src/modules/people/index.ts +3 -1
- package/src/modules/people/personConsentWrites.ts +177 -0
- package/src/modules/people/repository.ts +31 -0
- package/src/modules/people/routes.ts +127 -18
- package/src/modules/people/schema.ts +109 -3
- package/src/modules/people/service.ts +205 -39
- package/src/modules/people/tools.ts +5 -1
- package/src/modules/personLinks.ts +278 -0
- package/src/modules/positions/routes.ts +4 -2
- package/src/modules/raises/index.ts +3 -1
- package/src/modules/raises/repository.ts +6 -107
- package/src/modules/raises/routes.ts +7 -0
- package/src/modules/raises/schema.ts +7 -14
- package/src/modules/raises/service.ts +91 -20
- package/src/modules/recordTargets.ts +2 -0
- package/src/modules/references.ts +43 -4
- package/src/modules/sample-data/fixture.ts +690 -0
- package/src/modules/sample-data/index.ts +51 -0
- package/src/modules/sample-data/routes.ts +50 -0
- package/src/modules/sample-data/service.ts +679 -0
- package/src/modules/sample-data/tools.ts +32 -0
- package/src/modules/search/index.ts +2 -1
- package/src/modules/search/repository.ts +33 -1
- package/src/modules/search/service.ts +7 -5
- package/src/modules/smtp-email/index.ts +8 -1
- package/src/modules/stagedRecords.ts +18 -3
- package/src/modules/webhooks/payloads.ts +20 -2
- package/src/modules/workspace/repository.ts +12 -0
- package/src/modules/workspace/service.ts +27 -1
- package/src/modules/workspace/starters.ts +5 -0
- package/src/runtime/events.ts +1 -0
- package/src/schema/index.ts +4 -0
- package/src/testing/database.ts +97 -11
|
@@ -148,6 +148,118 @@
|
|
|
148
148
|
"when": 1787447911296,
|
|
149
149
|
"tag": "0020_early_nemesis",
|
|
150
150
|
"breakpoints": true
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"idx": 21,
|
|
154
|
+
"version": "7",
|
|
155
|
+
"when": 1787527717966,
|
|
156
|
+
"tag": "0021_certain_maggott",
|
|
157
|
+
"breakpoints": true
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"idx": 22,
|
|
161
|
+
"version": "7",
|
|
162
|
+
"when": 1787626585359,
|
|
163
|
+
"tag": "0022_stormy_manta",
|
|
164
|
+
"breakpoints": true
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"idx": 23,
|
|
168
|
+
"version": "7",
|
|
169
|
+
"when": 1787651539093,
|
|
170
|
+
"tag": "0023_funny_maddog",
|
|
171
|
+
"breakpoints": true
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"idx": 24,
|
|
175
|
+
"version": "7",
|
|
176
|
+
"when": 1787978002874,
|
|
177
|
+
"tag": "0024_third_king_cobra",
|
|
178
|
+
"breakpoints": true
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"idx": 25,
|
|
182
|
+
"version": "7",
|
|
183
|
+
"when": 1787979321712,
|
|
184
|
+
"tag": "0025_worthless_chimera",
|
|
185
|
+
"breakpoints": true
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"idx": 26,
|
|
189
|
+
"version": "7",
|
|
190
|
+
"when": 1787981859874,
|
|
191
|
+
"tag": "0026_late_aqueduct",
|
|
192
|
+
"breakpoints": true
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"idx": 27,
|
|
196
|
+
"version": "7",
|
|
197
|
+
"when": 1788007470077,
|
|
198
|
+
"tag": "0027_brainy_silver_sable",
|
|
199
|
+
"breakpoints": true
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"idx": 28,
|
|
203
|
+
"version": "7",
|
|
204
|
+
"when": 1788045423814,
|
|
205
|
+
"tag": "0028_freezing_scrambler",
|
|
206
|
+
"breakpoints": true
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"idx": 29,
|
|
210
|
+
"version": "7",
|
|
211
|
+
"when": 1788067713235,
|
|
212
|
+
"tag": "0029_custom_fields",
|
|
213
|
+
"breakpoints": true
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"idx": 30,
|
|
217
|
+
"version": "7",
|
|
218
|
+
"when": 1788089808149,
|
|
219
|
+
"tag": "0030_enquiries",
|
|
220
|
+
"breakpoints": true
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"idx": 31,
|
|
224
|
+
"version": "7",
|
|
225
|
+
"when": 1788128702292,
|
|
226
|
+
"tag": "0031_consent",
|
|
227
|
+
"breakpoints": true
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"idx": 32,
|
|
231
|
+
"version": "7",
|
|
232
|
+
"when": 1788133056653,
|
|
233
|
+
"tag": "0032_form_field_statement",
|
|
234
|
+
"breakpoints": true
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"idx": 33,
|
|
238
|
+
"version": "7",
|
|
239
|
+
"when": 1788134204561,
|
|
240
|
+
"tag": "0033_form_field_consent_purpose_ids",
|
|
241
|
+
"breakpoints": true
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"idx": 34,
|
|
245
|
+
"version": "7",
|
|
246
|
+
"when": 1788134239537,
|
|
247
|
+
"tag": "0034_drop_form_field_consent_purpose_id",
|
|
248
|
+
"breakpoints": true
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"idx": 35,
|
|
252
|
+
"version": "7",
|
|
253
|
+
"when": 1788146179776,
|
|
254
|
+
"tag": "0035_form_field_consent_purpose_labels",
|
|
255
|
+
"breakpoints": true
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"idx": 36,
|
|
259
|
+
"version": "7",
|
|
260
|
+
"when": 1788146891073,
|
|
261
|
+
"tag": "0036_form_field_notice_type",
|
|
262
|
+
"breakpoints": true
|
|
151
263
|
}
|
|
152
264
|
]
|
|
153
265
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kelpie/server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "The Kelpie service as a library: module runtime, core CRM modules, REST API, MCP surface, and the shared migration pipeline.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"kelpie",
|
|
@@ -52,11 +52,12 @@
|
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"@hono/node-server": "^2.0.12",
|
|
55
|
-
"@kelpie/schemas": "^0.
|
|
55
|
+
"@kelpie/schemas": "^0.9.0",
|
|
56
56
|
"@node-rs/argon2": "^2.0.2",
|
|
57
57
|
"drizzle-orm": "^0.45.2",
|
|
58
58
|
"emittery": "^2.0.0",
|
|
59
59
|
"hono": "^4.12.32",
|
|
60
|
+
"mailgen": "^2.0.36",
|
|
60
61
|
"nodemailer": "^9.0.5",
|
|
61
62
|
"postgres": "^3.4.9",
|
|
62
63
|
"ulid": "^3.0.2",
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consumer email hosts, checked case-insensitively.
|
|
3
|
+
*
|
|
4
|
+
* The email-domain listener refuses to auto-link a Person to a Company on any
|
|
5
|
+
* domain in this list. A consumer address belongs to no one company, and a
|
|
6
|
+
* Company row entered by mistake against, say, `gmail.com` would otherwise
|
|
7
|
+
* auto-attach every consumer address after.
|
|
8
|
+
*
|
|
9
|
+
* A starter list of the common providers. Add locale variants and less common
|
|
10
|
+
* hosts as the need arrives.
|
|
11
|
+
*/
|
|
12
|
+
const CONSUMER_EMAIL_DOMAINS: ReadonlySet<string> = new Set([
|
|
13
|
+
'gmail.com',
|
|
14
|
+
'googlemail.com',
|
|
15
|
+
'yahoo.com',
|
|
16
|
+
'yahoo.co.uk',
|
|
17
|
+
'yahoo.co.jp',
|
|
18
|
+
'yahoo.fr',
|
|
19
|
+
'yahoo.de',
|
|
20
|
+
'yahoo.ca',
|
|
21
|
+
'yahoo.com.au',
|
|
22
|
+
'ymail.com',
|
|
23
|
+
'rocketmail.com',
|
|
24
|
+
'hotmail.com',
|
|
25
|
+
'hotmail.co.uk',
|
|
26
|
+
'hotmail.fr',
|
|
27
|
+
'hotmail.de',
|
|
28
|
+
'hotmail.it',
|
|
29
|
+
'hotmail.es',
|
|
30
|
+
'outlook.com',
|
|
31
|
+
'outlook.co.uk',
|
|
32
|
+
'live.com',
|
|
33
|
+
'live.co.uk',
|
|
34
|
+
'msn.com',
|
|
35
|
+
'aol.com',
|
|
36
|
+
'aim.com',
|
|
37
|
+
'icloud.com',
|
|
38
|
+
'me.com',
|
|
39
|
+
'mac.com',
|
|
40
|
+
'protonmail.com',
|
|
41
|
+
'proton.me',
|
|
42
|
+
'pm.me',
|
|
43
|
+
'gmx.com',
|
|
44
|
+
'gmx.net',
|
|
45
|
+
'gmx.de',
|
|
46
|
+
'mail.com',
|
|
47
|
+
'fastmail.com',
|
|
48
|
+
'fastmail.fm',
|
|
49
|
+
'zoho.com',
|
|
50
|
+
'yandex.com',
|
|
51
|
+
'yandex.ru',
|
|
52
|
+
'tutanota.com',
|
|
53
|
+
'tuta.io',
|
|
54
|
+
'qq.com',
|
|
55
|
+
'163.com',
|
|
56
|
+
'126.com',
|
|
57
|
+
'naver.com',
|
|
58
|
+
])
|
|
59
|
+
|
|
60
|
+
export function isConsumerEmailDomain(domain: string): boolean {
|
|
61
|
+
return CONSUMER_EMAIL_DOMAINS.has(domain.trim().toLowerCase())
|
|
62
|
+
}
|
package/src/lib/email.ts
CHANGED
|
@@ -21,7 +21,14 @@ import type { Logger } from './logger.ts'
|
|
|
21
21
|
export interface EmailMessage {
|
|
22
22
|
readonly to: string
|
|
23
23
|
readonly subject: string
|
|
24
|
+
/** The plaintext part. Always present: text-only clients and logs read it. */
|
|
24
25
|
readonly body: string
|
|
26
|
+
/**
|
|
27
|
+
* The HTML alternative, rendered by `lib/emailContent.ts`. Optional so
|
|
28
|
+
* provider modules written against the older port keep compiling and a
|
|
29
|
+
* plain-text message stays expressible.
|
|
30
|
+
*/
|
|
31
|
+
readonly html?: string
|
|
25
32
|
}
|
|
26
33
|
|
|
27
34
|
export interface EmailSender {
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import Mailgen from 'mailgen'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Renders transactional mail bodies: a plaintext part and an HTML part from
|
|
5
|
+
* one description of the message.
|
|
6
|
+
*
|
|
7
|
+
* Email clients need table-based, inline-styled HTML; mailgen owns that
|
|
8
|
+
* problem so Kelpie does not. The plaintext part is built here by hand rather
|
|
9
|
+
* than by mailgen's plaintext generator, because that generator pads lines
|
|
10
|
+
* with trailing whitespace and the plaintext body is the part tests and
|
|
11
|
+
* text-only clients read token links out of. The wording of the two parts
|
|
12
|
+
* comes from the same fields, so they cannot drift.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** A link the message asks the reader to follow, rendered as a button in HTML. */
|
|
16
|
+
export interface EmailAction {
|
|
17
|
+
readonly instructions: string
|
|
18
|
+
readonly buttonText: string
|
|
19
|
+
readonly link: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface EmailContent {
|
|
23
|
+
readonly intro?: string
|
|
24
|
+
readonly action?: EmailAction
|
|
25
|
+
readonly outro?: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface RenderedEmail {
|
|
29
|
+
readonly text: string
|
|
30
|
+
readonly html: string
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Fixed so rendering is deterministic. Mailgen's default footer stamps the
|
|
35
|
+
* current year, which the sender has no claim to: the workspace, not Kelpie,
|
|
36
|
+
* owns the relationship with the recipient.
|
|
37
|
+
*/
|
|
38
|
+
const FOOTER_LINE = 'Sent by Kelpie.'
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Renders one transactional message. `appBaseUrl` becomes the link on the
|
|
42
|
+
* product name in the header and footer, so every part of the mail points at
|
|
43
|
+
* the deployment that sent it.
|
|
44
|
+
*/
|
|
45
|
+
export function renderEmail(content: EmailContent, appBaseUrl: string): RenderedEmail {
|
|
46
|
+
const generator = new Mailgen({
|
|
47
|
+
theme: 'default',
|
|
48
|
+
product: {
|
|
49
|
+
name: 'Kelpie',
|
|
50
|
+
link: appBaseUrl,
|
|
51
|
+
copyright: FOOTER_LINE,
|
|
52
|
+
},
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
const html: string = generator.generate({
|
|
56
|
+
body: {
|
|
57
|
+
greeting: false,
|
|
58
|
+
signature: false,
|
|
59
|
+
...(content.intro === undefined ? {} : { intro: content.intro }),
|
|
60
|
+
...(content.action === undefined
|
|
61
|
+
? {}
|
|
62
|
+
: {
|
|
63
|
+
action: {
|
|
64
|
+
instructions: content.action.instructions,
|
|
65
|
+
button: {
|
|
66
|
+
text: content.action.buttonText,
|
|
67
|
+
link: content.action.link,
|
|
68
|
+
fallback: true,
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
}),
|
|
72
|
+
...(content.outro === undefined ? {} : { outro: content.outro }),
|
|
73
|
+
},
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
const paragraphs: string[] = []
|
|
77
|
+
|
|
78
|
+
if (content.intro !== undefined) {
|
|
79
|
+
paragraphs.push(content.intro)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (content.action !== undefined) {
|
|
83
|
+
paragraphs.push(`${content.action.instructions}\n\n${content.action.link}`)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (content.outro !== undefined) {
|
|
87
|
+
paragraphs.push(content.outro)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return { text: paragraphs.join('\n\n'), html }
|
|
91
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { UNIQUE_VIOLATION, postgresErrorCode } from './database.ts'
|
|
2
|
+
import type { IdFactory } from './ids.ts'
|
|
3
|
+
import { isConsumerEmailDomain } from './consumerEmailDomains.ts'
|
|
4
|
+
import type { BufferedEvents, Transaction } from '../runtime/transaction.ts'
|
|
5
|
+
import type { ActivityRecorder, SystemActor } from '../modules/activities/recorder.ts'
|
|
6
|
+
import { describeLink } from '../modules/activities/wording.ts'
|
|
7
|
+
import * as companyRepository from '../modules/companies/repository.ts'
|
|
8
|
+
import type { CompanyRecord } from '../modules/companies/repository.ts'
|
|
9
|
+
import * as peopleRepository from '../modules/people/repository.ts'
|
|
10
|
+
import type { PersonRecord } from '../modules/people/repository.ts'
|
|
11
|
+
import '../modules/positions/events.ts'
|
|
12
|
+
import * as positionRepository from '../modules/positions/repository.ts'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Auto-link a Person to a workspace Company whose domain matches the person's
|
|
16
|
+
* email. Runs inside the caller's transaction, so the new Position is present
|
|
17
|
+
* in the response the API returns for the same request.
|
|
18
|
+
*
|
|
19
|
+
* Skips: no email, consumer email host (`isConsumerEmailDomain`), no Company
|
|
20
|
+
* on that domain in the workspace, or a Position already linking the two. A
|
|
21
|
+
* unique-key race with a concurrent linker is absorbed.
|
|
22
|
+
*
|
|
23
|
+
* The created Position carries an empty title. `positions.title` is `NOT NULL`,
|
|
24
|
+
* and empty reads honestly as "the domain matched; no title yet".
|
|
25
|
+
*
|
|
26
|
+
* Split from the people service so the layering (people below positions) is
|
|
27
|
+
* carried by imports only: this helper depends on both repositories, and the
|
|
28
|
+
* people service depends on this helper. The `positions` module still owns the
|
|
29
|
+
* event catalogue for the emitted event.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/** What the timeline calls this side effect. */
|
|
33
|
+
const LINKER_ACTOR: SystemActor = { kind: 'system', label: 'Email domain match' }
|
|
34
|
+
|
|
35
|
+
export interface AutoLinkDependencies {
|
|
36
|
+
readonly createId: IdFactory
|
|
37
|
+
readonly now: () => Date
|
|
38
|
+
readonly recordActivity: ActivityRecorder
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Considers `person` for a matching Company in `workspaceId` and inserts a
|
|
43
|
+
* titleless Position if none links them yet.
|
|
44
|
+
*
|
|
45
|
+
* @returns The new Position's id, or `undefined` if nothing was written.
|
|
46
|
+
*/
|
|
47
|
+
export async function autoLinkPersonByEmailDomain(
|
|
48
|
+
tx: Transaction,
|
|
49
|
+
events: BufferedEvents,
|
|
50
|
+
workspaceId: string,
|
|
51
|
+
person: PersonRecord,
|
|
52
|
+
dependencies: AutoLinkDependencies,
|
|
53
|
+
): Promise<string | undefined> {
|
|
54
|
+
if (person.email === null) {
|
|
55
|
+
return undefined
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const at = person.email.indexOf('@')
|
|
59
|
+
if (at < 0) {
|
|
60
|
+
return undefined
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const domain = person.email.slice(at + 1)
|
|
64
|
+
if (domain.length === 0 || isConsumerEmailDomain(domain)) {
|
|
65
|
+
return undefined
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const company = await companyRepository.findCompanyByDomain(tx, workspaceId, domain)
|
|
69
|
+
if (company === undefined) {
|
|
70
|
+
return undefined
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const held = await positionRepository.listPositionsAt(tx, workspaceId, person.id, company.id)
|
|
74
|
+
if (held.length > 0) {
|
|
75
|
+
return undefined
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return insertStubPosition(tx, events, workspaceId, person, company, dependencies)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Sweeps every Person in `workspaceId` whose email domain matches `company`'s
|
|
83
|
+
* domain and stubs a Position where none exists yet. Called when a Company is
|
|
84
|
+
* created or its domain is set.
|
|
85
|
+
*
|
|
86
|
+
* @returns The ids of every Position this call inserted.
|
|
87
|
+
*/
|
|
88
|
+
export async function autoLinkCompanyByDomain(
|
|
89
|
+
tx: Transaction,
|
|
90
|
+
events: BufferedEvents,
|
|
91
|
+
workspaceId: string,
|
|
92
|
+
company: CompanyRecord,
|
|
93
|
+
dependencies: AutoLinkDependencies,
|
|
94
|
+
): Promise<readonly string[]> {
|
|
95
|
+
if (company.domain === null || company.domain.length === 0) {
|
|
96
|
+
return []
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (isConsumerEmailDomain(company.domain)) {
|
|
100
|
+
return []
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const matches = await peopleRepository.findPeopleByEmailDomain(tx, workspaceId, company.domain)
|
|
104
|
+
const created: string[] = []
|
|
105
|
+
|
|
106
|
+
for (const person of matches) {
|
|
107
|
+
const held = await positionRepository.listPositionsAt(tx, workspaceId, person.id, company.id)
|
|
108
|
+
if (held.length > 0) {
|
|
109
|
+
continue
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const id = await insertStubPosition(tx, events, workspaceId, person, company, dependencies)
|
|
113
|
+
if (id !== undefined) {
|
|
114
|
+
created.push(id)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return created
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* The write half. Wraps the unique-constraint race the two entry points share:
|
|
123
|
+
* a concurrent linker that beat us to `(personId, companyId, '')` is treated
|
|
124
|
+
* as success (the link is there, either way).
|
|
125
|
+
*/
|
|
126
|
+
async function insertStubPosition(
|
|
127
|
+
tx: Transaction,
|
|
128
|
+
events: BufferedEvents,
|
|
129
|
+
workspaceId: string,
|
|
130
|
+
person: PersonRecord,
|
|
131
|
+
company: CompanyRecord,
|
|
132
|
+
dependencies: AutoLinkDependencies,
|
|
133
|
+
): Promise<string | undefined> {
|
|
134
|
+
try {
|
|
135
|
+
const created = await positionRepository.insertPosition(tx, {
|
|
136
|
+
id: dependencies.createId('position'),
|
|
137
|
+
workspaceId,
|
|
138
|
+
personId: person.id,
|
|
139
|
+
companyId: company.id,
|
|
140
|
+
title: '',
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
await dependencies.recordActivity(tx, workspaceId, LINKER_ACTOR, {
|
|
144
|
+
targetType: 'person',
|
|
145
|
+
targetId: person.id,
|
|
146
|
+
kind: 'linked',
|
|
147
|
+
...describeLink('company', company.name),
|
|
148
|
+
})
|
|
149
|
+
await dependencies.recordActivity(tx, workspaceId, LINKER_ACTOR, {
|
|
150
|
+
targetType: 'company',
|
|
151
|
+
targetId: company.id,
|
|
152
|
+
kind: 'linked',
|
|
153
|
+
...describeLink('person', person.name),
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
events.emit('positions.position.created', { type: 'position', id: created.id }, {})
|
|
157
|
+
|
|
158
|
+
return created.id
|
|
159
|
+
} catch (error: unknown) {
|
|
160
|
+
if (postgresErrorCode(error) === UNIQUE_VIOLATION) {
|
|
161
|
+
return undefined
|
|
162
|
+
}
|
|
163
|
+
throw error
|
|
164
|
+
}
|
|
165
|
+
}
|
package/src/lib/ids.ts
CHANGED
|
@@ -19,6 +19,7 @@ export const idPrefixes = {
|
|
|
19
19
|
position: 'pos',
|
|
20
20
|
pipelineStage: 'stage',
|
|
21
21
|
deal: 'deal',
|
|
22
|
+
enquiry: 'enq',
|
|
22
23
|
opportunity: 'opp',
|
|
23
24
|
partnership: 'prt',
|
|
24
25
|
raise: 'rse',
|
|
@@ -28,7 +29,19 @@ export const idPrefixes = {
|
|
|
28
29
|
decision: 'dec',
|
|
29
30
|
note: 'note',
|
|
30
31
|
activity: 'act',
|
|
32
|
+
list: 'list',
|
|
33
|
+
listMember: 'lmem',
|
|
34
|
+
/**
|
|
35
|
+
* Never returns over the wire either: `person_links` has no routes of its
|
|
36
|
+
* own — the link surfaces as a `person_ids` array on each pipeline record —
|
|
37
|
+
* so the prefix is not in `api.md`'s public prefix table, matching `idem`
|
|
38
|
+
* and `rl`. It still comes from this factory rather than a bare ULID call,
|
|
39
|
+
* so every id in the database is generated the same, injectable way.
|
|
40
|
+
*/
|
|
41
|
+
personLink: 'plink',
|
|
31
42
|
handbookPage: 'hb',
|
|
43
|
+
customFieldDefinition: 'fld',
|
|
44
|
+
consentPurpose: 'cnp',
|
|
32
45
|
form: 'form',
|
|
33
46
|
formField: 'ff',
|
|
34
47
|
formSubmission: 'sub',
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { and, eq, inArray, or, sql } from 'drizzle-orm'
|
|
2
2
|
import type { SQL } from 'drizzle-orm'
|
|
3
3
|
|
|
4
|
+
import type { PipelineKind } from '@kelpie/schemas'
|
|
5
|
+
|
|
4
6
|
import { keysetCondition, orderByWindow, timestampSort } from '../../lib/pagination.ts'
|
|
5
7
|
import type { ListWindow, SortableFields } from '../../lib/pagination.ts'
|
|
6
8
|
import type { Queryable } from '../../runtime/transaction.ts'
|
|
7
|
-
import {
|
|
9
|
+
import { deals } from '../deals/schema.ts'
|
|
10
|
+
import { enquiries } from '../enquiries/schema.ts'
|
|
8
11
|
import { opportunities } from '../opportunities/schema.ts'
|
|
9
|
-
import {
|
|
12
|
+
import { partnerships } from '../partnerships/schema.ts'
|
|
13
|
+
import * as personLinks from '../personLinks.ts'
|
|
10
14
|
import type { RecordTargetType } from '../recordTargets.ts'
|
|
11
15
|
import { activities } from './schema.ts'
|
|
12
16
|
|
|
@@ -66,7 +70,7 @@ export async function listRolledUpTargets(
|
|
|
66
70
|
targetId: string,
|
|
67
71
|
): Promise<ActivityTarget[]> {
|
|
68
72
|
if (targetType === 'company') {
|
|
69
|
-
const [dealRows, opportunityRows, partnershipRows] = await Promise.all([
|
|
73
|
+
const [dealRows, opportunityRows, partnershipRows, enquiryRows] = await Promise.all([
|
|
70
74
|
db
|
|
71
75
|
.select({ id: deals.id })
|
|
72
76
|
.from(deals)
|
|
@@ -81,36 +85,31 @@ export async function listRolledUpTargets(
|
|
|
81
85
|
.select({ id: partnerships.id })
|
|
82
86
|
.from(partnerships)
|
|
83
87
|
.where(and(eq(partnerships.workspaceId, workspaceId), eq(partnerships.companyId, targetId))),
|
|
88
|
+
db
|
|
89
|
+
.select({ id: enquiries.id })
|
|
90
|
+
.from(enquiries)
|
|
91
|
+
.where(and(eq(enquiries.workspaceId, workspaceId), eq(enquiries.companyId, targetId))),
|
|
84
92
|
])
|
|
85
93
|
|
|
86
94
|
return [
|
|
87
95
|
...dealRows.map((row) => ({ targetType: 'deal' as const, targetId: row.id })),
|
|
88
96
|
...opportunityRows.map((row) => ({ targetType: 'opportunity' as const, targetId: row.id })),
|
|
89
97
|
...partnershipRows.map((row) => ({ targetType: 'partnership' as const, targetId: row.id })),
|
|
98
|
+
...enquiryRows.map((row) => ({ targetType: 'enquiry' as const, targetId: row.id })),
|
|
90
99
|
]
|
|
91
100
|
}
|
|
92
101
|
|
|
93
102
|
if (targetType === 'person') {
|
|
94
|
-
//
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
.innerJoin(partnershipPeople, eq(partnershipPeople.partnershipId, partnerships.id))
|
|
105
|
-
.where(
|
|
106
|
-
and(eq(partnerships.workspaceId, workspaceId), eq(partnershipPeople.personId, targetId)),
|
|
107
|
-
),
|
|
108
|
-
])
|
|
109
|
-
|
|
110
|
-
return [
|
|
111
|
-
...dealRows.map((row) => ({ targetType: 'deal' as const, targetId: row.id })),
|
|
112
|
-
...partnershipRows.map((row) => ({ targetType: 'partnership' as const, targetId: row.id })),
|
|
113
|
-
]
|
|
103
|
+
// person_links carries all four pipeline kinds in one table, so a person's
|
|
104
|
+
// roll-up is one read regardless of how many pipelines they touch. The
|
|
105
|
+
// shared helper's `PipelineKind` narrows to the check-constraint set, which
|
|
106
|
+
// is exactly what an ActivityTarget expects to receive.
|
|
107
|
+
const links = await personLinks.listTargetsOfPerson(db, workspaceId, targetId)
|
|
108
|
+
|
|
109
|
+
return links.map((link) => ({
|
|
110
|
+
targetType: link.targetType satisfies PipelineKind as RecordTargetType,
|
|
111
|
+
targetId: link.targetId,
|
|
112
|
+
}))
|
|
114
113
|
}
|
|
115
114
|
|
|
116
115
|
return []
|
|
@@ -147,6 +147,24 @@ export function describeStageChange(fromStage: string, toStage: string): Activit
|
|
|
147
147
|
return { action: `moved to ${toStage}`, detail: `${fromStage} → ${toStage}` }
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
+
/**
|
|
151
|
+
* `converted to Deal`, with the deal's name beneath it. Files on the enquiry;
|
|
152
|
+
* the deal's own timeline gets `created Deal from Enquiry` via
|
|
153
|
+
* `describeCreationFrom`.
|
|
154
|
+
*/
|
|
155
|
+
export function describeConversion(objectLabel: string, name: string): ActivityWording {
|
|
156
|
+
return { action: `converted to ${objectLabel}`, detail: name }
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* `created Deal from Enquiry`, with the source record's name beneath it. Mirror
|
|
161
|
+
* of `describeCreationVia` but the source is another CRM record rather than a
|
|
162
|
+
* form or import file.
|
|
163
|
+
*/
|
|
164
|
+
export function describeCreationFrom(objectLabel: string, sourceLabel: string, sourceName: string): ActivityWording {
|
|
165
|
+
return { action: `created ${objectLabel} from ${sourceLabel}`, detail: sourceName }
|
|
166
|
+
}
|
|
167
|
+
|
|
150
168
|
/** How much of a note's body the timeline repeats before trailing off. */
|
|
151
169
|
const NOTE_EXCERPT_LENGTH = 120
|
|
152
170
|
|
|
@@ -305,6 +305,69 @@ Optionally save as a Note.`,
|
|
|
305
305
|
Append a Note, propose Plan items, update summary/whyWin/risks only with clear evidence, extract Decisions.`,
|
|
306
306
|
}),
|
|
307
307
|
|
|
308
|
+
// Enquiry
|
|
309
|
+
task({
|
|
310
|
+
id: 'enquiry.triage',
|
|
311
|
+
label: 'Triage enquiry',
|
|
312
|
+
description: 'Recommend pursue, nurture, or close.',
|
|
313
|
+
targetTypes: ['enquiry'],
|
|
314
|
+
placement: 'primary',
|
|
315
|
+
handbookSlugs: ['ideal-customer-profile', 'product', 'agent-faq'],
|
|
316
|
+
instructions: `Assess this Enquiry against Ideal customer profile and Product. Recommend one of:
|
|
317
|
+
- pursue (convert to Deal)
|
|
318
|
+
- nurture (keep in In progress, add a follow-up Plan item)
|
|
319
|
+
- close (move to Closed, note the reason).
|
|
320
|
+
Save the recommendation and rationale as a Note. Do not change the stage or convert without human confirmation.`,
|
|
321
|
+
}),
|
|
322
|
+
task({
|
|
323
|
+
id: 'enquiry.propose_plan',
|
|
324
|
+
label: 'Propose Plan',
|
|
325
|
+
description: 'Dated follow-up items.',
|
|
326
|
+
targetTypes: ['enquiry'],
|
|
327
|
+
placement: 'primary',
|
|
328
|
+
handbookSlugs: ['agent-faq'],
|
|
329
|
+
instructions: `Propose dated Plan items for this Enquiry (a first response, a follow-up, a review).
|
|
330
|
+
Prefer concrete actions over vague reminders.`,
|
|
331
|
+
}),
|
|
332
|
+
task({
|
|
333
|
+
id: 'enquiry.refresh_summary',
|
|
334
|
+
label: 'Refresh enquiry summary',
|
|
335
|
+
description: 'Rewrite summary from evidence.',
|
|
336
|
+
targetTypes: ['enquiry'],
|
|
337
|
+
placement: 'primary',
|
|
338
|
+
handbookSlugs: ['agent-faq'],
|
|
339
|
+
instructions: `Rewrite the Enquiry summary from source, stage, notes, and linked Company.`,
|
|
340
|
+
}),
|
|
341
|
+
task({
|
|
342
|
+
id: 'enquiry.draft_reply',
|
|
343
|
+
label: 'Draft reply',
|
|
344
|
+
description: 'First-response email in Voice.',
|
|
345
|
+
targetTypes: ['enquiry'],
|
|
346
|
+
placement: 'primary',
|
|
347
|
+
handbookSlugs: ['voice-and-tone', 'product', 'agent-faq'],
|
|
348
|
+
instructions: `Draft a first response to this Enquiry in Voice. Reference the Product handbook only where the
|
|
349
|
+
Enquiry's summary or notes signal a match. Save the draft as a Note. Do not send.`,
|
|
350
|
+
}),
|
|
351
|
+
task({
|
|
352
|
+
id: 'enquiry.capture_decision',
|
|
353
|
+
label: 'Capture decision',
|
|
354
|
+
description: 'Log what was decided about this enquiry.',
|
|
355
|
+
targetTypes: ['enquiry'],
|
|
356
|
+
placement: 'overflow',
|
|
357
|
+
handbookSlugs: ['agent-faq'],
|
|
358
|
+
instructions: `Create a Decision linked to this Enquiry from recent commitments or the human's instruction.`,
|
|
359
|
+
}),
|
|
360
|
+
task({
|
|
361
|
+
id: 'enquiry.log_transcript',
|
|
362
|
+
label: 'Log transcript',
|
|
363
|
+
description: 'Parse call notes into CRM updates.',
|
|
364
|
+
targetTypes: ['enquiry'],
|
|
365
|
+
placement: 'overflow',
|
|
366
|
+
handbookSlugs: ['agent-faq'],
|
|
367
|
+
instructions: `The human will paste a call or chat transcript after this prompt.
|
|
368
|
+
Append a Note, propose Plan items, update the summary only with clear evidence, extract Decisions.`,
|
|
369
|
+
}),
|
|
370
|
+
|
|
308
371
|
// Opportunity
|
|
309
372
|
task({
|
|
310
373
|
id: 'opportunity.propose_plan',
|