@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,140 +1,140 @@
|
|
|
1
|
-
import type { RateLimiter } from './rate-limiter-types'
|
|
2
|
-
import { DEFAULT_RATE_LIMIT_CAPACITY, DEFAULT_RATE_LIMIT_WINDOW_MS, STALE_BUCKET_MULTIPLIER } from '../constants/resilience'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Token bucket state
|
|
6
|
-
*/
|
|
7
|
-
interface TokenBucket {
|
|
8
|
-
tokens: number
|
|
9
|
-
lastRefill: number
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* In-memory token bucket rate limiter
|
|
14
|
-
*
|
|
15
|
-
* Implements token bucket algorithm for rate limiting integration API calls.
|
|
16
|
-
* Default: 60 requests per minute per organization per integration.
|
|
17
|
-
*
|
|
18
|
-
* Pattern: Stateful class (justified - manages rate limit state)
|
|
19
|
-
*
|
|
20
|
-
* @example
|
|
21
|
-
* const limiter = new InMemoryRateLimiter(60, 60000) // 60 req/min
|
|
22
|
-
* const allowed = await limiter.allow('org123:gmail')
|
|
23
|
-
* if (!allowed) {
|
|
24
|
-
* throw new ToolingError('rate_limit_exceeded', 'Rate limit exceeded')
|
|
25
|
-
* }
|
|
26
|
-
*/
|
|
27
|
-
export class InMemoryRateLimiter implements RateLimiter {
|
|
28
|
-
private buckets = new Map<string, TokenBucket>()
|
|
29
|
-
private lastEviction = Date.now()
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* @param capacity - Maximum tokens (requests) allowed
|
|
33
|
-
* @param refillIntervalMs - Refill interval in milliseconds
|
|
34
|
-
*/
|
|
35
|
-
constructor(
|
|
36
|
-
private readonly capacity: number = DEFAULT_RATE_LIMIT_CAPACITY,
|
|
37
|
-
private readonly refillIntervalMs: number = DEFAULT_RATE_LIMIT_WINDOW_MS
|
|
38
|
-
) {}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Check if request is allowed and consume token if available
|
|
42
|
-
*/
|
|
43
|
-
async allow(key: string): Promise<boolean> {
|
|
44
|
-
const bucket = this.getOrCreateBucket(key)
|
|
45
|
-
this.refillBucket(bucket)
|
|
46
|
-
|
|
47
|
-
if (bucket.tokens > 0) {
|
|
48
|
-
bucket.tokens -= 1
|
|
49
|
-
return true
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return false
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Get remaining tokens for key
|
|
57
|
-
*/
|
|
58
|
-
async remaining(key: string): Promise<number> {
|
|
59
|
-
const bucket = this.getOrCreateBucket(key)
|
|
60
|
-
this.refillBucket(bucket)
|
|
61
|
-
return Math.floor(bucket.tokens)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Reset rate limit for key (removes bucket)
|
|
66
|
-
*/
|
|
67
|
-
async reset(key: string): Promise<void> {
|
|
68
|
-
this.buckets.delete(key)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Get or create token bucket for key
|
|
73
|
-
* Lazily evicts stale buckets to prevent memory leaks
|
|
74
|
-
*/
|
|
75
|
-
private getOrCreateBucket(key: string): TokenBucket {
|
|
76
|
-
this.evictStaleBuckets()
|
|
77
|
-
|
|
78
|
-
let bucket = this.buckets.get(key)
|
|
79
|
-
if (!bucket) {
|
|
80
|
-
bucket = {
|
|
81
|
-
tokens: this.capacity,
|
|
82
|
-
lastRefill: Date.now()
|
|
83
|
-
}
|
|
84
|
-
this.buckets.set(key, bucket)
|
|
85
|
-
}
|
|
86
|
-
return bucket
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Evict buckets that haven't been accessed in 5x the refill interval
|
|
91
|
-
* Runs at most once per refill interval to avoid overhead
|
|
92
|
-
*/
|
|
93
|
-
private evictStaleBuckets(): void {
|
|
94
|
-
const now = Date.now()
|
|
95
|
-
if (now - this.lastEviction < this.refillIntervalMs) return
|
|
96
|
-
this.lastEviction = now
|
|
97
|
-
|
|
98
|
-
const staleThreshold = this.refillIntervalMs * STALE_BUCKET_MULTIPLIER
|
|
99
|
-
for (const [key, bucket] of this.buckets) {
|
|
100
|
-
if (now - bucket.lastRefill > staleThreshold) {
|
|
101
|
-
this.buckets.delete(key)
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Refill bucket based on time elapsed
|
|
108
|
-
* Uses linear refill: tokens added = (elapsed / interval) * capacity
|
|
109
|
-
*/
|
|
110
|
-
private refillBucket(bucket: TokenBucket): void {
|
|
111
|
-
const now = Date.now()
|
|
112
|
-
const elapsed = now - bucket.lastRefill
|
|
113
|
-
|
|
114
|
-
if (elapsed >= this.refillIntervalMs) {
|
|
115
|
-
// Full refill if interval passed
|
|
116
|
-
bucket.tokens = this.capacity
|
|
117
|
-
bucket.lastRefill = now
|
|
118
|
-
} else {
|
|
119
|
-
// Partial refill based on elapsed time
|
|
120
|
-
const tokensToAdd = (elapsed / this.refillIntervalMs) * this.capacity
|
|
121
|
-
bucket.tokens = Math.min(this.capacity, bucket.tokens + tokensToAdd)
|
|
122
|
-
bucket.lastRefill = now
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Clear all buckets (for testing)
|
|
128
|
-
*/
|
|
129
|
-
clearAll(): void {
|
|
130
|
-
this.buckets.clear()
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Create default rate limiter instance
|
|
136
|
-
* 60 requests per minute per organization per integration
|
|
137
|
-
*/
|
|
138
|
-
export function createRateLimiter(): RateLimiter {
|
|
139
|
-
return new InMemoryRateLimiter(DEFAULT_RATE_LIMIT_CAPACITY, DEFAULT_RATE_LIMIT_WINDOW_MS)
|
|
140
|
-
}
|
|
1
|
+
import type { RateLimiter } from './rate-limiter-types'
|
|
2
|
+
import { DEFAULT_RATE_LIMIT_CAPACITY, DEFAULT_RATE_LIMIT_WINDOW_MS, STALE_BUCKET_MULTIPLIER } from '../constants/resilience'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Token bucket state
|
|
6
|
+
*/
|
|
7
|
+
interface TokenBucket {
|
|
8
|
+
tokens: number
|
|
9
|
+
lastRefill: number
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* In-memory token bucket rate limiter
|
|
14
|
+
*
|
|
15
|
+
* Implements token bucket algorithm for rate limiting integration API calls.
|
|
16
|
+
* Default: 60 requests per minute per organization per integration.
|
|
17
|
+
*
|
|
18
|
+
* Pattern: Stateful class (justified - manages rate limit state)
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* const limiter = new InMemoryRateLimiter(60, 60000) // 60 req/min
|
|
22
|
+
* const allowed = await limiter.allow('org123:gmail')
|
|
23
|
+
* if (!allowed) {
|
|
24
|
+
* throw new ToolingError('rate_limit_exceeded', 'Rate limit exceeded')
|
|
25
|
+
* }
|
|
26
|
+
*/
|
|
27
|
+
export class InMemoryRateLimiter implements RateLimiter {
|
|
28
|
+
private buckets = new Map<string, TokenBucket>()
|
|
29
|
+
private lastEviction = Date.now()
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @param capacity - Maximum tokens (requests) allowed
|
|
33
|
+
* @param refillIntervalMs - Refill interval in milliseconds
|
|
34
|
+
*/
|
|
35
|
+
constructor(
|
|
36
|
+
private readonly capacity: number = DEFAULT_RATE_LIMIT_CAPACITY,
|
|
37
|
+
private readonly refillIntervalMs: number = DEFAULT_RATE_LIMIT_WINDOW_MS
|
|
38
|
+
) {}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Check if request is allowed and consume token if available
|
|
42
|
+
*/
|
|
43
|
+
async allow(key: string): Promise<boolean> {
|
|
44
|
+
const bucket = this.getOrCreateBucket(key)
|
|
45
|
+
this.refillBucket(bucket)
|
|
46
|
+
|
|
47
|
+
if (bucket.tokens > 0) {
|
|
48
|
+
bucket.tokens -= 1
|
|
49
|
+
return true
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return false
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Get remaining tokens for key
|
|
57
|
+
*/
|
|
58
|
+
async remaining(key: string): Promise<number> {
|
|
59
|
+
const bucket = this.getOrCreateBucket(key)
|
|
60
|
+
this.refillBucket(bucket)
|
|
61
|
+
return Math.floor(bucket.tokens)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Reset rate limit for key (removes bucket)
|
|
66
|
+
*/
|
|
67
|
+
async reset(key: string): Promise<void> {
|
|
68
|
+
this.buckets.delete(key)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Get or create token bucket for key
|
|
73
|
+
* Lazily evicts stale buckets to prevent memory leaks
|
|
74
|
+
*/
|
|
75
|
+
private getOrCreateBucket(key: string): TokenBucket {
|
|
76
|
+
this.evictStaleBuckets()
|
|
77
|
+
|
|
78
|
+
let bucket = this.buckets.get(key)
|
|
79
|
+
if (!bucket) {
|
|
80
|
+
bucket = {
|
|
81
|
+
tokens: this.capacity,
|
|
82
|
+
lastRefill: Date.now()
|
|
83
|
+
}
|
|
84
|
+
this.buckets.set(key, bucket)
|
|
85
|
+
}
|
|
86
|
+
return bucket
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Evict buckets that haven't been accessed in 5x the refill interval
|
|
91
|
+
* Runs at most once per refill interval to avoid overhead
|
|
92
|
+
*/
|
|
93
|
+
private evictStaleBuckets(): void {
|
|
94
|
+
const now = Date.now()
|
|
95
|
+
if (now - this.lastEviction < this.refillIntervalMs) return
|
|
96
|
+
this.lastEviction = now
|
|
97
|
+
|
|
98
|
+
const staleThreshold = this.refillIntervalMs * STALE_BUCKET_MULTIPLIER
|
|
99
|
+
for (const [key, bucket] of this.buckets) {
|
|
100
|
+
if (now - bucket.lastRefill > staleThreshold) {
|
|
101
|
+
this.buckets.delete(key)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Refill bucket based on time elapsed
|
|
108
|
+
* Uses linear refill: tokens added = (elapsed / interval) * capacity
|
|
109
|
+
*/
|
|
110
|
+
private refillBucket(bucket: TokenBucket): void {
|
|
111
|
+
const now = Date.now()
|
|
112
|
+
const elapsed = now - bucket.lastRefill
|
|
113
|
+
|
|
114
|
+
if (elapsed >= this.refillIntervalMs) {
|
|
115
|
+
// Full refill if interval passed
|
|
116
|
+
bucket.tokens = this.capacity
|
|
117
|
+
bucket.lastRefill = now
|
|
118
|
+
} else {
|
|
119
|
+
// Partial refill based on elapsed time
|
|
120
|
+
const tokensToAdd = (elapsed / this.refillIntervalMs) * this.capacity
|
|
121
|
+
bucket.tokens = Math.min(this.capacity, bucket.tokens + tokensToAdd)
|
|
122
|
+
bucket.lastRefill = now
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Clear all buckets (for testing)
|
|
128
|
+
*/
|
|
129
|
+
clearAll(): void {
|
|
130
|
+
this.buckets.clear()
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Create default rate limiter instance
|
|
136
|
+
* 60 requests per minute per organization per integration
|
|
137
|
+
*/
|
|
138
|
+
export function createRateLimiter(): RateLimiter {
|
|
139
|
+
return new InMemoryRateLimiter(DEFAULT_RATE_LIMIT_CAPACITY, DEFAULT_RATE_LIMIT_WINDOW_MS)
|
|
140
|
+
}
|
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
import type { RetryPolicy } from './rate-limiter-types'
|
|
2
|
-
import { ToolingError } from '../../execution/engine/tools/types'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Calculate retry delay with exponential backoff and jitter
|
|
6
|
-
*
|
|
7
|
-
* Formula: delay = min(maxDelay, initialDelay * 2^attempt) * (1 +/- jitter)
|
|
8
|
-
*
|
|
9
|
-
* @param attempt - Retry attempt number (0-indexed)
|
|
10
|
-
* @param policy - Retry policy configuration
|
|
11
|
-
* @returns Delay in milliseconds
|
|
12
|
-
*/
|
|
13
|
-
export function calculateRetryDelay(attempt: number, policy: RetryPolicy): number {
|
|
14
|
-
const exponentialDelay = policy.initialDelayMs * Math.pow(2, attempt)
|
|
15
|
-
const cappedDelay = Math.min(policy.maxDelayMs, exponentialDelay)
|
|
16
|
-
|
|
17
|
-
// Add jitter: random factor between (1 - jitter) and (1 + jitter)
|
|
18
|
-
const jitterRange = policy.jitterFactor * 2
|
|
19
|
-
const jitterMultiplier = 1 - policy.jitterFactor + Math.random() * jitterRange
|
|
20
|
-
|
|
21
|
-
return Math.floor(cappedDelay * jitterMultiplier)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Sleep for specified milliseconds
|
|
26
|
-
*/
|
|
27
|
-
export function sleep(ms: number): Promise<void> {
|
|
28
|
-
return new Promise((resolve) => setTimeout(resolve, ms))
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Execute function with retry logic
|
|
33
|
-
*
|
|
34
|
-
* Retries on ToolingError where isRetryable() returns true.
|
|
35
|
-
* Uses exponential backoff with jitter to prevent thundering herd.
|
|
36
|
-
*
|
|
37
|
-
* Pattern: Stateless function (processor pattern)
|
|
38
|
-
*
|
|
39
|
-
* @param fn - Function to execute
|
|
40
|
-
* @param policy - Retry policy
|
|
41
|
-
* @returns Function result
|
|
42
|
-
* @throws ToolingError if all retries exhausted
|
|
43
|
-
*
|
|
44
|
-
* @example
|
|
45
|
-
* const result = await withRetry(
|
|
46
|
-
* () => adapter.call('sendEmail', params, creds),
|
|
47
|
-
* DEFAULT_RETRY_POLICY
|
|
48
|
-
* )
|
|
49
|
-
*/
|
|
50
|
-
export async function withRetry<T>(
|
|
51
|
-
fn: () => Promise<T>,
|
|
52
|
-
policy: RetryPolicy
|
|
53
|
-
): Promise<T> {
|
|
54
|
-
let lastError: Error | undefined
|
|
55
|
-
|
|
56
|
-
for (let attempt = 0; attempt <= policy.maxRetries; attempt++) {
|
|
57
|
-
try {
|
|
58
|
-
return await fn()
|
|
59
|
-
} catch (error) {
|
|
60
|
-
lastError = error as Error
|
|
61
|
-
|
|
62
|
-
// Don't retry non-ToolingErrors (programming bugs, TypeErrors, etc.)
|
|
63
|
-
if (!(error instanceof ToolingError)) {
|
|
64
|
-
throw error
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Don't retry if the ToolingError is marked non-retryable
|
|
68
|
-
if (!error.isRetryable()) {
|
|
69
|
-
throw error
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Don't retry if max retries reached
|
|
73
|
-
if (attempt === policy.maxRetries) {
|
|
74
|
-
break
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Calculate delay and sleep before retry
|
|
78
|
-
const delay = calculateRetryDelay(attempt, policy)
|
|
79
|
-
await sleep(delay)
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// All retries exhausted
|
|
84
|
-
throw new ToolingError(
|
|
85
|
-
'api_error',
|
|
86
|
-
`Failed after ${policy.maxRetries} retries: ${lastError?.message}`,
|
|
87
|
-
{ originalError: lastError }
|
|
88
|
-
)
|
|
89
|
-
}
|
|
1
|
+
import type { RetryPolicy } from './rate-limiter-types'
|
|
2
|
+
import { ToolingError } from '../../execution/engine/tools/types'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Calculate retry delay with exponential backoff and jitter
|
|
6
|
+
*
|
|
7
|
+
* Formula: delay = min(maxDelay, initialDelay * 2^attempt) * (1 +/- jitter)
|
|
8
|
+
*
|
|
9
|
+
* @param attempt - Retry attempt number (0-indexed)
|
|
10
|
+
* @param policy - Retry policy configuration
|
|
11
|
+
* @returns Delay in milliseconds
|
|
12
|
+
*/
|
|
13
|
+
export function calculateRetryDelay(attempt: number, policy: RetryPolicy): number {
|
|
14
|
+
const exponentialDelay = policy.initialDelayMs * Math.pow(2, attempt)
|
|
15
|
+
const cappedDelay = Math.min(policy.maxDelayMs, exponentialDelay)
|
|
16
|
+
|
|
17
|
+
// Add jitter: random factor between (1 - jitter) and (1 + jitter)
|
|
18
|
+
const jitterRange = policy.jitterFactor * 2
|
|
19
|
+
const jitterMultiplier = 1 - policy.jitterFactor + Math.random() * jitterRange
|
|
20
|
+
|
|
21
|
+
return Math.floor(cappedDelay * jitterMultiplier)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Sleep for specified milliseconds
|
|
26
|
+
*/
|
|
27
|
+
export function sleep(ms: number): Promise<void> {
|
|
28
|
+
return new Promise((resolve) => setTimeout(resolve, ms))
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Execute function with retry logic
|
|
33
|
+
*
|
|
34
|
+
* Retries on ToolingError where isRetryable() returns true.
|
|
35
|
+
* Uses exponential backoff with jitter to prevent thundering herd.
|
|
36
|
+
*
|
|
37
|
+
* Pattern: Stateless function (processor pattern)
|
|
38
|
+
*
|
|
39
|
+
* @param fn - Function to execute
|
|
40
|
+
* @param policy - Retry policy
|
|
41
|
+
* @returns Function result
|
|
42
|
+
* @throws ToolingError if all retries exhausted
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* const result = await withRetry(
|
|
46
|
+
* () => adapter.call('sendEmail', params, creds),
|
|
47
|
+
* DEFAULT_RETRY_POLICY
|
|
48
|
+
* )
|
|
49
|
+
*/
|
|
50
|
+
export async function withRetry<T>(
|
|
51
|
+
fn: () => Promise<T>,
|
|
52
|
+
policy: RetryPolicy
|
|
53
|
+
): Promise<T> {
|
|
54
|
+
let lastError: Error | undefined
|
|
55
|
+
|
|
56
|
+
for (let attempt = 0; attempt <= policy.maxRetries; attempt++) {
|
|
57
|
+
try {
|
|
58
|
+
return await fn()
|
|
59
|
+
} catch (error) {
|
|
60
|
+
lastError = error as Error
|
|
61
|
+
|
|
62
|
+
// Don't retry non-ToolingErrors (programming bugs, TypeErrors, etc.)
|
|
63
|
+
if (!(error instanceof ToolingError)) {
|
|
64
|
+
throw error
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Don't retry if the ToolingError is marked non-retryable
|
|
68
|
+
if (!error.isRetryable()) {
|
|
69
|
+
throw error
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Don't retry if max retries reached
|
|
73
|
+
if (attempt === policy.maxRetries) {
|
|
74
|
+
break
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Calculate delay and sleep before retry
|
|
78
|
+
const delay = calculateRetryDelay(attempt, policy)
|
|
79
|
+
await sleep(delay)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// All retries exhausted
|
|
84
|
+
throw new ToolingError(
|
|
85
|
+
'api_error',
|
|
86
|
+
`Failed after ${policy.maxRetries} retries: ${lastError?.message}`,
|
|
87
|
+
{ originalError: lastError }
|
|
88
|
+
)
|
|
89
|
+
}
|
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Timeout utility for wrapping external service calls.
|
|
3
|
-
* Provides consistent timeout behavior with proper error classification.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { ServiceTimeoutError } from './errors'
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Wraps a Promise with a timeout. If the Promise doesn't resolve within
|
|
10
|
-
* the specified time, throws a ServiceTimeoutError.
|
|
11
|
-
*
|
|
12
|
-
* @param promise - The Promise to wrap
|
|
13
|
-
* @param timeoutMs - Timeout in milliseconds
|
|
14
|
-
* @param service - Service name for error context (e.g., 'WorkOS', 'OpenAI')
|
|
15
|
-
* @param operation - Optional operation name for error context (e.g., 'jwt_verify')
|
|
16
|
-
* @returns The resolved value of the Promise
|
|
17
|
-
* @throws ServiceTimeoutError if the timeout is exceeded
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```typescript
|
|
21
|
-
* const user = await withTimeout(
|
|
22
|
-
* workos.userManagement.getUser(userId),
|
|
23
|
-
* SERVICE_TIMEOUTS.WORKOS_USER,
|
|
24
|
-
* 'WorkOS',
|
|
25
|
-
* 'user_lookup'
|
|
26
|
-
* )
|
|
27
|
-
* ```
|
|
28
|
-
*/
|
|
29
|
-
export async function withTimeout<T>(
|
|
30
|
-
promise: Promise<T>,
|
|
31
|
-
timeoutMs: number,
|
|
32
|
-
service: string,
|
|
33
|
-
operation?: string
|
|
34
|
-
): Promise<T> {
|
|
35
|
-
let timeoutId: ReturnType<typeof setTimeout>
|
|
36
|
-
|
|
37
|
-
const timeoutPromise = new Promise<never>((_, reject) => {
|
|
38
|
-
timeoutId = setTimeout(() => {
|
|
39
|
-
reject(new ServiceTimeoutError(service, timeoutMs, operation))
|
|
40
|
-
}, timeoutMs)
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
return await Promise.race([promise, timeoutPromise])
|
|
45
|
-
} finally {
|
|
46
|
-
clearTimeout(timeoutId!)
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Standard timeout values for different service operations.
|
|
52
|
-
* These values are tuned for typical service behavior and cold start scenarios.
|
|
53
|
-
*/
|
|
54
|
-
export const SERVICE_TIMEOUTS = {
|
|
55
|
-
/** WorkOS JWT verification - allows for cold starts */
|
|
56
|
-
WORKOS_JWT: 15_000,
|
|
57
|
-
/** WorkOS user lookup */
|
|
58
|
-
WORKOS_USER: 10_000,
|
|
59
|
-
/** Simple database queries */
|
|
60
|
-
DATABASE_SIMPLE: 10_000,
|
|
61
|
-
/** Complex database queries (JOINs, aggregations) */
|
|
62
|
-
DATABASE_COMPLEX: 30_000
|
|
63
|
-
} as const
|
|
1
|
+
/**
|
|
2
|
+
* Timeout utility for wrapping external service calls.
|
|
3
|
+
* Provides consistent timeout behavior with proper error classification.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { ServiceTimeoutError } from './errors'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Wraps a Promise with a timeout. If the Promise doesn't resolve within
|
|
10
|
+
* the specified time, throws a ServiceTimeoutError.
|
|
11
|
+
*
|
|
12
|
+
* @param promise - The Promise to wrap
|
|
13
|
+
* @param timeoutMs - Timeout in milliseconds
|
|
14
|
+
* @param service - Service name for error context (e.g., 'WorkOS', 'OpenAI')
|
|
15
|
+
* @param operation - Optional operation name for error context (e.g., 'jwt_verify')
|
|
16
|
+
* @returns The resolved value of the Promise
|
|
17
|
+
* @throws ServiceTimeoutError if the timeout is exceeded
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const user = await withTimeout(
|
|
22
|
+
* workos.userManagement.getUser(userId),
|
|
23
|
+
* SERVICE_TIMEOUTS.WORKOS_USER,
|
|
24
|
+
* 'WorkOS',
|
|
25
|
+
* 'user_lookup'
|
|
26
|
+
* )
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export async function withTimeout<T>(
|
|
30
|
+
promise: Promise<T>,
|
|
31
|
+
timeoutMs: number,
|
|
32
|
+
service: string,
|
|
33
|
+
operation?: string
|
|
34
|
+
): Promise<T> {
|
|
35
|
+
let timeoutId: ReturnType<typeof setTimeout>
|
|
36
|
+
|
|
37
|
+
const timeoutPromise = new Promise<never>((_, reject) => {
|
|
38
|
+
timeoutId = setTimeout(() => {
|
|
39
|
+
reject(new ServiceTimeoutError(service, timeoutMs, operation))
|
|
40
|
+
}, timeoutMs)
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
return await Promise.race([promise, timeoutPromise])
|
|
45
|
+
} finally {
|
|
46
|
+
clearTimeout(timeoutId!)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Standard timeout values for different service operations.
|
|
52
|
+
* These values are tuned for typical service behavior and cold start scenarios.
|
|
53
|
+
*/
|
|
54
|
+
export const SERVICE_TIMEOUTS = {
|
|
55
|
+
/** WorkOS JWT verification - allows for cold starts */
|
|
56
|
+
WORKOS_JWT: 15_000,
|
|
57
|
+
/** WorkOS user lookup */
|
|
58
|
+
WORKOS_USER: 10_000,
|
|
59
|
+
/** Simple database queries */
|
|
60
|
+
DATABASE_SIMPLE: 10_000,
|
|
61
|
+
/** Complex database queries (JOINs, aggregations) */
|
|
62
|
+
DATABASE_COMPLEX: 30_000
|
|
63
|
+
} as const
|
|
@@ -1,34 +1,37 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SSE Event Types - Central Union
|
|
3
|
-
*
|
|
4
|
-
* Aggregates all domain-specific SSE events into a type-safe union
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { NotificationSSEEvent, NotificationCountUpdatedEvent } from '../../operations/notifications/sse-events'
|
|
8
|
-
import type { ActivitySSEEvent, ActivityCreatedEvent, ActivityConnectedEvent } from '../../operations/activities/sse-events'
|
|
9
|
-
import type { CommandQueueSSEEvent, CommandQueueTaskUpdatedEvent, CommandQueueConnectedEvent } from '../../commands/queue/sse-events'
|
|
10
|
-
import type {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
export
|
|
20
|
-
export type {
|
|
21
|
-
export type {
|
|
22
|
-
export type {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
|
34
|
-
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE Event Types - Central Union
|
|
3
|
+
*
|
|
4
|
+
* Aggregates all domain-specific SSE events into a type-safe union
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { NotificationSSEEvent, NotificationCountUpdatedEvent } from '../../operations/notifications/sse-events'
|
|
8
|
+
import type { ActivitySSEEvent, ActivityCreatedEvent, ActivityConnectedEvent } from '../../operations/activities/sse-events'
|
|
9
|
+
import type { CommandQueueSSEEvent, CommandQueueTaskUpdatedEvent, CommandQueueConnectedEvent } from '../../commands/queue/sse-events'
|
|
10
|
+
import type { DeliverySSEEvent, DeliveryConnectedEvent, DeliveryEntityChangedEvent } from '../../business/projects/sse-events'
|
|
11
|
+
import type {
|
|
12
|
+
ExecutionSSEEvent,
|
|
13
|
+
ExecutionStartedEvent,
|
|
14
|
+
ExecutionLogEvent,
|
|
15
|
+
ExecutionCompleteEvent,
|
|
16
|
+
ExecutionConnectedEvent
|
|
17
|
+
} from '../../execution/core/sse-executions'
|
|
18
|
+
|
|
19
|
+
// Re-export domain-specific event types
|
|
20
|
+
export type { NotificationSSEEvent, NotificationCountUpdatedEvent }
|
|
21
|
+
export type { ActivitySSEEvent, ActivityCreatedEvent, ActivityConnectedEvent }
|
|
22
|
+
export type { CommandQueueSSEEvent, CommandQueueTaskUpdatedEvent, CommandQueueConnectedEvent }
|
|
23
|
+
export type { DeliverySSEEvent, DeliveryConnectedEvent, DeliveryEntityChangedEvent }
|
|
24
|
+
export type { ExecutionSSEEvent, ExecutionStartedEvent, ExecutionLogEvent, ExecutionCompleteEvent, ExecutionConnectedEvent }
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Union of all application-level SSE events across all domains
|
|
28
|
+
*
|
|
29
|
+
* Use this for generic SSE handling that needs to support all event types.
|
|
30
|
+
* For domain-specific handling, use NotificationSSEEvent, ActivitySSEEvent, ExecutionSSEEvent, etc.
|
|
31
|
+
*/
|
|
32
|
+
export type AppSSEEvent =
|
|
33
|
+
| NotificationSSEEvent
|
|
34
|
+
| ActivitySSEEvent
|
|
35
|
+
| CommandQueueSSEEvent
|
|
36
|
+
| DeliverySSEEvent
|
|
37
|
+
| ExecutionSSEEvent
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SSE (Server-Sent Events) Types and Utilities
|
|
3
|
-
*
|
|
4
|
-
* Central export point for all SSE-related types
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export * from './events'
|
|
1
|
+
/**
|
|
2
|
+
* SSE (Server-Sent Events) Types and Utilities
|
|
3
|
+
*
|
|
4
|
+
* Central export point for all SSE-related types
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export * from './events'
|