@elevasis/core 0.7.1 → 0.8.2

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 (476) hide show
  1. package/dist/test-utils/index.d.ts +3122 -0
  2. package/dist/test-utils/index.js +386 -0
  3. package/package.json +6 -1
  4. package/src/README.md +39 -36
  5. package/src/__tests__/publish.test.ts +18 -13
  6. package/src/__tests__/{template-foundations-compatibility.test.ts → template-core-compatibility.test.ts} +99 -99
  7. package/src/_gen/__tests__/__snapshots__/contracts.md.snap +1135 -1131
  8. package/src/_gen/__tests__/scaffold-contracts.test.ts +47 -36
  9. package/src/_gen/scaffold-contracts.ts +45 -45
  10. package/src/auth/multi-tenancy/credentials/README.md +38 -38
  11. package/src/auth/multi-tenancy/credentials/index.ts +6 -6
  12. package/src/auth/multi-tenancy/credentials/server/encryption.ts +39 -39
  13. package/src/auth/multi-tenancy/credentials/server/service.ts +60 -60
  14. package/src/auth/multi-tenancy/index.ts +17 -17
  15. package/src/auth/multi-tenancy/invitations/api-schemas.ts +107 -107
  16. package/src/auth/multi-tenancy/invitations/index.ts +37 -37
  17. package/src/auth/multi-tenancy/invitations/invitation.ts +86 -86
  18. package/src/auth/multi-tenancy/invitations/server/index.ts +25 -25
  19. package/src/auth/multi-tenancy/invitations/server/transforms.ts +24 -24
  20. package/src/auth/multi-tenancy/invitations/server/workos.ts +24 -24
  21. package/src/auth/multi-tenancy/invitations/supabase.ts +50 -50
  22. package/src/auth/multi-tenancy/memberships/api-schemas.ts +126 -126
  23. package/src/auth/multi-tenancy/memberships/index.ts +21 -21
  24. package/src/auth/multi-tenancy/memberships/membership.ts +138 -138
  25. package/src/auth/multi-tenancy/memberships/server/index.ts +15 -15
  26. package/src/auth/multi-tenancy/memberships/server/transforms.ts +32 -32
  27. package/src/auth/multi-tenancy/memberships/server/workos.ts +21 -21
  28. package/src/auth/multi-tenancy/memberships/supabase.ts +46 -46
  29. package/src/auth/multi-tenancy/organizations/api-schemas.ts +128 -128
  30. package/src/auth/multi-tenancy/organizations/index.ts +23 -23
  31. package/src/auth/multi-tenancy/organizations/organization.ts +24 -24
  32. package/src/auth/multi-tenancy/organizations/server/index.ts +10 -10
  33. package/src/auth/multi-tenancy/organizations/server/transforms.ts +35 -35
  34. package/src/auth/multi-tenancy/organizations/server/workos.ts +20 -20
  35. package/src/auth/multi-tenancy/types.ts +83 -83
  36. package/src/auth/multi-tenancy/users/api-schemas.ts +194 -194
  37. package/src/auth/multi-tenancy/users/index.ts +27 -27
  38. package/src/auth/multi-tenancy/users/server/index.ts +19 -19
  39. package/src/auth/multi-tenancy/users/server/transforms.ts +21 -21
  40. package/src/auth/multi-tenancy/users/server/workos.ts +16 -16
  41. package/src/auth/multi-tenancy/users/user.ts +65 -65
  42. package/src/business/README.md +52 -52
  43. package/src/business/__tests__/entities-published.test.ts +33 -33
  44. package/src/business/acquisition/api-schemas.ts +759 -759
  45. package/src/business/acquisition/index.ts +109 -109
  46. package/src/business/acquisition/types.ts +402 -402
  47. package/src/business/base-entities.test.ts +481 -481
  48. package/src/business/base-entities.ts +241 -241
  49. package/src/business/entities-published.ts +24 -24
  50. package/src/business/index.ts +15 -15
  51. package/src/business/pdf/browser/pdfmake-browser.ts +229 -229
  52. package/src/business/pdf/index.ts +10 -10
  53. package/src/business/pdf/server/index.ts +21 -21
  54. package/src/business/pdf/server/themes/default.ts +8 -8
  55. package/src/business/pdf/server/themes/index.ts +9 -9
  56. package/src/business/pdf/server/themes/types.ts +8 -8
  57. package/src/business/pdf/types.ts +272 -272
  58. package/src/business/projects/index.ts +2 -2
  59. package/src/business/projects/sse-events.ts +21 -21
  60. package/src/business/projects/types.ts +89 -89
  61. package/src/business/sales/api-schemas.ts +75 -75
  62. package/src/business/seo/__tests__/linking.test.ts +549 -549
  63. package/src/business/seo/__tests__/types.test.ts +404 -404
  64. package/src/business/seo/index.ts +2 -2
  65. package/src/business/seo/linking.ts +281 -281
  66. package/src/business/seo/types.ts +199 -199
  67. package/src/commands/queue/index.ts +3 -3
  68. package/src/commands/queue/schemas.test.ts +593 -593
  69. package/src/commands/queue/schemas.ts +125 -125
  70. package/src/commands/queue/sse-events.ts +61 -61
  71. package/src/commands/queue/types/action.ts +52 -52
  72. package/src/commands/queue/types/checkpoint.ts +44 -44
  73. package/src/commands/queue/types/index.ts +7 -7
  74. package/src/commands/queue/types/task.ts +116 -116
  75. package/src/commands/queue/types.ts +14 -14
  76. package/src/content/distribution-metadata.ts +61 -61
  77. package/src/content/index.ts +10 -10
  78. package/src/deployments/index.ts +22 -22
  79. package/src/execution/core/__tests__/archived-logs.test.ts +72 -72
  80. package/src/execution/core/index.ts +11 -11
  81. package/src/execution/core/runner-types.ts +80 -80
  82. package/src/execution/core/server/environment.ts +31 -31
  83. package/src/execution/core/sse-executions.ts +119 -119
  84. package/src/execution/core/types.ts +29 -29
  85. package/src/execution/engine/__tests__/fixtures/test-agents.ts +4 -4
  86. package/src/execution/engine/__tests__/timeout.test.ts +565 -565
  87. package/src/execution/engine/agent/__tests__/errors.test.ts +508 -508
  88. package/src/execution/engine/agent/actions/__tests__/processor.test.ts +531 -531
  89. package/src/execution/engine/agent/actions/executor.ts +205 -205
  90. package/src/execution/engine/agent/actions/navigate-knowledge-executor.ts +230 -230
  91. package/src/execution/engine/agent/actions/processor.ts +116 -116
  92. package/src/execution/engine/agent/actions/types.ts +70 -70
  93. package/src/execution/engine/agent/core/agent.ts +810 -810
  94. package/src/execution/engine/agent/core/types.ts +155 -155
  95. package/src/execution/engine/agent/errors.ts +251 -251
  96. package/src/execution/engine/agent/index.ts +78 -78
  97. package/src/execution/engine/agent/knowledge-map/types.ts +106 -106
  98. package/src/execution/engine/agent/knowledge-map/utils.ts +101 -101
  99. package/src/execution/engine/agent/memory/__tests__/manager.test.ts +754 -754
  100. package/src/execution/engine/agent/memory/domains.ts +99 -99
  101. package/src/execution/engine/agent/memory/manager.ts +365 -365
  102. package/src/execution/engine/agent/memory/processor.ts +66 -66
  103. package/src/execution/engine/agent/memory/types.ts +90 -90
  104. package/src/execution/engine/agent/memory/utils.ts +134 -134
  105. package/src/execution/engine/agent/observability/logging.ts +467 -467
  106. package/src/execution/engine/agent/observability/types.ts +64 -64
  107. package/src/execution/engine/agent/reasoning/adapters/agent-adapter-helpers.ts +349 -349
  108. package/src/execution/engine/agent/reasoning/processor.ts +92 -92
  109. package/src/execution/engine/agent/reasoning/prompt-sections/base-actions.ts +134 -134
  110. package/src/execution/engine/agent/reasoning/prompt-sections/completion.ts +49 -49
  111. package/src/execution/engine/agent/reasoning/prompt-sections/knowledge-map.ts +93 -93
  112. package/src/execution/engine/agent/reasoning/prompt-sections/memory.ts +65 -65
  113. package/src/execution/engine/agent/reasoning/prompt-sections/tools.ts +44 -44
  114. package/src/execution/engine/agent/reasoning/request-builder.ts +169 -169
  115. package/src/execution/engine/agent/reasoning/types.ts +18 -18
  116. package/src/execution/engine/base/errors.ts +118 -118
  117. package/src/execution/engine/base/index.ts +2 -2
  118. package/src/execution/engine/base/logging.ts +31 -31
  119. package/src/execution/engine/base/serialization.ts +324 -324
  120. package/src/execution/engine/base/types.ts +126 -126
  121. package/src/execution/engine/base/utils.ts +41 -41
  122. package/src/execution/engine/index.ts +434 -434
  123. package/src/execution/engine/interface/index.ts +1 -1
  124. package/src/execution/engine/interface/types.ts +62 -62
  125. package/src/execution/engine/llm/__tests__/model-info.test.ts +50 -50
  126. package/src/execution/engine/llm/__tests__/model-validation.test.ts +321 -321
  127. package/src/execution/engine/llm/__tests__/response-schema-validator.test.ts +115 -115
  128. package/src/execution/engine/llm/adapters/__tests__/adapter-factory.test.ts +375 -375
  129. package/src/execution/engine/llm/adapters/__tests__/anthropic-adapter.test.ts +463 -463
  130. package/src/execution/engine/llm/adapters/__tests__/anthropic.integration.test.ts +177 -177
  131. package/src/execution/engine/llm/adapters/__tests__/google-adapter.test.ts +722 -722
  132. package/src/execution/engine/llm/adapters/__tests__/google.integration.test.ts +376 -376
  133. package/src/execution/engine/llm/adapters/__tests__/openai-adapter.test.ts +551 -551
  134. package/src/execution/engine/llm/adapters/__tests__/openrouter-adapter.test.ts +563 -563
  135. package/src/execution/engine/llm/adapters/__tests__/openrouter.integration.test.ts +105 -105
  136. package/src/execution/engine/llm/adapters/__tests__/universal-adapter.test.ts +537 -537
  137. package/src/execution/engine/llm/adapters/circuit-breaker.ts +147 -147
  138. package/src/execution/engine/llm/adapters/index.ts +17 -17
  139. package/src/execution/engine/llm/adapters/mock-adapter.ts +116 -116
  140. package/src/execution/engine/llm/adapters/server/adapter-factory.ts +130 -130
  141. package/src/execution/engine/llm/adapters/server/anthropic.ts +137 -137
  142. package/src/execution/engine/llm/adapters/server/google.ts +283 -283
  143. package/src/execution/engine/llm/adapters/server/index.ts +12 -12
  144. package/src/execution/engine/llm/adapters/server/openai.ts +206 -206
  145. package/src/execution/engine/llm/adapters/server/openrouter.ts +235 -235
  146. package/src/execution/engine/llm/adapters/universal-adapter.ts +230 -230
  147. package/src/execution/engine/llm/errors.ts +186 -186
  148. package/src/execution/engine/llm/model-info.ts +332 -332
  149. package/src/execution/engine/llm/response-schema-validator.ts +113 -113
  150. package/src/execution/engine/llm/types.ts +86 -86
  151. package/src/execution/engine/test-utils/index.ts +6 -6
  152. package/src/execution/engine/test-utils/mocks.ts +56 -56
  153. package/src/execution/engine/tools/integration/base-integration-adapter.ts +50 -50
  154. package/src/execution/engine/tools/integration/index.ts +53 -53
  155. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-adapter.ts +73 -73
  156. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-tools.ts +209 -209
  157. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-company-email/index.ts +82 -82
  158. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-decision-maker-email/index.ts +122 -122
  159. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-person-email/index.ts +89 -89
  160. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/verify-email/index.ts +84 -84
  161. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/index.ts +16 -16
  162. package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +293 -293
  163. package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +100 -100
  164. package/src/execution/engine/tools/integration/server/adapters/apify/apify-tools.ts +217 -217
  165. package/src/execution/engine/tools/integration/server/adapters/apify/fetch/get-dataset-items/index.ts +92 -92
  166. package/src/execution/engine/tools/integration/server/adapters/apify/fetch/run-actor/index.ts +218 -218
  167. package/src/execution/engine/tools/integration/server/adapters/apify/fetch/start-actor/index.ts +87 -87
  168. package/src/execution/engine/tools/integration/server/adapters/apify/index.ts +11 -11
  169. package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +361 -361
  170. package/src/execution/engine/tools/integration/server/adapters/attio/attio-adapter.ts +162 -162
  171. package/src/execution/engine/tools/integration/server/adapters/attio/attio-tools.ts +594 -594
  172. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-attribute/index.ts +214 -214
  173. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-note/index.ts +152 -152
  174. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-record/index.ts +141 -141
  175. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-note/index.ts +86 -86
  176. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-record/index.ts +105 -105
  177. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.ts +118 -118
  178. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-attributes/index.ts +165 -165
  179. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-notes/index.ts +96 -96
  180. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-objects/index.ts +104 -104
  181. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.ts +156 -156
  182. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-attribute/index.ts +220 -220
  183. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-record/index.ts +140 -140
  184. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/utils/types.ts +146 -146
  185. package/src/execution/engine/tools/integration/server/adapters/attio/index.ts +31 -31
  186. package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +210 -210
  187. package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +104 -104
  188. package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -261
  189. package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-adapter.ts +1189 -1189
  190. package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-tools.ts +641 -641
  191. package/src/execution/engine/tools/integration/server/adapters/google-sheets/index.ts +18 -18
  192. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/activate-campaign/index.ts +86 -86
  193. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/__tests__/index.test.ts +289 -289
  194. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/index.ts +154 -154
  195. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/__tests__/index.test.ts +325 -325
  196. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/index.ts +153 -153
  197. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-delete-leads/index.ts +84 -84
  198. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-campaign/index.ts +125 -125
  199. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-inbox-test/index.ts +107 -107
  200. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/delete-campaign/index.ts +85 -85
  201. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-account-health/index.ts +91 -91
  202. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign/index.ts +92 -92
  203. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/__tests__/index.test.ts +195 -195
  204. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/index.ts +113 -113
  205. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-daily-campaign-analytics/index.ts +104 -104
  206. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-emails/index.ts +155 -155
  207. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/__tests__/index.test.ts +196 -196
  208. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/index.ts +102 -102
  209. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/__tests__/index.test.ts +189 -189
  210. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/index.ts +87 -87
  211. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-leads/index.ts +112 -112
  212. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/patch-lead/index.ts +76 -76
  213. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/pause-campaign/index.ts +86 -86
  214. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/remove-from-subsequence/index.ts +98 -98
  215. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/send-reply/index.ts +126 -126
  216. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/__tests__/index.test.ts +193 -193
  217. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/index.ts +99 -99
  218. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/__tests__/index.test.ts +621 -621
  219. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/index.ts +125 -125
  220. package/src/execution/engine/tools/integration/server/adapters/instantly/index.ts +29 -29
  221. package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-adapter.ts +178 -178
  222. package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1473 -1473
  223. package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/check-credits/index.ts +59 -59
  224. package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/verify-email/index.ts +102 -102
  225. package/src/execution/engine/tools/integration/server/adapters/millionverifier/index.ts +17 -17
  226. package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-adapter.ts +80 -80
  227. package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +102 -102
  228. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/get-email/index.ts +102 -102
  229. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +134 -134
  230. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +75 -75
  231. package/src/execution/engine/tools/integration/server/adapters/resend/index.ts +27 -27
  232. package/src/execution/engine/tools/integration/server/adapters/resend/resend-adapter.ts +108 -108
  233. package/src/execution/engine/tools/integration/server/adapters/resend/resend-tools.ts +132 -132
  234. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/create-envelope/index.ts +274 -274
  235. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/download-document/index.ts +230 -230
  236. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/get-envelope/index.ts +133 -133
  237. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/void-envelope/index.ts +90 -90
  238. package/src/execution/engine/tools/integration/server/adapters/stripe/fetch/utils/types.ts +210 -210
  239. package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-adapter.ts +517 -517
  240. package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +309 -309
  241. package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/domain-search/index.ts +133 -133
  242. package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-finder/index.ts +122 -122
  243. package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-verifier/index.ts +111 -111
  244. package/src/execution/engine/tools/integration/server/adapters/tomba/index.ts +11 -11
  245. package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-adapter.ts +78 -78
  246. package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-tools.ts +222 -222
  247. package/src/execution/engine/tools/integration/server/index.ts +61 -61
  248. package/src/execution/engine/tools/integration/service.ts +161 -161
  249. package/src/execution/engine/tools/integration/tool.ts +253 -253
  250. package/src/execution/engine/tools/integration/types/anymailfinder.ts +74 -74
  251. package/src/execution/engine/tools/integration/types/apify.ts +92 -92
  252. package/src/execution/engine/tools/integration/types/index.ts +19 -19
  253. package/src/execution/engine/tools/integration/types/instantly.ts +557 -557
  254. package/src/execution/engine/tools/integration/types/millionverifier.ts +56 -56
  255. package/src/execution/engine/tools/integration/types/stripe.ts +162 -162
  256. package/src/execution/engine/tools/integration/types/tomba.ts +94 -94
  257. package/src/execution/engine/tools/lead-service-types.ts +884 -884
  258. package/src/execution/engine/tools/llm/index.ts +11 -11
  259. package/src/execution/engine/tools/llm/server/index.ts +8 -8
  260. package/src/execution/engine/tools/llm/server/llm-call-tool.ts +118 -118
  261. package/src/execution/engine/tools/platform/__tests__/pdf.test.ts +441 -441
  262. package/src/execution/engine/tools/platform/acquisition/company-tools.ts +248 -248
  263. package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +319 -319
  264. package/src/execution/engine/tools/platform/acquisition/index.ts +43 -43
  265. package/src/execution/engine/tools/platform/acquisition/list-tools.ts +148 -148
  266. package/src/execution/engine/tools/platform/acquisition/types.ts +260 -260
  267. package/src/execution/engine/tools/platform/email/index.ts +122 -122
  268. package/src/execution/engine/tools/platform/email/types.ts +96 -96
  269. package/src/execution/engine/tools/platform/index.ts +157 -157
  270. package/src/execution/engine/tools/platform/notification.ts +81 -81
  271. package/src/execution/engine/tools/platform/pdf/index.ts +110 -110
  272. package/src/execution/engine/tools/platform/pdf/types.ts +77 -77
  273. package/src/execution/engine/tools/platform/scheduler.ts +87 -87
  274. package/src/execution/engine/tools/platform/storage/index.ts +370 -370
  275. package/src/execution/engine/tools/platform/types.ts +148 -148
  276. package/src/execution/engine/tools/registry.ts +700 -700
  277. package/src/execution/engine/tools/tool-maps.ts +786 -786
  278. package/src/execution/engine/tools/types.ts +233 -233
  279. package/src/execution/engine/workflow/__tests__/errors.test.ts +139 -139
  280. package/src/execution/engine/workflow/errors.ts +63 -63
  281. package/src/execution/engine/workflow/helpers/index.ts +11 -11
  282. package/src/execution/engine/workflow/helpers/server/index.ts +8 -8
  283. package/src/execution/engine/workflow/helpers/server/llm-call.ts +93 -93
  284. package/src/execution/engine/workflow/index.ts +19 -19
  285. package/src/execution/engine/workflow/log-truncate.ts +26 -26
  286. package/src/execution/engine/workflow/logging.ts +191 -191
  287. package/src/execution/engine/workflow/types.ts +182 -182
  288. package/src/execution/engine/workflow/utils.ts +280 -280
  289. package/src/execution/engine/workflow/workflow.ts +168 -168
  290. package/src/execution/index.ts +3 -3
  291. package/src/execution/scheduler/__tests__/api-schemas.test.ts +733 -733
  292. package/src/execution/scheduler/__tests__/utils.test.ts +1009 -1009
  293. package/src/execution/scheduler/api-schemas.ts +296 -296
  294. package/src/execution/scheduler/index.ts +50 -50
  295. package/src/execution/scheduler/schemas.ts +264 -264
  296. package/src/execution/scheduler/types.ts +111 -111
  297. package/src/execution/scheduler/utils.ts +364 -364
  298. package/src/forms/index.ts +7 -7
  299. package/src/forms/schemas.ts +69 -69
  300. package/src/forms/types.ts +70 -70
  301. package/src/index.ts +71 -60
  302. package/src/integrations/credentials/__tests__/schemas.test.ts +82 -82
  303. package/src/integrations/credentials/__tests__/utils.test.ts +144 -144
  304. package/src/integrations/credentials/api-schemas.ts +143 -143
  305. package/src/integrations/credentials/index.ts +32 -32
  306. package/src/integrations/credentials/schemas.ts +164 -164
  307. package/src/integrations/credentials/utils.ts +59 -59
  308. package/src/integrations/oauth/__tests__/provider-registry.test.ts +59 -59
  309. package/src/integrations/oauth/api-schemas.ts +92 -92
  310. package/src/integrations/oauth/index.ts +19 -19
  311. package/src/integrations/oauth/provider-registry.ts +61 -61
  312. package/src/integrations/oauth/server/__tests__/refresh-concurrent.test.ts +183 -183
  313. package/src/integrations/oauth/server/__tests__/refresh.test.ts +577 -577
  314. package/src/integrations/oauth/server/credentials.ts +39 -39
  315. package/src/integrations/oauth/server/refresh.ts +214 -214
  316. package/src/integrations/oauth/types.ts +34 -34
  317. package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +318 -318
  318. package/src/integrations/webhook-endpoints/api-schemas.ts +102 -102
  319. package/src/integrations/webhook-endpoints/index.ts +28 -28
  320. package/src/integrations/webhook-endpoints/types.ts +51 -51
  321. package/src/operations/activities/api-schemas.ts +79 -79
  322. package/src/operations/activities/index.ts +9 -9
  323. package/src/operations/activities/sse-events.ts +30 -30
  324. package/src/operations/activities/types.ts +63 -63
  325. package/src/operations/debug-logs/client.ts +60 -60
  326. package/src/operations/debug-logs/debug-logger.ts +83 -83
  327. package/src/operations/debug-logs/index.ts +8 -8
  328. package/src/operations/debug-logs/server.ts +19 -19
  329. package/src/operations/debug-logs/types.ts +33 -33
  330. package/src/operations/index.ts +50 -50
  331. package/src/operations/notifications/api-schemas.ts +91 -91
  332. package/src/operations/notifications/index.ts +3 -3
  333. package/src/operations/notifications/sse-events.ts +21 -21
  334. package/src/operations/notifications/types.ts +47 -47
  335. package/src/operations/observability/__tests__/openrouter-cost-flow.test.ts +297 -297
  336. package/src/operations/observability/__tests__/utils.test.ts +54 -54
  337. package/src/operations/observability/ai-usage-collector.ts +64 -64
  338. package/src/operations/observability/index.ts +13 -13
  339. package/src/operations/observability/metrics-collector.ts +49 -49
  340. package/src/operations/observability/schemas.ts +39 -39
  341. package/src/operations/observability/types.ts +463 -463
  342. package/src/operations/observability/utils.ts +77 -77
  343. package/src/operations/sessions/__tests__/manager.test.ts +821 -821
  344. package/src/operations/sessions/index.ts +26 -26
  345. package/src/operations/sessions/server/manager.ts +90 -90
  346. package/src/operations/sessions/server/session.ts +180 -180
  347. package/src/operations/sessions/types.ts +98 -98
  348. package/src/operations/triggers/index.ts +12 -12
  349. package/src/operations/triggers/webhook/definitions/instantly-account-error.ts +44 -44
  350. package/src/operations/triggers/webhook/definitions/instantly-auto-reply-received.ts +51 -51
  351. package/src/operations/triggers/webhook/definitions/instantly-campaign-completed.ts +45 -45
  352. package/src/operations/triggers/webhook/definitions/instantly-email-bounced.ts +49 -49
  353. package/src/operations/triggers/webhook/definitions/instantly-lead-unsubscribed.ts +45 -45
  354. package/src/operations/triggers/webhook/definitions/instantly-reply-received.ts +54 -54
  355. package/src/operations/triggers/webhook/index.ts +35 -35
  356. package/src/operations/triggers/webhook/types.ts +74 -74
  357. package/src/organization-model/README.md +97 -97
  358. package/src/organization-model/__tests__/defaults.test.ts +175 -175
  359. package/src/organization-model/__tests__/domains/customers.test.ts +295 -295
  360. package/src/organization-model/__tests__/domains/goals.test.ts +479 -479
  361. package/src/organization-model/__tests__/domains/identity.test.ts +279 -279
  362. package/src/organization-model/__tests__/domains/navigation.test.ts +212 -212
  363. package/src/organization-model/__tests__/domains/offerings.test.ts +419 -419
  364. package/src/organization-model/__tests__/domains/operations.test.ts +203 -203
  365. package/src/organization-model/__tests__/domains/resource-mappings.test.ts +362 -362
  366. package/src/organization-model/__tests__/domains/roles.test.ts +347 -347
  367. package/src/organization-model/__tests__/domains/statuses.test.ts +243 -243
  368. package/src/organization-model/__tests__/foundation.test.ts +105 -105
  369. package/src/organization-model/__tests__/graph.test.ts +894 -894
  370. package/src/organization-model/__tests__/resolve.test.ts +690 -690
  371. package/src/organization-model/__tests__/schema.test.ts +407 -407
  372. package/src/organization-model/contracts.ts +14 -14
  373. package/src/organization-model/defaults.ts +148 -148
  374. package/src/organization-model/domains/branding.ts +22 -22
  375. package/src/organization-model/domains/customers.ts +75 -75
  376. package/src/organization-model/domains/features.ts +22 -22
  377. package/src/organization-model/domains/goals.ts +80 -80
  378. package/src/organization-model/domains/identity.ts +94 -94
  379. package/src/organization-model/domains/navigation.ts +391 -391
  380. package/src/organization-model/domains/offerings.ts +66 -66
  381. package/src/organization-model/domains/operations.ts +85 -85
  382. package/src/organization-model/domains/projects.ts +48 -48
  383. package/src/organization-model/domains/prospecting.ts +33 -33
  384. package/src/organization-model/domains/roles.ts +55 -55
  385. package/src/organization-model/domains/sales.ts +94 -94
  386. package/src/organization-model/domains/shared.ts +62 -62
  387. package/src/organization-model/domains/statuses.ts +130 -130
  388. package/src/organization-model/foundation.ts +97 -97
  389. package/src/organization-model/graph/build.ts +399 -399
  390. package/src/organization-model/graph/index.ts +4 -4
  391. package/src/organization-model/graph/schema.ts +48 -48
  392. package/src/organization-model/graph/types.ts +40 -40
  393. package/src/organization-model/index.ts +13 -13
  394. package/src/organization-model/organization-graph.mdx +272 -272
  395. package/src/organization-model/organization-model.mdx +320 -320
  396. package/src/organization-model/published.ts +85 -85
  397. package/src/organization-model/resolve.ts +66 -66
  398. package/src/organization-model/schema.ts +287 -287
  399. package/src/organization-model/types.ts +46 -46
  400. package/src/platform/api/index.ts +1 -1
  401. package/src/platform/api/types.ts +35 -35
  402. package/src/platform/constants/http.ts +37 -37
  403. package/src/platform/constants/index.ts +5 -5
  404. package/src/platform/constants/limits.ts +32 -32
  405. package/src/platform/constants/resilience.ts +51 -51
  406. package/src/platform/constants/timeouts.ts +20 -20
  407. package/src/platform/constants/versions.ts +3 -3
  408. package/src/platform/registry/__tests__/resource-registry-static.test.ts +347 -347
  409. package/src/platform/registry/__tests__/resource-registry.integration.test.ts +1028 -1028
  410. package/src/platform/registry/__tests__/resource-registry.list-executable.test.ts +393 -393
  411. package/src/platform/registry/__tests__/resource-registry.test.ts +2005 -2005
  412. package/src/platform/registry/__tests__/serialization.test.ts +1127 -1127
  413. package/src/platform/registry/command-view.ts +180 -180
  414. package/src/platform/registry/domains.ts +165 -165
  415. package/src/platform/registry/index.ts +93 -93
  416. package/src/platform/registry/reserved.ts +24 -24
  417. package/src/platform/registry/resource-metadata.ts +59 -59
  418. package/src/platform/registry/resource-registry.command-queue-groups.test.ts +129 -129
  419. package/src/platform/registry/resource-registry.ts +876 -876
  420. package/src/platform/registry/serialization.ts +273 -273
  421. package/src/platform/registry/serialized-types.ts +231 -231
  422. package/src/platform/registry/stats-types.ts +66 -66
  423. package/src/platform/registry/types.ts +404 -404
  424. package/src/platform/registry/validation.ts +513 -513
  425. package/src/platform/resilience/__tests__/rate-limiter.test.ts +471 -471
  426. package/src/platform/resilience/circuit-breaker.ts +164 -164
  427. package/src/platform/resilience/errors.ts +68 -68
  428. package/src/platform/resilience/http-error-mapper.ts +129 -129
  429. package/src/platform/resilience/index.ts +93 -93
  430. package/src/platform/resilience/rate-limiter-types.ts +46 -46
  431. package/src/platform/resilience/rate-limiter.ts +140 -140
  432. package/src/platform/resilience/retry.ts +89 -89
  433. package/src/platform/resilience/timeout.ts +63 -63
  434. package/src/platform/sse/events.ts +37 -37
  435. package/src/platform/sse/index.ts +7 -7
  436. package/src/platform/utils/__tests__/validation.test.ts +1083 -1083
  437. package/src/platform/utils/currency.ts +96 -96
  438. package/src/platform/utils/debounce.ts +52 -52
  439. package/src/platform/utils/error.ts +41 -41
  440. package/src/platform/utils/hmac.test.ts +97 -97
  441. package/src/platform/utils/index.ts +32 -32
  442. package/src/platform/utils/server/betterstack-logger.ts +210 -210
  443. package/src/platform/utils/server/hmac.ts +44 -44
  444. package/src/platform/utils/server/unsubscribe.ts +111 -111
  445. package/src/platform/utils/token-counter.ts +96 -96
  446. package/src/platform/utils/validation.ts +425 -425
  447. package/src/projects/api-schemas.ts +268 -268
  448. package/src/published.ts +1 -1
  449. package/src/reference/_generated/contracts.md +607 -607
  450. package/src/reference/glossary.md +105 -105
  451. package/src/requests/__tests__/api-schemas.test.ts +277 -277
  452. package/src/requests/api-schemas.ts +83 -83
  453. package/src/requests/index.ts +1 -1
  454. package/src/scaffold-registry/__tests__/index.test.ts +17 -0
  455. package/src/scaffold-registry/__tests__/schema.test.ts +329 -230
  456. package/src/scaffold-registry/index.ts +205 -189
  457. package/src/scaffold-registry/schema.ts +196 -128
  458. package/src/server.ts +272 -272
  459. package/src/supabase/database.types.ts +2719 -2719
  460. package/src/supabase/helpers.ts +20 -20
  461. package/src/supabase/index.ts +52 -52
  462. package/src/supabase/server/client.ts +58 -58
  463. package/src/test-utils/README.md +30 -138
  464. package/src/test-utils/browser-mocks.ts +54 -54
  465. package/src/test-utils/fixtures/api-keys.ts +52 -52
  466. package/src/test-utils/fixtures/index.ts +4 -4
  467. package/src/test-utils/fixtures/memberships.ts +80 -80
  468. package/src/test-utils/fixtures/organizations.ts +69 -69
  469. package/src/test-utils/fixtures/users.ts +79 -79
  470. package/src/test-utils/index.ts +7 -8
  471. package/src/test-utils/mocks/index.ts +2 -2
  472. package/src/test-utils/mocks/supabase.ts +142 -142
  473. package/src/test-utils/mocks/workos.ts +108 -108
  474. package/src/test-utils/published.ts +4 -0
  475. package/src/test-utils/rls/RLSTestContext.ts +554 -554
  476. 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
+ }