@elevasis/core 0.7.0 → 0.8.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.
Files changed (473) hide show
  1. package/package.json +3 -3
  2. package/src/README.md +41 -41
  3. package/src/__tests__/publish.test.ts +18 -18
  4. package/src/__tests__/{template-foundations-compatibility.test.ts → template-core-compatibility.test.ts} +99 -99
  5. package/src/_gen/__tests__/__snapshots__/contracts.md.snap +1135 -1131
  6. package/src/_gen/__tests__/scaffold-contracts.test.ts +53 -53
  7. package/src/_gen/scaffold-contracts.ts +45 -45
  8. package/src/auth/multi-tenancy/credentials/README.md +38 -38
  9. package/src/auth/multi-tenancy/credentials/index.ts +6 -6
  10. package/src/auth/multi-tenancy/credentials/server/encryption.ts +39 -39
  11. package/src/auth/multi-tenancy/credentials/server/service.ts +60 -60
  12. package/src/auth/multi-tenancy/index.ts +17 -17
  13. package/src/auth/multi-tenancy/invitations/api-schemas.ts +107 -107
  14. package/src/auth/multi-tenancy/invitations/index.ts +37 -37
  15. package/src/auth/multi-tenancy/invitations/invitation.ts +86 -86
  16. package/src/auth/multi-tenancy/invitations/server/index.ts +25 -25
  17. package/src/auth/multi-tenancy/invitations/server/transforms.ts +24 -24
  18. package/src/auth/multi-tenancy/invitations/server/workos.ts +24 -24
  19. package/src/auth/multi-tenancy/invitations/supabase.ts +50 -50
  20. package/src/auth/multi-tenancy/memberships/api-schemas.ts +126 -126
  21. package/src/auth/multi-tenancy/memberships/index.ts +21 -21
  22. package/src/auth/multi-tenancy/memberships/membership.ts +138 -138
  23. package/src/auth/multi-tenancy/memberships/server/index.ts +15 -15
  24. package/src/auth/multi-tenancy/memberships/server/transforms.ts +32 -32
  25. package/src/auth/multi-tenancy/memberships/server/workos.ts +21 -21
  26. package/src/auth/multi-tenancy/memberships/supabase.ts +46 -46
  27. package/src/auth/multi-tenancy/organizations/api-schemas.ts +128 -128
  28. package/src/auth/multi-tenancy/organizations/index.ts +23 -23
  29. package/src/auth/multi-tenancy/organizations/organization.ts +24 -24
  30. package/src/auth/multi-tenancy/organizations/server/index.ts +10 -10
  31. package/src/auth/multi-tenancy/organizations/server/transforms.ts +35 -35
  32. package/src/auth/multi-tenancy/organizations/server/workos.ts +20 -20
  33. package/src/auth/multi-tenancy/types.ts +83 -83
  34. package/src/auth/multi-tenancy/users/api-schemas.ts +194 -194
  35. package/src/auth/multi-tenancy/users/index.ts +27 -27
  36. package/src/auth/multi-tenancy/users/server/index.ts +19 -19
  37. package/src/auth/multi-tenancy/users/server/transforms.ts +21 -21
  38. package/src/auth/multi-tenancy/users/server/workos.ts +16 -16
  39. package/src/auth/multi-tenancy/users/user.ts +65 -65
  40. package/src/business/README.md +52 -52
  41. package/src/business/__tests__/entities-published.test.ts +33 -33
  42. package/src/business/acquisition/api-schemas.ts +759 -759
  43. package/src/business/acquisition/index.ts +109 -109
  44. package/src/business/acquisition/types.ts +402 -402
  45. package/src/business/base-entities.test.ts +481 -481
  46. package/src/business/base-entities.ts +241 -241
  47. package/src/business/entities-published.ts +24 -24
  48. package/src/business/index.ts +15 -15
  49. package/src/business/pdf/browser/pdfmake-browser.ts +229 -229
  50. package/src/business/pdf/index.ts +10 -10
  51. package/src/business/pdf/server/index.ts +21 -21
  52. package/src/business/pdf/server/themes/default.ts +8 -8
  53. package/src/business/pdf/server/themes/index.ts +9 -9
  54. package/src/business/pdf/server/themes/types.ts +8 -8
  55. package/src/business/pdf/types.ts +272 -272
  56. package/src/business/projects/index.ts +2 -1
  57. package/src/business/projects/sse-events.ts +21 -0
  58. package/src/business/projects/types.ts +89 -89
  59. package/src/business/sales/api-schemas.ts +75 -75
  60. package/src/business/seo/__tests__/linking.test.ts +549 -549
  61. package/src/business/seo/__tests__/types.test.ts +404 -404
  62. package/src/business/seo/index.ts +2 -2
  63. package/src/business/seo/linking.ts +281 -281
  64. package/src/business/seo/types.ts +199 -199
  65. package/src/commands/queue/index.ts +3 -3
  66. package/src/commands/queue/schemas.test.ts +593 -593
  67. package/src/commands/queue/schemas.ts +125 -125
  68. package/src/commands/queue/sse-events.ts +61 -61
  69. package/src/commands/queue/types/action.ts +52 -52
  70. package/src/commands/queue/types/checkpoint.ts +44 -44
  71. package/src/commands/queue/types/index.ts +7 -7
  72. package/src/commands/queue/types/task.ts +116 -116
  73. package/src/commands/queue/types.ts +14 -14
  74. package/src/content/distribution-metadata.ts +61 -61
  75. package/src/content/index.ts +10 -10
  76. package/src/deployments/index.ts +22 -22
  77. package/src/execution/core/__tests__/archived-logs.test.ts +72 -72
  78. package/src/execution/core/index.ts +11 -11
  79. package/src/execution/core/runner-types.ts +80 -80
  80. package/src/execution/core/server/environment.ts +31 -31
  81. package/src/execution/core/sse-executions.ts +119 -119
  82. package/src/execution/core/types.ts +29 -29
  83. package/src/execution/engine/__tests__/fixtures/test-agents.ts +4 -4
  84. package/src/execution/engine/__tests__/timeout.test.ts +565 -565
  85. package/src/execution/engine/agent/__tests__/errors.test.ts +508 -508
  86. package/src/execution/engine/agent/actions/__tests__/processor.test.ts +531 -531
  87. package/src/execution/engine/agent/actions/executor.ts +205 -205
  88. package/src/execution/engine/agent/actions/navigate-knowledge-executor.ts +230 -230
  89. package/src/execution/engine/agent/actions/processor.ts +116 -116
  90. package/src/execution/engine/agent/actions/types.ts +70 -70
  91. package/src/execution/engine/agent/core/agent.ts +810 -810
  92. package/src/execution/engine/agent/core/types.ts +155 -155
  93. package/src/execution/engine/agent/errors.ts +251 -251
  94. package/src/execution/engine/agent/index.ts +78 -78
  95. package/src/execution/engine/agent/knowledge-map/types.ts +106 -106
  96. package/src/execution/engine/agent/knowledge-map/utils.ts +101 -101
  97. package/src/execution/engine/agent/memory/__tests__/manager.test.ts +754 -754
  98. package/src/execution/engine/agent/memory/domains.ts +99 -99
  99. package/src/execution/engine/agent/memory/manager.ts +365 -365
  100. package/src/execution/engine/agent/memory/processor.ts +66 -66
  101. package/src/execution/engine/agent/memory/types.ts +90 -90
  102. package/src/execution/engine/agent/memory/utils.ts +134 -134
  103. package/src/execution/engine/agent/observability/logging.ts +467 -467
  104. package/src/execution/engine/agent/observability/types.ts +64 -64
  105. package/src/execution/engine/agent/reasoning/adapters/agent-adapter-helpers.ts +349 -349
  106. package/src/execution/engine/agent/reasoning/processor.ts +92 -92
  107. package/src/execution/engine/agent/reasoning/prompt-sections/base-actions.ts +134 -134
  108. package/src/execution/engine/agent/reasoning/prompt-sections/completion.ts +49 -49
  109. package/src/execution/engine/agent/reasoning/prompt-sections/knowledge-map.ts +93 -93
  110. package/src/execution/engine/agent/reasoning/prompt-sections/memory.ts +65 -65
  111. package/src/execution/engine/agent/reasoning/prompt-sections/tools.ts +44 -44
  112. package/src/execution/engine/agent/reasoning/request-builder.ts +169 -169
  113. package/src/execution/engine/agent/reasoning/types.ts +18 -18
  114. package/src/execution/engine/base/errors.ts +118 -118
  115. package/src/execution/engine/base/index.ts +2 -2
  116. package/src/execution/engine/base/logging.ts +31 -31
  117. package/src/execution/engine/base/serialization.ts +324 -324
  118. package/src/execution/engine/base/types.ts +126 -126
  119. package/src/execution/engine/base/utils.ts +41 -41
  120. package/src/execution/engine/index.ts +434 -434
  121. package/src/execution/engine/interface/index.ts +1 -1
  122. package/src/execution/engine/interface/types.ts +62 -62
  123. package/src/execution/engine/llm/__tests__/model-info.test.ts +50 -50
  124. package/src/execution/engine/llm/__tests__/model-validation.test.ts +321 -321
  125. package/src/execution/engine/llm/__tests__/response-schema-validator.test.ts +115 -115
  126. package/src/execution/engine/llm/adapters/__tests__/adapter-factory.test.ts +375 -375
  127. package/src/execution/engine/llm/adapters/__tests__/anthropic-adapter.test.ts +463 -463
  128. package/src/execution/engine/llm/adapters/__tests__/anthropic.integration.test.ts +177 -177
  129. package/src/execution/engine/llm/adapters/__tests__/google-adapter.test.ts +722 -722
  130. package/src/execution/engine/llm/adapters/__tests__/google.integration.test.ts +376 -376
  131. package/src/execution/engine/llm/adapters/__tests__/openai-adapter.test.ts +551 -551
  132. package/src/execution/engine/llm/adapters/__tests__/openrouter-adapter.test.ts +563 -563
  133. package/src/execution/engine/llm/adapters/__tests__/openrouter.integration.test.ts +105 -105
  134. package/src/execution/engine/llm/adapters/__tests__/universal-adapter.test.ts +537 -537
  135. package/src/execution/engine/llm/adapters/circuit-breaker.ts +147 -147
  136. package/src/execution/engine/llm/adapters/index.ts +17 -17
  137. package/src/execution/engine/llm/adapters/mock-adapter.ts +116 -116
  138. package/src/execution/engine/llm/adapters/server/adapter-factory.ts +130 -130
  139. package/src/execution/engine/llm/adapters/server/anthropic.ts +137 -137
  140. package/src/execution/engine/llm/adapters/server/google.ts +283 -283
  141. package/src/execution/engine/llm/adapters/server/index.ts +12 -12
  142. package/src/execution/engine/llm/adapters/server/openai.ts +206 -206
  143. package/src/execution/engine/llm/adapters/server/openrouter.ts +235 -235
  144. package/src/execution/engine/llm/adapters/universal-adapter.ts +230 -230
  145. package/src/execution/engine/llm/errors.ts +186 -186
  146. package/src/execution/engine/llm/model-info.ts +332 -332
  147. package/src/execution/engine/llm/response-schema-validator.ts +113 -113
  148. package/src/execution/engine/llm/types.ts +86 -86
  149. package/src/execution/engine/test-utils/index.ts +6 -6
  150. package/src/execution/engine/test-utils/mocks.ts +56 -56
  151. package/src/execution/engine/tools/integration/base-integration-adapter.ts +50 -50
  152. package/src/execution/engine/tools/integration/index.ts +53 -53
  153. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-adapter.ts +73 -73
  154. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-tools.ts +209 -209
  155. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-company-email/index.ts +82 -82
  156. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-decision-maker-email/index.ts +122 -122
  157. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-person-email/index.ts +89 -89
  158. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/verify-email/index.ts +84 -84
  159. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/index.ts +16 -16
  160. package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +293 -293
  161. package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +100 -100
  162. package/src/execution/engine/tools/integration/server/adapters/apify/apify-tools.ts +217 -217
  163. package/src/execution/engine/tools/integration/server/adapters/apify/fetch/get-dataset-items/index.ts +92 -92
  164. package/src/execution/engine/tools/integration/server/adapters/apify/fetch/run-actor/index.ts +218 -218
  165. package/src/execution/engine/tools/integration/server/adapters/apify/fetch/start-actor/index.ts +87 -87
  166. package/src/execution/engine/tools/integration/server/adapters/apify/index.ts +11 -11
  167. package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +361 -361
  168. package/src/execution/engine/tools/integration/server/adapters/attio/attio-adapter.ts +162 -162
  169. package/src/execution/engine/tools/integration/server/adapters/attio/attio-tools.ts +594 -594
  170. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-attribute/index.ts +214 -214
  171. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-note/index.ts +152 -152
  172. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-record/index.ts +141 -141
  173. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-note/index.ts +86 -86
  174. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-record/index.ts +105 -105
  175. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.ts +118 -118
  176. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-attributes/index.ts +165 -165
  177. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-notes/index.ts +96 -96
  178. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-objects/index.ts +104 -104
  179. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.ts +156 -156
  180. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-attribute/index.ts +220 -220
  181. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-record/index.ts +140 -140
  182. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/utils/types.ts +146 -146
  183. package/src/execution/engine/tools/integration/server/adapters/attio/index.ts +31 -31
  184. package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +210 -210
  185. package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +104 -104
  186. package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -261
  187. package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-adapter.ts +1189 -1189
  188. package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-tools.ts +641 -641
  189. package/src/execution/engine/tools/integration/server/adapters/google-sheets/index.ts +18 -18
  190. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/activate-campaign/index.ts +86 -86
  191. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/__tests__/index.test.ts +289 -289
  192. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/index.ts +154 -154
  193. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/__tests__/index.test.ts +325 -325
  194. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/index.ts +153 -153
  195. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-delete-leads/index.ts +84 -84
  196. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-campaign/index.ts +125 -125
  197. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-inbox-test/index.ts +107 -107
  198. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/delete-campaign/index.ts +85 -85
  199. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-account-health/index.ts +91 -91
  200. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign/index.ts +92 -92
  201. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/__tests__/index.test.ts +195 -195
  202. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/index.ts +113 -113
  203. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-daily-campaign-analytics/index.ts +104 -104
  204. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-emails/index.ts +155 -155
  205. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/__tests__/index.test.ts +196 -196
  206. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/index.ts +102 -102
  207. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/__tests__/index.test.ts +189 -189
  208. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/index.ts +87 -87
  209. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-leads/index.ts +112 -112
  210. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/patch-lead/index.ts +76 -76
  211. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/pause-campaign/index.ts +86 -86
  212. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/remove-from-subsequence/index.ts +98 -98
  213. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/send-reply/index.ts +126 -126
  214. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/__tests__/index.test.ts +193 -193
  215. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/index.ts +99 -99
  216. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/__tests__/index.test.ts +621 -621
  217. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/index.ts +125 -125
  218. package/src/execution/engine/tools/integration/server/adapters/instantly/index.ts +29 -29
  219. package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-adapter.ts +178 -178
  220. package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1473 -1473
  221. package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/check-credits/index.ts +59 -59
  222. package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/verify-email/index.ts +102 -102
  223. package/src/execution/engine/tools/integration/server/adapters/millionverifier/index.ts +17 -17
  224. package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-adapter.ts +80 -80
  225. package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +102 -102
  226. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/get-email/index.ts +102 -102
  227. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +134 -134
  228. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +75 -75
  229. package/src/execution/engine/tools/integration/server/adapters/resend/index.ts +27 -27
  230. package/src/execution/engine/tools/integration/server/adapters/resend/resend-adapter.ts +108 -108
  231. package/src/execution/engine/tools/integration/server/adapters/resend/resend-tools.ts +132 -132
  232. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/create-envelope/index.ts +274 -274
  233. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/download-document/index.ts +230 -230
  234. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/get-envelope/index.ts +133 -133
  235. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/void-envelope/index.ts +90 -90
  236. package/src/execution/engine/tools/integration/server/adapters/stripe/fetch/utils/types.ts +210 -210
  237. package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-adapter.ts +517 -517
  238. package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +309 -309
  239. package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/domain-search/index.ts +133 -133
  240. package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-finder/index.ts +122 -122
  241. package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-verifier/index.ts +111 -111
  242. package/src/execution/engine/tools/integration/server/adapters/tomba/index.ts +11 -11
  243. package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-adapter.ts +78 -78
  244. package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-tools.ts +222 -222
  245. package/src/execution/engine/tools/integration/server/index.ts +61 -61
  246. package/src/execution/engine/tools/integration/service.ts +161 -161
  247. package/src/execution/engine/tools/integration/tool.ts +253 -253
  248. package/src/execution/engine/tools/integration/types/anymailfinder.ts +74 -74
  249. package/src/execution/engine/tools/integration/types/apify.ts +92 -92
  250. package/src/execution/engine/tools/integration/types/index.ts +19 -19
  251. package/src/execution/engine/tools/integration/types/instantly.ts +557 -557
  252. package/src/execution/engine/tools/integration/types/millionverifier.ts +56 -56
  253. package/src/execution/engine/tools/integration/types/stripe.ts +162 -162
  254. package/src/execution/engine/tools/integration/types/tomba.ts +94 -94
  255. package/src/execution/engine/tools/lead-service-types.ts +884 -884
  256. package/src/execution/engine/tools/llm/index.ts +11 -11
  257. package/src/execution/engine/tools/llm/server/index.ts +8 -8
  258. package/src/execution/engine/tools/llm/server/llm-call-tool.ts +118 -118
  259. package/src/execution/engine/tools/platform/__tests__/pdf.test.ts +441 -441
  260. package/src/execution/engine/tools/platform/acquisition/company-tools.ts +248 -248
  261. package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +319 -319
  262. package/src/execution/engine/tools/platform/acquisition/index.ts +43 -43
  263. package/src/execution/engine/tools/platform/acquisition/list-tools.ts +148 -148
  264. package/src/execution/engine/tools/platform/acquisition/types.ts +260 -260
  265. package/src/execution/engine/tools/platform/email/index.ts +122 -122
  266. package/src/execution/engine/tools/platform/email/types.ts +96 -96
  267. package/src/execution/engine/tools/platform/index.ts +157 -157
  268. package/src/execution/engine/tools/platform/notification.ts +81 -81
  269. package/src/execution/engine/tools/platform/pdf/index.ts +110 -110
  270. package/src/execution/engine/tools/platform/pdf/types.ts +77 -77
  271. package/src/execution/engine/tools/platform/scheduler.ts +87 -87
  272. package/src/execution/engine/tools/platform/storage/index.ts +370 -370
  273. package/src/execution/engine/tools/platform/types.ts +148 -148
  274. package/src/execution/engine/tools/registry.ts +700 -699
  275. package/src/execution/engine/tools/tool-maps.ts +786 -786
  276. package/src/execution/engine/tools/types.ts +233 -233
  277. package/src/execution/engine/workflow/__tests__/errors.test.ts +139 -139
  278. package/src/execution/engine/workflow/errors.ts +63 -63
  279. package/src/execution/engine/workflow/helpers/index.ts +11 -11
  280. package/src/execution/engine/workflow/helpers/server/index.ts +8 -8
  281. package/src/execution/engine/workflow/helpers/server/llm-call.ts +93 -93
  282. package/src/execution/engine/workflow/index.ts +19 -19
  283. package/src/execution/engine/workflow/log-truncate.ts +26 -26
  284. package/src/execution/engine/workflow/logging.ts +191 -191
  285. package/src/execution/engine/workflow/types.ts +182 -182
  286. package/src/execution/engine/workflow/utils.ts +280 -280
  287. package/src/execution/engine/workflow/workflow.ts +168 -168
  288. package/src/execution/index.ts +3 -3
  289. package/src/execution/scheduler/__tests__/api-schemas.test.ts +733 -733
  290. package/src/execution/scheduler/__tests__/utils.test.ts +1009 -1009
  291. package/src/execution/scheduler/api-schemas.ts +296 -296
  292. package/src/execution/scheduler/index.ts +50 -50
  293. package/src/execution/scheduler/schemas.ts +264 -264
  294. package/src/execution/scheduler/types.ts +111 -111
  295. package/src/execution/scheduler/utils.ts +364 -364
  296. package/src/forms/index.ts +7 -7
  297. package/src/forms/schemas.ts +69 -69
  298. package/src/forms/types.ts +70 -70
  299. package/src/index.ts +71 -60
  300. package/src/integrations/credentials/__tests__/schemas.test.ts +82 -82
  301. package/src/integrations/credentials/__tests__/utils.test.ts +144 -144
  302. package/src/integrations/credentials/api-schemas.ts +143 -143
  303. package/src/integrations/credentials/index.ts +32 -32
  304. package/src/integrations/credentials/schemas.ts +164 -164
  305. package/src/integrations/credentials/utils.ts +59 -59
  306. package/src/integrations/oauth/__tests__/provider-registry.test.ts +59 -59
  307. package/src/integrations/oauth/api-schemas.ts +92 -92
  308. package/src/integrations/oauth/index.ts +19 -19
  309. package/src/integrations/oauth/provider-registry.ts +61 -61
  310. package/src/integrations/oauth/server/__tests__/refresh-concurrent.test.ts +183 -183
  311. package/src/integrations/oauth/server/__tests__/refresh.test.ts +577 -577
  312. package/src/integrations/oauth/server/credentials.ts +39 -39
  313. package/src/integrations/oauth/server/refresh.ts +214 -214
  314. package/src/integrations/oauth/types.ts +34 -34
  315. package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +318 -318
  316. package/src/integrations/webhook-endpoints/api-schemas.ts +102 -102
  317. package/src/integrations/webhook-endpoints/index.ts +28 -28
  318. package/src/integrations/webhook-endpoints/types.ts +51 -51
  319. package/src/operations/activities/api-schemas.ts +79 -79
  320. package/src/operations/activities/index.ts +9 -9
  321. package/src/operations/activities/sse-events.ts +30 -30
  322. package/src/operations/activities/types.ts +63 -63
  323. package/src/operations/debug-logs/client.ts +60 -60
  324. package/src/operations/debug-logs/debug-logger.ts +83 -83
  325. package/src/operations/debug-logs/index.ts +8 -8
  326. package/src/operations/debug-logs/server.ts +19 -19
  327. package/src/operations/debug-logs/types.ts +33 -33
  328. package/src/operations/index.ts +50 -50
  329. package/src/operations/notifications/api-schemas.ts +91 -91
  330. package/src/operations/notifications/index.ts +3 -3
  331. package/src/operations/notifications/sse-events.ts +21 -21
  332. package/src/operations/notifications/types.ts +47 -47
  333. package/src/operations/observability/__tests__/openrouter-cost-flow.test.ts +297 -297
  334. package/src/operations/observability/__tests__/utils.test.ts +54 -54
  335. package/src/operations/observability/ai-usage-collector.ts +64 -64
  336. package/src/operations/observability/index.ts +13 -13
  337. package/src/operations/observability/metrics-collector.ts +49 -49
  338. package/src/operations/observability/schemas.ts +39 -39
  339. package/src/operations/observability/types.ts +463 -463
  340. package/src/operations/observability/utils.ts +77 -77
  341. package/src/operations/sessions/__tests__/manager.test.ts +821 -821
  342. package/src/operations/sessions/index.ts +26 -26
  343. package/src/operations/sessions/server/manager.ts +90 -90
  344. package/src/operations/sessions/server/session.ts +180 -180
  345. package/src/operations/sessions/types.ts +98 -98
  346. package/src/operations/triggers/index.ts +12 -12
  347. package/src/operations/triggers/webhook/definitions/instantly-account-error.ts +44 -44
  348. package/src/operations/triggers/webhook/definitions/instantly-auto-reply-received.ts +51 -51
  349. package/src/operations/triggers/webhook/definitions/instantly-campaign-completed.ts +45 -45
  350. package/src/operations/triggers/webhook/definitions/instantly-email-bounced.ts +49 -49
  351. package/src/operations/triggers/webhook/definitions/instantly-lead-unsubscribed.ts +45 -45
  352. package/src/operations/triggers/webhook/definitions/instantly-reply-received.ts +54 -54
  353. package/src/operations/triggers/webhook/index.ts +35 -35
  354. package/src/operations/triggers/webhook/types.ts +74 -74
  355. package/src/organization-model/README.md +97 -97
  356. package/src/organization-model/__tests__/defaults.test.ts +175 -175
  357. package/src/organization-model/__tests__/domains/customers.test.ts +295 -295
  358. package/src/organization-model/__tests__/domains/goals.test.ts +479 -479
  359. package/src/organization-model/__tests__/domains/identity.test.ts +279 -279
  360. package/src/organization-model/__tests__/domains/navigation.test.ts +212 -212
  361. package/src/organization-model/__tests__/domains/offerings.test.ts +419 -419
  362. package/src/organization-model/__tests__/domains/operations.test.ts +203 -203
  363. package/src/organization-model/__tests__/domains/resource-mappings.test.ts +362 -362
  364. package/src/organization-model/__tests__/domains/roles.test.ts +347 -347
  365. package/src/organization-model/__tests__/domains/statuses.test.ts +243 -243
  366. package/src/organization-model/__tests__/foundation.test.ts +105 -105
  367. package/src/organization-model/__tests__/graph.test.ts +894 -894
  368. package/src/organization-model/__tests__/resolve.test.ts +690 -690
  369. package/src/organization-model/__tests__/schema.test.ts +407 -407
  370. package/src/organization-model/contracts.ts +14 -14
  371. package/src/organization-model/defaults.ts +148 -148
  372. package/src/organization-model/domains/branding.ts +22 -22
  373. package/src/organization-model/domains/customers.ts +75 -75
  374. package/src/organization-model/domains/features.ts +22 -22
  375. package/src/organization-model/domains/goals.ts +80 -80
  376. package/src/organization-model/domains/identity.ts +94 -94
  377. package/src/organization-model/domains/navigation.ts +391 -391
  378. package/src/organization-model/domains/offerings.ts +66 -66
  379. package/src/organization-model/domains/operations.ts +85 -85
  380. package/src/organization-model/domains/projects.ts +48 -48
  381. package/src/organization-model/domains/prospecting.ts +33 -33
  382. package/src/organization-model/domains/roles.ts +55 -55
  383. package/src/organization-model/domains/sales.ts +94 -94
  384. package/src/organization-model/domains/shared.ts +62 -62
  385. package/src/organization-model/domains/statuses.ts +130 -130
  386. package/src/organization-model/foundation.ts +97 -97
  387. package/src/organization-model/graph/build.ts +399 -399
  388. package/src/organization-model/graph/index.ts +4 -4
  389. package/src/organization-model/graph/schema.ts +48 -48
  390. package/src/organization-model/graph/types.ts +40 -40
  391. package/src/organization-model/index.ts +13 -13
  392. package/src/organization-model/organization-graph.mdx +272 -272
  393. package/src/organization-model/organization-model.mdx +320 -320
  394. package/src/organization-model/published.ts +85 -85
  395. package/src/organization-model/resolve.ts +66 -66
  396. package/src/organization-model/schema.ts +287 -287
  397. package/src/organization-model/types.ts +46 -46
  398. package/src/platform/api/index.ts +1 -1
  399. package/src/platform/api/types.ts +35 -35
  400. package/src/platform/constants/http.ts +37 -37
  401. package/src/platform/constants/index.ts +5 -5
  402. package/src/platform/constants/limits.ts +32 -32
  403. package/src/platform/constants/resilience.ts +51 -51
  404. package/src/platform/constants/timeouts.ts +20 -20
  405. package/src/platform/constants/versions.ts +3 -3
  406. package/src/platform/registry/__tests__/resource-registry-static.test.ts +347 -347
  407. package/src/platform/registry/__tests__/resource-registry.integration.test.ts +1028 -1028
  408. package/src/platform/registry/__tests__/resource-registry.list-executable.test.ts +393 -393
  409. package/src/platform/registry/__tests__/resource-registry.test.ts +2005 -2005
  410. package/src/platform/registry/__tests__/serialization.test.ts +1127 -1127
  411. package/src/platform/registry/command-view.ts +180 -180
  412. package/src/platform/registry/domains.ts +165 -165
  413. package/src/platform/registry/index.ts +93 -93
  414. package/src/platform/registry/reserved.ts +24 -24
  415. package/src/platform/registry/resource-metadata.ts +59 -59
  416. package/src/platform/registry/resource-registry.command-queue-groups.test.ts +129 -129
  417. package/src/platform/registry/resource-registry.ts +876 -876
  418. package/src/platform/registry/serialization.ts +273 -273
  419. package/src/platform/registry/serialized-types.ts +231 -231
  420. package/src/platform/registry/stats-types.ts +66 -66
  421. package/src/platform/registry/types.ts +404 -404
  422. package/src/platform/registry/validation.ts +513 -513
  423. package/src/platform/resilience/__tests__/rate-limiter.test.ts +471 -471
  424. package/src/platform/resilience/circuit-breaker.ts +164 -164
  425. package/src/platform/resilience/errors.ts +68 -68
  426. package/src/platform/resilience/http-error-mapper.ts +129 -129
  427. package/src/platform/resilience/index.ts +93 -93
  428. package/src/platform/resilience/rate-limiter-types.ts +46 -46
  429. package/src/platform/resilience/rate-limiter.ts +140 -140
  430. package/src/platform/resilience/retry.ts +89 -89
  431. package/src/platform/resilience/timeout.ts +63 -63
  432. package/src/platform/sse/events.ts +37 -34
  433. package/src/platform/sse/index.ts +7 -7
  434. package/src/platform/utils/__tests__/validation.test.ts +1083 -1083
  435. package/src/platform/utils/currency.ts +96 -96
  436. package/src/platform/utils/debounce.ts +52 -52
  437. package/src/platform/utils/error.ts +41 -41
  438. package/src/platform/utils/hmac.test.ts +97 -97
  439. package/src/platform/utils/index.ts +32 -32
  440. package/src/platform/utils/server/betterstack-logger.ts +210 -210
  441. package/src/platform/utils/server/hmac.ts +44 -44
  442. package/src/platform/utils/server/unsubscribe.ts +111 -111
  443. package/src/platform/utils/token-counter.ts +96 -96
  444. package/src/platform/utils/validation.ts +425 -425
  445. package/src/projects/api-schemas.ts +268 -268
  446. package/src/published.ts +1 -1
  447. package/src/reference/_generated/contracts.md +611 -607
  448. package/src/reference/glossary.md +105 -105
  449. package/src/requests/__tests__/api-schemas.test.ts +277 -277
  450. package/src/requests/api-schemas.ts +83 -83
  451. package/src/requests/index.ts +1 -1
  452. package/src/scaffold-registry/__tests__/index.test.ts +17 -0
  453. package/src/scaffold-registry/__tests__/schema.test.ts +329 -230
  454. package/src/scaffold-registry/index.ts +205 -189
  455. package/src/scaffold-registry/schema.ts +196 -128
  456. package/src/server.ts +272 -272
  457. package/src/supabase/database.types.ts +2719 -2719
  458. package/src/supabase/helpers.ts +20 -20
  459. package/src/supabase/index.ts +52 -52
  460. package/src/supabase/server/client.ts +58 -58
  461. package/src/test-utils/README.md +38 -38
  462. package/src/test-utils/browser-mocks.ts +54 -54
  463. package/src/test-utils/fixtures/api-keys.ts +52 -52
  464. package/src/test-utils/fixtures/index.ts +4 -4
  465. package/src/test-utils/fixtures/memberships.ts +80 -80
  466. package/src/test-utils/fixtures/organizations.ts +69 -69
  467. package/src/test-utils/fixtures/users.ts +79 -79
  468. package/src/test-utils/index.ts +11 -11
  469. package/src/test-utils/mocks/index.ts +2 -2
  470. package/src/test-utils/mocks/supabase.ts +142 -142
  471. package/src/test-utils/mocks/workos.ts +108 -108
  472. package/src/test-utils/rls/RLSTestContext.ts +556 -556
  473. package/src/test-utils/rls/index.ts +1 -1
