@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,111 +1,111 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unsubscribe Token Utilities
|
|
3
|
-
*
|
|
4
|
-
* HMAC-based token generation and verification for one-click unsubscribe
|
|
5
|
-
* compliance with RFC 8058 (Gmail/Yahoo/Microsoft requirements).
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```typescript
|
|
9
|
-
* import { generateUnsubscribeToken, verifyUnsubscribeToken } from '@repo/core/server'
|
|
10
|
-
*
|
|
11
|
-
* // Generate token for email link
|
|
12
|
-
* const token = generateUnsubscribeToken('john@example.com', process.env.UNSUBSCRIBE_SECRET!)
|
|
13
|
-
* const url = `https://api.elevasis.io/api/unsubscribe?email=john@example.com&token=${token}`
|
|
14
|
-
*
|
|
15
|
-
* // Verify token on POST request
|
|
16
|
-
* const isValid = verifyUnsubscribeToken('john@example.com', token, process.env.UNSUBSCRIBE_SECRET!)
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import crypto from 'crypto'
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Generate HMAC-SHA256 token for unsubscribe verification
|
|
24
|
-
*
|
|
25
|
-
* Uses first 16 characters of the hash for URL-friendly tokens.
|
|
26
|
-
*
|
|
27
|
-
* @param email - Email address to generate token for
|
|
28
|
-
* @param secret - HMAC secret key (HMAC_SECRET)
|
|
29
|
-
* @returns 16-character hex token
|
|
30
|
-
*/
|
|
31
|
-
export function generateUnsubscribeToken(email: string, secret: string): string {
|
|
32
|
-
return crypto.createHmac('sha256', secret).update(email.toLowerCase().trim()).digest('hex').slice(0, 16)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Verify unsubscribe token using timing-safe comparison
|
|
37
|
-
*
|
|
38
|
-
* Prevents timing attacks by using constant-time comparison.
|
|
39
|
-
*
|
|
40
|
-
* @param email - Email address to verify
|
|
41
|
-
* @param token - Token from request
|
|
42
|
-
* @param secret - HMAC secret key (HMAC_SECRET)
|
|
43
|
-
* @returns true if token is valid
|
|
44
|
-
*/
|
|
45
|
-
export function verifyUnsubscribeToken(email: string, token: string, secret: string): boolean {
|
|
46
|
-
const expected = generateUnsubscribeToken(email, secret)
|
|
47
|
-
|
|
48
|
-
// Ensure both are same length before comparison
|
|
49
|
-
if (token.length !== expected.length) {
|
|
50
|
-
return false
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const tokenBuf = Buffer.from(token)
|
|
54
|
-
const expectedBuf = Buffer.from(expected)
|
|
55
|
-
|
|
56
|
-
return crypto.timingSafeEqual(tokenBuf, expectedBuf)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Generate unsubscribe URL with token
|
|
61
|
-
*
|
|
62
|
-
* @param email - Email address
|
|
63
|
-
* @param secret - HMAC secret key
|
|
64
|
-
* @param baseUrl - Base URL for unsubscribe endpoint (default: production URL)
|
|
65
|
-
* @returns Full unsubscribe URL with email and token query params
|
|
66
|
-
*/
|
|
67
|
-
export function generateUnsubscribeUrl(
|
|
68
|
-
email: string,
|
|
69
|
-
secret: string,
|
|
70
|
-
baseUrl = 'https://api.elevasis.io/api/unsubscribe'
|
|
71
|
-
): string {
|
|
72
|
-
const token = generateUnsubscribeToken(email, secret)
|
|
73
|
-
const encodedEmail = encodeURIComponent(email.toLowerCase().trim())
|
|
74
|
-
return `${baseUrl}?email=${encodedEmail}&token=${token}`
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Generate List-Unsubscribe headers for RFC 8058 compliance
|
|
79
|
-
*
|
|
80
|
-
* Returns headers object to include in Resend email headers parameter.
|
|
81
|
-
*
|
|
82
|
-
* @param email - Recipient email address
|
|
83
|
-
* @param secret - HMAC secret key
|
|
84
|
-
* @param baseUrl - Base URL for unsubscribe endpoint
|
|
85
|
-
* @returns Headers object with List-Unsubscribe and List-Unsubscribe-Post
|
|
86
|
-
*
|
|
87
|
-
* @example
|
|
88
|
-
* ```typescript
|
|
89
|
-
* const headers = generateUnsubscribeHeaders('john@example.com', secret)
|
|
90
|
-
* // Use in Resend:
|
|
91
|
-
* await resend.emails.send({
|
|
92
|
-
* from: 'sender@domain.com',
|
|
93
|
-
* to: 'john@example.com',
|
|
94
|
-
* subject: 'Subject',
|
|
95
|
-
* html: '<p>Content</p>',
|
|
96
|
-
* headers
|
|
97
|
-
* })
|
|
98
|
-
* ```
|
|
99
|
-
*/
|
|
100
|
-
export function generateUnsubscribeHeaders(
|
|
101
|
-
email: string,
|
|
102
|
-
secret: string,
|
|
103
|
-
baseUrl = 'https://api.elevasis.io/api/unsubscribe'
|
|
104
|
-
): Record<string, string> {
|
|
105
|
-
const url = generateUnsubscribeUrl(email, secret, baseUrl)
|
|
106
|
-
|
|
107
|
-
return {
|
|
108
|
-
'List-Unsubscribe': `<${url}>`,
|
|
109
|
-
'List-Unsubscribe-Post': 'List-Unsubscribe=One-Click'
|
|
110
|
-
}
|
|
111
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Unsubscribe Token Utilities
|
|
3
|
+
*
|
|
4
|
+
* HMAC-based token generation and verification for one-click unsubscribe
|
|
5
|
+
* compliance with RFC 8058 (Gmail/Yahoo/Microsoft requirements).
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { generateUnsubscribeToken, verifyUnsubscribeToken } from '@repo/core/server'
|
|
10
|
+
*
|
|
11
|
+
* // Generate token for email link
|
|
12
|
+
* const token = generateUnsubscribeToken('john@example.com', process.env.UNSUBSCRIBE_SECRET!)
|
|
13
|
+
* const url = `https://api.elevasis.io/api/unsubscribe?email=john@example.com&token=${token}`
|
|
14
|
+
*
|
|
15
|
+
* // Verify token on POST request
|
|
16
|
+
* const isValid = verifyUnsubscribeToken('john@example.com', token, process.env.UNSUBSCRIBE_SECRET!)
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import crypto from 'crypto'
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Generate HMAC-SHA256 token for unsubscribe verification
|
|
24
|
+
*
|
|
25
|
+
* Uses first 16 characters of the hash for URL-friendly tokens.
|
|
26
|
+
*
|
|
27
|
+
* @param email - Email address to generate token for
|
|
28
|
+
* @param secret - HMAC secret key (HMAC_SECRET)
|
|
29
|
+
* @returns 16-character hex token
|
|
30
|
+
*/
|
|
31
|
+
export function generateUnsubscribeToken(email: string, secret: string): string {
|
|
32
|
+
return crypto.createHmac('sha256', secret).update(email.toLowerCase().trim()).digest('hex').slice(0, 16)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Verify unsubscribe token using timing-safe comparison
|
|
37
|
+
*
|
|
38
|
+
* Prevents timing attacks by using constant-time comparison.
|
|
39
|
+
*
|
|
40
|
+
* @param email - Email address to verify
|
|
41
|
+
* @param token - Token from request
|
|
42
|
+
* @param secret - HMAC secret key (HMAC_SECRET)
|
|
43
|
+
* @returns true if token is valid
|
|
44
|
+
*/
|
|
45
|
+
export function verifyUnsubscribeToken(email: string, token: string, secret: string): boolean {
|
|
46
|
+
const expected = generateUnsubscribeToken(email, secret)
|
|
47
|
+
|
|
48
|
+
// Ensure both are same length before comparison
|
|
49
|
+
if (token.length !== expected.length) {
|
|
50
|
+
return false
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const tokenBuf = Buffer.from(token)
|
|
54
|
+
const expectedBuf = Buffer.from(expected)
|
|
55
|
+
|
|
56
|
+
return crypto.timingSafeEqual(tokenBuf, expectedBuf)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Generate unsubscribe URL with token
|
|
61
|
+
*
|
|
62
|
+
* @param email - Email address
|
|
63
|
+
* @param secret - HMAC secret key
|
|
64
|
+
* @param baseUrl - Base URL for unsubscribe endpoint (default: production URL)
|
|
65
|
+
* @returns Full unsubscribe URL with email and token query params
|
|
66
|
+
*/
|
|
67
|
+
export function generateUnsubscribeUrl(
|
|
68
|
+
email: string,
|
|
69
|
+
secret: string,
|
|
70
|
+
baseUrl = 'https://api.elevasis.io/api/unsubscribe'
|
|
71
|
+
): string {
|
|
72
|
+
const token = generateUnsubscribeToken(email, secret)
|
|
73
|
+
const encodedEmail = encodeURIComponent(email.toLowerCase().trim())
|
|
74
|
+
return `${baseUrl}?email=${encodedEmail}&token=${token}`
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Generate List-Unsubscribe headers for RFC 8058 compliance
|
|
79
|
+
*
|
|
80
|
+
* Returns headers object to include in Resend email headers parameter.
|
|
81
|
+
*
|
|
82
|
+
* @param email - Recipient email address
|
|
83
|
+
* @param secret - HMAC secret key
|
|
84
|
+
* @param baseUrl - Base URL for unsubscribe endpoint
|
|
85
|
+
* @returns Headers object with List-Unsubscribe and List-Unsubscribe-Post
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* const headers = generateUnsubscribeHeaders('john@example.com', secret)
|
|
90
|
+
* // Use in Resend:
|
|
91
|
+
* await resend.emails.send({
|
|
92
|
+
* from: 'sender@domain.com',
|
|
93
|
+
* to: 'john@example.com',
|
|
94
|
+
* subject: 'Subject',
|
|
95
|
+
* html: '<p>Content</p>',
|
|
96
|
+
* headers
|
|
97
|
+
* })
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
export function generateUnsubscribeHeaders(
|
|
101
|
+
email: string,
|
|
102
|
+
secret: string,
|
|
103
|
+
baseUrl = 'https://api.elevasis.io/api/unsubscribe'
|
|
104
|
+
): Record<string, string> {
|
|
105
|
+
const url = generateUnsubscribeUrl(email, secret, baseUrl)
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
'List-Unsubscribe': `<${url}>`,
|
|
109
|
+
'List-Unsubscribe-Post': 'List-Unsubscribe=One-Click'
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Token Counter Utility
|
|
3
|
-
* Shared between frontend and backend for consistent validation
|
|
4
|
-
*
|
|
5
|
-
* Uses character-based estimation with safety margin
|
|
6
|
-
* Future: Can be upgraded to tiktoken for exact counts
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
export interface TokenCountResult {
|
|
10
|
-
tokens: number
|
|
11
|
-
characters: number
|
|
12
|
-
withinLimit: boolean
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface TokenLimits {
|
|
16
|
-
maxTokens: number
|
|
17
|
-
errorMessage?: string
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Estimate token count from text
|
|
22
|
-
* Uses 1 token ≈ 3.5 characters (improved accuracy)
|
|
23
|
-
*
|
|
24
|
-
* Character-based approximation provides:
|
|
25
|
-
* - Fast estimation (no external dependencies)
|
|
26
|
-
* - ~10-15% error margin for English text
|
|
27
|
-
* - Works for all text types (code, prose, JSON)
|
|
28
|
-
*
|
|
29
|
-
* Note: For exact token counts, use model-specific tokenizers (tiktoken for OpenAI, Anthropic SDK for Claude)
|
|
30
|
-
*
|
|
31
|
-
* @param text - Text to estimate tokens for (string or JSON-serializable object)
|
|
32
|
-
* @returns Estimated token count
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* ```typescript
|
|
36
|
-
* estimateTokens("Hello world") // ~3 tokens
|
|
37
|
-
* estimateTokens({ message: "Hello" }) // ~5 tokens (includes JSON structure)
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
export function estimateTokens(text: string | unknown): number {
|
|
41
|
-
const content = typeof text === 'string' ? text : JSON.stringify(text)
|
|
42
|
-
const chars = content.length
|
|
43
|
-
// 1 token ≈ 3.5 characters (better accuracy than 4 chars with safety margin)
|
|
44
|
-
return Math.ceil(chars / 3.5)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Validate text against token limit
|
|
49
|
-
*
|
|
50
|
-
* @param text - Text to validate (string or JSON-serializable object)
|
|
51
|
-
* @param limits - Token limits configuration
|
|
52
|
-
* @returns Validation result with token count and character count
|
|
53
|
-
*
|
|
54
|
-
* @example
|
|
55
|
-
* ```typescript
|
|
56
|
-
* const result = validateTokenLimit(userInput, { maxTokens: 25000 })
|
|
57
|
-
* if (!result.withinLimit) {
|
|
58
|
-
* console.error(`Too large: ${result.tokens} tokens (max 25000)`)
|
|
59
|
-
* }
|
|
60
|
-
* ```
|
|
61
|
-
*/
|
|
62
|
-
export function validateTokenLimit(text: string | unknown, limits: TokenLimits): TokenCountResult {
|
|
63
|
-
const content = typeof text === 'string' ? text : JSON.stringify(text)
|
|
64
|
-
const characters = content.length
|
|
65
|
-
const tokens = estimateTokens(content)
|
|
66
|
-
|
|
67
|
-
return {
|
|
68
|
-
tokens,
|
|
69
|
-
characters,
|
|
70
|
-
withinLimit: tokens <= limits.maxTokens
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Common token limits for different use cases
|
|
76
|
-
*
|
|
77
|
-
* Limits are based on:
|
|
78
|
-
* - User experience (reasonable input sizes)
|
|
79
|
-
* - DoS prevention (resource exhaustion)
|
|
80
|
-
* - Model context windows (AI capabilities)
|
|
81
|
-
*/
|
|
82
|
-
export const TOKEN_LIMITS = {
|
|
83
|
-
// User input limits (prompts)
|
|
84
|
-
USER_MESSAGE: 25000, // ~100KB text - allows large code pastes
|
|
85
|
-
CHAT_MESSAGE: 10000, // ~40KB text - typical chat message
|
|
86
|
-
|
|
87
|
-
// WebSocket message limits
|
|
88
|
-
WEBSOCKET_MESSAGE: 25000, // Same as user message
|
|
89
|
-
WEBSOCKET_TOTAL: 250000, // Hard limit for entire payload (1MB)
|
|
90
|
-
|
|
91
|
-
// AI model context windows (for reference)
|
|
92
|
-
GPT4_TURBO: 128000,
|
|
93
|
-
CLAUDE_SONNET: 200000,
|
|
94
|
-
GPT35_TURBO: 16385
|
|
95
|
-
} as const
|
|
96
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Token Counter Utility
|
|
3
|
+
* Shared between frontend and backend for consistent validation
|
|
4
|
+
*
|
|
5
|
+
* Uses character-based estimation with safety margin
|
|
6
|
+
* Future: Can be upgraded to tiktoken for exact counts
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface TokenCountResult {
|
|
10
|
+
tokens: number
|
|
11
|
+
characters: number
|
|
12
|
+
withinLimit: boolean
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface TokenLimits {
|
|
16
|
+
maxTokens: number
|
|
17
|
+
errorMessage?: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Estimate token count from text
|
|
22
|
+
* Uses 1 token ≈ 3.5 characters (improved accuracy)
|
|
23
|
+
*
|
|
24
|
+
* Character-based approximation provides:
|
|
25
|
+
* - Fast estimation (no external dependencies)
|
|
26
|
+
* - ~10-15% error margin for English text
|
|
27
|
+
* - Works for all text types (code, prose, JSON)
|
|
28
|
+
*
|
|
29
|
+
* Note: For exact token counts, use model-specific tokenizers (tiktoken for OpenAI, Anthropic SDK for Claude)
|
|
30
|
+
*
|
|
31
|
+
* @param text - Text to estimate tokens for (string or JSON-serializable object)
|
|
32
|
+
* @returns Estimated token count
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* estimateTokens("Hello world") // ~3 tokens
|
|
37
|
+
* estimateTokens({ message: "Hello" }) // ~5 tokens (includes JSON structure)
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export function estimateTokens(text: string | unknown): number {
|
|
41
|
+
const content = typeof text === 'string' ? text : JSON.stringify(text)
|
|
42
|
+
const chars = content.length
|
|
43
|
+
// 1 token ≈ 3.5 characters (better accuracy than 4 chars with safety margin)
|
|
44
|
+
return Math.ceil(chars / 3.5)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Validate text against token limit
|
|
49
|
+
*
|
|
50
|
+
* @param text - Text to validate (string or JSON-serializable object)
|
|
51
|
+
* @param limits - Token limits configuration
|
|
52
|
+
* @returns Validation result with token count and character count
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* const result = validateTokenLimit(userInput, { maxTokens: 25000 })
|
|
57
|
+
* if (!result.withinLimit) {
|
|
58
|
+
* console.error(`Too large: ${result.tokens} tokens (max 25000)`)
|
|
59
|
+
* }
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export function validateTokenLimit(text: string | unknown, limits: TokenLimits): TokenCountResult {
|
|
63
|
+
const content = typeof text === 'string' ? text : JSON.stringify(text)
|
|
64
|
+
const characters = content.length
|
|
65
|
+
const tokens = estimateTokens(content)
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
tokens,
|
|
69
|
+
characters,
|
|
70
|
+
withinLimit: tokens <= limits.maxTokens
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Common token limits for different use cases
|
|
76
|
+
*
|
|
77
|
+
* Limits are based on:
|
|
78
|
+
* - User experience (reasonable input sizes)
|
|
79
|
+
* - DoS prevention (resource exhaustion)
|
|
80
|
+
* - Model context windows (AI capabilities)
|
|
81
|
+
*/
|
|
82
|
+
export const TOKEN_LIMITS = {
|
|
83
|
+
// User input limits (prompts)
|
|
84
|
+
USER_MESSAGE: 25000, // ~100KB text - allows large code pastes
|
|
85
|
+
CHAT_MESSAGE: 10000, // ~40KB text - typical chat message
|
|
86
|
+
|
|
87
|
+
// WebSocket message limits
|
|
88
|
+
WEBSOCKET_MESSAGE: 25000, // Same as user message
|
|
89
|
+
WEBSOCKET_TOTAL: 250000, // Hard limit for entire payload (1MB)
|
|
90
|
+
|
|
91
|
+
// AI model context windows (for reference)
|
|
92
|
+
GPT4_TURBO: 128000,
|
|
93
|
+
CLAUDE_SONNET: 200000,
|
|
94
|
+
GPT35_TURBO: 16385
|
|
95
|
+
} as const
|
|
96
|
+
|