@elevasis/core 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -3
- package/src/README.md +41 -41
- package/src/__tests__/publish.test.ts +18 -18
- package/src/__tests__/{template-foundations-compatibility.test.ts → template-core-compatibility.test.ts} +99 -99
- package/src/_gen/__tests__/__snapshots__/contracts.md.snap +1135 -1131
- package/src/_gen/__tests__/scaffold-contracts.test.ts +53 -53
- package/src/_gen/scaffold-contracts.ts +45 -45
- package/src/auth/multi-tenancy/credentials/README.md +38 -38
- package/src/auth/multi-tenancy/credentials/index.ts +6 -6
- package/src/auth/multi-tenancy/credentials/server/encryption.ts +39 -39
- package/src/auth/multi-tenancy/credentials/server/service.ts +60 -60
- package/src/auth/multi-tenancy/index.ts +17 -17
- package/src/auth/multi-tenancy/invitations/api-schemas.ts +107 -107
- package/src/auth/multi-tenancy/invitations/index.ts +37 -37
- package/src/auth/multi-tenancy/invitations/invitation.ts +86 -86
- package/src/auth/multi-tenancy/invitations/server/index.ts +25 -25
- package/src/auth/multi-tenancy/invitations/server/transforms.ts +24 -24
- package/src/auth/multi-tenancy/invitations/server/workos.ts +24 -24
- package/src/auth/multi-tenancy/invitations/supabase.ts +50 -50
- package/src/auth/multi-tenancy/memberships/api-schemas.ts +126 -126
- package/src/auth/multi-tenancy/memberships/index.ts +21 -21
- package/src/auth/multi-tenancy/memberships/membership.ts +138 -138
- package/src/auth/multi-tenancy/memberships/server/index.ts +15 -15
- package/src/auth/multi-tenancy/memberships/server/transforms.ts +32 -32
- package/src/auth/multi-tenancy/memberships/server/workos.ts +21 -21
- package/src/auth/multi-tenancy/memberships/supabase.ts +46 -46
- package/src/auth/multi-tenancy/organizations/api-schemas.ts +128 -128
- package/src/auth/multi-tenancy/organizations/index.ts +23 -23
- package/src/auth/multi-tenancy/organizations/organization.ts +24 -24
- package/src/auth/multi-tenancy/organizations/server/index.ts +10 -10
- package/src/auth/multi-tenancy/organizations/server/transforms.ts +35 -35
- package/src/auth/multi-tenancy/organizations/server/workos.ts +20 -20
- package/src/auth/multi-tenancy/types.ts +83 -83
- package/src/auth/multi-tenancy/users/api-schemas.ts +194 -194
- package/src/auth/multi-tenancy/users/index.ts +27 -27
- package/src/auth/multi-tenancy/users/server/index.ts +19 -19
- package/src/auth/multi-tenancy/users/server/transforms.ts +21 -21
- package/src/auth/multi-tenancy/users/server/workos.ts +16 -16
- package/src/auth/multi-tenancy/users/user.ts +65 -65
- package/src/business/README.md +52 -52
- package/src/business/__tests__/entities-published.test.ts +33 -33
- package/src/business/acquisition/api-schemas.ts +759 -759
- package/src/business/acquisition/index.ts +109 -109
- package/src/business/acquisition/types.ts +402 -402
- package/src/business/base-entities.test.ts +481 -481
- package/src/business/base-entities.ts +241 -241
- package/src/business/entities-published.ts +24 -24
- package/src/business/index.ts +15 -15
- package/src/business/pdf/browser/pdfmake-browser.ts +229 -229
- package/src/business/pdf/index.ts +10 -10
- package/src/business/pdf/server/index.ts +21 -21
- package/src/business/pdf/server/themes/default.ts +8 -8
- package/src/business/pdf/server/themes/index.ts +9 -9
- package/src/business/pdf/server/themes/types.ts +8 -8
- package/src/business/pdf/types.ts +272 -272
- package/src/business/projects/index.ts +2 -1
- package/src/business/projects/sse-events.ts +21 -0
- package/src/business/projects/types.ts +89 -89
- package/src/business/sales/api-schemas.ts +75 -75
- package/src/business/seo/__tests__/linking.test.ts +549 -549
- package/src/business/seo/__tests__/types.test.ts +404 -404
- package/src/business/seo/index.ts +2 -2
- package/src/business/seo/linking.ts +281 -281
- package/src/business/seo/types.ts +199 -199
- package/src/commands/queue/index.ts +3 -3
- package/src/commands/queue/schemas.test.ts +593 -593
- package/src/commands/queue/schemas.ts +125 -125
- package/src/commands/queue/sse-events.ts +61 -61
- package/src/commands/queue/types/action.ts +52 -52
- package/src/commands/queue/types/checkpoint.ts +44 -44
- package/src/commands/queue/types/index.ts +7 -7
- package/src/commands/queue/types/task.ts +116 -116
- package/src/commands/queue/types.ts +14 -14
- package/src/content/distribution-metadata.ts +61 -61
- package/src/content/index.ts +10 -10
- package/src/deployments/index.ts +22 -22
- package/src/execution/core/__tests__/archived-logs.test.ts +72 -72
- package/src/execution/core/index.ts +11 -11
- package/src/execution/core/runner-types.ts +80 -80
- package/src/execution/core/server/environment.ts +31 -31
- package/src/execution/core/sse-executions.ts +119 -119
- package/src/execution/core/types.ts +29 -29
- package/src/execution/engine/__tests__/fixtures/test-agents.ts +4 -4
- package/src/execution/engine/__tests__/timeout.test.ts +565 -565
- package/src/execution/engine/agent/__tests__/errors.test.ts +508 -508
- package/src/execution/engine/agent/actions/__tests__/processor.test.ts +531 -531
- package/src/execution/engine/agent/actions/executor.ts +205 -205
- package/src/execution/engine/agent/actions/navigate-knowledge-executor.ts +230 -230
- package/src/execution/engine/agent/actions/processor.ts +116 -116
- package/src/execution/engine/agent/actions/types.ts +70 -70
- package/src/execution/engine/agent/core/agent.ts +810 -810
- package/src/execution/engine/agent/core/types.ts +155 -155
- package/src/execution/engine/agent/errors.ts +251 -251
- package/src/execution/engine/agent/index.ts +78 -78
- package/src/execution/engine/agent/knowledge-map/types.ts +106 -106
- package/src/execution/engine/agent/knowledge-map/utils.ts +101 -101
- package/src/execution/engine/agent/memory/__tests__/manager.test.ts +754 -754
- package/src/execution/engine/agent/memory/domains.ts +99 -99
- package/src/execution/engine/agent/memory/manager.ts +365 -365
- package/src/execution/engine/agent/memory/processor.ts +66 -66
- package/src/execution/engine/agent/memory/types.ts +90 -90
- package/src/execution/engine/agent/memory/utils.ts +134 -134
- package/src/execution/engine/agent/observability/logging.ts +467 -467
- package/src/execution/engine/agent/observability/types.ts +64 -64
- package/src/execution/engine/agent/reasoning/adapters/agent-adapter-helpers.ts +349 -349
- package/src/execution/engine/agent/reasoning/processor.ts +92 -92
- package/src/execution/engine/agent/reasoning/prompt-sections/base-actions.ts +134 -134
- package/src/execution/engine/agent/reasoning/prompt-sections/completion.ts +49 -49
- package/src/execution/engine/agent/reasoning/prompt-sections/knowledge-map.ts +93 -93
- package/src/execution/engine/agent/reasoning/prompt-sections/memory.ts +65 -65
- package/src/execution/engine/agent/reasoning/prompt-sections/tools.ts +44 -44
- package/src/execution/engine/agent/reasoning/request-builder.ts +169 -169
- package/src/execution/engine/agent/reasoning/types.ts +18 -18
- package/src/execution/engine/base/errors.ts +118 -118
- package/src/execution/engine/base/index.ts +2 -2
- package/src/execution/engine/base/logging.ts +31 -31
- package/src/execution/engine/base/serialization.ts +324 -324
- package/src/execution/engine/base/types.ts +126 -126
- package/src/execution/engine/base/utils.ts +41 -41
- package/src/execution/engine/index.ts +434 -434
- package/src/execution/engine/interface/index.ts +1 -1
- package/src/execution/engine/interface/types.ts +62 -62
- package/src/execution/engine/llm/__tests__/model-info.test.ts +50 -50
- package/src/execution/engine/llm/__tests__/model-validation.test.ts +321 -321
- package/src/execution/engine/llm/__tests__/response-schema-validator.test.ts +115 -115
- package/src/execution/engine/llm/adapters/__tests__/adapter-factory.test.ts +375 -375
- package/src/execution/engine/llm/adapters/__tests__/anthropic-adapter.test.ts +463 -463
- package/src/execution/engine/llm/adapters/__tests__/anthropic.integration.test.ts +177 -177
- package/src/execution/engine/llm/adapters/__tests__/google-adapter.test.ts +722 -722
- package/src/execution/engine/llm/adapters/__tests__/google.integration.test.ts +376 -376
- package/src/execution/engine/llm/adapters/__tests__/openai-adapter.test.ts +551 -551
- package/src/execution/engine/llm/adapters/__tests__/openrouter-adapter.test.ts +563 -563
- package/src/execution/engine/llm/adapters/__tests__/openrouter.integration.test.ts +105 -105
- package/src/execution/engine/llm/adapters/__tests__/universal-adapter.test.ts +537 -537
- package/src/execution/engine/llm/adapters/circuit-breaker.ts +147 -147
- package/src/execution/engine/llm/adapters/index.ts +17 -17
- package/src/execution/engine/llm/adapters/mock-adapter.ts +116 -116
- package/src/execution/engine/llm/adapters/server/adapter-factory.ts +130 -130
- package/src/execution/engine/llm/adapters/server/anthropic.ts +137 -137
- package/src/execution/engine/llm/adapters/server/google.ts +283 -283
- package/src/execution/engine/llm/adapters/server/index.ts +12 -12
- package/src/execution/engine/llm/adapters/server/openai.ts +206 -206
- package/src/execution/engine/llm/adapters/server/openrouter.ts +235 -235
- package/src/execution/engine/llm/adapters/universal-adapter.ts +230 -230
- package/src/execution/engine/llm/errors.ts +186 -186
- package/src/execution/engine/llm/model-info.ts +332 -332
- package/src/execution/engine/llm/response-schema-validator.ts +113 -113
- package/src/execution/engine/llm/types.ts +86 -86
- package/src/execution/engine/test-utils/index.ts +6 -6
- package/src/execution/engine/test-utils/mocks.ts +56 -56
- package/src/execution/engine/tools/integration/base-integration-adapter.ts +50 -50
- package/src/execution/engine/tools/integration/index.ts +53 -53
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-adapter.ts +73 -73
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-tools.ts +209 -209
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-company-email/index.ts +82 -82
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-decision-maker-email/index.ts +122 -122
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-person-email/index.ts +89 -89
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/verify-email/index.ts +84 -84
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/index.ts +16 -16
- package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +293 -293
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +100 -100
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-tools.ts +217 -217
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/get-dataset-items/index.ts +92 -92
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/run-actor/index.ts +218 -218
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/start-actor/index.ts +87 -87
- package/src/execution/engine/tools/integration/server/adapters/apify/index.ts +11 -11
- package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +361 -361
- package/src/execution/engine/tools/integration/server/adapters/attio/attio-adapter.ts +162 -162
- package/src/execution/engine/tools/integration/server/adapters/attio/attio-tools.ts +594 -594
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-attribute/index.ts +214 -214
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-note/index.ts +152 -152
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-record/index.ts +141 -141
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-note/index.ts +86 -86
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-record/index.ts +105 -105
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.ts +118 -118
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-attributes/index.ts +165 -165
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-notes/index.ts +96 -96
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-objects/index.ts +104 -104
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.ts +156 -156
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-attribute/index.ts +220 -220
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-record/index.ts +140 -140
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/utils/types.ts +146 -146
- package/src/execution/engine/tools/integration/server/adapters/attio/index.ts +31 -31
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +210 -210
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +104 -104
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -261
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-adapter.ts +1189 -1189
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-tools.ts +641 -641
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/index.ts +18 -18
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/activate-campaign/index.ts +86 -86
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/__tests__/index.test.ts +289 -289
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/index.ts +154 -154
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/__tests__/index.test.ts +325 -325
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/index.ts +153 -153
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-delete-leads/index.ts +84 -84
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-campaign/index.ts +125 -125
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-inbox-test/index.ts +107 -107
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/delete-campaign/index.ts +85 -85
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-account-health/index.ts +91 -91
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign/index.ts +92 -92
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/__tests__/index.test.ts +195 -195
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/index.ts +113 -113
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-daily-campaign-analytics/index.ts +104 -104
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-emails/index.ts +155 -155
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/__tests__/index.test.ts +196 -196
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/index.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/__tests__/index.test.ts +189 -189
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/index.ts +87 -87
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-leads/index.ts +112 -112
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/patch-lead/index.ts +76 -76
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/pause-campaign/index.ts +86 -86
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/remove-from-subsequence/index.ts +98 -98
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/send-reply/index.ts +126 -126
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/__tests__/index.test.ts +193 -193
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/index.ts +99 -99
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/__tests__/index.test.ts +621 -621
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/index.ts +125 -125
- package/src/execution/engine/tools/integration/server/adapters/instantly/index.ts +29 -29
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-adapter.ts +178 -178
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1473 -1473
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/check-credits/index.ts +59 -59
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/verify-email/index.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/index.ts +17 -17
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-adapter.ts +80 -80
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/get-email/index.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +134 -134
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +75 -75
- package/src/execution/engine/tools/integration/server/adapters/resend/index.ts +27 -27
- package/src/execution/engine/tools/integration/server/adapters/resend/resend-adapter.ts +108 -108
- package/src/execution/engine/tools/integration/server/adapters/resend/resend-tools.ts +132 -132
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/create-envelope/index.ts +274 -274
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/download-document/index.ts +230 -230
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/get-envelope/index.ts +133 -133
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/void-envelope/index.ts +90 -90
- package/src/execution/engine/tools/integration/server/adapters/stripe/fetch/utils/types.ts +210 -210
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-adapter.ts +517 -517
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +309 -309
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/domain-search/index.ts +133 -133
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-finder/index.ts +122 -122
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-verifier/index.ts +111 -111
- package/src/execution/engine/tools/integration/server/adapters/tomba/index.ts +11 -11
- package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-adapter.ts +78 -78
- package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-tools.ts +222 -222
- package/src/execution/engine/tools/integration/server/index.ts +61 -61
- package/src/execution/engine/tools/integration/service.ts +161 -161
- package/src/execution/engine/tools/integration/tool.ts +253 -253
- package/src/execution/engine/tools/integration/types/anymailfinder.ts +74 -74
- package/src/execution/engine/tools/integration/types/apify.ts +92 -92
- package/src/execution/engine/tools/integration/types/index.ts +19 -19
- package/src/execution/engine/tools/integration/types/instantly.ts +557 -557
- package/src/execution/engine/tools/integration/types/millionverifier.ts +56 -56
- package/src/execution/engine/tools/integration/types/stripe.ts +162 -162
- package/src/execution/engine/tools/integration/types/tomba.ts +94 -94
- package/src/execution/engine/tools/lead-service-types.ts +884 -884
- package/src/execution/engine/tools/llm/index.ts +11 -11
- package/src/execution/engine/tools/llm/server/index.ts +8 -8
- package/src/execution/engine/tools/llm/server/llm-call-tool.ts +118 -118
- package/src/execution/engine/tools/platform/__tests__/pdf.test.ts +441 -441
- package/src/execution/engine/tools/platform/acquisition/company-tools.ts +248 -248
- package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +319 -319
- package/src/execution/engine/tools/platform/acquisition/index.ts +43 -43
- package/src/execution/engine/tools/platform/acquisition/list-tools.ts +148 -148
- package/src/execution/engine/tools/platform/acquisition/types.ts +260 -260
- package/src/execution/engine/tools/platform/email/index.ts +122 -122
- package/src/execution/engine/tools/platform/email/types.ts +96 -96
- package/src/execution/engine/tools/platform/index.ts +157 -157
- package/src/execution/engine/tools/platform/notification.ts +81 -81
- package/src/execution/engine/tools/platform/pdf/index.ts +110 -110
- package/src/execution/engine/tools/platform/pdf/types.ts +77 -77
- package/src/execution/engine/tools/platform/scheduler.ts +87 -87
- package/src/execution/engine/tools/platform/storage/index.ts +370 -370
- package/src/execution/engine/tools/platform/types.ts +148 -148
- package/src/execution/engine/tools/registry.ts +700 -699
- package/src/execution/engine/tools/tool-maps.ts +786 -786
- package/src/execution/engine/tools/types.ts +233 -233
- package/src/execution/engine/workflow/__tests__/errors.test.ts +139 -139
- package/src/execution/engine/workflow/errors.ts +63 -63
- package/src/execution/engine/workflow/helpers/index.ts +11 -11
- package/src/execution/engine/workflow/helpers/server/index.ts +8 -8
- package/src/execution/engine/workflow/helpers/server/llm-call.ts +93 -93
- package/src/execution/engine/workflow/index.ts +19 -19
- package/src/execution/engine/workflow/log-truncate.ts +26 -26
- package/src/execution/engine/workflow/logging.ts +191 -191
- package/src/execution/engine/workflow/types.ts +182 -182
- package/src/execution/engine/workflow/utils.ts +280 -280
- package/src/execution/engine/workflow/workflow.ts +168 -168
- package/src/execution/index.ts +3 -3
- package/src/execution/scheduler/__tests__/api-schemas.test.ts +733 -733
- package/src/execution/scheduler/__tests__/utils.test.ts +1009 -1009
- package/src/execution/scheduler/api-schemas.ts +296 -296
- package/src/execution/scheduler/index.ts +50 -50
- package/src/execution/scheduler/schemas.ts +264 -264
- package/src/execution/scheduler/types.ts +111 -111
- package/src/execution/scheduler/utils.ts +364 -364
- package/src/forms/index.ts +7 -7
- package/src/forms/schemas.ts +69 -69
- package/src/forms/types.ts +70 -70
- package/src/index.ts +71 -60
- package/src/integrations/credentials/__tests__/schemas.test.ts +82 -82
- package/src/integrations/credentials/__tests__/utils.test.ts +144 -144
- package/src/integrations/credentials/api-schemas.ts +143 -143
- package/src/integrations/credentials/index.ts +32 -32
- package/src/integrations/credentials/schemas.ts +164 -164
- package/src/integrations/credentials/utils.ts +59 -59
- package/src/integrations/oauth/__tests__/provider-registry.test.ts +59 -59
- package/src/integrations/oauth/api-schemas.ts +92 -92
- package/src/integrations/oauth/index.ts +19 -19
- package/src/integrations/oauth/provider-registry.ts +61 -61
- package/src/integrations/oauth/server/__tests__/refresh-concurrent.test.ts +183 -183
- package/src/integrations/oauth/server/__tests__/refresh.test.ts +577 -577
- package/src/integrations/oauth/server/credentials.ts +39 -39
- package/src/integrations/oauth/server/refresh.ts +214 -214
- package/src/integrations/oauth/types.ts +34 -34
- package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +318 -318
- package/src/integrations/webhook-endpoints/api-schemas.ts +102 -102
- package/src/integrations/webhook-endpoints/index.ts +28 -28
- package/src/integrations/webhook-endpoints/types.ts +51 -51
- package/src/operations/activities/api-schemas.ts +79 -79
- package/src/operations/activities/index.ts +9 -9
- package/src/operations/activities/sse-events.ts +30 -30
- package/src/operations/activities/types.ts +63 -63
- package/src/operations/debug-logs/client.ts +60 -60
- package/src/operations/debug-logs/debug-logger.ts +83 -83
- package/src/operations/debug-logs/index.ts +8 -8
- package/src/operations/debug-logs/server.ts +19 -19
- package/src/operations/debug-logs/types.ts +33 -33
- package/src/operations/index.ts +50 -50
- package/src/operations/notifications/api-schemas.ts +91 -91
- package/src/operations/notifications/index.ts +3 -3
- package/src/operations/notifications/sse-events.ts +21 -21
- package/src/operations/notifications/types.ts +47 -47
- package/src/operations/observability/__tests__/openrouter-cost-flow.test.ts +297 -297
- package/src/operations/observability/__tests__/utils.test.ts +54 -54
- package/src/operations/observability/ai-usage-collector.ts +64 -64
- package/src/operations/observability/index.ts +13 -13
- package/src/operations/observability/metrics-collector.ts +49 -49
- package/src/operations/observability/schemas.ts +39 -39
- package/src/operations/observability/types.ts +463 -463
- package/src/operations/observability/utils.ts +77 -77
- package/src/operations/sessions/__tests__/manager.test.ts +821 -821
- package/src/operations/sessions/index.ts +26 -26
- package/src/operations/sessions/server/manager.ts +90 -90
- package/src/operations/sessions/server/session.ts +180 -180
- package/src/operations/sessions/types.ts +98 -98
- package/src/operations/triggers/index.ts +12 -12
- package/src/operations/triggers/webhook/definitions/instantly-account-error.ts +44 -44
- package/src/operations/triggers/webhook/definitions/instantly-auto-reply-received.ts +51 -51
- package/src/operations/triggers/webhook/definitions/instantly-campaign-completed.ts +45 -45
- package/src/operations/triggers/webhook/definitions/instantly-email-bounced.ts +49 -49
- package/src/operations/triggers/webhook/definitions/instantly-lead-unsubscribed.ts +45 -45
- package/src/operations/triggers/webhook/definitions/instantly-reply-received.ts +54 -54
- package/src/operations/triggers/webhook/index.ts +35 -35
- package/src/operations/triggers/webhook/types.ts +74 -74
- package/src/organization-model/README.md +97 -97
- package/src/organization-model/__tests__/defaults.test.ts +175 -175
- package/src/organization-model/__tests__/domains/customers.test.ts +295 -295
- package/src/organization-model/__tests__/domains/goals.test.ts +479 -479
- package/src/organization-model/__tests__/domains/identity.test.ts +279 -279
- package/src/organization-model/__tests__/domains/navigation.test.ts +212 -212
- package/src/organization-model/__tests__/domains/offerings.test.ts +419 -419
- package/src/organization-model/__tests__/domains/operations.test.ts +203 -203
- package/src/organization-model/__tests__/domains/resource-mappings.test.ts +362 -362
- package/src/organization-model/__tests__/domains/roles.test.ts +347 -347
- package/src/organization-model/__tests__/domains/statuses.test.ts +243 -243
- package/src/organization-model/__tests__/foundation.test.ts +105 -105
- package/src/organization-model/__tests__/graph.test.ts +894 -894
- package/src/organization-model/__tests__/resolve.test.ts +690 -690
- package/src/organization-model/__tests__/schema.test.ts +407 -407
- package/src/organization-model/contracts.ts +14 -14
- package/src/organization-model/defaults.ts +148 -148
- package/src/organization-model/domains/branding.ts +22 -22
- package/src/organization-model/domains/customers.ts +75 -75
- package/src/organization-model/domains/features.ts +22 -22
- package/src/organization-model/domains/goals.ts +80 -80
- package/src/organization-model/domains/identity.ts +94 -94
- package/src/organization-model/domains/navigation.ts +391 -391
- package/src/organization-model/domains/offerings.ts +66 -66
- package/src/organization-model/domains/operations.ts +85 -85
- package/src/organization-model/domains/projects.ts +48 -48
- package/src/organization-model/domains/prospecting.ts +33 -33
- package/src/organization-model/domains/roles.ts +55 -55
- package/src/organization-model/domains/sales.ts +94 -94
- package/src/organization-model/domains/shared.ts +62 -62
- package/src/organization-model/domains/statuses.ts +130 -130
- package/src/organization-model/foundation.ts +97 -97
- package/src/organization-model/graph/build.ts +399 -399
- package/src/organization-model/graph/index.ts +4 -4
- package/src/organization-model/graph/schema.ts +48 -48
- package/src/organization-model/graph/types.ts +40 -40
- package/src/organization-model/index.ts +13 -13
- package/src/organization-model/organization-graph.mdx +272 -272
- package/src/organization-model/organization-model.mdx +320 -320
- package/src/organization-model/published.ts +85 -85
- package/src/organization-model/resolve.ts +66 -66
- package/src/organization-model/schema.ts +287 -287
- package/src/organization-model/types.ts +46 -46
- package/src/platform/api/index.ts +1 -1
- package/src/platform/api/types.ts +35 -35
- package/src/platform/constants/http.ts +37 -37
- package/src/platform/constants/index.ts +5 -5
- package/src/platform/constants/limits.ts +32 -32
- package/src/platform/constants/resilience.ts +51 -51
- package/src/platform/constants/timeouts.ts +20 -20
- package/src/platform/constants/versions.ts +3 -3
- package/src/platform/registry/__tests__/resource-registry-static.test.ts +347 -347
- package/src/platform/registry/__tests__/resource-registry.integration.test.ts +1028 -1028
- package/src/platform/registry/__tests__/resource-registry.list-executable.test.ts +393 -393
- package/src/platform/registry/__tests__/resource-registry.test.ts +2005 -2005
- package/src/platform/registry/__tests__/serialization.test.ts +1127 -1127
- package/src/platform/registry/command-view.ts +180 -180
- package/src/platform/registry/domains.ts +165 -165
- package/src/platform/registry/index.ts +93 -93
- package/src/platform/registry/reserved.ts +24 -24
- package/src/platform/registry/resource-metadata.ts +59 -59
- package/src/platform/registry/resource-registry.command-queue-groups.test.ts +129 -129
- package/src/platform/registry/resource-registry.ts +876 -876
- package/src/platform/registry/serialization.ts +273 -273
- package/src/platform/registry/serialized-types.ts +231 -231
- package/src/platform/registry/stats-types.ts +66 -66
- package/src/platform/registry/types.ts +404 -404
- package/src/platform/registry/validation.ts +513 -513
- package/src/platform/resilience/__tests__/rate-limiter.test.ts +471 -471
- package/src/platform/resilience/circuit-breaker.ts +164 -164
- package/src/platform/resilience/errors.ts +68 -68
- package/src/platform/resilience/http-error-mapper.ts +129 -129
- package/src/platform/resilience/index.ts +93 -93
- package/src/platform/resilience/rate-limiter-types.ts +46 -46
- package/src/platform/resilience/rate-limiter.ts +140 -140
- package/src/platform/resilience/retry.ts +89 -89
- package/src/platform/resilience/timeout.ts +63 -63
- package/src/platform/sse/events.ts +37 -34
- package/src/platform/sse/index.ts +7 -7
- package/src/platform/utils/__tests__/validation.test.ts +1083 -1083
- package/src/platform/utils/currency.ts +96 -96
- package/src/platform/utils/debounce.ts +52 -52
- package/src/platform/utils/error.ts +41 -41
- package/src/platform/utils/hmac.test.ts +97 -97
- package/src/platform/utils/index.ts +32 -32
- package/src/platform/utils/server/betterstack-logger.ts +210 -210
- package/src/platform/utils/server/hmac.ts +44 -44
- package/src/platform/utils/server/unsubscribe.ts +111 -111
- package/src/platform/utils/token-counter.ts +96 -96
- package/src/platform/utils/validation.ts +425 -425
- package/src/projects/api-schemas.ts +268 -268
- package/src/published.ts +1 -1
- package/src/reference/_generated/contracts.md +611 -607
- package/src/reference/glossary.md +105 -105
- package/src/requests/__tests__/api-schemas.test.ts +277 -277
- package/src/requests/api-schemas.ts +83 -83
- package/src/requests/index.ts +1 -1
- package/src/scaffold-registry/__tests__/index.test.ts +17 -0
- package/src/scaffold-registry/__tests__/schema.test.ts +329 -230
- package/src/scaffold-registry/index.ts +205 -189
- package/src/scaffold-registry/schema.ts +196 -128
- package/src/server.ts +272 -272
- package/src/supabase/database.types.ts +2719 -2719
- package/src/supabase/helpers.ts +20 -20
- package/src/supabase/index.ts +52 -52
- package/src/supabase/server/client.ts +58 -58
- package/src/test-utils/README.md +38 -38
- package/src/test-utils/browser-mocks.ts +54 -54
- package/src/test-utils/fixtures/api-keys.ts +52 -52
- package/src/test-utils/fixtures/index.ts +4 -4
- package/src/test-utils/fixtures/memberships.ts +80 -80
- package/src/test-utils/fixtures/organizations.ts +69 -69
- package/src/test-utils/fixtures/users.ts +79 -79
- package/src/test-utils/index.ts +11 -11
- package/src/test-utils/mocks/index.ts +2 -2
- package/src/test-utils/mocks/supabase.ts +142 -142
- package/src/test-utils/mocks/workos.ts +108 -108
- package/src/test-utils/rls/RLSTestContext.ts +556 -556
- package/src/test-utils/rls/index.ts +1 -1
|
@@ -1,319 +1,319 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Contact Platform Tools
|
|
3
|
-
*
|
|
4
|
-
* Platform tools for contact CRUD operations in the acquisition domain.
|
|
5
|
-
* Used by AI agents to manage contact records with multi-tenant isolation.
|
|
6
|
-
*
|
|
7
|
-
* All operations require organizationId from ExecutionContext for RLS enforcement.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { getToolServices } from '../../registry'
|
|
11
|
-
import { serviceUnavailable } from '../../types'
|
|
12
|
-
import type { Tool } from '../../types'
|
|
13
|
-
import {
|
|
14
|
-
CreateContactInputSchema,
|
|
15
|
-
UpdateContactInputSchema,
|
|
16
|
-
UpsertContactInputSchema,
|
|
17
|
-
GetContactInputSchema,
|
|
18
|
-
ListContactsInputSchema,
|
|
19
|
-
DeleteContactInputSchema,
|
|
20
|
-
BulkImportInputSchema,
|
|
21
|
-
ContactOutputSchema,
|
|
22
|
-
PaginatedContactsOutputSchema,
|
|
23
|
-
BulkImportResultSchema,
|
|
24
|
-
DeleteResultSchema,
|
|
25
|
-
DeactivateContactsByCompanyInputSchema,
|
|
26
|
-
DeactivateContactsByCompanyResultSchema
|
|
27
|
-
} from './types'
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Transform contact result to output format
|
|
31
|
-
* Converts Date objects to ISO strings for JSON serialization
|
|
32
|
-
*/
|
|
33
|
-
function toContactOutput(result: any) {
|
|
34
|
-
return {
|
|
35
|
-
id: result.id,
|
|
36
|
-
organizationId: result.organizationId,
|
|
37
|
-
companyId: result.companyId,
|
|
38
|
-
email: result.email,
|
|
39
|
-
emailValid: result.emailValid,
|
|
40
|
-
firstName: result.firstName,
|
|
41
|
-
lastName: result.lastName,
|
|
42
|
-
linkedinUrl: result.linkedinUrl,
|
|
43
|
-
title: result.title,
|
|
44
|
-
headline: result.headline,
|
|
45
|
-
filterReason: result.filterReason,
|
|
46
|
-
openingLine: result.openingLine,
|
|
47
|
-
source: result.source,
|
|
48
|
-
sourceId: result.sourceId,
|
|
49
|
-
pipelineStatus: result.pipelineStatus,
|
|
50
|
-
enrichmentData: result.enrichmentData,
|
|
51
|
-
tags: result.tags,
|
|
52
|
-
batchId: result.batchId ?? null,
|
|
53
|
-
status: result.status ?? 'active',
|
|
54
|
-
createdAt: result.createdAt instanceof Date ? result.createdAt.toISOString() : result.createdAt,
|
|
55
|
-
updatedAt: result.updatedAt instanceof Date ? result.updatedAt.toISOString() : result.updatedAt
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Create a new contact record
|
|
61
|
-
*
|
|
62
|
-
* @returns Tool for creating contacts
|
|
63
|
-
*/
|
|
64
|
-
export function createAcqContactCreateTool(): Tool {
|
|
65
|
-
return {
|
|
66
|
-
name: 'acq_contact_create',
|
|
67
|
-
description: 'Create a new contact record.',
|
|
68
|
-
inputSchema: CreateContactInputSchema,
|
|
69
|
-
outputSchema: ContactOutputSchema,
|
|
70
|
-
execute: async ({ input, executionContext }) => {
|
|
71
|
-
const leadService = getToolServices().leadService
|
|
72
|
-
if (!leadService) throw serviceUnavailable('LeadService')
|
|
73
|
-
if (!executionContext?.organizationId)
|
|
74
|
-
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
75
|
-
|
|
76
|
-
const validated = input as {
|
|
77
|
-
email: string
|
|
78
|
-
companyId?: string
|
|
79
|
-
firstName?: string
|
|
80
|
-
lastName?: string
|
|
81
|
-
linkedinUrl?: string
|
|
82
|
-
title?: string
|
|
83
|
-
source?: string
|
|
84
|
-
sourceId?: string
|
|
85
|
-
batchId?: string
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const result = await leadService.createContact({
|
|
89
|
-
organizationId: executionContext.organizationId,
|
|
90
|
-
...validated
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
return toContactOutput(result)
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Update an existing contact with new data
|
|
100
|
-
*
|
|
101
|
-
* @returns Tool for updating contacts (enrichment, personalization, campaign status)
|
|
102
|
-
*/
|
|
103
|
-
export function createAcqContactUpdateTool(): Tool {
|
|
104
|
-
return {
|
|
105
|
-
name: 'acq_contact_update',
|
|
106
|
-
description: 'Update an existing contact with new data (enrichment, personalization, campaign status).',
|
|
107
|
-
inputSchema: UpdateContactInputSchema,
|
|
108
|
-
outputSchema: ContactOutputSchema,
|
|
109
|
-
execute: async ({ input, executionContext }) => {
|
|
110
|
-
const leadService = getToolServices().leadService
|
|
111
|
-
if (!leadService) throw serviceUnavailable('LeadService')
|
|
112
|
-
if (!executionContext?.organizationId)
|
|
113
|
-
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
114
|
-
|
|
115
|
-
const { id, ...params } = input as { id: string; [key: string]: unknown }
|
|
116
|
-
const result = await leadService.updateContact(id, params)
|
|
117
|
-
|
|
118
|
-
return toContactOutput(result)
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Upsert a contact by email
|
|
125
|
-
*
|
|
126
|
-
* @returns Tool for upserting contacts (creates new or updates existing by email)
|
|
127
|
-
*/
|
|
128
|
-
export function createAcqContactUpsertTool(): Tool {
|
|
129
|
-
return {
|
|
130
|
-
name: 'acq_contact_upsert',
|
|
131
|
-
description: 'Upsert a contact by email. Creates new contact if email does not exist, otherwise updates existing.',
|
|
132
|
-
inputSchema: UpsertContactInputSchema,
|
|
133
|
-
outputSchema: ContactOutputSchema,
|
|
134
|
-
execute: async ({ input, executionContext }) => {
|
|
135
|
-
const leadService = getToolServices().leadService
|
|
136
|
-
if (!leadService) throw serviceUnavailable('LeadService')
|
|
137
|
-
if (!executionContext?.organizationId)
|
|
138
|
-
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
139
|
-
|
|
140
|
-
const validated = input as {
|
|
141
|
-
email: string
|
|
142
|
-
companyId?: string
|
|
143
|
-
firstName?: string
|
|
144
|
-
lastName?: string
|
|
145
|
-
linkedinUrl?: string
|
|
146
|
-
title?: string
|
|
147
|
-
source?: string
|
|
148
|
-
sourceId?: string
|
|
149
|
-
batchId?: string
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
const result = await leadService.upsertContact({
|
|
153
|
-
organizationId: executionContext.organizationId,
|
|
154
|
-
...validated
|
|
155
|
-
})
|
|
156
|
-
|
|
157
|
-
return toContactOutput(result)
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Get a single contact by ID
|
|
164
|
-
*
|
|
165
|
-
* @returns Tool for retrieving a contact by ID
|
|
166
|
-
*/
|
|
167
|
-
export function createAcqContactGetTool(): Tool {
|
|
168
|
-
return {
|
|
169
|
-
name: 'acq_contact_get',
|
|
170
|
-
description: 'Get a single contact by ID.',
|
|
171
|
-
inputSchema: GetContactInputSchema,
|
|
172
|
-
outputSchema: ContactOutputSchema.nullable(),
|
|
173
|
-
execute: async ({ input, executionContext }) => {
|
|
174
|
-
const leadService = getToolServices().leadService
|
|
175
|
-
if (!leadService) throw serviceUnavailable('LeadService')
|
|
176
|
-
if (!executionContext?.organizationId)
|
|
177
|
-
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
178
|
-
|
|
179
|
-
const { id } = input as { id: string }
|
|
180
|
-
const result = await leadService.getContact(id, executionContext.organizationId)
|
|
181
|
-
return result ? toContactOutput(result) : null
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* List contacts with filters and pagination
|
|
188
|
-
*
|
|
189
|
-
* @returns Tool for listing contacts with optional filters (list, qualification, campaign)
|
|
190
|
-
*/
|
|
191
|
-
export function createAcqContactListTool(): Tool {
|
|
192
|
-
return {
|
|
193
|
-
name: 'acq_contact_list',
|
|
194
|
-
description: 'List contacts with optional filters (list, qualification, campaign) and pagination.',
|
|
195
|
-
inputSchema: ListContactsInputSchema,
|
|
196
|
-
outputSchema: PaginatedContactsOutputSchema,
|
|
197
|
-
execute: async ({ input, executionContext }) => {
|
|
198
|
-
const leadService = getToolServices().leadService
|
|
199
|
-
if (!leadService) throw serviceUnavailable('LeadService')
|
|
200
|
-
if (!executionContext?.organizationId)
|
|
201
|
-
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
202
|
-
|
|
203
|
-
const { limit, offset, ...filters } = input as {
|
|
204
|
-
limit?: number
|
|
205
|
-
offset?: number
|
|
206
|
-
openingLineIsNull?: boolean
|
|
207
|
-
batchId?: string
|
|
208
|
-
contactStatus?: 'active' | 'invalid'
|
|
209
|
-
}
|
|
210
|
-
const result = await leadService.listContacts(executionContext.organizationId, filters, {
|
|
211
|
-
limit: limit ?? 100,
|
|
212
|
-
offset: offset ?? 0
|
|
213
|
-
})
|
|
214
|
-
|
|
215
|
-
return {
|
|
216
|
-
data: result.data.map(toContactOutput),
|
|
217
|
-
total: result.total,
|
|
218
|
-
limit: result.limit,
|
|
219
|
-
offset: result.offset
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Delete a contact record
|
|
227
|
-
*
|
|
228
|
-
* @returns Tool for deleting contacts
|
|
229
|
-
*/
|
|
230
|
-
export function createAcqContactDeleteTool(): Tool {
|
|
231
|
-
return {
|
|
232
|
-
name: 'acq_contact_delete',
|
|
233
|
-
description: 'Delete a contact record.',
|
|
234
|
-
inputSchema: DeleteContactInputSchema,
|
|
235
|
-
outputSchema: DeleteResultSchema,
|
|
236
|
-
execute: async ({ input, executionContext }) => {
|
|
237
|
-
const leadService = getToolServices().leadService
|
|
238
|
-
if (!leadService) throw serviceUnavailable('LeadService')
|
|
239
|
-
if (!executionContext?.organizationId)
|
|
240
|
-
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
241
|
-
|
|
242
|
-
const { id } = input as { id: string }
|
|
243
|
-
await leadService.deleteContact(id, executionContext.organizationId)
|
|
244
|
-
return { success: true }
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/**
|
|
250
|
-
* Batch import contacts with automatic deduplication
|
|
251
|
-
*
|
|
252
|
-
* @returns Tool for bulk importing contacts (creates new or updates existing by email)
|
|
253
|
-
*/
|
|
254
|
-
export function createAcqContactBulkImportTool(): Tool {
|
|
255
|
-
return {
|
|
256
|
-
name: 'acq_contact_bulk_import',
|
|
257
|
-
description:
|
|
258
|
-
'Batch import contacts with automatic deduplication. Creates new contacts or updates existing by email.',
|
|
259
|
-
inputSchema: BulkImportInputSchema,
|
|
260
|
-
outputSchema: BulkImportResultSchema,
|
|
261
|
-
execute: async ({ input, executionContext }) => {
|
|
262
|
-
const leadService = getToolServices().leadService
|
|
263
|
-
if (!leadService) throw serviceUnavailable('LeadService')
|
|
264
|
-
if (!executionContext?.organizationId)
|
|
265
|
-
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
266
|
-
|
|
267
|
-
const { contacts } = input as {
|
|
268
|
-
contacts: Array<{
|
|
269
|
-
email: string
|
|
270
|
-
companyId?: string
|
|
271
|
-
firstName?: string
|
|
272
|
-
lastName?: string
|
|
273
|
-
linkedinUrl?: string
|
|
274
|
-
title?: string
|
|
275
|
-
source?: string
|
|
276
|
-
sourceId?: string
|
|
277
|
-
batchId?: string
|
|
278
|
-
}>
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
const result = await leadService.bulkImportContacts({
|
|
282
|
-
organizationId: executionContext.organizationId,
|
|
283
|
-
contacts: contacts.map((c) => ({
|
|
284
|
-
organizationId: executionContext.organizationId,
|
|
285
|
-
...c
|
|
286
|
-
}))
|
|
287
|
-
})
|
|
288
|
-
|
|
289
|
-
return result
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* Deactivate all active contacts belonging to a company.
|
|
296
|
-
* Used by qualification workflow to cascade company disqualification.
|
|
297
|
-
*
|
|
298
|
-
* @returns Tool for bulk deactivating contacts by company
|
|
299
|
-
*/
|
|
300
|
-
export function createAcqContactDeactivateByCompanyTool(): Tool {
|
|
301
|
-
return {
|
|
302
|
-
name: 'acq_contact_deactivate_by_company',
|
|
303
|
-
description: 'Deactivate all active contacts belonging to a company. Used to cascade company disqualification.',
|
|
304
|
-
inputSchema: DeactivateContactsByCompanyInputSchema,
|
|
305
|
-
outputSchema: DeactivateContactsByCompanyResultSchema,
|
|
306
|
-
execute: async ({ input, executionContext }) => {
|
|
307
|
-
const leadService = getToolServices().leadService
|
|
308
|
-
if (!leadService) throw serviceUnavailable('LeadService')
|
|
309
|
-
if (!executionContext?.organizationId)
|
|
310
|
-
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
311
|
-
|
|
312
|
-
const { companyId } = input as { companyId: string }
|
|
313
|
-
return leadService.deactivateContactsByCompany({
|
|
314
|
-
organizationId: executionContext.organizationId,
|
|
315
|
-
companyId
|
|
316
|
-
})
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Contact Platform Tools
|
|
3
|
+
*
|
|
4
|
+
* Platform tools for contact CRUD operations in the acquisition domain.
|
|
5
|
+
* Used by AI agents to manage contact records with multi-tenant isolation.
|
|
6
|
+
*
|
|
7
|
+
* All operations require organizationId from ExecutionContext for RLS enforcement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { getToolServices } from '../../registry'
|
|
11
|
+
import { serviceUnavailable } from '../../types'
|
|
12
|
+
import type { Tool } from '../../types'
|
|
13
|
+
import {
|
|
14
|
+
CreateContactInputSchema,
|
|
15
|
+
UpdateContactInputSchema,
|
|
16
|
+
UpsertContactInputSchema,
|
|
17
|
+
GetContactInputSchema,
|
|
18
|
+
ListContactsInputSchema,
|
|
19
|
+
DeleteContactInputSchema,
|
|
20
|
+
BulkImportInputSchema,
|
|
21
|
+
ContactOutputSchema,
|
|
22
|
+
PaginatedContactsOutputSchema,
|
|
23
|
+
BulkImportResultSchema,
|
|
24
|
+
DeleteResultSchema,
|
|
25
|
+
DeactivateContactsByCompanyInputSchema,
|
|
26
|
+
DeactivateContactsByCompanyResultSchema
|
|
27
|
+
} from './types'
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Transform contact result to output format
|
|
31
|
+
* Converts Date objects to ISO strings for JSON serialization
|
|
32
|
+
*/
|
|
33
|
+
function toContactOutput(result: any) {
|
|
34
|
+
return {
|
|
35
|
+
id: result.id,
|
|
36
|
+
organizationId: result.organizationId,
|
|
37
|
+
companyId: result.companyId,
|
|
38
|
+
email: result.email,
|
|
39
|
+
emailValid: result.emailValid,
|
|
40
|
+
firstName: result.firstName,
|
|
41
|
+
lastName: result.lastName,
|
|
42
|
+
linkedinUrl: result.linkedinUrl,
|
|
43
|
+
title: result.title,
|
|
44
|
+
headline: result.headline,
|
|
45
|
+
filterReason: result.filterReason,
|
|
46
|
+
openingLine: result.openingLine,
|
|
47
|
+
source: result.source,
|
|
48
|
+
sourceId: result.sourceId,
|
|
49
|
+
pipelineStatus: result.pipelineStatus,
|
|
50
|
+
enrichmentData: result.enrichmentData,
|
|
51
|
+
tags: result.tags,
|
|
52
|
+
batchId: result.batchId ?? null,
|
|
53
|
+
status: result.status ?? 'active',
|
|
54
|
+
createdAt: result.createdAt instanceof Date ? result.createdAt.toISOString() : result.createdAt,
|
|
55
|
+
updatedAt: result.updatedAt instanceof Date ? result.updatedAt.toISOString() : result.updatedAt
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Create a new contact record
|
|
61
|
+
*
|
|
62
|
+
* @returns Tool for creating contacts
|
|
63
|
+
*/
|
|
64
|
+
export function createAcqContactCreateTool(): Tool {
|
|
65
|
+
return {
|
|
66
|
+
name: 'acq_contact_create',
|
|
67
|
+
description: 'Create a new contact record.',
|
|
68
|
+
inputSchema: CreateContactInputSchema,
|
|
69
|
+
outputSchema: ContactOutputSchema,
|
|
70
|
+
execute: async ({ input, executionContext }) => {
|
|
71
|
+
const leadService = getToolServices().leadService
|
|
72
|
+
if (!leadService) throw serviceUnavailable('LeadService')
|
|
73
|
+
if (!executionContext?.organizationId)
|
|
74
|
+
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
75
|
+
|
|
76
|
+
const validated = input as {
|
|
77
|
+
email: string
|
|
78
|
+
companyId?: string
|
|
79
|
+
firstName?: string
|
|
80
|
+
lastName?: string
|
|
81
|
+
linkedinUrl?: string
|
|
82
|
+
title?: string
|
|
83
|
+
source?: string
|
|
84
|
+
sourceId?: string
|
|
85
|
+
batchId?: string
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const result = await leadService.createContact({
|
|
89
|
+
organizationId: executionContext.organizationId,
|
|
90
|
+
...validated
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
return toContactOutput(result)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Update an existing contact with new data
|
|
100
|
+
*
|
|
101
|
+
* @returns Tool for updating contacts (enrichment, personalization, campaign status)
|
|
102
|
+
*/
|
|
103
|
+
export function createAcqContactUpdateTool(): Tool {
|
|
104
|
+
return {
|
|
105
|
+
name: 'acq_contact_update',
|
|
106
|
+
description: 'Update an existing contact with new data (enrichment, personalization, campaign status).',
|
|
107
|
+
inputSchema: UpdateContactInputSchema,
|
|
108
|
+
outputSchema: ContactOutputSchema,
|
|
109
|
+
execute: async ({ input, executionContext }) => {
|
|
110
|
+
const leadService = getToolServices().leadService
|
|
111
|
+
if (!leadService) throw serviceUnavailable('LeadService')
|
|
112
|
+
if (!executionContext?.organizationId)
|
|
113
|
+
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
114
|
+
|
|
115
|
+
const { id, ...params } = input as { id: string; [key: string]: unknown }
|
|
116
|
+
const result = await leadService.updateContact(id, params)
|
|
117
|
+
|
|
118
|
+
return toContactOutput(result)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Upsert a contact by email
|
|
125
|
+
*
|
|
126
|
+
* @returns Tool for upserting contacts (creates new or updates existing by email)
|
|
127
|
+
*/
|
|
128
|
+
export function createAcqContactUpsertTool(): Tool {
|
|
129
|
+
return {
|
|
130
|
+
name: 'acq_contact_upsert',
|
|
131
|
+
description: 'Upsert a contact by email. Creates new contact if email does not exist, otherwise updates existing.',
|
|
132
|
+
inputSchema: UpsertContactInputSchema,
|
|
133
|
+
outputSchema: ContactOutputSchema,
|
|
134
|
+
execute: async ({ input, executionContext }) => {
|
|
135
|
+
const leadService = getToolServices().leadService
|
|
136
|
+
if (!leadService) throw serviceUnavailable('LeadService')
|
|
137
|
+
if (!executionContext?.organizationId)
|
|
138
|
+
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
139
|
+
|
|
140
|
+
const validated = input as {
|
|
141
|
+
email: string
|
|
142
|
+
companyId?: string
|
|
143
|
+
firstName?: string
|
|
144
|
+
lastName?: string
|
|
145
|
+
linkedinUrl?: string
|
|
146
|
+
title?: string
|
|
147
|
+
source?: string
|
|
148
|
+
sourceId?: string
|
|
149
|
+
batchId?: string
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const result = await leadService.upsertContact({
|
|
153
|
+
organizationId: executionContext.organizationId,
|
|
154
|
+
...validated
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
return toContactOutput(result)
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Get a single contact by ID
|
|
164
|
+
*
|
|
165
|
+
* @returns Tool for retrieving a contact by ID
|
|
166
|
+
*/
|
|
167
|
+
export function createAcqContactGetTool(): Tool {
|
|
168
|
+
return {
|
|
169
|
+
name: 'acq_contact_get',
|
|
170
|
+
description: 'Get a single contact by ID.',
|
|
171
|
+
inputSchema: GetContactInputSchema,
|
|
172
|
+
outputSchema: ContactOutputSchema.nullable(),
|
|
173
|
+
execute: async ({ input, executionContext }) => {
|
|
174
|
+
const leadService = getToolServices().leadService
|
|
175
|
+
if (!leadService) throw serviceUnavailable('LeadService')
|
|
176
|
+
if (!executionContext?.organizationId)
|
|
177
|
+
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
178
|
+
|
|
179
|
+
const { id } = input as { id: string }
|
|
180
|
+
const result = await leadService.getContact(id, executionContext.organizationId)
|
|
181
|
+
return result ? toContactOutput(result) : null
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* List contacts with filters and pagination
|
|
188
|
+
*
|
|
189
|
+
* @returns Tool for listing contacts with optional filters (list, qualification, campaign)
|
|
190
|
+
*/
|
|
191
|
+
export function createAcqContactListTool(): Tool {
|
|
192
|
+
return {
|
|
193
|
+
name: 'acq_contact_list',
|
|
194
|
+
description: 'List contacts with optional filters (list, qualification, campaign) and pagination.',
|
|
195
|
+
inputSchema: ListContactsInputSchema,
|
|
196
|
+
outputSchema: PaginatedContactsOutputSchema,
|
|
197
|
+
execute: async ({ input, executionContext }) => {
|
|
198
|
+
const leadService = getToolServices().leadService
|
|
199
|
+
if (!leadService) throw serviceUnavailable('LeadService')
|
|
200
|
+
if (!executionContext?.organizationId)
|
|
201
|
+
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
202
|
+
|
|
203
|
+
const { limit, offset, ...filters } = input as {
|
|
204
|
+
limit?: number
|
|
205
|
+
offset?: number
|
|
206
|
+
openingLineIsNull?: boolean
|
|
207
|
+
batchId?: string
|
|
208
|
+
contactStatus?: 'active' | 'invalid'
|
|
209
|
+
}
|
|
210
|
+
const result = await leadService.listContacts(executionContext.organizationId, filters, {
|
|
211
|
+
limit: limit ?? 100,
|
|
212
|
+
offset: offset ?? 0
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
return {
|
|
216
|
+
data: result.data.map(toContactOutput),
|
|
217
|
+
total: result.total,
|
|
218
|
+
limit: result.limit,
|
|
219
|
+
offset: result.offset
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Delete a contact record
|
|
227
|
+
*
|
|
228
|
+
* @returns Tool for deleting contacts
|
|
229
|
+
*/
|
|
230
|
+
export function createAcqContactDeleteTool(): Tool {
|
|
231
|
+
return {
|
|
232
|
+
name: 'acq_contact_delete',
|
|
233
|
+
description: 'Delete a contact record.',
|
|
234
|
+
inputSchema: DeleteContactInputSchema,
|
|
235
|
+
outputSchema: DeleteResultSchema,
|
|
236
|
+
execute: async ({ input, executionContext }) => {
|
|
237
|
+
const leadService = getToolServices().leadService
|
|
238
|
+
if (!leadService) throw serviceUnavailable('LeadService')
|
|
239
|
+
if (!executionContext?.organizationId)
|
|
240
|
+
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
241
|
+
|
|
242
|
+
const { id } = input as { id: string }
|
|
243
|
+
await leadService.deleteContact(id, executionContext.organizationId)
|
|
244
|
+
return { success: true }
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Batch import contacts with automatic deduplication
|
|
251
|
+
*
|
|
252
|
+
* @returns Tool for bulk importing contacts (creates new or updates existing by email)
|
|
253
|
+
*/
|
|
254
|
+
export function createAcqContactBulkImportTool(): Tool {
|
|
255
|
+
return {
|
|
256
|
+
name: 'acq_contact_bulk_import',
|
|
257
|
+
description:
|
|
258
|
+
'Batch import contacts with automatic deduplication. Creates new contacts or updates existing by email.',
|
|
259
|
+
inputSchema: BulkImportInputSchema,
|
|
260
|
+
outputSchema: BulkImportResultSchema,
|
|
261
|
+
execute: async ({ input, executionContext }) => {
|
|
262
|
+
const leadService = getToolServices().leadService
|
|
263
|
+
if (!leadService) throw serviceUnavailable('LeadService')
|
|
264
|
+
if (!executionContext?.organizationId)
|
|
265
|
+
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
266
|
+
|
|
267
|
+
const { contacts } = input as {
|
|
268
|
+
contacts: Array<{
|
|
269
|
+
email: string
|
|
270
|
+
companyId?: string
|
|
271
|
+
firstName?: string
|
|
272
|
+
lastName?: string
|
|
273
|
+
linkedinUrl?: string
|
|
274
|
+
title?: string
|
|
275
|
+
source?: string
|
|
276
|
+
sourceId?: string
|
|
277
|
+
batchId?: string
|
|
278
|
+
}>
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const result = await leadService.bulkImportContacts({
|
|
282
|
+
organizationId: executionContext.organizationId,
|
|
283
|
+
contacts: contacts.map((c) => ({
|
|
284
|
+
organizationId: executionContext.organizationId,
|
|
285
|
+
...c
|
|
286
|
+
}))
|
|
287
|
+
})
|
|
288
|
+
|
|
289
|
+
return result
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Deactivate all active contacts belonging to a company.
|
|
296
|
+
* Used by qualification workflow to cascade company disqualification.
|
|
297
|
+
*
|
|
298
|
+
* @returns Tool for bulk deactivating contacts by company
|
|
299
|
+
*/
|
|
300
|
+
export function createAcqContactDeactivateByCompanyTool(): Tool {
|
|
301
|
+
return {
|
|
302
|
+
name: 'acq_contact_deactivate_by_company',
|
|
303
|
+
description: 'Deactivate all active contacts belonging to a company. Used to cascade company disqualification.',
|
|
304
|
+
inputSchema: DeactivateContactsByCompanyInputSchema,
|
|
305
|
+
outputSchema: DeactivateContactsByCompanyResultSchema,
|
|
306
|
+
execute: async ({ input, executionContext }) => {
|
|
307
|
+
const leadService = getToolServices().leadService
|
|
308
|
+
if (!leadService) throw serviceUnavailable('LeadService')
|
|
309
|
+
if (!executionContext?.organizationId)
|
|
310
|
+
throw serviceUnavailable('ExecutionContext', { reason: 'organizationId required for multi-tenant isolation' })
|
|
311
|
+
|
|
312
|
+
const { companyId } = input as { companyId: string }
|
|
313
|
+
return leadService.deactivateContactsByCompany({
|
|
314
|
+
organizationId: executionContext.organizationId,
|
|
315
|
+
companyId
|
|
316
|
+
})
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|