@@ -1,884 +1,884 @@
1
- /**
2
- * Lead Service Types
3
- * CRUD operation types for the acquisition platform (lists, companies, contacts, deals)
4
- *
5
- * Implementation: apps/api/src/acquisition/lead-service.ts (LeadService class)
6
- */
7
-
8
- import type { Json } from '../../../supabase'
9
-
10
- // Re-export acquisition domain types from the authoritative source
11
- import type {
12
- AcqList,
13
- AcqCompany,
14
- AcqContact,
15
- AcqDealTask,
16
- AcqDealTaskKind,
17
- CompanyListStage,
18
- ContactListStage,
19
- ListConfig,
20
- ListTelemetry
21
- } from '../../../business/acquisition/types'
22
-
23
- export type {
24
- AcqList,
25
- AcqCompany,
26
- AcqContact,
27
- AcqDealTask,
28
- AcqDealTaskKind,
29
- CompanyListStage,
30
- ContactListStage,
31
- ListConfig,
32
- ListTelemetry
33
- }
34
-
35
- // Pagination types
36
- export interface PaginationParams {
37
- limit: number
38
- offset: number
39
- }
40
-
41
- export interface PaginatedResult<T> {
42
- data: T[]
43
- total: number
44
- limit: number
45
- offset: number
46
- }
47
-
48
- // List params
49
- export interface CreateListParams {
50
- organizationId: string
51
- name: string
52
- description?: string
53
- type?: string
54
- batchIds?: string[]
55
- instantlyCampaignId?: string
56
- status?: string
57
- metadata?: Record<string, unknown>
58
- config?: ListConfig
59
- }
60
-
61
- export interface UpdateListParams {
62
- name?: string
63
- description?: string
64
- status?: string
65
- }
66
-
67
- // Company params
68
- export interface CreateCompanyParams {
69
- organizationId: string
70
- name: string
71
- domain?: string
72
- linkedinUrl?: string
73
- website?: string
74
- numEmployees?: number
75
- foundedYear?: number
76
- locationCity?: string
77
- locationState?: string
78
- category?: string
79
- source?: string
80
- batchId?: string
81
- verticalResearch?: string
82
- }
83
-
84
- export interface UpdateCompanyParams {
85
- name?: string
86
- domain?: string
87
- linkedinUrl?: string
88
- website?: string
89
- numEmployees?: number
90
- foundedYear?: number
91
- locationCity?: string
92
- locationState?: string
93
- category?: string
94
- segment?: string
95
- pipelineStatus?: Record<string, unknown>
96
- enrichmentData?: Record<string, unknown>
97
- source?: string
98
- batchId?: string
99
- status?: 'active' | 'invalid'
100
- verticalResearch?: string | null
101
- }
102
-
103
- export type UpsertCompanyParams = CreateCompanyParams
104
- // Upsert by domain - uses same fields as create
105
-
106
- export interface CompanyFilters {
107
- listId?: string // Filter to companies in a specific list (via acq_list_companies)
108
- search?: string
109
- domain?: string
110
- website?: string
111
- segment?: string
112
- category?: string
113
- pipelineStatus?: Record<string, unknown>
114
- /** Exclude companies whose pipeline_status contains this value (PostgREST NOT contains) */
115
- pipelineStatusNot?: Record<string, unknown>
116
- batchId?: string
117
- status?: 'active' | 'invalid'
118
- includeAll?: boolean
119
- excludeColumns?: Array<'enrichmentData' | 'pipelineStatus'>
120
- }
121
-
122
- // Contact params
123
- export interface CreateContactParams {
124
- organizationId: string
125
- email: string
126
- companyId?: string
127
- firstName?: string
128
- lastName?: string
129
- linkedinUrl?: string
130
- title?: string
131
- source?: string
132
- sourceId?: string
133
- batchId?: string
134
- }
135
-
136
- export interface UpdateContactParams {
137
- companyId?: string
138
- emailValid?: 'VALID' | 'INVALID' | 'RISKY' | 'UNKNOWN'
139
- firstName?: string
140
- lastName?: string
141
- linkedinUrl?: string
142
- title?: string
143
- headline?: string
144
- filterReason?: string
145
- openingLine?: string
146
- pipelineStatus?: Record<string, unknown>
147
- enrichmentData?: Record<string, unknown>
148
- status?: 'active' | 'invalid'
149
- }
150
-
151
- export type UpsertContactParams = CreateContactParams
152
- // Upsert by email - uses same fields as create
153
-
154
- export interface ContactFilters {
155
- listId?: string // Filter to contacts in a specific list (via acq_list_members)
156
- search?: string
157
- openingLineIsNull?: boolean // Filter to contacts without personalization
158
- pipelineStatus?: Record<string, unknown>
159
- batchId?: string
160
- contactStatus?: 'active' | 'invalid' // Filter by contact status (soft-delete flag)
161
- }
162
-
163
- // Deal params (for acq_deals table)
164
- export interface UpsertDealParams {
165
- organizationId: string
166
- /** Contact email — dedupe key together with organization_id */
167
- contactEmail: string
168
- /** Optional contact ID for foreign key join */
169
- contactId?: string
170
- /** Campaign list that generated this deal (FK to acq_lists) */
171
- sourceListId?: string
172
- /** Deal origin: 'instantly', 'referral', 'inbound', 'manual' */
173
- sourceType?: 'instantly' | 'referral' | 'inbound' | 'manual'
174
- /** Optional discovery data JSONB to set on upsert */
175
- discoveryData?: unknown
176
- /** Optional proposal data JSONB to set on upsert */
177
- proposalData?: unknown
178
- }
179
-
180
- export interface UpdateDiscoveryDataParams {
181
- organizationId: string
182
- contactEmail: string
183
- discoveryData: unknown
184
- submittedBy?: string
185
- }
186
-
187
- export interface UpdateProposalDataParams {
188
- organizationId: string
189
- contactEmail: string
190
- proposalData: unknown
191
- proposalPdfUrl?: string
192
- proposalStatus?: string
193
- }
194
-
195
- export interface MarkProposalSentParams {
196
- organizationId: string
197
- contactEmail: string
198
- }
199
-
200
- export interface MarkProposalReviewedParams {
201
- organizationId: string
202
- contactEmail: string
203
- reviewedBy: string
204
- proposalData?: unknown
205
- }
206
-
207
- export interface UpdateCloseLostReasonParams {
208
- organizationId: string
209
- dealId: string
210
- reason: string
211
- }
212
-
213
- export interface UpdateFeesParams {
214
- organizationId: string
215
- contactEmail?: string
216
- dealId?: string
217
- initialFee?: number
218
- monthlyFee?: number
219
- }
220
-
221
- export interface SyncDealStageParams {
222
- organizationId: string
223
- dealId: string
224
- stage: string
225
- }
226
-
227
- export interface SetContactNurtureParams {
228
- organizationId: string
229
- contactEmail: string
230
- nurture?: boolean
231
- }
232
-
233
- export interface DeactivateContactsByCompanyParams {
234
- organizationId: string
235
- companyId: string
236
- }
237
-
238
- export interface DeactivateContactsByCompanyResult {
239
- deactivated: number
240
- }
241
-
242
- export interface CancelSchedulesAndHitlByEmailParams {
243
- organizationId: string
244
- email: string
245
- }
246
-
247
- export interface CancelHitlByDealIdParams {
248
- organizationId: string
249
- dealId: string
250
- }
251
-
252
- export interface ClearDealFieldsParams {
253
- organizationId: string
254
- contactEmail?: string
255
- dealId?: string
256
- fields: (
257
- | 'proposalPdfUrl'
258
- | 'proposalStatus'
259
- | 'proposalGeneratedAt'
260
- | 'initialFee'
261
- | 'monthlyFee'
262
- | 'closedLostReason'
263
- | 'closedLostAt'
264
- | 'discoveryData'
265
- | 'discoverySubmittedAt'
266
- )[]
267
- }
268
-
269
- export interface DeleteDealParams {
270
- organizationId: string
271
- dealId: string
272
- }
273
-
274
- export interface GetDealByIdParams {
275
- dealId: string
276
- organizationId: string
277
- }
278
-
279
- export interface GetContactByIdParams {
280
- contactId: string
281
- organizationId: string
282
- }
283
-
284
- export interface GetCompanyByIdParams {
285
- companyId: string
286
- organizationId: string
287
- }
288
-
289
- // Social monitoring params (acq_social_posts table)
290
- export interface UpsertSocialPostParams {
291
- organizationId: string
292
- platform: string
293
- platformPostId: string
294
- authorName: string
295
- authorUrl?: string | null
296
- postTitle: string
297
- postText: string
298
- postUrl: string
299
- engagementCount?: number
300
- commentsCount?: number
301
- postedAt: string
302
- metadata?: Record<string, unknown>
303
- relevanceScore?: number
304
- matchedKeywords?: string[]
305
- matchedQuery?: string | null
306
- initialDraft?: string | null
307
- finalResponse?: string | null
308
- sourceCategory?: string | null
309
- }
310
-
311
- export interface UpsertSocialPostsParams {
312
- organizationId: string
313
- posts: Omit<UpsertSocialPostParams, 'organizationId'>[]
314
- }
315
-
316
- export interface UpsertSocialPostsResult {
317
- inserted: number
318
- duplicatesSkipped: number
319
- }
320
-
321
- export interface AcqDeal {
322
- id: string
323
- organizationId: string
324
- contactEmail: string
325
- cachedStage?: string | null
326
- discoveryData?: Json | null
327
- proposalData?: Json | null
328
- proposalStatus?: string | null
329
- proposalSentAt?: string | null
330
- proposalPdfUrl?: string | null
331
- signatureEnvelopeId?: string | null
332
- sourceListId?: string | null
333
- sourceType?: string | null
334
- activityLog: DealActivityEntry[]
335
- createdAt: Date
336
- updatedAt: Date
337
- }
338
-
339
- export interface DealActivityEntry {
340
- type: string
341
- title: string
342
- description?: string
343
- payload?: Record<string, unknown>
344
- occurredAt: string
345
- }
346
-
347
- export interface AcqDealNote {
348
- id: string
349
- dealId: string
350
- organizationId: string
351
- authorUserId: string | null
352
- body: string
353
- createdAt: string
354
- updatedAt: string
355
- }
356
-
357
- export interface CreateDealNoteParams {
358
- organizationId: string
359
- dealId: string
360
- body: string
361
- authorUserId?: string
362
- }
363
-
364
- export interface ListDealNotesParams {
365
- organizationId: string
366
- dealId: string
367
- }
368
-
369
- export interface CreateDealTaskParams {
370
- organizationId: string
371
- dealId: string
372
- title: string
373
- description?: string | null
374
- kind?: AcqDealTaskKind
375
- dueAt?: string | null
376
- assigneeUserId?: string | null
377
- createdByUserId?: string | null
378
- }
379
-
380
- export interface ListDealTasksParams {
381
- organizationId: string
382
- dealId: string
383
- }
384
-
385
- export interface ListDealTasksDueParams {
386
- organizationId: string
387
- assigneeUserId?: string | null
388
- /** Window filter: 'overdue' = past due, 'today' = due today only, 'today_and_overdue' (default) = both, 'upcoming' = future */
389
- window?: 'overdue' | 'today' | 'today_and_overdue' | 'upcoming'
390
- }
391
-
392
- export interface CompleteDealTaskParams {
393
- organizationId: string
394
- taskId: string
395
- completedByUserId: string | null
396
- }
397
-
398
- export interface RecordDealActivityParams {
399
- organizationId: string
400
- dealId: string
401
- type: string
402
- title: string
403
- description?: string
404
- payload?: Record<string, unknown>
405
- }
406
-
407
- // Deal analytics types (for /meta status and platform-status workflow)
408
-
409
- export interface DealStageSummary {
410
- stage: string
411
- count: number
412
- oldestUpdatedAt: string | null
413
- newestUpdatedAt: string | null
414
- }
415
-
416
- export interface StaleDeal {
417
- id: string
418
- contactEmail: string
419
- cachedStage: string
420
- updatedAt: string
421
- daysStale: number
422
- }
423
-
424
- export interface DealPipelineAnalytics {
425
- totalDeals: number
426
- stageSummary: DealStageSummary[]
427
- staleDeals: StaleDeal[]
428
- recentActivity: AcqDeal[]
429
- }
430
-
431
- export interface DealAnalyticsParams {
432
- organizationId: string
433
- recentLimit?: number
434
- }
435
-
436
- export interface DealFilters {
437
- stage?: string
438
- search?: string
439
- limit?: number
440
- offset?: number
441
- }
442
-
443
- export interface AddContactsToListParams {
444
- organizationId: string
445
- listId: string
446
- contactIds: string[]
447
- }
448
-
449
- export interface AddContactsToListResult {
450
- added: number
451
- alreadyExisted: number
452
- }
453
-
454
- // List config/progress/executions params
455
- export interface UpdateListConfigParams {
456
- organizationId: string
457
- listId: string
458
- /** Deep-partial patch — any subtree that is present is replaced at that level. */
459
- configPatch: Record<string, unknown>
460
- }
461
-
462
- export interface UpdateCompanyStageParams {
463
- organizationId: string
464
- listId: string
465
- companyId: string
466
- stage: CompanyListStage
467
- executionId?: string
468
- }
469
-
470
- export interface UpdateContactStageParams {
471
- organizationId: string
472
- listId: string
473
- contactId: string
474
- stage: ContactListStage
475
- executionId?: string
476
- }
477
-
478
- export interface AddCompaniesToListParams {
479
- organizationId: string
480
- listId: string
481
- companyIds: string[]
482
- }
483
-
484
- export interface AddCompaniesToListResult {
485
- added: number
486
- alreadyExisted: number
487
- }
488
-
489
- export interface RemoveCompaniesFromListParams {
490
- organizationId: string
491
- listId: string
492
- companyIds: string[]
493
- }
494
-
495
- export interface RemoveCompaniesFromListResult {
496
- removed: number
497
- }
498
-
499
- export interface RecordListExecutionParams {
500
- organizationId: string
501
- listId: string
502
- executionId: string
503
- configSnapshot?: Record<string, unknown>
504
- }
505
-
506
- export interface ListExecutionSummary {
507
- executionId: string
508
- resourceId: string
509
- status: string
510
- createdAt: string
511
- completedAt: string | null
512
- durationMs: number | null
513
- }
514
-
515
- // Bulk import (contacts)
516
- export interface BulkImportParams {
517
- organizationId: string
518
- contacts: CreateContactParams[]
519
- listId?: string
520
- }
521
-
522
- export interface BulkImportResult {
523
- created: number
524
- updated: number
525
- errors: Array<{ email: string; error: string }>
526
- }
527
-
528
- // Bulk import (companies)
529
- export interface BulkImportCompanyEntry {
530
- name: string
531
- domain: string
532
- website?: string
533
- locationCity?: string
534
- locationState?: string
535
- category?: string
536
- source?: string
537
- enrichmentData?: Record<string, unknown>
538
- pipelineStatus?: Record<string, unknown>
539
- }
540
-
541
- export interface BulkImportCompaniesParams {
542
- organizationId: string
543
- batchId: string
544
- companies: BulkImportCompanyEntry[]
545
- }
546
-
547
- export interface BulkImportCompaniesResult {
548
- created: number
549
- skipped: number
550
- errors: Array<{ companyName: string; error: string }>
551
- }
552
-
553
- /**
554
- * Lead Service interface for acquisition platform tools.
555
- * Provides CRUD operations for lists, companies, and contacts.
556
- *
557
- * Implementation: apps/api/src/acquisition/lead-service.ts (LeadService class)
558
- *
559
- * Multi-tenancy: All operations require organizationId for tenant isolation.
560
- * All queries are filtered by organizationId via RLS policies.
561
- */
562
- export interface ILeadService {
563
- // List operations
564
- /**
565
- * Create a new list
566
- * @see LeadService.createList (apps/api/src/acquisition/lead-service.ts)
567
- */
568
- createList(params: CreateListParams): Promise<AcqList>
569
-
570
- /**
571
- * Update an existing list
572
- * @see LeadService.updateList (apps/api/src/acquisition/lead-service.ts)
573
- */
574
- updateList(id: string, params: UpdateListParams): Promise<AcqList>
575
-
576
- /**
577
- * Delete a list
578
- * @see LeadService.deleteList (apps/api/src/acquisition/lead-service.ts)
579
- */
580
- deleteList(id: string, organizationId: string): Promise<void>
581
-
582
- /**
583
- * Add contacts to a list (upsert — idempotent on re-runs)
584
- * @see LeadService.addContactsToList (apps/api/src/business/acquisition/lead-service.ts)
585
- */
586
- addContactsToList(params: AddContactsToListParams): Promise<AddContactsToListResult>
587
-
588
- /**
589
- * List all lists for an organization
590
- * @see LeadService.listLists (apps/api/src/acquisition/lead-service.ts)
591
- */
592
- listLists(organizationId: string): Promise<AcqList[]>
593
-
594
- /**
595
- * Get a single list by ID.
596
- */
597
- getList(id: string, organizationId: string): Promise<AcqList | null>
598
-
599
- /**
600
- * Deep-merge patch the jsonb `config` column. Patch keys at any depth
601
- * replace the corresponding subtree.
602
- */
603
- updateListConfig(params: UpdateListConfigParams): Promise<AcqList>
604
-
605
- /**
606
- * Add companies to a list via the acq_list_companies junction.
607
- * Idempotent on (list_id, company_id).
608
- */
609
- addCompaniesToList(params: AddCompaniesToListParams): Promise<AddCompaniesToListResult>
610
-
611
- /**
612
- * Remove companies from a list (delete junction rows only — company rows untouched).
613
- */
614
- removeCompaniesFromList(params: RemoveCompaniesFromListParams): Promise<RemoveCompaniesFromListResult>
615
-
616
- /**
617
- * Live org-wide list telemetry — computed on demand from acq_companies
618
- * and acq_contacts joined through the acq_list_companies / acq_list_members
619
- * junctions. Replaces the batch-scoped getBatchTelemetry.
620
- */
621
- getListsTelemetry(organizationId: string): Promise<ListTelemetry[]>
622
-
623
- /**
624
- * Single live rollup read from list junction stage columns.
625
- */
626
- getListProgress(listId: string, organizationId: string): Promise<ListTelemetry | null>
627
-
628
- /**
629
- * Advance a company row within a list's explicit stage journey.
630
- */
631
- updateCompanyStage(params: UpdateCompanyStageParams): Promise<void>
632
-
633
- /**
634
- * Advance a contact row within a list's explicit stage journey.
635
- */
636
- updateContactStage(params: UpdateContactStageParams): Promise<void>
637
-
638
- /**
639
- * Per-list execution history — reads via the feature-owned
640
- * acq_list_executions junction, joined to execution_logs for details.
641
- */
642
- getListExecutions(listId: string, organizationId: string): Promise<ListExecutionSummary[]>
643
-
644
- /**
645
- * Write a junction row linking (listId, executionId). Called by the
646
- * workflow layer at execution start in Step 4. No-op if the row exists.
647
- */
648
- recordListExecution(params: RecordListExecutionParams): Promise<void>
649
-
650
- // Company operations
651
- /**
652
- * Create a new company
653
- * @see LeadService.createCompany (apps/api/src/acquisition/lead-service.ts)
654
- */
655
- createCompany(params: CreateCompanyParams): Promise<AcqCompany>
656
-
657
- /**
658
- * Update an existing company
659
- * @see LeadService.updateCompany (apps/api/src/acquisition/lead-service.ts)
660
- */
661
- updateCompany(id: string, params: UpdateCompanyParams): Promise<AcqCompany>
662
-
663
- /**
664
- * Upsert a company by domain
665
- * @see LeadService.upsertCompany (apps/api/src/acquisition/lead-service.ts)
666
- */
667
- upsertCompany(params: UpsertCompanyParams): Promise<AcqCompany>
668
-
669
- /**
670
- * Get a company by ID
671
- * @see LeadService.getCompany (apps/api/src/acquisition/lead-service.ts)
672
- */
673
- getCompany(id: string, organizationId: string): Promise<AcqCompany | null>
674
-
675
- /**
676
- * List companies with optional filters
677
- * @see LeadService.listCompanies (apps/api/src/acquisition/lead-service.ts)
678
- */
679
- listCompanies(organizationId: string, filters: CompanyFilters): Promise<AcqCompany[]>
680
-
681
- /**
682
- * Delete a company
683
- * @see LeadService.deleteCompany (apps/api/src/acquisition/lead-service.ts)
684
- */
685
- deleteCompany(id: string, organizationId: string): Promise<void>
686
-
687
- // Contact operations
688
- /**
689
- * Create a new contact
690
- * @see LeadService.createContact (apps/api/src/acquisition/lead-service.ts)
691
- */
692
- createContact(params: CreateContactParams): Promise<AcqContact>
693
-
694
- /**
695
- * Update an existing contact
696
- * @see LeadService.updateContact (apps/api/src/acquisition/lead-service.ts)
697
- */
698
- updateContact(id: string, params: UpdateContactParams): Promise<AcqContact>
699
-
700
- /**
701
- * Upsert a contact by email
702
- * @see LeadService.upsertContact (apps/api/src/acquisition/lead-service.ts)
703
- */
704
- upsertContact(params: UpsertContactParams): Promise<AcqContact>
705
-
706
- /**
707
- * Get a contact by ID
708
- * @see LeadService.getContact (apps/api/src/acquisition/lead-service.ts)
709
- */
710
- getContact(id: string, organizationId: string): Promise<AcqContact | null>
711
-
712
- /**
713
- * List contacts with pagination and filters
714
- * @see LeadService.listContacts (apps/api/src/acquisition/lead-service.ts)
715
- */
716
- listContacts(
717
- organizationId: string,
718
- filters: ContactFilters,
719
- pagination: PaginationParams
720
- ): Promise<PaginatedResult<AcqContact>>
721
-
722
- /**
723
- * Delete a contact
724
- * @see LeadService.deleteContact (apps/api/src/acquisition/lead-service.ts)
725
- */
726
- deleteContact(id: string, organizationId: string): Promise<void>
727
-
728
- /**
729
- * Bulk import contacts
730
- * @see LeadService.bulkImportContacts (apps/api/src/acquisition/lead-service.ts)
731
- */
732
- bulkImportContacts(params: BulkImportParams): Promise<BulkImportResult>
733
-
734
- /**
735
- * Bulk import companies with domain dedup (skips existing domains).
736
- * Inserts in batches using Supabase bulk insert + ON CONFLICT.
737
- * @see LeadService.bulkImportCompanies (apps/api/src/business/acquisition/lead-service.ts)
738
- */
739
- bulkImportCompanies(params: BulkImportCompaniesParams): Promise<BulkImportCompaniesResult>
740
-
741
- /**
742
- * Deactivate all active contacts belonging to a company.
743
- * Used by qualification workflow to cascade company disqualification to contacts.
744
- */
745
- deactivateContactsByCompany(params: DeactivateContactsByCompanyParams): Promise<DeactivateContactsByCompanyResult>
746
-
747
- /**
748
- * Get a contact by email address
749
- * Used for looking up existing leads when they reply to outreach
750
- * @see LeadService.getContactByEmail (apps/api/src/acquisition/lead-service.ts)
751
- */
752
- getContactByEmail(email: string, organizationId: string): Promise<AcqContact | null>
753
-
754
- // Deal operations (acq_deals table)
755
- /**
756
- * Upsert a deal by Attio Deal ID
757
- * Creates or updates acq_deals record linking Attio Deal to Supabase
758
- * @see LeadService.upsertDeal (apps/api/src/acquisition/lead-service.ts)
759
- */
760
- upsertDeal(params: UpsertDealParams): Promise<AcqDeal>
761
-
762
- /**
763
- * Get a deal by contact email
764
- * Used for looking up existing deals when leads book via email (fallback lookup)
765
- * @see LeadService.getDealByEmail (apps/api/src/acquisition/lead-service.ts)
766
- */
767
- getDealByEmail(email: string, organizationId: string): Promise<AcqDeal | null>
768
-
769
- /**
770
- * Get a deal by SignatureAPI envelope ID
771
- * Used by webhook handler to find deal when contract is signed
772
- * @see LeadService.getDealByEnvelopeId (apps/api/src/acquisition/lead-service.ts)
773
- */
774
- getDealByEnvelopeId(envelopeId: string, organizationId: string): Promise<AcqDeal | null>
775
-
776
- /**
777
- * Update deal with signature envelope ID
778
- * Called when proposal is sent via SignatureAPI
779
- * @see LeadService.updateDealEnvelopeId (apps/api/src/acquisition/lead-service.ts)
780
- */
781
- updateDealEnvelopeId(dealId: string, envelopeId: string, organizationId: string): Promise<AcqDeal | null>
782
-
783
- // Deal-sync operations (mirror deal-sync.ts utilities as server-side methods)
784
-
785
- getDealById(params: GetDealByIdParams): Promise<AcqDeal | null>
786
-
787
- getContactById(params: GetContactByIdParams): Promise<AcqContact | null>
788
-
789
- getCompanyById(params: GetCompanyByIdParams): Promise<AcqCompany | null>
790
-
791
- updateDiscoveryData(params: UpdateDiscoveryDataParams): Promise<void>
792
-
793
- updateProposalData(params: UpdateProposalDataParams): Promise<void>
794
-
795
- markProposalSent(params: MarkProposalSentParams): Promise<void>
796
-
797
- markProposalReviewed(params: MarkProposalReviewedParams): Promise<void>
798
-
799
- updateCloseLostReason(params: UpdateCloseLostReasonParams): Promise<void>
800
-
801
- updateFees(params: UpdateFeesParams): Promise<void>
802
-
803
- syncDealStage(params: SyncDealStageParams): Promise<void>
804
-
805
- setContactNurture(params: SetContactNurtureParams): Promise<void>
806
-
807
- cancelSchedulesAndHitlByEmail(
808
- params: CancelSchedulesAndHitlByEmailParams
809
- ): Promise<{ schedulesCancelled: number; hitlDeleted: number }>
810
-
811
- cancelHitlByDealId(params: CancelHitlByDealIdParams): Promise<{ hitlDeleted: number }>
812
-
813
- clearDealFields(params: ClearDealFieldsParams): Promise<void>
814
-
815
- deleteDeal(params: DeleteDealParams): Promise<void>
816
-
817
- listDeals(organizationId: string, filters?: DealFilters): Promise<AcqDeal[]>
818
-
819
- getDealPipelineAnalytics(organizationId: string, recentLimit?: number): Promise<DealPipelineAnalytics>
820
-
821
- /**
822
- * Deep-merge enrichment data into a company or contact record.
823
- * Merges per source key rather than wholesale replacing the JSONB object.
824
- * @see LeadService.mergeEnrichmentData (apps/api/src/business/acquisition/lead-service.ts)
825
- */
826
- mergeEnrichmentData(
827
- id: string,
828
- orgId: string,
829
- table: 'acq_companies' | 'acq_contacts',
830
- data: Record<string, unknown>
831
- ): Promise<void>
832
-
833
- // Deal note operations (acq_deal_notes table)
834
- /**
835
- * Create a human-authored note on a deal
836
- * @see LeadService.createDealNote (apps/api/src/business/acquisition/lead-service.ts)
837
- */
838
- createDealNote(params: CreateDealNoteParams): Promise<AcqDealNote>
839
-
840
- /**
841
- * List notes for a deal, ordered by created_at DESC
842
- * @see LeadService.listDealNotes (apps/api/src/business/acquisition/lead-service.ts)
843
- */
844
- listDealNotes(params: ListDealNotesParams): Promise<AcqDealNote[]>
845
-
846
- // Deal task operations (acq_deal_tasks table)
847
- /**
848
- * Creates a new task attached to a deal.
849
- * @see LeadService.createDealTask (apps/api/src/business/acquisition/lead-service.ts)
850
- */
851
- createDealTask(params: CreateDealTaskParams): Promise<AcqDealTask>
852
-
853
- /**
854
- * Lists all tasks for a given deal, ordered by due date.
855
- * @see LeadService.listDealTasks (apps/api/src/business/acquisition/lead-service.ts)
856
- */
857
- listDealTasks(params: ListDealTasksParams): Promise<AcqDealTask[]>
858
-
859
- /**
860
- * Lists open (uncompleted) tasks within a date window across all deals.
861
- * @see LeadService.listDealTasksDue (apps/api/src/business/acquisition/lead-service.ts)
862
- */
863
- listDealTasksDue(params: ListDealTasksDueParams): Promise<AcqDealTask[]>
864
-
865
- /**
866
- * Marks a task as completed.
867
- * @see LeadService.completeDealTask (apps/api/src/business/acquisition/lead-service.ts)
868
- */
869
- completeDealTask(params: CompleteDealTaskParams): Promise<AcqDealTask>
870
-
871
- /**
872
- * Record a deal activity entry by deal ID.
873
- * Generic method for any activity type — used by SDK workflows.
874
- * @see LeadService.recordDealActivity (apps/api/src/business/acquisition/lead-service.ts)
875
- */
876
- recordDealActivity(params: RecordDealActivityParams): Promise<void>
877
-
878
- // Social monitoring operations (acq_social_posts table)
879
- /**
880
- * Bulk upsert social posts (deduplicate by platform + platform_post_id)
881
- * @see LeadService.upsertSocialPosts (apps/api/src/business/acquisition/lead-service.ts)
882
- */
883
- upsertSocialPosts(params: UpsertSocialPostsParams): Promise<UpsertSocialPostsResult>
884
- }
1
+ /**
2
+ * Lead Service Types
3
+ * CRUD operation types for the acquisition platform (lists, companies, contacts, deals)
4
+ *
5
+ * Implementation: apps/api/src/acquisition/lead-service.ts (LeadService class)
6
+ */
7
+
8
+ import type { Json } from '../../../supabase'
9
+
10
+ // Re-export acquisition domain types from the authoritative source
11
+ import type {
12
+ AcqList,
13
+ AcqCompany,
14
+ AcqContact,
15
+ AcqDealTask,
16
+ AcqDealTaskKind,
17
+ CompanyListStage,
18
+ ContactListStage,
19
+ ListConfig,
20
+ ListTelemetry
21
+ } from '../../../business/acquisition/types'
22
+
23
+ export type {
24
+ AcqList,
25
+ AcqCompany,
26
+ AcqContact,
27
+ AcqDealTask,
28
+ AcqDealTaskKind,
29
+ CompanyListStage,
30
+ ContactListStage,
31
+ ListConfig,
32
+ ListTelemetry
33
+ }
34
+
35
+ // Pagination types
36
+ export interface PaginationParams {
37
+ limit: number
38
+ offset: number
39
+ }
40
+
41
+ export interface PaginatedResult<T> {
42
+ data: T[]
43
+ total: number
44
+ limit: number
45
+ offset: number
46
+ }
47
+
48
+ // List params
49
+ export interface CreateListParams {
50
+ organizationId: string
51
+ name: string
52
+ description?: string
53
+ type?: string
54
+ batchIds?: string[]
55
+ instantlyCampaignId?: string
56
+ status?: string
57
+ metadata?: Record<string, unknown>
58
+ config?: ListConfig
59
+ }
60
+
61
+ export interface UpdateListParams {
62
+ name?: string
63
+ description?: string
64
+ status?: string
65
+ }
66
+
67
+ // Company params
68
+ export interface CreateCompanyParams {
69
+ organizationId: string
70
+ name: string
71
+ domain?: string
72
+ linkedinUrl?: string
73
+ website?: string
74
+ numEmployees?: number
75
+ foundedYear?: number
76
+ locationCity?: string
77
+ locationState?: string
78
+ category?: string
79
+ source?: string
80
+ batchId?: string
81
+ verticalResearch?: string
82
+ }
83
+
84
+ export interface UpdateCompanyParams {
85
+ name?: string
86
+ domain?: string
87
+ linkedinUrl?: string
88
+ website?: string
89
+ numEmployees?: number
90
+ foundedYear?: number
91
+ locationCity?: string
92
+ locationState?: string
93
+ category?: string
94
+ segment?: string
95
+ pipelineStatus?: Record<string, unknown>
96
+ enrichmentData?: Record<string, unknown>
97
+ source?: string
98
+ batchId?: string
99
+ status?: 'active' | 'invalid'
100
+ verticalResearch?: string | null
101
+ }
102
+
103
+ export type UpsertCompanyParams = CreateCompanyParams
104
+ // Upsert by domain - uses same fields as create
105
+
106
+ export interface CompanyFilters {
107
+ listId?: string // Filter to companies in a specific list (via acq_list_companies)
108
+ search?: string
109
+ domain?: string
110
+ website?: string
111
+ segment?: string
112
+ category?: string
113
+ pipelineStatus?: Record<string, unknown>
114
+ /** Exclude companies whose pipeline_status contains this value (PostgREST NOT contains) */
115
+ pipelineStatusNot?: Record<string, unknown>
116
+ batchId?: string
117
+ status?: 'active' | 'invalid'
118
+ includeAll?: boolean
119
+ excludeColumns?: Array<'enrichmentData' | 'pipelineStatus'>
120
+ }
121
+
122
+ // Contact params
123
+ export interface CreateContactParams {
124
+ organizationId: string
125
+ email: string
126
+ companyId?: string
127
+ firstName?: string
128
+ lastName?: string
129
+ linkedinUrl?: string
130
+ title?: string
131
+ source?: string
132
+ sourceId?: string
133
+ batchId?: string
134
+ }
135
+
136
+ export interface UpdateContactParams {
137
+ companyId?: string
138
+ emailValid?: 'VALID' | 'INVALID' | 'RISKY' | 'UNKNOWN'
139
+ firstName?: string
140
+ lastName?: string
141
+ linkedinUrl?: string
142
+ title?: string
143
+ headline?: string
144
+ filterReason?: string
145
+ openingLine?: string
146
+ pipelineStatus?: Record<string, unknown>
147
+ enrichmentData?: Record<string, unknown>
148
+ status?: 'active' | 'invalid'
149
+ }
150
+
151
+ export type UpsertContactParams = CreateContactParams
152
+ // Upsert by email - uses same fields as create
153
+
154
+ export interface ContactFilters {
155
+ listId?: string // Filter to contacts in a specific list (via acq_list_members)
156
+ search?: string
157
+ openingLineIsNull?: boolean // Filter to contacts without personalization
158
+ pipelineStatus?: Record<string, unknown>
159
+ batchId?: string
160
+ contactStatus?: 'active' | 'invalid' // Filter by contact status (soft-delete flag)
161
+ }
162
+
163
+ // Deal params (for acq_deals table)
164
+ export interface UpsertDealParams {
165
+ organizationId: string
166
+ /** Contact email — dedupe key together with organization_id */
167
+ contactEmail: string
168
+ /** Optional contact ID for foreign key join */
169
+ contactId?: string
170
+ /** Campaign list that generated this deal (FK to acq_lists) */
171
+ sourceListId?: string
172
+ /** Deal origin: 'instantly', 'referral', 'inbound', 'manual' */
173
+ sourceType?: 'instantly' | 'referral' | 'inbound' | 'manual'
174
+ /** Optional discovery data JSONB to set on upsert */
175
+ discoveryData?: unknown
176
+ /** Optional proposal data JSONB to set on upsert */
177
+ proposalData?: unknown
178
+ }
179
+
180
+ export interface UpdateDiscoveryDataParams {
181
+ organizationId: string
182
+ contactEmail: string
183
+ discoveryData: unknown
184
+ submittedBy?: string
185
+ }
186
+
187
+ export interface UpdateProposalDataParams {
188
+ organizationId: string
189
+ contactEmail: string
190
+ proposalData: unknown
191
+ proposalPdfUrl?: string
192
+ proposalStatus?: string
193
+ }
194
+
195
+ export interface MarkProposalSentParams {
196
+ organizationId: string
197
+ contactEmail: string
198
+ }
199
+
200
+ export interface MarkProposalReviewedParams {
201
+ organizationId: string
202
+ contactEmail: string
203
+ reviewedBy: string
204
+ proposalData?: unknown
205
+ }
206
+
207
+ export interface UpdateCloseLostReasonParams {
208
+ organizationId: string
209
+ dealId: string
210
+ reason: string
211
+ }
212
+
213
+ export interface UpdateFeesParams {
214
+ organizationId: string
215
+ contactEmail?: string
216
+ dealId?: string
217
+ initialFee?: number
218
+ monthlyFee?: number
219
+ }
220
+
221
+ export interface SyncDealStageParams {
222
+ organizationId: string
223
+ dealId: string
224
+ stage: string
225
+ }
226
+
227
+ export interface SetContactNurtureParams {
228
+ organizationId: string
229
+ contactEmail: string
230
+ nurture?: boolean
231
+ }
232
+
233
+ export interface DeactivateContactsByCompanyParams {
234
+ organizationId: string
235
+ companyId: string
236
+ }
237
+
238
+ export interface DeactivateContactsByCompanyResult {
239
+ deactivated: number
240
+ }
241
+
242
+ export interface CancelSchedulesAndHitlByEmailParams {
243
+ organizationId: string
244
+ email: string
245
+ }
246
+
247
+ export interface CancelHitlByDealIdParams {
248
+ organizationId: string
249
+ dealId: string
250
+ }
251
+
252
+ export interface ClearDealFieldsParams {
253
+ organizationId: string
254
+ contactEmail?: string
255
+ dealId?: string
256
+ fields: (
257
+ | 'proposalPdfUrl'
258
+ | 'proposalStatus'
259
+ | 'proposalGeneratedAt'
260
+ | 'initialFee'
261
+ | 'monthlyFee'
262
+ | 'closedLostReason'
263
+ | 'closedLostAt'
264
+ | 'discoveryData'
265
+ | 'discoverySubmittedAt'
266
+ )[]
267
+ }
268
+
269
+ export interface DeleteDealParams {
270
+ organizationId: string
271
+ dealId: string
272
+ }
273
+
274
+ export interface GetDealByIdParams {
275
+ dealId: string
276
+ organizationId: string
277
+ }
278
+
279
+ export interface GetContactByIdParams {
280
+ contactId: string
281
+ organizationId: string
282
+ }
283
+
284
+ export interface GetCompanyByIdParams {
285
+ companyId: string
286
+ organizationId: string
287
+ }
288
+
289
+ // Social monitoring params (acq_social_posts table)
290
+ export interface UpsertSocialPostParams {
291
+ organizationId: string
292
+ platform: string
293
+ platformPostId: string
294
+ authorName: string
295
+ authorUrl?: string | null
296
+ postTitle: string
297
+ postText: string
298
+ postUrl: string
299
+ engagementCount?: number
300
+ commentsCount?: number
301
+ postedAt: string
302
+ metadata?: Record<string, unknown>
303
+ relevanceScore?: number
304
+ matchedKeywords?: string[]
305
+ matchedQuery?: string | null
306
+ initialDraft?: string | null
307
+ finalResponse?: string | null
308
+ sourceCategory?: string | null
309
+ }
310
+
311
+ export interface UpsertSocialPostsParams {
312
+ organizationId: string
313
+ posts: Omit<UpsertSocialPostParams, 'organizationId'>[]
314
+ }
315
+
316
+ export interface UpsertSocialPostsResult {
317
+ inserted: number
318
+ duplicatesSkipped: number
319
+ }
320
+
321
+ export interface AcqDeal {
322
+ id: string
323
+ organizationId: string
324
+ contactEmail: string
325
+ cachedStage?: string | null
326
+ discoveryData?: Json | null
327
+ proposalData?: Json | null
328
+ proposalStatus?: string | null
329
+ proposalSentAt?: string | null
330
+ proposalPdfUrl?: string | null
331
+ signatureEnvelopeId?: string | null
332
+ sourceListId?: string | null
333
+ sourceType?: string | null
334
+ activityLog: DealActivityEntry[]
335
+ createdAt: Date
336
+ updatedAt: Date
337
+ }
338
+
339
+ export interface DealActivityEntry {
340
+ type: string
341
+ title: string
342
+ description?: string
343
+ payload?: Record<string, unknown>
344
+ occurredAt: string
345
+ }
346
+
347
+ export interface AcqDealNote {
348
+ id: string
349
+ dealId: string
350
+ organizationId: string
351
+ authorUserId: string | null
352
+ body: string
353
+ createdAt: string
354
+ updatedAt: string
355
+ }
356
+
357
+ export interface CreateDealNoteParams {
358
+ organizationId: string
359
+ dealId: string
360
+ body: string
361
+ authorUserId?: string
362
+ }
363
+
364
+ export interface ListDealNotesParams {
365
+ organizationId: string
366
+ dealId: string
367
+ }
368
+
369
+ export interface CreateDealTaskParams {
370
+ organizationId: string
371
+ dealId: string
372
+ title: string
373
+ description?: string | null
374
+ kind?: AcqDealTaskKind
375
+ dueAt?: string | null
376
+ assigneeUserId?: string | null
377
+ createdByUserId?: string | null
378
+ }
379
+
380
+ export interface ListDealTasksParams {
381
+ organizationId: string
382
+ dealId: string
383
+ }
384
+
385
+ export interface ListDealTasksDueParams {
386
+ organizationId: string
387
+ assigneeUserId?: string | null
388
+ /** Window filter: 'overdue' = past due, 'today' = due today only, 'today_and_overdue' (default) = both, 'upcoming' = future */
389
+ window?: 'overdue' | 'today' | 'today_and_overdue' | 'upcoming'
390
+ }
391
+
392
+ export interface CompleteDealTaskParams {
393
+ organizationId: string
394
+ taskId: string
395
+ completedByUserId: string | null
396
+ }
397
+
398
+ export interface RecordDealActivityParams {
399
+ organizationId: string
400
+ dealId: string
401
+ type: string
402
+ title: string
403
+ description?: string
404
+ payload?: Record<string, unknown>
405
+ }
406
+
407
+ // Deal analytics types (for /meta status and platform-status workflow)
408
+
409
+ export interface DealStageSummary {
410
+ stage: string
411
+ count: number
412
+ oldestUpdatedAt: string | null
413
+ newestUpdatedAt: string | null
414
+ }
415
+
416
+ export interface StaleDeal {
417
+ id: string
418
+ contactEmail: string
419
+ cachedStage: string
420
+ updatedAt: string
421
+ daysStale: number
422
+ }
423
+
424
+ export interface DealPipelineAnalytics {
425
+ totalDeals: number
426
+ stageSummary: DealStageSummary[]
427
+ staleDeals: StaleDeal[]
428
+ recentActivity: AcqDeal[]
429
+ }
430
+
431
+ export interface DealAnalyticsParams {
432
+ organizationId: string
433
+ recentLimit?: number
434
+ }
435
+
436
+ export interface DealFilters {
437
+ stage?: string
438
+ search?: string
439
+ limit?: number
440
+ offset?: number
441
+ }
442
+
443
+ export interface AddContactsToListParams {
444
+ organizationId: string
445
+ listId: string
446
+ contactIds: string[]
447
+ }
448
+
449
+ export interface AddContactsToListResult {
450
+ added: number
451
+ alreadyExisted: number
452
+ }
453
+
454
+ // List config/progress/executions params
455
+ export interface UpdateListConfigParams {
456
+ organizationId: string
457
+ listId: string
458
+ /** Deep-partial patch — any subtree that is present is replaced at that level. */
459
+ configPatch: Record<string, unknown>
460
+ }
461
+
462
+ export interface UpdateCompanyStageParams {
463
+ organizationId: string
464
+ listId: string
465
+ companyId: string
466
+ stage: CompanyListStage
467
+ executionId?: string
468
+ }
469
+
470
+ export interface UpdateContactStageParams {
471
+ organizationId: string
472
+ listId: string
473
+ contactId: string
474
+ stage: ContactListStage
475
+ executionId?: string
476
+ }
477
+
478
+ export interface AddCompaniesToListParams {
479
+ organizationId: string
480
+ listId: string
481
+ companyIds: string[]
482
+ }
483
+
484
+ export interface AddCompaniesToListResult {
485
+ added: number
486
+ alreadyExisted: number
487
+ }
488
+
489
+ export interface RemoveCompaniesFromListParams {
490
+ organizationId: string
491
+ listId: string
492
+ companyIds: string[]
493
+ }
494
+
495
+ export interface RemoveCompaniesFromListResult {
496
+ removed: number
497
+ }
498
+
499
+ export interface RecordListExecutionParams {
500
+ organizationId: string
501
+ listId: string
502
+ executionId: string
503
+ configSnapshot?: Record<string, unknown>
504
+ }
505
+
506
+ export interface ListExecutionSummary {
507
+ executionId: string
508
+ resourceId: string
509
+ status: string
510
+ createdAt: string
511
+ completedAt: string | null
512
+ durationMs: number | null
513
+ }
514
+
515
+ // Bulk import (contacts)
516
+ export interface BulkImportParams {
517
+ organizationId: string
518
+ contacts: CreateContactParams[]
519
+ listId?: string
520
+ }
521
+
522
+ export interface BulkImportResult {
523
+ created: number
524
+ updated: number
525
+ errors: Array<{ email: string; error: string }>
526
+ }
527
+
528
+ // Bulk import (companies)
529
+ export interface BulkImportCompanyEntry {
530
+ name: string
531
+ domain: string
532
+ website?: string
533
+ locationCity?: string
534
+ locationState?: string
535
+ category?: string
536
+ source?: string
537
+ enrichmentData?: Record<string, unknown>
538
+ pipelineStatus?: Record<string, unknown>
539
+ }
540
+
541
+ export interface BulkImportCompaniesParams {
542
+ organizationId: string
543
+ batchId: string
544
+ companies: BulkImportCompanyEntry[]
545
+ }
546
+
547
+ export interface BulkImportCompaniesResult {
548
+ created: number
549
+ skipped: number
550
+ errors: Array<{ companyName: string; error: string }>
551
+ }
552
+
553
+ /**
554
+ * Lead Service interface for acquisition platform tools.
555
+ * Provides CRUD operations for lists, companies, and contacts.
556
+ *
557
+ * Implementation: apps/api/src/acquisition/lead-service.ts (LeadService class)
558
+ *
559
+ * Multi-tenancy: All operations require organizationId for tenant isolation.
560
+ * All queries are filtered by organizationId via RLS policies.
561
+ */
562
+ export interface ILeadService {
563
+ // List operations
564
+ /**
565
+ * Create a new list
566
+ * @see LeadService.createList (apps/api/src/acquisition/lead-service.ts)
567
+ */
568
+ createList(params: CreateListParams): Promise<AcqList>
569
+
570
+ /**
571
+ * Update an existing list
572
+ * @see LeadService.updateList (apps/api/src/acquisition/lead-service.ts)
573
+ */
574
+ updateList(id: string, params: UpdateListParams): Promise<AcqList>
575
+
576
+ /**
577
+ * Delete a list
578
+ * @see LeadService.deleteList (apps/api/src/acquisition/lead-service.ts)
579
+ */
580
+ deleteList(id: string, organizationId: string): Promise<void>
581
+
582
+ /**
583
+ * Add contacts to a list (upsert — idempotent on re-runs)
584
+ * @see LeadService.addContactsToList (apps/api/src/business/acquisition/lead-service.ts)
585
+ */
586
+ addContactsToList(params: AddContactsToListParams): Promise<AddContactsToListResult>
587
+
588
+ /**
589
+ * List all lists for an organization
590
+ * @see LeadService.listLists (apps/api/src/acquisition/lead-service.ts)
591
+ */
592
+ listLists(organizationId: string): Promise<AcqList[]>
593
+
594
+ /**
595
+ * Get a single list by ID.
596
+ */
597
+ getList(id: string, organizationId: string): Promise<AcqList | null>
598
+
599
+ /**
600
+ * Deep-merge patch the jsonb `config` column. Patch keys at any depth
601
+ * replace the corresponding subtree.
602
+ */
603
+ updateListConfig(params: UpdateListConfigParams): Promise<AcqList>
604
+
605
+ /**
606
+ * Add companies to a list via the acq_list_companies junction.
607
+ * Idempotent on (list_id, company_id).
608
+ */
609
+ addCompaniesToList(params: AddCompaniesToListParams): Promise<AddCompaniesToListResult>
610
+
611
+ /**
612
+ * Remove companies from a list (delete junction rows only — company rows untouched).
613
+ */
614
+ removeCompaniesFromList(params: RemoveCompaniesFromListParams): Promise<RemoveCompaniesFromListResult>
615
+
616
+ /**
617
+ * Live org-wide list telemetry — computed on demand from acq_companies
618
+ * and acq_contacts joined through the acq_list_companies / acq_list_members
619
+ * junctions. Replaces the batch-scoped getBatchTelemetry.
620
+ */
621
+ getListsTelemetry(organizationId: string): Promise<ListTelemetry[]>
622
+
623
+ /**
624
+ * Single live rollup read from list junction stage columns.
625
+ */
626
+ getListProgress(listId: string, organizationId: string): Promise<ListTelemetry | null>
627
+
628
+ /**
629
+ * Advance a company row within a list's explicit stage journey.
630
+ */
631
+ updateCompanyStage(params: UpdateCompanyStageParams): Promise<void>
632
+
633
+ /**
634
+ * Advance a contact row within a list's explicit stage journey.
635
+ */
636
+ updateContactStage(params: UpdateContactStageParams): Promise<void>
637
+
638
+ /**
639
+ * Per-list execution history — reads via the feature-owned
640
+ * acq_list_executions junction, joined to execution_logs for details.
641
+ */
642
+ getListExecutions(listId: string, organizationId: string): Promise<ListExecutionSummary[]>
643
+
644
+ /**
645
+ * Write a junction row linking (listId, executionId). Called by the
646
+ * workflow layer at execution start in Step 4. No-op if the row exists.
647
+ */
648
+ recordListExecution(params: RecordListExecutionParams): Promise<void>
649
+
650
+ // Company operations
651
+ /**
652
+ * Create a new company
653
+ * @see LeadService.createCompany (apps/api/src/acquisition/lead-service.ts)
654
+ */
655
+ createCompany(params: CreateCompanyParams): Promise<AcqCompany>
656
+
657
+ /**
658
+ * Update an existing company
659
+ * @see LeadService.updateCompany (apps/api/src/acquisition/lead-service.ts)
660
+ */
661
+ updateCompany(id: string, params: UpdateCompanyParams): Promise<AcqCompany>
662
+
663
+ /**
664
+ * Upsert a company by domain
665
+ * @see LeadService.upsertCompany (apps/api/src/acquisition/lead-service.ts)
666
+ */
667
+ upsertCompany(params: UpsertCompanyParams): Promise<AcqCompany>
668
+
669
+ /**
670
+ * Get a company by ID
671
+ * @see LeadService.getCompany (apps/api/src/acquisition/lead-service.ts)
672
+ */
673
+ getCompany(id: string, organizationId: string): Promise<AcqCompany | null>
674
+
675
+ /**
676
+ * List companies with optional filters
677
+ * @see LeadService.listCompanies (apps/api/src/acquisition/lead-service.ts)
678
+ */
679
+ listCompanies(organizationId: string, filters: CompanyFilters): Promise<AcqCompany[]>
680
+
681
+ /**
682
+ * Delete a company
683
+ * @see LeadService.deleteCompany (apps/api/src/acquisition/lead-service.ts)
684
+ */
685
+ deleteCompany(id: string, organizationId: string): Promise<void>
686
+
687
+ // Contact operations
688
+ /**
689
+ * Create a new contact
690
+ * @see LeadService.createContact (apps/api/src/acquisition/lead-service.ts)
691
+ */
692
+ createContact(params: CreateContactParams): Promise<AcqContact>
693
+
694
+ /**
695
+ * Update an existing contact
696
+ * @see LeadService.updateContact (apps/api/src/acquisition/lead-service.ts)
697
+ */
698
+ updateContact(id: string, params: UpdateContactParams): Promise<AcqContact>
699
+
700
+ /**
701
+ * Upsert a contact by email
702
+ * @see LeadService.upsertContact (apps/api/src/acquisition/lead-service.ts)
703
+ */
704
+ upsertContact(params: UpsertContactParams): Promise<AcqContact>
705
+
706
+ /**
707
+ * Get a contact by ID
708
+ * @see LeadService.getContact (apps/api/src/acquisition/lead-service.ts)
709
+ */
710
+ getContact(id: string, organizationId: string): Promise<AcqContact | null>
711
+
712
+ /**
713
+ * List contacts with pagination and filters
714
+ * @see LeadService.listContacts (apps/api/src/acquisition/lead-service.ts)
715
+ */
716
+ listContacts(
717
+ organizationId: string,
718
+ filters: ContactFilters,
719
+ pagination: PaginationParams
720
+ ): Promise<PaginatedResult<AcqContact>>
721
+
722
+ /**
723
+ * Delete a contact
724
+ * @see LeadService.deleteContact (apps/api/src/acquisition/lead-service.ts)
725
+ */
726
+ deleteContact(id: string, organizationId: string): Promise<void>
727
+
728
+ /**
729
+ * Bulk import contacts
730
+ * @see LeadService.bulkImportContacts (apps/api/src/acquisition/lead-service.ts)
731
+ */
732
+ bulkImportContacts(params: BulkImportParams): Promise<BulkImportResult>
733
+
734
+ /**
735
+ * Bulk import companies with domain dedup (skips existing domains).
736
+ * Inserts in batches using Supabase bulk insert + ON CONFLICT.
737
+ * @see LeadService.bulkImportCompanies (apps/api/src/business/acquisition/lead-service.ts)
738
+ */
739
+ bulkImportCompanies(params: BulkImportCompaniesParams): Promise<BulkImportCompaniesResult>
740
+
741
+ /**
742
+ * Deactivate all active contacts belonging to a company.
743
+ * Used by qualification workflow to cascade company disqualification to contacts.
744
+ */
745
+ deactivateContactsByCompany(params: DeactivateContactsByCompanyParams): Promise<DeactivateContactsByCompanyResult>
746
+
747
+ /**
748
+ * Get a contact by email address
749
+ * Used for looking up existing leads when they reply to outreach
750
+ * @see LeadService.getContactByEmail (apps/api/src/acquisition/lead-service.ts)
751
+ */
752
+ getContactByEmail(email: string, organizationId: string): Promise<AcqContact | null>
753
+
754
+ // Deal operations (acq_deals table)
755
+ /**
756
+ * Upsert a deal by Attio Deal ID
757
+ * Creates or updates acq_deals record linking Attio Deal to Supabase
758
+ * @see LeadService.upsertDeal (apps/api/src/acquisition/lead-service.ts)
759
+ */
760
+ upsertDeal(params: UpsertDealParams): Promise<AcqDeal>
761
+
762
+ /**
763
+ * Get a deal by contact email
764
+ * Used for looking up existing deals when leads book via email (fallback lookup)
765
+ * @see LeadService.getDealByEmail (apps/api/src/acquisition/lead-service.ts)
766
+ */
767
+ getDealByEmail(email: string, organizationId: string): Promise<AcqDeal | null>
768
+
769
+ /**
770
+ * Get a deal by SignatureAPI envelope ID
771
+ * Used by webhook handler to find deal when contract is signed
772
+ * @see LeadService.getDealByEnvelopeId (apps/api/src/acquisition/lead-service.ts)
773
+ */
774
+ getDealByEnvelopeId(envelopeId: string, organizationId: string): Promise<AcqDeal | null>
775
+
776
+ /**
777
+ * Update deal with signature envelope ID
778
+ * Called when proposal is sent via SignatureAPI
779
+ * @see LeadService.updateDealEnvelopeId (apps/api/src/acquisition/lead-service.ts)
780
+ */
781
+ updateDealEnvelopeId(dealId: string, envelopeId: string, organizationId: string): Promise<AcqDeal | null>
782
+
783
+ // Deal-sync operations (mirror deal-sync.ts utilities as server-side methods)
784
+
785
+ getDealById(params: GetDealByIdParams): Promise<AcqDeal | null>
786
+
787
+ getContactById(params: GetContactByIdParams): Promise<AcqContact | null>
788
+
789
+ getCompanyById(params: GetCompanyByIdParams): Promise<AcqCompany | null>
790
+
791
+ updateDiscoveryData(params: UpdateDiscoveryDataParams): Promise<void>
792
+
793
+ updateProposalData(params: UpdateProposalDataParams): Promise<void>
794
+
795
+ markProposalSent(params: MarkProposalSentParams): Promise<void>
796
+
797
+ markProposalReviewed(params: MarkProposalReviewedParams): Promise<void>
798
+
799
+ updateCloseLostReason(params: UpdateCloseLostReasonParams): Promise<void>
800
+
801
+ updateFees(params: UpdateFeesParams): Promise<void>
802
+
803
+ syncDealStage(params: SyncDealStageParams): Promise<void>
804
+
805
+ setContactNurture(params: SetContactNurtureParams): Promise<void>
806
+
807
+ cancelSchedulesAndHitlByEmail(
808
+ params: CancelSchedulesAndHitlByEmailParams
809
+ ): Promise<{ schedulesCancelled: number; hitlDeleted: number }>
810
+
811
+ cancelHitlByDealId(params: CancelHitlByDealIdParams): Promise<{ hitlDeleted: number }>
812
+
813
+ clearDealFields(params: ClearDealFieldsParams): Promise<void>
814
+
815
+ deleteDeal(params: DeleteDealParams): Promise<void>
816
+
817
+ listDeals(organizationId: string, filters?: DealFilters): Promise<AcqDeal[]>
818
+
819
+ getDealPipelineAnalytics(organizationId: string, recentLimit?: number): Promise<DealPipelineAnalytics>
820
+
821
+ /**
822
+ * Deep-merge enrichment data into a company or contact record.
823
+ * Merges per source key rather than wholesale replacing the JSONB object.
824
+ * @see LeadService.mergeEnrichmentData (apps/api/src/business/acquisition/lead-service.ts)
825
+ */
826
+ mergeEnrichmentData(
827
+ id: string,
828
+ orgId: string,
829
+ table: 'acq_companies' | 'acq_contacts',
830
+ data: Record<string, unknown>
831
+ ): Promise<void>
832
+
833
+ // Deal note operations (acq_deal_notes table)
834
+ /**
835
+ * Create a human-authored note on a deal
836
+ * @see LeadService.createDealNote (apps/api/src/business/acquisition/lead-service.ts)
837
+ */
838
+ createDealNote(params: CreateDealNoteParams): Promise<AcqDealNote>
839
+
840
+ /**
841
+ * List notes for a deal, ordered by created_at DESC
842
+ * @see LeadService.listDealNotes (apps/api/src/business/acquisition/lead-service.ts)
843
+ */
844
+ listDealNotes(params: ListDealNotesParams): Promise<AcqDealNote[]>
845
+
846
+ // Deal task operations (acq_deal_tasks table)
847
+ /**
848
+ * Creates a new task attached to a deal.
849
+ * @see LeadService.createDealTask (apps/api/src/business/acquisition/lead-service.ts)
850
+ */
851
+ createDealTask(params: CreateDealTaskParams): Promise<AcqDealTask>
852
+
853
+ /**
854
+ * Lists all tasks for a given deal, ordered by due date.
855
+ * @see LeadService.listDealTasks (apps/api/src/business/acquisition/lead-service.ts)
856
+ */
857
+ listDealTasks(params: ListDealTasksParams): Promise<AcqDealTask[]>
858
+
859
+ /**
860
+ * Lists open (uncompleted) tasks within a date window across all deals.
861
+ * @see LeadService.listDealTasksDue (apps/api/src/business/acquisition/lead-service.ts)
862
+ */
863
+ listDealTasksDue(params: ListDealTasksDueParams): Promise<AcqDealTask[]>
864
+
865
+ /**
866
+ * Marks a task as completed.
867
+ * @see LeadService.completeDealTask (apps/api/src/business/acquisition/lead-service.ts)
868
+ */
869
+ completeDealTask(params: CompleteDealTaskParams): Promise<AcqDealTask>
870
+
871
+ /**
872
+ * Record a deal activity entry by deal ID.
873
+ * Generic method for any activity type — used by SDK workflows.
874
+ * @see LeadService.recordDealActivity (apps/api/src/business/acquisition/lead-service.ts)
875
+ */
876
+ recordDealActivity(params: RecordDealActivityParams): Promise<void>
877
+
878
+ // Social monitoring operations (acq_social_posts table)
879
+ /**
880
+ * Bulk upsert social posts (deduplicate by platform + platform_post_id)
881
+ * @see LeadService.upsertSocialPosts (apps/api/src/business/acquisition/lead-service.ts)
882
+ */
883
+ upsertSocialPosts(params: UpsertSocialPostsParams): Promise<UpsertSocialPostsResult>
884
+ }