@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.
- package/dist/test-utils/index.d.ts +3122 -0
- package/dist/test-utils/index.js +386 -0
- package/package.json +6 -1
- package/src/README.md +39 -36
- package/src/__tests__/publish.test.ts +18 -13
- 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 +47 -36
- 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 -2
- package/src/business/projects/sse-events.ts +21 -21
- 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 -700
- 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 -37
- 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 +607 -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 +30 -138
- 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 +7 -8
- 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/published.ts +4 -0
- package/src/test-utils/rls/RLSTestContext.ts +554 -554
- package/src/test-utils/rls/index.ts +1 -1
|
@@ -1,210 +1,210 @@
|
|
|
1
|
-
import { ExecutionError } from '../../../execution/engine/base/errors'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Better Stack Logger (Simplified)
|
|
5
|
-
*
|
|
6
|
-
* Production-only error logging using Sentry SDK pointing to Better Stack.
|
|
7
|
-
* Provides domain-specific context that global error handler cannot infer.
|
|
8
|
-
*
|
|
9
|
-
* **Design Philosophy:**
|
|
10
|
-
* - Global error handler (setup-error-handler.ts) catches ALL errors automatically
|
|
11
|
-
* - bslog functions only add value when they provide context the global handler can't capture
|
|
12
|
-
* - WebSocket, SSE, Database, and Critical errors are already handled by global error handler
|
|
13
|
-
* - Only use these functions for external services and execution failures that need special context
|
|
14
|
-
*
|
|
15
|
-
* **Naming Convention:** Prefixed with "bslog" to distinguish from other logging systems:
|
|
16
|
-
* - Fastify Logger: request.log.info/error (HTTP lifecycle)
|
|
17
|
-
* - Execution Logger: executionLogger.logError (AI execution tracking)
|
|
18
|
-
* - Better Stack Logger: bslog*() (production error tracking & alerts)
|
|
19
|
-
*
|
|
20
|
-
* **When to Use:**
|
|
21
|
-
* - External service failures (OpenAI, WorkOS, OAuth) - global handler can't infer service name
|
|
22
|
-
* - Execution failures - global handler can't infer execution phase/resource type
|
|
23
|
-
* - System errors only (use isSystemError() to filter 5xx vs 4xx)
|
|
24
|
-
*
|
|
25
|
-
* **When NOT to Use:**
|
|
26
|
-
* - User errors (4xx validation, auth checks) - too noisy
|
|
27
|
-
* - WebSocket/SSE/Database errors - global handler already logs these
|
|
28
|
-
* - Generic errors - global handler already logs these
|
|
29
|
-
*
|
|
30
|
-
* All functions are no-ops unless NODE_ENV === 'production' AND API_BETTERSTACK_ERRORS_DSN is set.
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Log external service failures (OpenAI, WorkOS, OAuth providers)
|
|
35
|
-
*
|
|
36
|
-
* Use this when external API calls fail to add service-specific context
|
|
37
|
-
* that the global error handler cannot infer.
|
|
38
|
-
*
|
|
39
|
-
* @example
|
|
40
|
-
* ```typescript
|
|
41
|
-
* try {
|
|
42
|
-
* const response = await openai.chat.completions.create(params)
|
|
43
|
-
* } catch (error) {
|
|
44
|
-
* bslogExternalServiceError('openai', 'chat.completions.create', error, {
|
|
45
|
-
* model: params.model,
|
|
46
|
-
* tokens: params.max_tokens,
|
|
47
|
-
* organizationId: executionContext.organizationId,
|
|
48
|
-
* statusCode: (error as any).status
|
|
49
|
-
* })
|
|
50
|
-
* throw error
|
|
51
|
-
* }
|
|
52
|
-
* ```
|
|
53
|
-
*/
|
|
54
|
-
export async function bslogExternalServiceError(
|
|
55
|
-
service: 'openai' | 'workos' | 'google-oauth' | 'notion-oauth' | 'attio-oauth' | string,
|
|
56
|
-
operation: string,
|
|
57
|
-
error: Error,
|
|
58
|
-
context?: {
|
|
59
|
-
statusCode?: number
|
|
60
|
-
response?: string
|
|
61
|
-
endpoint?: string
|
|
62
|
-
organizationId?: string
|
|
63
|
-
userId?: string
|
|
64
|
-
[key: string]: unknown
|
|
65
|
-
}
|
|
66
|
-
): Promise<void> {
|
|
67
|
-
if (process.env.NODE_ENV === 'production' && process.env.API_BETTERSTACK_ERRORS_DSN) {
|
|
68
|
-
// Sentry is optional - only loaded in production
|
|
69
|
-
try {
|
|
70
|
-
const Sentry = await import('@sentry/node')
|
|
71
|
-
Sentry.captureException(error, {
|
|
72
|
-
tags: {
|
|
73
|
-
layer: 'integration',
|
|
74
|
-
service,
|
|
75
|
-
operation,
|
|
76
|
-
...(context?.statusCode && { status_code: context.statusCode })
|
|
77
|
-
},
|
|
78
|
-
user: context?.userId
|
|
79
|
-
? {
|
|
80
|
-
id: context.userId
|
|
81
|
-
}
|
|
82
|
-
: undefined,
|
|
83
|
-
extra: {
|
|
84
|
-
service,
|
|
85
|
-
operation,
|
|
86
|
-
organizationId: context?.organizationId,
|
|
87
|
-
endpoint: context?.endpoint,
|
|
88
|
-
response: context?.response,
|
|
89
|
-
...context
|
|
90
|
-
}
|
|
91
|
-
})
|
|
92
|
-
} catch {
|
|
93
|
-
// Sentry not available - skip logging
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Log workflow/agent execution failures
|
|
100
|
-
*
|
|
101
|
-
* Use this for critical business logic failures to add execution-specific
|
|
102
|
-
* context that the global error handler cannot infer.
|
|
103
|
-
*
|
|
104
|
-
* @example
|
|
105
|
-
* ```typescript
|
|
106
|
-
* try {
|
|
107
|
-
* return await this.runExecution(params)
|
|
108
|
-
* } catch (error) {
|
|
109
|
-
* bslogExecutionFailure({
|
|
110
|
-
* executionId: execution.id,
|
|
111
|
-
* resourceType: params.resourceType,
|
|
112
|
-
* resourceId: params.resourceId,
|
|
113
|
-
* organizationId: params.organizationId,
|
|
114
|
-
* userId: params.userId,
|
|
115
|
-
* inputType: typeof params.input,
|
|
116
|
-
* errorPhase: 'execution'
|
|
117
|
-
* }, error as Error)
|
|
118
|
-
* throw error
|
|
119
|
-
* }
|
|
120
|
-
* ```
|
|
121
|
-
*/
|
|
122
|
-
export async function bslogExecutionFailure(
|
|
123
|
-
executionContext: {
|
|
124
|
-
executionId?: string
|
|
125
|
-
resourceType: 'workflow' | 'agent'
|
|
126
|
-
resourceId: string
|
|
127
|
-
organizationId: string
|
|
128
|
-
userId?: string
|
|
129
|
-
inputType?: string
|
|
130
|
-
errorPhase?: 'initialization' | 'execution' | 'completion' | 'cleanup'
|
|
131
|
-
},
|
|
132
|
-
error: Error
|
|
133
|
-
): Promise<void> {
|
|
134
|
-
if (process.env.NODE_ENV === 'production' && process.env.API_BETTERSTACK_ERRORS_DSN) {
|
|
135
|
-
try {
|
|
136
|
-
const Sentry = await import('@sentry/node')
|
|
137
|
-
const domainTags =
|
|
138
|
-
error instanceof ExecutionError
|
|
139
|
-
? {
|
|
140
|
-
error_type_domain: error.type,
|
|
141
|
-
error_severity: error.severity,
|
|
142
|
-
error_category: error.category,
|
|
143
|
-
is_retryable: String(error.isRetryable())
|
|
144
|
-
}
|
|
145
|
-
: {}
|
|
146
|
-
|
|
147
|
-
Sentry.captureException(error, {
|
|
148
|
-
tags: {
|
|
149
|
-
layer: 'execution',
|
|
150
|
-
resource_type: executionContext.resourceType,
|
|
151
|
-
organization_id: executionContext.organizationId,
|
|
152
|
-
error_phase: executionContext.errorPhase || 'execution',
|
|
153
|
-
...domainTags
|
|
154
|
-
},
|
|
155
|
-
user: executionContext.userId
|
|
156
|
-
? {
|
|
157
|
-
id: executionContext.userId
|
|
158
|
-
}
|
|
159
|
-
: undefined,
|
|
160
|
-
extra: {
|
|
161
|
-
executionId: executionContext.executionId,
|
|
162
|
-
resourceType: executionContext.resourceType,
|
|
163
|
-
resourceId: executionContext.resourceId,
|
|
164
|
-
organizationId: executionContext.organizationId,
|
|
165
|
-
inputType: executionContext.inputType,
|
|
166
|
-
errorPhase: executionContext.errorPhase
|
|
167
|
-
}
|
|
168
|
-
})
|
|
169
|
-
} catch {
|
|
170
|
-
// Sentry not available - skip logging
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Helper: Check if error should be logged to Better Stack
|
|
177
|
-
*
|
|
178
|
-
* Returns true for system errors (5xx), false for user errors (4xx)
|
|
179
|
-
*
|
|
180
|
-
* Use this to filter out validation errors and auth failures that
|
|
181
|
-
* would create noise in Better Stack.
|
|
182
|
-
*
|
|
183
|
-
* @example
|
|
184
|
-
* ```typescript
|
|
185
|
-
* catch (error) {
|
|
186
|
-
* if (isSystemError(error)) {
|
|
187
|
-
* bslogExternalServiceError('openai', 'completion', error, { ... })
|
|
188
|
-
* }
|
|
189
|
-
* throw error
|
|
190
|
-
* }
|
|
191
|
-
* ```
|
|
192
|
-
*/
|
|
193
|
-
export function isSystemError(error: unknown): boolean {
|
|
194
|
-
// Check if error has a status code property (common in HTTP errors)
|
|
195
|
-
if (error && typeof error === 'object') {
|
|
196
|
-
const statusCode =
|
|
197
|
-
('statusCode' in error && typeof error.statusCode === 'number' && error.statusCode) ||
|
|
198
|
-
('status' in error && typeof error.status === 'number' && error.status) ||
|
|
199
|
-
('code' in error && typeof error.code === 'number' && error.code)
|
|
200
|
-
|
|
201
|
-
if (statusCode) {
|
|
202
|
-
// 5xx = system error (log it)
|
|
203
|
-
// 4xx = user error (don't log)
|
|
204
|
-
return statusCode >= 500
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// If no status code, assume it's a system error (better to over-log than under-log)
|
|
209
|
-
return true
|
|
210
|
-
}
|
|
1
|
+
import { ExecutionError } from '../../../execution/engine/base/errors'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Better Stack Logger (Simplified)
|
|
5
|
+
*
|
|
6
|
+
* Production-only error logging using Sentry SDK pointing to Better Stack.
|
|
7
|
+
* Provides domain-specific context that global error handler cannot infer.
|
|
8
|
+
*
|
|
9
|
+
* **Design Philosophy:**
|
|
10
|
+
* - Global error handler (setup-error-handler.ts) catches ALL errors automatically
|
|
11
|
+
* - bslog functions only add value when they provide context the global handler can't capture
|
|
12
|
+
* - WebSocket, SSE, Database, and Critical errors are already handled by global error handler
|
|
13
|
+
* - Only use these functions for external services and execution failures that need special context
|
|
14
|
+
*
|
|
15
|
+
* **Naming Convention:** Prefixed with "bslog" to distinguish from other logging systems:
|
|
16
|
+
* - Fastify Logger: request.log.info/error (HTTP lifecycle)
|
|
17
|
+
* - Execution Logger: executionLogger.logError (AI execution tracking)
|
|
18
|
+
* - Better Stack Logger: bslog*() (production error tracking & alerts)
|
|
19
|
+
*
|
|
20
|
+
* **When to Use:**
|
|
21
|
+
* - External service failures (OpenAI, WorkOS, OAuth) - global handler can't infer service name
|
|
22
|
+
* - Execution failures - global handler can't infer execution phase/resource type
|
|
23
|
+
* - System errors only (use isSystemError() to filter 5xx vs 4xx)
|
|
24
|
+
*
|
|
25
|
+
* **When NOT to Use:**
|
|
26
|
+
* - User errors (4xx validation, auth checks) - too noisy
|
|
27
|
+
* - WebSocket/SSE/Database errors - global handler already logs these
|
|
28
|
+
* - Generic errors - global handler already logs these
|
|
29
|
+
*
|
|
30
|
+
* All functions are no-ops unless NODE_ENV === 'production' AND API_BETTERSTACK_ERRORS_DSN is set.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Log external service failures (OpenAI, WorkOS, OAuth providers)
|
|
35
|
+
*
|
|
36
|
+
* Use this when external API calls fail to add service-specific context
|
|
37
|
+
* that the global error handler cannot infer.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* try {
|
|
42
|
+
* const response = await openai.chat.completions.create(params)
|
|
43
|
+
* } catch (error) {
|
|
44
|
+
* bslogExternalServiceError('openai', 'chat.completions.create', error, {
|
|
45
|
+
* model: params.model,
|
|
46
|
+
* tokens: params.max_tokens,
|
|
47
|
+
* organizationId: executionContext.organizationId,
|
|
48
|
+
* statusCode: (error as any).status
|
|
49
|
+
* })
|
|
50
|
+
* throw error
|
|
51
|
+
* }
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export async function bslogExternalServiceError(
|
|
55
|
+
service: 'openai' | 'workos' | 'google-oauth' | 'notion-oauth' | 'attio-oauth' | string,
|
|
56
|
+
operation: string,
|
|
57
|
+
error: Error,
|
|
58
|
+
context?: {
|
|
59
|
+
statusCode?: number
|
|
60
|
+
response?: string
|
|
61
|
+
endpoint?: string
|
|
62
|
+
organizationId?: string
|
|
63
|
+
userId?: string
|
|
64
|
+
[key: string]: unknown
|
|
65
|
+
}
|
|
66
|
+
): Promise<void> {
|
|
67
|
+
if (process.env.NODE_ENV === 'production' && process.env.API_BETTERSTACK_ERRORS_DSN) {
|
|
68
|
+
// Sentry is optional - only loaded in production
|
|
69
|
+
try {
|
|
70
|
+
const Sentry = await import('@sentry/node')
|
|
71
|
+
Sentry.captureException(error, {
|
|
72
|
+
tags: {
|
|
73
|
+
layer: 'integration',
|
|
74
|
+
service,
|
|
75
|
+
operation,
|
|
76
|
+
...(context?.statusCode && { status_code: context.statusCode })
|
|
77
|
+
},
|
|
78
|
+
user: context?.userId
|
|
79
|
+
? {
|
|
80
|
+
id: context.userId
|
|
81
|
+
}
|
|
82
|
+
: undefined,
|
|
83
|
+
extra: {
|
|
84
|
+
service,
|
|
85
|
+
operation,
|
|
86
|
+
organizationId: context?.organizationId,
|
|
87
|
+
endpoint: context?.endpoint,
|
|
88
|
+
response: context?.response,
|
|
89
|
+
...context
|
|
90
|
+
}
|
|
91
|
+
})
|
|
92
|
+
} catch {
|
|
93
|
+
// Sentry not available - skip logging
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Log workflow/agent execution failures
|
|
100
|
+
*
|
|
101
|
+
* Use this for critical business logic failures to add execution-specific
|
|
102
|
+
* context that the global error handler cannot infer.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* try {
|
|
107
|
+
* return await this.runExecution(params)
|
|
108
|
+
* } catch (error) {
|
|
109
|
+
* bslogExecutionFailure({
|
|
110
|
+
* executionId: execution.id,
|
|
111
|
+
* resourceType: params.resourceType,
|
|
112
|
+
* resourceId: params.resourceId,
|
|
113
|
+
* organizationId: params.organizationId,
|
|
114
|
+
* userId: params.userId,
|
|
115
|
+
* inputType: typeof params.input,
|
|
116
|
+
* errorPhase: 'execution'
|
|
117
|
+
* }, error as Error)
|
|
118
|
+
* throw error
|
|
119
|
+
* }
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
export async function bslogExecutionFailure(
|
|
123
|
+
executionContext: {
|
|
124
|
+
executionId?: string
|
|
125
|
+
resourceType: 'workflow' | 'agent'
|
|
126
|
+
resourceId: string
|
|
127
|
+
organizationId: string
|
|
128
|
+
userId?: string
|
|
129
|
+
inputType?: string
|
|
130
|
+
errorPhase?: 'initialization' | 'execution' | 'completion' | 'cleanup'
|
|
131
|
+
},
|
|
132
|
+
error: Error
|
|
133
|
+
): Promise<void> {
|
|
134
|
+
if (process.env.NODE_ENV === 'production' && process.env.API_BETTERSTACK_ERRORS_DSN) {
|
|
135
|
+
try {
|
|
136
|
+
const Sentry = await import('@sentry/node')
|
|
137
|
+
const domainTags =
|
|
138
|
+
error instanceof ExecutionError
|
|
139
|
+
? {
|
|
140
|
+
error_type_domain: error.type,
|
|
141
|
+
error_severity: error.severity,
|
|
142
|
+
error_category: error.category,
|
|
143
|
+
is_retryable: String(error.isRetryable())
|
|
144
|
+
}
|
|
145
|
+
: {}
|
|
146
|
+
|
|
147
|
+
Sentry.captureException(error, {
|
|
148
|
+
tags: {
|
|
149
|
+
layer: 'execution',
|
|
150
|
+
resource_type: executionContext.resourceType,
|
|
151
|
+
organization_id: executionContext.organizationId,
|
|
152
|
+
error_phase: executionContext.errorPhase || 'execution',
|
|
153
|
+
...domainTags
|
|
154
|
+
},
|
|
155
|
+
user: executionContext.userId
|
|
156
|
+
? {
|
|
157
|
+
id: executionContext.userId
|
|
158
|
+
}
|
|
159
|
+
: undefined,
|
|
160
|
+
extra: {
|
|
161
|
+
executionId: executionContext.executionId,
|
|
162
|
+
resourceType: executionContext.resourceType,
|
|
163
|
+
resourceId: executionContext.resourceId,
|
|
164
|
+
organizationId: executionContext.organizationId,
|
|
165
|
+
inputType: executionContext.inputType,
|
|
166
|
+
errorPhase: executionContext.errorPhase
|
|
167
|
+
}
|
|
168
|
+
})
|
|
169
|
+
} catch {
|
|
170
|
+
// Sentry not available - skip logging
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Helper: Check if error should be logged to Better Stack
|
|
177
|
+
*
|
|
178
|
+
* Returns true for system errors (5xx), false for user errors (4xx)
|
|
179
|
+
*
|
|
180
|
+
* Use this to filter out validation errors and auth failures that
|
|
181
|
+
* would create noise in Better Stack.
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```typescript
|
|
185
|
+
* catch (error) {
|
|
186
|
+
* if (isSystemError(error)) {
|
|
187
|
+
* bslogExternalServiceError('openai', 'completion', error, { ... })
|
|
188
|
+
* }
|
|
189
|
+
* throw error
|
|
190
|
+
* }
|
|
191
|
+
* ```
|
|
192
|
+
*/
|
|
193
|
+
export function isSystemError(error: unknown): boolean {
|
|
194
|
+
// Check if error has a status code property (common in HTTP errors)
|
|
195
|
+
if (error && typeof error === 'object') {
|
|
196
|
+
const statusCode =
|
|
197
|
+
('statusCode' in error && typeof error.statusCode === 'number' && error.statusCode) ||
|
|
198
|
+
('status' in error && typeof error.status === 'number' && error.status) ||
|
|
199
|
+
('code' in error && typeof error.code === 'number' && error.code)
|
|
200
|
+
|
|
201
|
+
if (statusCode) {
|
|
202
|
+
// 5xx = system error (log it)
|
|
203
|
+
// 4xx = user error (don't log)
|
|
204
|
+
return statusCode >= 500
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// If no status code, assume it's a system error (better to over-log than under-log)
|
|
209
|
+
return true
|
|
210
|
+
}
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HMAC Token Utilities
|
|
3
|
-
*
|
|
4
|
-
* Generic HMAC-based token generation and verification.
|
|
5
|
-
* Used for unsubscribe links, brochure personalization, and other marketing URLs.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import crypto from 'crypto'
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Generate HMAC-SHA256 token for any data
|
|
12
|
-
*
|
|
13
|
-
* @param data - Data to sign (email, contactId, etc.)
|
|
14
|
-
* @param secret - HMAC secret key (HMAC_SECRET)
|
|
15
|
-
* @returns 16-character hex token
|
|
16
|
-
*/
|
|
17
|
-
export function generateHmacToken(data: string, secret: string): string {
|
|
18
|
-
return crypto
|
|
19
|
-
.createHmac('sha256', secret)
|
|
20
|
-
.update(data.toLowerCase().trim())
|
|
21
|
-
.digest('hex')
|
|
22
|
-
.slice(0, 16)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Verify HMAC token using timing-safe comparison
|
|
27
|
-
*/
|
|
28
|
-
export function verifyHmacToken(data: string, token: string, secret: string): boolean {
|
|
29
|
-
const expected = generateHmacToken(data, secret)
|
|
30
|
-
if (token.length !== expected.length) return false
|
|
31
|
-
return crypto.timingSafeEqual(Buffer.from(token), Buffer.from(expected))
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Generate brochure URL with token
|
|
36
|
-
*/
|
|
37
|
-
export function generateBrochureUrl(
|
|
38
|
-
contactId: string,
|
|
39
|
-
secret: string,
|
|
40
|
-
baseUrl = 'https://brochure.elevasis.io'
|
|
41
|
-
): string {
|
|
42
|
-
const token = generateHmacToken(contactId, secret)
|
|
43
|
-
return `${baseUrl}/${contactId}?t=${token}`
|
|
44
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* HMAC Token Utilities
|
|
3
|
+
*
|
|
4
|
+
* Generic HMAC-based token generation and verification.
|
|
5
|
+
* Used for unsubscribe links, brochure personalization, and other marketing URLs.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import crypto from 'crypto'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Generate HMAC-SHA256 token for any data
|
|
12
|
+
*
|
|
13
|
+
* @param data - Data to sign (email, contactId, etc.)
|
|
14
|
+
* @param secret - HMAC secret key (HMAC_SECRET)
|
|
15
|
+
* @returns 16-character hex token
|
|
16
|
+
*/
|
|
17
|
+
export function generateHmacToken(data: string, secret: string): string {
|
|
18
|
+
return crypto
|
|
19
|
+
.createHmac('sha256', secret)
|
|
20
|
+
.update(data.toLowerCase().trim())
|
|
21
|
+
.digest('hex')
|
|
22
|
+
.slice(0, 16)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Verify HMAC token using timing-safe comparison
|
|
27
|
+
*/
|
|
28
|
+
export function verifyHmacToken(data: string, token: string, secret: string): boolean {
|
|
29
|
+
const expected = generateHmacToken(data, secret)
|
|
30
|
+
if (token.length !== expected.length) return false
|
|
31
|
+
return crypto.timingSafeEqual(Buffer.from(token), Buffer.from(expected))
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Generate brochure URL with token
|
|
36
|
+
*/
|
|
37
|
+
export function generateBrochureUrl(
|
|
38
|
+
contactId: string,
|
|
39
|
+
secret: string,
|
|
40
|
+
baseUrl = 'https://brochure.elevasis.io'
|
|
41
|
+
): string {
|
|
42
|
+
const token = generateHmacToken(contactId, secret)
|
|
43
|
+
return `${baseUrl}/${contactId}?t=${token}`
|
|
44
|
+
}
|