@elevasis/core 0.7.1 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/test-utils/index.d.ts +3122 -0
- package/dist/test-utils/index.js +386 -0
- package/package.json +6 -1
- package/src/README.md +39 -36
- package/src/__tests__/publish.test.ts +18 -13
- package/src/__tests__/{template-foundations-compatibility.test.ts → template-core-compatibility.test.ts} +99 -99
- package/src/_gen/__tests__/__snapshots__/contracts.md.snap +1135 -1131
- package/src/_gen/__tests__/scaffold-contracts.test.ts +47 -36
- package/src/_gen/scaffold-contracts.ts +45 -45
- package/src/auth/multi-tenancy/credentials/README.md +38 -38
- package/src/auth/multi-tenancy/credentials/index.ts +6 -6
- package/src/auth/multi-tenancy/credentials/server/encryption.ts +39 -39
- package/src/auth/multi-tenancy/credentials/server/service.ts +60 -60
- package/src/auth/multi-tenancy/index.ts +17 -17
- package/src/auth/multi-tenancy/invitations/api-schemas.ts +107 -107
- package/src/auth/multi-tenancy/invitations/index.ts +37 -37
- package/src/auth/multi-tenancy/invitations/invitation.ts +86 -86
- package/src/auth/multi-tenancy/invitations/server/index.ts +25 -25
- package/src/auth/multi-tenancy/invitations/server/transforms.ts +24 -24
- package/src/auth/multi-tenancy/invitations/server/workos.ts +24 -24
- package/src/auth/multi-tenancy/invitations/supabase.ts +50 -50
- package/src/auth/multi-tenancy/memberships/api-schemas.ts +126 -126
- package/src/auth/multi-tenancy/memberships/index.ts +21 -21
- package/src/auth/multi-tenancy/memberships/membership.ts +138 -138
- package/src/auth/multi-tenancy/memberships/server/index.ts +15 -15
- package/src/auth/multi-tenancy/memberships/server/transforms.ts +32 -32
- package/src/auth/multi-tenancy/memberships/server/workos.ts +21 -21
- package/src/auth/multi-tenancy/memberships/supabase.ts +46 -46
- package/src/auth/multi-tenancy/organizations/api-schemas.ts +128 -128
- package/src/auth/multi-tenancy/organizations/index.ts +23 -23
- package/src/auth/multi-tenancy/organizations/organization.ts +24 -24
- package/src/auth/multi-tenancy/organizations/server/index.ts +10 -10
- package/src/auth/multi-tenancy/organizations/server/transforms.ts +35 -35
- package/src/auth/multi-tenancy/organizations/server/workos.ts +20 -20
- package/src/auth/multi-tenancy/types.ts +83 -83
- package/src/auth/multi-tenancy/users/api-schemas.ts +194 -194
- package/src/auth/multi-tenancy/users/index.ts +27 -27
- package/src/auth/multi-tenancy/users/server/index.ts +19 -19
- package/src/auth/multi-tenancy/users/server/transforms.ts +21 -21
- package/src/auth/multi-tenancy/users/server/workos.ts +16 -16
- package/src/auth/multi-tenancy/users/user.ts +65 -65
- package/src/business/README.md +52 -52
- package/src/business/__tests__/entities-published.test.ts +33 -33
- package/src/business/acquisition/api-schemas.ts +759 -759
- package/src/business/acquisition/index.ts +109 -109
- package/src/business/acquisition/types.ts +402 -402
- package/src/business/base-entities.test.ts +481 -481
- package/src/business/base-entities.ts +241 -241
- package/src/business/entities-published.ts +24 -24
- package/src/business/index.ts +15 -15
- package/src/business/pdf/browser/pdfmake-browser.ts +229 -229
- package/src/business/pdf/index.ts +10 -10
- package/src/business/pdf/server/index.ts +21 -21
- package/src/business/pdf/server/themes/default.ts +8 -8
- package/src/business/pdf/server/themes/index.ts +9 -9
- package/src/business/pdf/server/themes/types.ts +8 -8
- package/src/business/pdf/types.ts +272 -272
- package/src/business/projects/index.ts +2 -2
- package/src/business/projects/sse-events.ts +21 -21
- package/src/business/projects/types.ts +89 -89
- package/src/business/sales/api-schemas.ts +75 -75
- package/src/business/seo/__tests__/linking.test.ts +549 -549
- package/src/business/seo/__tests__/types.test.ts +404 -404
- package/src/business/seo/index.ts +2 -2
- package/src/business/seo/linking.ts +281 -281
- package/src/business/seo/types.ts +199 -199
- package/src/commands/queue/index.ts +3 -3
- package/src/commands/queue/schemas.test.ts +593 -593
- package/src/commands/queue/schemas.ts +125 -125
- package/src/commands/queue/sse-events.ts +61 -61
- package/src/commands/queue/types/action.ts +52 -52
- package/src/commands/queue/types/checkpoint.ts +44 -44
- package/src/commands/queue/types/index.ts +7 -7
- package/src/commands/queue/types/task.ts +116 -116
- package/src/commands/queue/types.ts +14 -14
- package/src/content/distribution-metadata.ts +61 -61
- package/src/content/index.ts +10 -10
- package/src/deployments/index.ts +22 -22
- package/src/execution/core/__tests__/archived-logs.test.ts +72 -72
- package/src/execution/core/index.ts +11 -11
- package/src/execution/core/runner-types.ts +80 -80
- package/src/execution/core/server/environment.ts +31 -31
- package/src/execution/core/sse-executions.ts +119 -119
- package/src/execution/core/types.ts +29 -29
- package/src/execution/engine/__tests__/fixtures/test-agents.ts +4 -4
- package/src/execution/engine/__tests__/timeout.test.ts +565 -565
- package/src/execution/engine/agent/__tests__/errors.test.ts +508 -508
- package/src/execution/engine/agent/actions/__tests__/processor.test.ts +531 -531
- package/src/execution/engine/agent/actions/executor.ts +205 -205
- package/src/execution/engine/agent/actions/navigate-knowledge-executor.ts +230 -230
- package/src/execution/engine/agent/actions/processor.ts +116 -116
- package/src/execution/engine/agent/actions/types.ts +70 -70
- package/src/execution/engine/agent/core/agent.ts +810 -810
- package/src/execution/engine/agent/core/types.ts +155 -155
- package/src/execution/engine/agent/errors.ts +251 -251
- package/src/execution/engine/agent/index.ts +78 -78
- package/src/execution/engine/agent/knowledge-map/types.ts +106 -106
- package/src/execution/engine/agent/knowledge-map/utils.ts +101 -101
- package/src/execution/engine/agent/memory/__tests__/manager.test.ts +754 -754
- package/src/execution/engine/agent/memory/domains.ts +99 -99
- package/src/execution/engine/agent/memory/manager.ts +365 -365
- package/src/execution/engine/agent/memory/processor.ts +66 -66
- package/src/execution/engine/agent/memory/types.ts +90 -90
- package/src/execution/engine/agent/memory/utils.ts +134 -134
- package/src/execution/engine/agent/observability/logging.ts +467 -467
- package/src/execution/engine/agent/observability/types.ts +64 -64
- package/src/execution/engine/agent/reasoning/adapters/agent-adapter-helpers.ts +349 -349
- package/src/execution/engine/agent/reasoning/processor.ts +92 -92
- package/src/execution/engine/agent/reasoning/prompt-sections/base-actions.ts +134 -134
- package/src/execution/engine/agent/reasoning/prompt-sections/completion.ts +49 -49
- package/src/execution/engine/agent/reasoning/prompt-sections/knowledge-map.ts +93 -93
- package/src/execution/engine/agent/reasoning/prompt-sections/memory.ts +65 -65
- package/src/execution/engine/agent/reasoning/prompt-sections/tools.ts +44 -44
- package/src/execution/engine/agent/reasoning/request-builder.ts +169 -169
- package/src/execution/engine/agent/reasoning/types.ts +18 -18
- package/src/execution/engine/base/errors.ts +118 -118
- package/src/execution/engine/base/index.ts +2 -2
- package/src/execution/engine/base/logging.ts +31 -31
- package/src/execution/engine/base/serialization.ts +324 -324
- package/src/execution/engine/base/types.ts +126 -126
- package/src/execution/engine/base/utils.ts +41 -41
- package/src/execution/engine/index.ts +434 -434
- package/src/execution/engine/interface/index.ts +1 -1
- package/src/execution/engine/interface/types.ts +62 -62
- package/src/execution/engine/llm/__tests__/model-info.test.ts +50 -50
- package/src/execution/engine/llm/__tests__/model-validation.test.ts +321 -321
- package/src/execution/engine/llm/__tests__/response-schema-validator.test.ts +115 -115
- package/src/execution/engine/llm/adapters/__tests__/adapter-factory.test.ts +375 -375
- package/src/execution/engine/llm/adapters/__tests__/anthropic-adapter.test.ts +463 -463
- package/src/execution/engine/llm/adapters/__tests__/anthropic.integration.test.ts +177 -177
- package/src/execution/engine/llm/adapters/__tests__/google-adapter.test.ts +722 -722
- package/src/execution/engine/llm/adapters/__tests__/google.integration.test.ts +376 -376
- package/src/execution/engine/llm/adapters/__tests__/openai-adapter.test.ts +551 -551
- package/src/execution/engine/llm/adapters/__tests__/openrouter-adapter.test.ts +563 -563
- package/src/execution/engine/llm/adapters/__tests__/openrouter.integration.test.ts +105 -105
- package/src/execution/engine/llm/adapters/__tests__/universal-adapter.test.ts +537 -537
- package/src/execution/engine/llm/adapters/circuit-breaker.ts +147 -147
- package/src/execution/engine/llm/adapters/index.ts +17 -17
- package/src/execution/engine/llm/adapters/mock-adapter.ts +116 -116
- package/src/execution/engine/llm/adapters/server/adapter-factory.ts +130 -130
- package/src/execution/engine/llm/adapters/server/anthropic.ts +137 -137
- package/src/execution/engine/llm/adapters/server/google.ts +283 -283
- package/src/execution/engine/llm/adapters/server/index.ts +12 -12
- package/src/execution/engine/llm/adapters/server/openai.ts +206 -206
- package/src/execution/engine/llm/adapters/server/openrouter.ts +235 -235
- package/src/execution/engine/llm/adapters/universal-adapter.ts +230 -230
- package/src/execution/engine/llm/errors.ts +186 -186
- package/src/execution/engine/llm/model-info.ts +332 -332
- package/src/execution/engine/llm/response-schema-validator.ts +113 -113
- package/src/execution/engine/llm/types.ts +86 -86
- package/src/execution/engine/test-utils/index.ts +6 -6
- package/src/execution/engine/test-utils/mocks.ts +56 -56
- package/src/execution/engine/tools/integration/base-integration-adapter.ts +50 -50
- package/src/execution/engine/tools/integration/index.ts +53 -53
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-adapter.ts +73 -73
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-tools.ts +209 -209
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-company-email/index.ts +82 -82
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-decision-maker-email/index.ts +122 -122
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-person-email/index.ts +89 -89
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/verify-email/index.ts +84 -84
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/index.ts +16 -16
- package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +293 -293
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +100 -100
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-tools.ts +217 -217
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/get-dataset-items/index.ts +92 -92
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/run-actor/index.ts +218 -218
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/start-actor/index.ts +87 -87
- package/src/execution/engine/tools/integration/server/adapters/apify/index.ts +11 -11
- package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +361 -361
- package/src/execution/engine/tools/integration/server/adapters/attio/attio-adapter.ts +162 -162
- package/src/execution/engine/tools/integration/server/adapters/attio/attio-tools.ts +594 -594
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-attribute/index.ts +214 -214
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-note/index.ts +152 -152
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-record/index.ts +141 -141
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-note/index.ts +86 -86
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-record/index.ts +105 -105
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.ts +118 -118
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-attributes/index.ts +165 -165
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-notes/index.ts +96 -96
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-objects/index.ts +104 -104
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.ts +156 -156
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-attribute/index.ts +220 -220
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-record/index.ts +140 -140
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/utils/types.ts +146 -146
- package/src/execution/engine/tools/integration/server/adapters/attio/index.ts +31 -31
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +210 -210
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +104 -104
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -261
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-adapter.ts +1189 -1189
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-tools.ts +641 -641
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/index.ts +18 -18
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/activate-campaign/index.ts +86 -86
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/__tests__/index.test.ts +289 -289
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/index.ts +154 -154
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/__tests__/index.test.ts +325 -325
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/index.ts +153 -153
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-delete-leads/index.ts +84 -84
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-campaign/index.ts +125 -125
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-inbox-test/index.ts +107 -107
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/delete-campaign/index.ts +85 -85
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-account-health/index.ts +91 -91
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign/index.ts +92 -92
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/__tests__/index.test.ts +195 -195
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/index.ts +113 -113
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-daily-campaign-analytics/index.ts +104 -104
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-emails/index.ts +155 -155
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/__tests__/index.test.ts +196 -196
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/index.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/__tests__/index.test.ts +189 -189
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/index.ts +87 -87
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-leads/index.ts +112 -112
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/patch-lead/index.ts +76 -76
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/pause-campaign/index.ts +86 -86
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/remove-from-subsequence/index.ts +98 -98
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/send-reply/index.ts +126 -126
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/__tests__/index.test.ts +193 -193
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/index.ts +99 -99
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/__tests__/index.test.ts +621 -621
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/index.ts +125 -125
- package/src/execution/engine/tools/integration/server/adapters/instantly/index.ts +29 -29
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-adapter.ts +178 -178
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1473 -1473
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/check-credits/index.ts +59 -59
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/verify-email/index.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/index.ts +17 -17
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-adapter.ts +80 -80
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/get-email/index.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +134 -134
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +75 -75
- package/src/execution/engine/tools/integration/server/adapters/resend/index.ts +27 -27
- package/src/execution/engine/tools/integration/server/adapters/resend/resend-adapter.ts +108 -108
- package/src/execution/engine/tools/integration/server/adapters/resend/resend-tools.ts +132 -132
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/create-envelope/index.ts +274 -274
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/download-document/index.ts +230 -230
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/get-envelope/index.ts +133 -133
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/void-envelope/index.ts +90 -90
- package/src/execution/engine/tools/integration/server/adapters/stripe/fetch/utils/types.ts +210 -210
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-adapter.ts +517 -517
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +309 -309
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/domain-search/index.ts +133 -133
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-finder/index.ts +122 -122
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-verifier/index.ts +111 -111
- package/src/execution/engine/tools/integration/server/adapters/tomba/index.ts +11 -11
- package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-adapter.ts +78 -78
- package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-tools.ts +222 -222
- package/src/execution/engine/tools/integration/server/index.ts +61 -61
- package/src/execution/engine/tools/integration/service.ts +161 -161
- package/src/execution/engine/tools/integration/tool.ts +253 -253
- package/src/execution/engine/tools/integration/types/anymailfinder.ts +74 -74
- package/src/execution/engine/tools/integration/types/apify.ts +92 -92
- package/src/execution/engine/tools/integration/types/index.ts +19 -19
- package/src/execution/engine/tools/integration/types/instantly.ts +557 -557
- package/src/execution/engine/tools/integration/types/millionverifier.ts +56 -56
- package/src/execution/engine/tools/integration/types/stripe.ts +162 -162
- package/src/execution/engine/tools/integration/types/tomba.ts +94 -94
- package/src/execution/engine/tools/lead-service-types.ts +884 -884
- package/src/execution/engine/tools/llm/index.ts +11 -11
- package/src/execution/engine/tools/llm/server/index.ts +8 -8
- package/src/execution/engine/tools/llm/server/llm-call-tool.ts +118 -118
- package/src/execution/engine/tools/platform/__tests__/pdf.test.ts +441 -441
- package/src/execution/engine/tools/platform/acquisition/company-tools.ts +248 -248
- package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +319 -319
- package/src/execution/engine/tools/platform/acquisition/index.ts +43 -43
- package/src/execution/engine/tools/platform/acquisition/list-tools.ts +148 -148
- package/src/execution/engine/tools/platform/acquisition/types.ts +260 -260
- package/src/execution/engine/tools/platform/email/index.ts +122 -122
- package/src/execution/engine/tools/platform/email/types.ts +96 -96
- package/src/execution/engine/tools/platform/index.ts +157 -157
- package/src/execution/engine/tools/platform/notification.ts +81 -81
- package/src/execution/engine/tools/platform/pdf/index.ts +110 -110
- package/src/execution/engine/tools/platform/pdf/types.ts +77 -77
- package/src/execution/engine/tools/platform/scheduler.ts +87 -87
- package/src/execution/engine/tools/platform/storage/index.ts +370 -370
- package/src/execution/engine/tools/platform/types.ts +148 -148
- package/src/execution/engine/tools/registry.ts +700 -700
- package/src/execution/engine/tools/tool-maps.ts +786 -786
- package/src/execution/engine/tools/types.ts +233 -233
- package/src/execution/engine/workflow/__tests__/errors.test.ts +139 -139
- package/src/execution/engine/workflow/errors.ts +63 -63
- package/src/execution/engine/workflow/helpers/index.ts +11 -11
- package/src/execution/engine/workflow/helpers/server/index.ts +8 -8
- package/src/execution/engine/workflow/helpers/server/llm-call.ts +93 -93
- package/src/execution/engine/workflow/index.ts +19 -19
- package/src/execution/engine/workflow/log-truncate.ts +26 -26
- package/src/execution/engine/workflow/logging.ts +191 -191
- package/src/execution/engine/workflow/types.ts +182 -182
- package/src/execution/engine/workflow/utils.ts +280 -280
- package/src/execution/engine/workflow/workflow.ts +168 -168
- package/src/execution/index.ts +3 -3
- package/src/execution/scheduler/__tests__/api-schemas.test.ts +733 -733
- package/src/execution/scheduler/__tests__/utils.test.ts +1009 -1009
- package/src/execution/scheduler/api-schemas.ts +296 -296
- package/src/execution/scheduler/index.ts +50 -50
- package/src/execution/scheduler/schemas.ts +264 -264
- package/src/execution/scheduler/types.ts +111 -111
- package/src/execution/scheduler/utils.ts +364 -364
- package/src/forms/index.ts +7 -7
- package/src/forms/schemas.ts +69 -69
- package/src/forms/types.ts +70 -70
- package/src/index.ts +71 -60
- package/src/integrations/credentials/__tests__/schemas.test.ts +82 -82
- package/src/integrations/credentials/__tests__/utils.test.ts +144 -144
- package/src/integrations/credentials/api-schemas.ts +143 -143
- package/src/integrations/credentials/index.ts +32 -32
- package/src/integrations/credentials/schemas.ts +164 -164
- package/src/integrations/credentials/utils.ts +59 -59
- package/src/integrations/oauth/__tests__/provider-registry.test.ts +59 -59
- package/src/integrations/oauth/api-schemas.ts +92 -92
- package/src/integrations/oauth/index.ts +19 -19
- package/src/integrations/oauth/provider-registry.ts +61 -61
- package/src/integrations/oauth/server/__tests__/refresh-concurrent.test.ts +183 -183
- package/src/integrations/oauth/server/__tests__/refresh.test.ts +577 -577
- package/src/integrations/oauth/server/credentials.ts +39 -39
- package/src/integrations/oauth/server/refresh.ts +214 -214
- package/src/integrations/oauth/types.ts +34 -34
- package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +318 -318
- package/src/integrations/webhook-endpoints/api-schemas.ts +102 -102
- package/src/integrations/webhook-endpoints/index.ts +28 -28
- package/src/integrations/webhook-endpoints/types.ts +51 -51
- package/src/operations/activities/api-schemas.ts +79 -79
- package/src/operations/activities/index.ts +9 -9
- package/src/operations/activities/sse-events.ts +30 -30
- package/src/operations/activities/types.ts +63 -63
- package/src/operations/debug-logs/client.ts +60 -60
- package/src/operations/debug-logs/debug-logger.ts +83 -83
- package/src/operations/debug-logs/index.ts +8 -8
- package/src/operations/debug-logs/server.ts +19 -19
- package/src/operations/debug-logs/types.ts +33 -33
- package/src/operations/index.ts +50 -50
- package/src/operations/notifications/api-schemas.ts +91 -91
- package/src/operations/notifications/index.ts +3 -3
- package/src/operations/notifications/sse-events.ts +21 -21
- package/src/operations/notifications/types.ts +47 -47
- package/src/operations/observability/__tests__/openrouter-cost-flow.test.ts +297 -297
- package/src/operations/observability/__tests__/utils.test.ts +54 -54
- package/src/operations/observability/ai-usage-collector.ts +64 -64
- package/src/operations/observability/index.ts +13 -13
- package/src/operations/observability/metrics-collector.ts +49 -49
- package/src/operations/observability/schemas.ts +39 -39
- package/src/operations/observability/types.ts +463 -463
- package/src/operations/observability/utils.ts +77 -77
- package/src/operations/sessions/__tests__/manager.test.ts +821 -821
- package/src/operations/sessions/index.ts +26 -26
- package/src/operations/sessions/server/manager.ts +90 -90
- package/src/operations/sessions/server/session.ts +180 -180
- package/src/operations/sessions/types.ts +98 -98
- package/src/operations/triggers/index.ts +12 -12
- package/src/operations/triggers/webhook/definitions/instantly-account-error.ts +44 -44
- package/src/operations/triggers/webhook/definitions/instantly-auto-reply-received.ts +51 -51
- package/src/operations/triggers/webhook/definitions/instantly-campaign-completed.ts +45 -45
- package/src/operations/triggers/webhook/definitions/instantly-email-bounced.ts +49 -49
- package/src/operations/triggers/webhook/definitions/instantly-lead-unsubscribed.ts +45 -45
- package/src/operations/triggers/webhook/definitions/instantly-reply-received.ts +54 -54
- package/src/operations/triggers/webhook/index.ts +35 -35
- package/src/operations/triggers/webhook/types.ts +74 -74
- package/src/organization-model/README.md +97 -97
- package/src/organization-model/__tests__/defaults.test.ts +175 -175
- package/src/organization-model/__tests__/domains/customers.test.ts +295 -295
- package/src/organization-model/__tests__/domains/goals.test.ts +479 -479
- package/src/organization-model/__tests__/domains/identity.test.ts +279 -279
- package/src/organization-model/__tests__/domains/navigation.test.ts +212 -212
- package/src/organization-model/__tests__/domains/offerings.test.ts +419 -419
- package/src/organization-model/__tests__/domains/operations.test.ts +203 -203
- package/src/organization-model/__tests__/domains/resource-mappings.test.ts +362 -362
- package/src/organization-model/__tests__/domains/roles.test.ts +347 -347
- package/src/organization-model/__tests__/domains/statuses.test.ts +243 -243
- package/src/organization-model/__tests__/foundation.test.ts +105 -105
- package/src/organization-model/__tests__/graph.test.ts +894 -894
- package/src/organization-model/__tests__/resolve.test.ts +690 -690
- package/src/organization-model/__tests__/schema.test.ts +407 -407
- package/src/organization-model/contracts.ts +14 -14
- package/src/organization-model/defaults.ts +148 -148
- package/src/organization-model/domains/branding.ts +22 -22
- package/src/organization-model/domains/customers.ts +75 -75
- package/src/organization-model/domains/features.ts +22 -22
- package/src/organization-model/domains/goals.ts +80 -80
- package/src/organization-model/domains/identity.ts +94 -94
- package/src/organization-model/domains/navigation.ts +391 -391
- package/src/organization-model/domains/offerings.ts +66 -66
- package/src/organization-model/domains/operations.ts +85 -85
- package/src/organization-model/domains/projects.ts +48 -48
- package/src/organization-model/domains/prospecting.ts +33 -33
- package/src/organization-model/domains/roles.ts +55 -55
- package/src/organization-model/domains/sales.ts +94 -94
- package/src/organization-model/domains/shared.ts +62 -62
- package/src/organization-model/domains/statuses.ts +130 -130
- package/src/organization-model/foundation.ts +97 -97
- package/src/organization-model/graph/build.ts +399 -399
- package/src/organization-model/graph/index.ts +4 -4
- package/src/organization-model/graph/schema.ts +48 -48
- package/src/organization-model/graph/types.ts +40 -40
- package/src/organization-model/index.ts +13 -13
- package/src/organization-model/organization-graph.mdx +272 -272
- package/src/organization-model/organization-model.mdx +320 -320
- package/src/organization-model/published.ts +85 -85
- package/src/organization-model/resolve.ts +66 -66
- package/src/organization-model/schema.ts +287 -287
- package/src/organization-model/types.ts +46 -46
- package/src/platform/api/index.ts +1 -1
- package/src/platform/api/types.ts +35 -35
- package/src/platform/constants/http.ts +37 -37
- package/src/platform/constants/index.ts +5 -5
- package/src/platform/constants/limits.ts +32 -32
- package/src/platform/constants/resilience.ts +51 -51
- package/src/platform/constants/timeouts.ts +20 -20
- package/src/platform/constants/versions.ts +3 -3
- package/src/platform/registry/__tests__/resource-registry-static.test.ts +347 -347
- package/src/platform/registry/__tests__/resource-registry.integration.test.ts +1028 -1028
- package/src/platform/registry/__tests__/resource-registry.list-executable.test.ts +393 -393
- package/src/platform/registry/__tests__/resource-registry.test.ts +2005 -2005
- package/src/platform/registry/__tests__/serialization.test.ts +1127 -1127
- package/src/platform/registry/command-view.ts +180 -180
- package/src/platform/registry/domains.ts +165 -165
- package/src/platform/registry/index.ts +93 -93
- package/src/platform/registry/reserved.ts +24 -24
- package/src/platform/registry/resource-metadata.ts +59 -59
- package/src/platform/registry/resource-registry.command-queue-groups.test.ts +129 -129
- package/src/platform/registry/resource-registry.ts +876 -876
- package/src/platform/registry/serialization.ts +273 -273
- package/src/platform/registry/serialized-types.ts +231 -231
- package/src/platform/registry/stats-types.ts +66 -66
- package/src/platform/registry/types.ts +404 -404
- package/src/platform/registry/validation.ts +513 -513
- package/src/platform/resilience/__tests__/rate-limiter.test.ts +471 -471
- package/src/platform/resilience/circuit-breaker.ts +164 -164
- package/src/platform/resilience/errors.ts +68 -68
- package/src/platform/resilience/http-error-mapper.ts +129 -129
- package/src/platform/resilience/index.ts +93 -93
- package/src/platform/resilience/rate-limiter-types.ts +46 -46
- package/src/platform/resilience/rate-limiter.ts +140 -140
- package/src/platform/resilience/retry.ts +89 -89
- package/src/platform/resilience/timeout.ts +63 -63
- package/src/platform/sse/events.ts +37 -37
- package/src/platform/sse/index.ts +7 -7
- package/src/platform/utils/__tests__/validation.test.ts +1083 -1083
- package/src/platform/utils/currency.ts +96 -96
- package/src/platform/utils/debounce.ts +52 -52
- package/src/platform/utils/error.ts +41 -41
- package/src/platform/utils/hmac.test.ts +97 -97
- package/src/platform/utils/index.ts +32 -32
- package/src/platform/utils/server/betterstack-logger.ts +210 -210
- package/src/platform/utils/server/hmac.ts +44 -44
- package/src/platform/utils/server/unsubscribe.ts +111 -111
- package/src/platform/utils/token-counter.ts +96 -96
- package/src/platform/utils/validation.ts +425 -425
- package/src/projects/api-schemas.ts +268 -268
- package/src/published.ts +1 -1
- package/src/reference/_generated/contracts.md +607 -607
- package/src/reference/glossary.md +105 -105
- package/src/requests/__tests__/api-schemas.test.ts +277 -277
- package/src/requests/api-schemas.ts +83 -83
- package/src/requests/index.ts +1 -1
- package/src/scaffold-registry/__tests__/index.test.ts +17 -0
- package/src/scaffold-registry/__tests__/schema.test.ts +329 -230
- package/src/scaffold-registry/index.ts +205 -189
- package/src/scaffold-registry/schema.ts +196 -128
- package/src/server.ts +272 -272
- package/src/supabase/database.types.ts +2719 -2719
- package/src/supabase/helpers.ts +20 -20
- package/src/supabase/index.ts +52 -52
- package/src/supabase/server/client.ts +58 -58
- package/src/test-utils/README.md +30 -138
- package/src/test-utils/browser-mocks.ts +54 -54
- package/src/test-utils/fixtures/api-keys.ts +52 -52
- package/src/test-utils/fixtures/index.ts +4 -4
- package/src/test-utils/fixtures/memberships.ts +80 -80
- package/src/test-utils/fixtures/organizations.ts +69 -69
- package/src/test-utils/fixtures/users.ts +79 -79
- package/src/test-utils/index.ts +7 -8
- package/src/test-utils/mocks/index.ts +2 -2
- package/src/test-utils/mocks/supabase.ts +142 -142
- package/src/test-utils/mocks/workos.ts +108 -108
- package/src/test-utils/published.ts +4 -0
- package/src/test-utils/rls/RLSTestContext.ts +554 -554
- package/src/test-utils/rls/index.ts +1 -1
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Currency formatting utilities
|
|
3
|
-
*
|
|
4
|
-
* These utilities handle formatting of USD currency values for display.
|
|
5
|
-
* Database stores values as NUMERIC (exact decimal precision), JavaScript
|
|
6
|
-
* uses number (IEEE 754 floating point).
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Format USD amount for display
|
|
11
|
-
*
|
|
12
|
-
* @param amountUsd - Amount in USD (e.g., 1.375 = $1.38)
|
|
13
|
-
* @param options - Formatting options
|
|
14
|
-
* @returns Formatted string (e.g., "$1.38")
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* formatCurrency(1.375) // "$1.38"
|
|
18
|
-
* formatCurrency(0.001) // "$0.00"
|
|
19
|
-
* formatCurrency(1234.56) // "$1,234.56"
|
|
20
|
-
* formatCurrency(1.5, { minimumFractionDigits: 4 }) // "$1.5000"
|
|
21
|
-
*/
|
|
22
|
-
export function formatCurrency(
|
|
23
|
-
amountUsd: number,
|
|
24
|
-
options: {
|
|
25
|
-
minimumFractionDigits?: number
|
|
26
|
-
maximumFractionDigits?: number
|
|
27
|
-
} = {}
|
|
28
|
-
): string {
|
|
29
|
-
const {
|
|
30
|
-
minimumFractionDigits = 2,
|
|
31
|
-
maximumFractionDigits = 2
|
|
32
|
-
} = options
|
|
33
|
-
|
|
34
|
-
return new Intl.NumberFormat('en-US', {
|
|
35
|
-
style: 'currency',
|
|
36
|
-
currency: 'USD',
|
|
37
|
-
minimumFractionDigits,
|
|
38
|
-
maximumFractionDigits
|
|
39
|
-
}).format(amountUsd)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Format USD amount with high precision (for debugging/technical displays)
|
|
44
|
-
*
|
|
45
|
-
* @param amountUsd - Amount in USD
|
|
46
|
-
* @returns Formatted string with 6 decimal places (e.g., "$0.001375")
|
|
47
|
-
*
|
|
48
|
-
* @example
|
|
49
|
-
* formatCurrencyPrecise(0.001375) // "$0.001375"
|
|
50
|
-
* formatCurrencyPrecise(1.5) // "$1.500000"
|
|
51
|
-
*/
|
|
52
|
-
export function formatCurrencyPrecise(amountUsd: number): string {
|
|
53
|
-
return formatCurrency(amountUsd, {
|
|
54
|
-
minimumFractionDigits: 6,
|
|
55
|
-
maximumFractionDigits: 6
|
|
56
|
-
})
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Format USD amount as compact notation (for charts/dashboards)
|
|
61
|
-
*
|
|
62
|
-
* @param amountUsd - Amount in USD
|
|
63
|
-
* @returns Compact formatted string (e.g., "$1.2K", "$3.5M")
|
|
64
|
-
*
|
|
65
|
-
* @example
|
|
66
|
-
* formatCurrencyCompact(1234) // "$1.2K"
|
|
67
|
-
* formatCurrencyCompact(1500000) // "$1.5M"
|
|
68
|
-
* formatCurrencyCompact(5) // "$5"
|
|
69
|
-
*/
|
|
70
|
-
export function formatCurrencyCompact(amountUsd: number): string {
|
|
71
|
-
return new Intl.NumberFormat('en-US', {
|
|
72
|
-
style: 'currency',
|
|
73
|
-
currency: 'USD',
|
|
74
|
-
notation: 'compact',
|
|
75
|
-
minimumFractionDigits: 0,
|
|
76
|
-
maximumFractionDigits: 1
|
|
77
|
-
}).format(amountUsd)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Parse string USD amount to number (for form inputs)
|
|
82
|
-
*
|
|
83
|
-
* @param value - String value (e.g., "$1,234.56" or "1234.56")
|
|
84
|
-
* @returns Parsed number or null if invalid
|
|
85
|
-
*
|
|
86
|
-
* @example
|
|
87
|
-
* parseCurrency("$1,234.56") // 1234.56
|
|
88
|
-
* parseCurrency("1234.56") // 1234.56
|
|
89
|
-
* parseCurrency("invalid") // null
|
|
90
|
-
*/
|
|
91
|
-
export function parseCurrency(value: string): number | null {
|
|
92
|
-
// Remove currency symbol and commas
|
|
93
|
-
const cleaned = value.replace(/[$,]/g, '').trim()
|
|
94
|
-
const parsed = parseFloat(cleaned)
|
|
95
|
-
return isNaN(parsed) ? null : parsed
|
|
96
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Currency formatting utilities
|
|
3
|
+
*
|
|
4
|
+
* These utilities handle formatting of USD currency values for display.
|
|
5
|
+
* Database stores values as NUMERIC (exact decimal precision), JavaScript
|
|
6
|
+
* uses number (IEEE 754 floating point).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Format USD amount for display
|
|
11
|
+
*
|
|
12
|
+
* @param amountUsd - Amount in USD (e.g., 1.375 = $1.38)
|
|
13
|
+
* @param options - Formatting options
|
|
14
|
+
* @returns Formatted string (e.g., "$1.38")
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* formatCurrency(1.375) // "$1.38"
|
|
18
|
+
* formatCurrency(0.001) // "$0.00"
|
|
19
|
+
* formatCurrency(1234.56) // "$1,234.56"
|
|
20
|
+
* formatCurrency(1.5, { minimumFractionDigits: 4 }) // "$1.5000"
|
|
21
|
+
*/
|
|
22
|
+
export function formatCurrency(
|
|
23
|
+
amountUsd: number,
|
|
24
|
+
options: {
|
|
25
|
+
minimumFractionDigits?: number
|
|
26
|
+
maximumFractionDigits?: number
|
|
27
|
+
} = {}
|
|
28
|
+
): string {
|
|
29
|
+
const {
|
|
30
|
+
minimumFractionDigits = 2,
|
|
31
|
+
maximumFractionDigits = 2
|
|
32
|
+
} = options
|
|
33
|
+
|
|
34
|
+
return new Intl.NumberFormat('en-US', {
|
|
35
|
+
style: 'currency',
|
|
36
|
+
currency: 'USD',
|
|
37
|
+
minimumFractionDigits,
|
|
38
|
+
maximumFractionDigits
|
|
39
|
+
}).format(amountUsd)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Format USD amount with high precision (for debugging/technical displays)
|
|
44
|
+
*
|
|
45
|
+
* @param amountUsd - Amount in USD
|
|
46
|
+
* @returns Formatted string with 6 decimal places (e.g., "$0.001375")
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* formatCurrencyPrecise(0.001375) // "$0.001375"
|
|
50
|
+
* formatCurrencyPrecise(1.5) // "$1.500000"
|
|
51
|
+
*/
|
|
52
|
+
export function formatCurrencyPrecise(amountUsd: number): string {
|
|
53
|
+
return formatCurrency(amountUsd, {
|
|
54
|
+
minimumFractionDigits: 6,
|
|
55
|
+
maximumFractionDigits: 6
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Format USD amount as compact notation (for charts/dashboards)
|
|
61
|
+
*
|
|
62
|
+
* @param amountUsd - Amount in USD
|
|
63
|
+
* @returns Compact formatted string (e.g., "$1.2K", "$3.5M")
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* formatCurrencyCompact(1234) // "$1.2K"
|
|
67
|
+
* formatCurrencyCompact(1500000) // "$1.5M"
|
|
68
|
+
* formatCurrencyCompact(5) // "$5"
|
|
69
|
+
*/
|
|
70
|
+
export function formatCurrencyCompact(amountUsd: number): string {
|
|
71
|
+
return new Intl.NumberFormat('en-US', {
|
|
72
|
+
style: 'currency',
|
|
73
|
+
currency: 'USD',
|
|
74
|
+
notation: 'compact',
|
|
75
|
+
minimumFractionDigits: 0,
|
|
76
|
+
maximumFractionDigits: 1
|
|
77
|
+
}).format(amountUsd)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Parse string USD amount to number (for form inputs)
|
|
82
|
+
*
|
|
83
|
+
* @param value - String value (e.g., "$1,234.56" or "1234.56")
|
|
84
|
+
* @returns Parsed number or null if invalid
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* parseCurrency("$1,234.56") // 1234.56
|
|
88
|
+
* parseCurrency("1234.56") // 1234.56
|
|
89
|
+
* parseCurrency("invalid") // null
|
|
90
|
+
*/
|
|
91
|
+
export function parseCurrency(value: string): number | null {
|
|
92
|
+
// Remove currency symbol and commas
|
|
93
|
+
const cleaned = value.replace(/[$,]/g, '').trim()
|
|
94
|
+
const parsed = parseFloat(cleaned)
|
|
95
|
+
return isNaN(parsed) ? null : parsed
|
|
96
|
+
}
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Debounce utility for delaying function execution
|
|
3
|
-
*
|
|
4
|
-
* Creates a debounced version of a function that delays invoking until
|
|
5
|
-
* after `wait` milliseconds have elapsed since the last time it was invoked.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Creates a debounced function that delays invoking `fn` until after `wait`
|
|
10
|
-
* milliseconds have elapsed since the last time the debounced function was invoked.
|
|
11
|
-
*
|
|
12
|
-
* @param fn - The function to debounce
|
|
13
|
-
* @param wait - The number of milliseconds to delay
|
|
14
|
-
* @returns A debounced version of the function with a `cancel` method
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* const debouncedSearch = debounce((query: string) => {
|
|
18
|
-
* console.log('Searching for:', query)
|
|
19
|
-
* }, 300)
|
|
20
|
-
*
|
|
21
|
-
* debouncedSearch('a')
|
|
22
|
-
* debouncedSearch('ab')
|
|
23
|
-
* debouncedSearch('abc') // Only this one executes after 300ms
|
|
24
|
-
*
|
|
25
|
-
* // Cancel pending execution
|
|
26
|
-
* debouncedSearch.cancel()
|
|
27
|
-
*/
|
|
28
|
-
export function debounce<T extends (...args: Parameters<T>) => void>(
|
|
29
|
-
fn: T,
|
|
30
|
-
wait: number
|
|
31
|
-
): ((...args: Parameters<T>) => void) & { cancel: () => void } {
|
|
32
|
-
let timeoutId: ReturnType<typeof setTimeout> | null = null
|
|
33
|
-
|
|
34
|
-
const debounced = (...args: Parameters<T>) => {
|
|
35
|
-
if (timeoutId !== null) {
|
|
36
|
-
clearTimeout(timeoutId)
|
|
37
|
-
}
|
|
38
|
-
timeoutId = setTimeout(() => {
|
|
39
|
-
fn(...args)
|
|
40
|
-
timeoutId = null
|
|
41
|
-
}, wait)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
debounced.cancel = () => {
|
|
45
|
-
if (timeoutId !== null) {
|
|
46
|
-
clearTimeout(timeoutId)
|
|
47
|
-
timeoutId = null
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return debounced
|
|
52
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Debounce utility for delaying function execution
|
|
3
|
+
*
|
|
4
|
+
* Creates a debounced version of a function that delays invoking until
|
|
5
|
+
* after `wait` milliseconds have elapsed since the last time it was invoked.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Creates a debounced function that delays invoking `fn` until after `wait`
|
|
10
|
+
* milliseconds have elapsed since the last time the debounced function was invoked.
|
|
11
|
+
*
|
|
12
|
+
* @param fn - The function to debounce
|
|
13
|
+
* @param wait - The number of milliseconds to delay
|
|
14
|
+
* @returns A debounced version of the function with a `cancel` method
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* const debouncedSearch = debounce((query: string) => {
|
|
18
|
+
* console.log('Searching for:', query)
|
|
19
|
+
* }, 300)
|
|
20
|
+
*
|
|
21
|
+
* debouncedSearch('a')
|
|
22
|
+
* debouncedSearch('ab')
|
|
23
|
+
* debouncedSearch('abc') // Only this one executes after 300ms
|
|
24
|
+
*
|
|
25
|
+
* // Cancel pending execution
|
|
26
|
+
* debouncedSearch.cancel()
|
|
27
|
+
*/
|
|
28
|
+
export function debounce<T extends (...args: Parameters<T>) => void>(
|
|
29
|
+
fn: T,
|
|
30
|
+
wait: number
|
|
31
|
+
): ((...args: Parameters<T>) => void) & { cancel: () => void } {
|
|
32
|
+
let timeoutId: ReturnType<typeof setTimeout> | null = null
|
|
33
|
+
|
|
34
|
+
const debounced = (...args: Parameters<T>) => {
|
|
35
|
+
if (timeoutId !== null) {
|
|
36
|
+
clearTimeout(timeoutId)
|
|
37
|
+
}
|
|
38
|
+
timeoutId = setTimeout(() => {
|
|
39
|
+
fn(...args)
|
|
40
|
+
timeoutId = null
|
|
41
|
+
}, wait)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
debounced.cancel = () => {
|
|
45
|
+
if (timeoutId !== null) {
|
|
46
|
+
clearTimeout(timeoutId)
|
|
47
|
+
timeoutId = null
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return debounced
|
|
52
|
+
}
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Error utility functions
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { ZodError } from 'zod'
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Convert unknown error to string message
|
|
9
|
-
* Handles Error objects and other types safely
|
|
10
|
-
* Includes special handling for Zod validation errors
|
|
11
|
-
*/
|
|
12
|
-
export function errorToString(error: unknown): string {
|
|
13
|
-
if (error instanceof ZodError) {
|
|
14
|
-
// Format Zod validation errors with field path and details
|
|
15
|
-
return JSON.stringify(error.issues, null, 2)
|
|
16
|
-
}
|
|
17
|
-
return error instanceof Error ? error.message : String(error)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Extract structured error details for logging
|
|
22
|
-
* Includes validation errors, stack traces, and context
|
|
23
|
-
*/
|
|
24
|
-
export function getErrorDetails(error: unknown): Record<string, unknown> {
|
|
25
|
-
const details: Record<string, unknown> = {
|
|
26
|
-
message: errorToString(error),
|
|
27
|
-
type: error instanceof Error ? error.constructor.name : typeof error
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Add Zod validation details
|
|
31
|
-
if (error instanceof ZodError) {
|
|
32
|
-
details.validationErrors = error.issues
|
|
33
|
-
details.isValidationError = true
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Add stack trace for Error objects
|
|
37
|
-
if (error instanceof Error && error.stack) {
|
|
38
|
-
details.stack = error.stack
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return details
|
|
1
|
+
/**
|
|
2
|
+
* Error utility functions
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { ZodError } from 'zod'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Convert unknown error to string message
|
|
9
|
+
* Handles Error objects and other types safely
|
|
10
|
+
* Includes special handling for Zod validation errors
|
|
11
|
+
*/
|
|
12
|
+
export function errorToString(error: unknown): string {
|
|
13
|
+
if (error instanceof ZodError) {
|
|
14
|
+
// Format Zod validation errors with field path and details
|
|
15
|
+
return JSON.stringify(error.issues, null, 2)
|
|
16
|
+
}
|
|
17
|
+
return error instanceof Error ? error.message : String(error)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Extract structured error details for logging
|
|
22
|
+
* Includes validation errors, stack traces, and context
|
|
23
|
+
*/
|
|
24
|
+
export function getErrorDetails(error: unknown): Record<string, unknown> {
|
|
25
|
+
const details: Record<string, unknown> = {
|
|
26
|
+
message: errorToString(error),
|
|
27
|
+
type: error instanceof Error ? error.constructor.name : typeof error
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Add Zod validation details
|
|
31
|
+
if (error instanceof ZodError) {
|
|
32
|
+
details.validationErrors = error.issues
|
|
33
|
+
details.isValidationError = true
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Add stack trace for Error objects
|
|
37
|
+
if (error instanceof Error && error.stack) {
|
|
38
|
+
details.stack = error.stack
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return details
|
|
42
42
|
}
|
|
@@ -1,97 +1,97 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { generateHmacToken, verifyHmacToken, generateBrochureUrl } from './server/hmac'
|
|
3
|
-
|
|
4
|
-
describe('HMAC Token Utilities', () => {
|
|
5
|
-
const TEST_SECRET = 'test-secret-key-12345'
|
|
6
|
-
const TEST_CONTACT_ID = '550e8400-e29b-41d4-a716-446655440000'
|
|
7
|
-
|
|
8
|
-
describe('generateHmacToken', () => {
|
|
9
|
-
it('returns 16-character hex token', () => {
|
|
10
|
-
const token = generateHmacToken('test-data', TEST_SECRET)
|
|
11
|
-
expect(token).toHaveLength(16)
|
|
12
|
-
expect(token).toMatch(/^[0-9a-f]{16}$/)
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
it('produces consistent tokens for same input', () => {
|
|
16
|
-
const token1 = generateHmacToken('test@example.com', TEST_SECRET)
|
|
17
|
-
const token2 = generateHmacToken('test@example.com', TEST_SECRET)
|
|
18
|
-
expect(token1).toBe(token2)
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
it('normalizes input (lowercase and trim)', () => {
|
|
22
|
-
const token1 = generateHmacToken('TEST@EXAMPLE.COM', TEST_SECRET)
|
|
23
|
-
const token2 = generateHmacToken(' test@example.com ', TEST_SECRET)
|
|
24
|
-
const token3 = generateHmacToken('test@example.com', TEST_SECRET)
|
|
25
|
-
expect(token1).toBe(token2)
|
|
26
|
-
expect(token2).toBe(token3)
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
it('produces different tokens for different secrets', () => {
|
|
30
|
-
const token1 = generateHmacToken('data', 'secret1')
|
|
31
|
-
const token2 = generateHmacToken('data', 'secret2')
|
|
32
|
-
expect(token1).not.toBe(token2)
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
it('produces different tokens for different data', () => {
|
|
36
|
-
const token1 = generateHmacToken('data1', TEST_SECRET)
|
|
37
|
-
const token2 = generateHmacToken('data2', TEST_SECRET)
|
|
38
|
-
expect(token1).not.toBe(token2)
|
|
39
|
-
})
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
describe('verifyHmacToken', () => {
|
|
43
|
-
it('returns true for valid token', () => {
|
|
44
|
-
const token = generateHmacToken(TEST_CONTACT_ID, TEST_SECRET)
|
|
45
|
-
const isValid = verifyHmacToken(TEST_CONTACT_ID, token, TEST_SECRET)
|
|
46
|
-
expect(isValid).toBe(true)
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
it('returns false for invalid token', () => {
|
|
50
|
-
const isValid = verifyHmacToken(TEST_CONTACT_ID, 'invalid-token-00', TEST_SECRET)
|
|
51
|
-
expect(isValid).toBe(false)
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
it('returns false for wrong length token', () => {
|
|
55
|
-
const isValid = verifyHmacToken(TEST_CONTACT_ID, 'short', TEST_SECRET)
|
|
56
|
-
expect(isValid).toBe(false)
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
it('returns false for wrong secret', () => {
|
|
60
|
-
const token = generateHmacToken(TEST_CONTACT_ID, TEST_SECRET)
|
|
61
|
-
const isValid = verifyHmacToken(TEST_CONTACT_ID, token, 'wrong-secret')
|
|
62
|
-
expect(isValid).toBe(false)
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
it('verifies with normalized input', () => {
|
|
66
|
-
const token = generateHmacToken('test@example.com', TEST_SECRET)
|
|
67
|
-
const isValid = verifyHmacToken(' TEST@EXAMPLE.COM ', token, TEST_SECRET)
|
|
68
|
-
expect(isValid).toBe(true)
|
|
69
|
-
})
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
describe('generateBrochureUrl', () => {
|
|
73
|
-
it('generates URL with default base', () => {
|
|
74
|
-
const url = generateBrochureUrl(TEST_CONTACT_ID, TEST_SECRET)
|
|
75
|
-
expect(url).toMatch(/^https:\/\/brochure\.elevasis\.io\//)
|
|
76
|
-
expect(url).toContain(TEST_CONTACT_ID)
|
|
77
|
-
expect(url).toMatch(/\?t=[0-9a-f]{16}$/)
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
it('generates URL with custom base', () => {
|
|
81
|
-
const customBase = 'https://custom.example.com/brochure'
|
|
82
|
-
const url = generateBrochureUrl(TEST_CONTACT_ID, TEST_SECRET, customBase)
|
|
83
|
-
expect(url).toMatch(/^https:\/\/custom\.example\.com\/brochure\//)
|
|
84
|
-
expect(url).toContain(TEST_CONTACT_ID)
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
it('generates verifiable token in URL', () => {
|
|
88
|
-
const url = generateBrochureUrl(TEST_CONTACT_ID, TEST_SECRET)
|
|
89
|
-
const tokenMatch = url.match(/\?t=([0-9a-f]{16})$/)
|
|
90
|
-
expect(tokenMatch).not.toBeNull()
|
|
91
|
-
|
|
92
|
-
const extractedToken = tokenMatch![1]
|
|
93
|
-
const isValid = verifyHmacToken(TEST_CONTACT_ID, extractedToken, TEST_SECRET)
|
|
94
|
-
expect(isValid).toBe(true)
|
|
95
|
-
})
|
|
96
|
-
})
|
|
97
|
-
})
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { generateHmacToken, verifyHmacToken, generateBrochureUrl } from './server/hmac'
|
|
3
|
+
|
|
4
|
+
describe('HMAC Token Utilities', () => {
|
|
5
|
+
const TEST_SECRET = 'test-secret-key-12345'
|
|
6
|
+
const TEST_CONTACT_ID = '550e8400-e29b-41d4-a716-446655440000'
|
|
7
|
+
|
|
8
|
+
describe('generateHmacToken', () => {
|
|
9
|
+
it('returns 16-character hex token', () => {
|
|
10
|
+
const token = generateHmacToken('test-data', TEST_SECRET)
|
|
11
|
+
expect(token).toHaveLength(16)
|
|
12
|
+
expect(token).toMatch(/^[0-9a-f]{16}$/)
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
it('produces consistent tokens for same input', () => {
|
|
16
|
+
const token1 = generateHmacToken('test@example.com', TEST_SECRET)
|
|
17
|
+
const token2 = generateHmacToken('test@example.com', TEST_SECRET)
|
|
18
|
+
expect(token1).toBe(token2)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
it('normalizes input (lowercase and trim)', () => {
|
|
22
|
+
const token1 = generateHmacToken('TEST@EXAMPLE.COM', TEST_SECRET)
|
|
23
|
+
const token2 = generateHmacToken(' test@example.com ', TEST_SECRET)
|
|
24
|
+
const token3 = generateHmacToken('test@example.com', TEST_SECRET)
|
|
25
|
+
expect(token1).toBe(token2)
|
|
26
|
+
expect(token2).toBe(token3)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
it('produces different tokens for different secrets', () => {
|
|
30
|
+
const token1 = generateHmacToken('data', 'secret1')
|
|
31
|
+
const token2 = generateHmacToken('data', 'secret2')
|
|
32
|
+
expect(token1).not.toBe(token2)
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('produces different tokens for different data', () => {
|
|
36
|
+
const token1 = generateHmacToken('data1', TEST_SECRET)
|
|
37
|
+
const token2 = generateHmacToken('data2', TEST_SECRET)
|
|
38
|
+
expect(token1).not.toBe(token2)
|
|
39
|
+
})
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
describe('verifyHmacToken', () => {
|
|
43
|
+
it('returns true for valid token', () => {
|
|
44
|
+
const token = generateHmacToken(TEST_CONTACT_ID, TEST_SECRET)
|
|
45
|
+
const isValid = verifyHmacToken(TEST_CONTACT_ID, token, TEST_SECRET)
|
|
46
|
+
expect(isValid).toBe(true)
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it('returns false for invalid token', () => {
|
|
50
|
+
const isValid = verifyHmacToken(TEST_CONTACT_ID, 'invalid-token-00', TEST_SECRET)
|
|
51
|
+
expect(isValid).toBe(false)
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
it('returns false for wrong length token', () => {
|
|
55
|
+
const isValid = verifyHmacToken(TEST_CONTACT_ID, 'short', TEST_SECRET)
|
|
56
|
+
expect(isValid).toBe(false)
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('returns false for wrong secret', () => {
|
|
60
|
+
const token = generateHmacToken(TEST_CONTACT_ID, TEST_SECRET)
|
|
61
|
+
const isValid = verifyHmacToken(TEST_CONTACT_ID, token, 'wrong-secret')
|
|
62
|
+
expect(isValid).toBe(false)
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
it('verifies with normalized input', () => {
|
|
66
|
+
const token = generateHmacToken('test@example.com', TEST_SECRET)
|
|
67
|
+
const isValid = verifyHmacToken(' TEST@EXAMPLE.COM ', token, TEST_SECRET)
|
|
68
|
+
expect(isValid).toBe(true)
|
|
69
|
+
})
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
describe('generateBrochureUrl', () => {
|
|
73
|
+
it('generates URL with default base', () => {
|
|
74
|
+
const url = generateBrochureUrl(TEST_CONTACT_ID, TEST_SECRET)
|
|
75
|
+
expect(url).toMatch(/^https:\/\/brochure\.elevasis\.io\//)
|
|
76
|
+
expect(url).toContain(TEST_CONTACT_ID)
|
|
77
|
+
expect(url).toMatch(/\?t=[0-9a-f]{16}$/)
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
it('generates URL with custom base', () => {
|
|
81
|
+
const customBase = 'https://custom.example.com/brochure'
|
|
82
|
+
const url = generateBrochureUrl(TEST_CONTACT_ID, TEST_SECRET, customBase)
|
|
83
|
+
expect(url).toMatch(/^https:\/\/custom\.example\.com\/brochure\//)
|
|
84
|
+
expect(url).toContain(TEST_CONTACT_ID)
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
it('generates verifiable token in URL', () => {
|
|
88
|
+
const url = generateBrochureUrl(TEST_CONTACT_ID, TEST_SECRET)
|
|
89
|
+
const tokenMatch = url.match(/\?t=([0-9a-f]{16})$/)
|
|
90
|
+
expect(tokenMatch).not.toBeNull()
|
|
91
|
+
|
|
92
|
+
const extractedToken = tokenMatch![1]
|
|
93
|
+
const isValid = verifyHmacToken(TEST_CONTACT_ID, extractedToken, TEST_SECRET)
|
|
94
|
+
expect(isValid).toBe(true)
|
|
95
|
+
})
|
|
96
|
+
})
|
|
97
|
+
})
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Core utility functions
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export { debounce } from './debounce'
|
|
6
|
-
export { errorToString, getErrorDetails } from './error'
|
|
7
|
-
export { formatCurrency, formatCurrencyPrecise, formatCurrencyCompact, parseCurrency } from './currency'
|
|
8
|
-
export { estimateTokens, validateTokenLimit, TOKEN_LIMITS } from './token-counter'
|
|
9
|
-
export type { TokenCountResult, TokenLimits } from './token-counter'
|
|
10
|
-
export {
|
|
11
|
-
UuidSchema,
|
|
12
|
-
NonEmptyStringSchema,
|
|
13
|
-
EmailSchema,
|
|
14
|
-
UrlSchema,
|
|
15
|
-
PaginationSchema,
|
|
16
|
-
TimestampSchema,
|
|
17
|
-
DateRangeSchema,
|
|
18
|
-
ResourceTypeSchema,
|
|
19
|
-
OriginResourceTypeSchema,
|
|
20
|
-
CredentialNameSchema,
|
|
21
|
-
OrganizationIdSchema,
|
|
22
|
-
OAuthProviderSchema,
|
|
23
|
-
OAuthCodeSchema,
|
|
24
|
-
OAuthStateParamSchema,
|
|
25
|
-
SanitizedStringSchema,
|
|
26
|
-
createEnumSchema,
|
|
27
|
-
createStringSchema,
|
|
28
|
-
createArraySchema,
|
|
29
|
-
createPayloadSizeValidator,
|
|
30
|
-
formatZodValidationError
|
|
31
|
-
} from './validation'
|
|
32
|
-
export type { PaginationParams, DateRange, ValidationErrorResponse, PaginatedResponse } from './validation'
|
|
1
|
+
/**
|
|
2
|
+
* Core utility functions
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export { debounce } from './debounce'
|
|
6
|
+
export { errorToString, getErrorDetails } from './error'
|
|
7
|
+
export { formatCurrency, formatCurrencyPrecise, formatCurrencyCompact, parseCurrency } from './currency'
|
|
8
|
+
export { estimateTokens, validateTokenLimit, TOKEN_LIMITS } from './token-counter'
|
|
9
|
+
export type { TokenCountResult, TokenLimits } from './token-counter'
|
|
10
|
+
export {
|
|
11
|
+
UuidSchema,
|
|
12
|
+
NonEmptyStringSchema,
|
|
13
|
+
EmailSchema,
|
|
14
|
+
UrlSchema,
|
|
15
|
+
PaginationSchema,
|
|
16
|
+
TimestampSchema,
|
|
17
|
+
DateRangeSchema,
|
|
18
|
+
ResourceTypeSchema,
|
|
19
|
+
OriginResourceTypeSchema,
|
|
20
|
+
CredentialNameSchema,
|
|
21
|
+
OrganizationIdSchema,
|
|
22
|
+
OAuthProviderSchema,
|
|
23
|
+
OAuthCodeSchema,
|
|
24
|
+
OAuthStateParamSchema,
|
|
25
|
+
SanitizedStringSchema,
|
|
26
|
+
createEnumSchema,
|
|
27
|
+
createStringSchema,
|
|
28
|
+
createArraySchema,
|
|
29
|
+
createPayloadSizeValidator,
|
|
30
|
+
formatZodValidationError
|
|
31
|
+
} from './validation'
|
|
32
|
+
export type { PaginationParams, DateRange, ValidationErrorResponse, PaginatedResponse } from './validation'
|