@elevasis/core 0.1.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/dist/index.d.ts +435 -0
- package/dist/index.js +403 -0
- package/dist/organization-model/index.d.ts +435 -0
- package/dist/organization-model/index.js +403 -0
- package/package.json +62 -0
- package/src/README.md +34 -0
- package/src/__tests__/observability-exports.test.ts +36 -0
- package/src/__tests__/publish.test.ts +18 -0
- package/src/__tests__/template-foundations-compatibility.test.ts +34 -0
- package/src/auth/index.ts +8 -0
- package/src/auth/multi-tenancy/credentials/README.md +38 -0
- package/src/auth/multi-tenancy/credentials/__tests__/encryption.test.ts +216 -0
- package/src/auth/multi-tenancy/credentials/__tests__/service.test.ts +174 -0
- package/src/auth/multi-tenancy/credentials/index.ts +6 -0
- package/src/auth/multi-tenancy/credentials/server/encryption.ts +39 -0
- package/src/auth/multi-tenancy/credentials/server/service.ts +60 -0
- package/src/auth/multi-tenancy/index.ts +17 -0
- package/src/auth/multi-tenancy/invitations/__tests__/invitation.test.ts +237 -0
- package/src/auth/multi-tenancy/invitations/api-schemas.ts +107 -0
- package/src/auth/multi-tenancy/invitations/index.ts +38 -0
- package/src/auth/multi-tenancy/invitations/invitation.ts +86 -0
- package/src/auth/multi-tenancy/invitations/server/index.ts +25 -0
- package/src/auth/multi-tenancy/invitations/server/transforms.ts +24 -0
- package/src/auth/multi-tenancy/invitations/server/workos.ts +24 -0
- package/src/auth/multi-tenancy/invitations/supabase.ts +50 -0
- package/src/auth/multi-tenancy/memberships/__tests__/membership.test.ts +227 -0
- package/src/auth/multi-tenancy/memberships/__tests__/supabase-transforms.test.ts +88 -0
- package/src/auth/multi-tenancy/memberships/__tests__/workos-transforms.test.ts +139 -0
- package/src/auth/multi-tenancy/memberships/api-schemas.ts +126 -0
- package/src/auth/multi-tenancy/memberships/index.ts +22 -0
- package/src/auth/multi-tenancy/memberships/membership.ts +138 -0
- package/src/auth/multi-tenancy/memberships/server/index.ts +15 -0
- package/src/auth/multi-tenancy/memberships/server/transforms.ts +32 -0
- package/src/auth/multi-tenancy/memberships/server/workos.ts +21 -0
- package/src/auth/multi-tenancy/memberships/supabase.ts +46 -0
- package/src/auth/multi-tenancy/organizations/__tests__/organization.test.ts +249 -0
- package/src/auth/multi-tenancy/organizations/api-schemas.ts +128 -0
- package/src/auth/multi-tenancy/organizations/index.ts +23 -0
- package/src/auth/multi-tenancy/organizations/organization.ts +25 -0
- package/src/auth/multi-tenancy/organizations/server/index.ts +10 -0
- package/src/auth/multi-tenancy/organizations/server/transforms.ts +35 -0
- package/src/auth/multi-tenancy/organizations/server/workos.ts +20 -0
- package/src/auth/multi-tenancy/types.ts +89 -0
- package/src/auth/multi-tenancy/users/__tests__/user.test.ts +208 -0
- package/src/auth/multi-tenancy/users/api-schemas.ts +194 -0
- package/src/auth/multi-tenancy/users/index.ts +28 -0
- package/src/auth/multi-tenancy/users/server/index.ts +19 -0
- package/src/auth/multi-tenancy/users/server/transforms.ts +21 -0
- package/src/auth/multi-tenancy/users/server/workos.ts +16 -0
- package/src/auth/multi-tenancy/users/user.ts +65 -0
- package/src/business/acquisition/api-schemas.ts +759 -0
- package/src/business/acquisition/index.ts +109 -0
- package/src/business/acquisition/types.ts +400 -0
- package/src/business/crm/api-schemas.ts +75 -0
- package/src/business/delivery/index.ts +1 -0
- package/src/business/delivery/types.ts +89 -0
- package/src/business/index.ts +12 -0
- package/src/business/pdf/assets/ElevasisLogo.png +0 -0
- package/src/business/pdf/browser/image-utils.ts +74 -0
- package/src/business/pdf/browser/index.ts +16 -0
- package/src/business/pdf/browser/pdfmake-browser.ts +229 -0
- package/src/business/pdf/index.ts +10 -0
- package/src/business/pdf/sections/acceptance.ts +112 -0
- package/src/business/pdf/sections/automation.ts +56 -0
- package/src/business/pdf/sections/cover.ts +51 -0
- package/src/business/pdf/sections/index.ts +57 -0
- package/src/business/pdf/sections/investment.ts +69 -0
- package/src/business/pdf/sections/proposal-document.ts +200 -0
- package/src/business/pdf/sections/summary-investment.ts +124 -0
- package/src/business/pdf/sections/summary.ts +55 -0
- package/src/business/pdf/sections/table-summary.ts +59 -0
- package/src/business/pdf/sections/types.ts +124 -0
- package/src/business/pdf/server/__tests__/pdfmake-test.ts +219 -0
- package/src/business/pdf/server/index.ts +21 -0
- package/src/business/pdf/server/pdfmake-service.ts +237 -0
- package/src/business/pdf/server/themes/default.ts +8 -0
- package/src/business/pdf/server/themes/index.ts +9 -0
- package/src/business/pdf/server/themes/types.ts +8 -0
- package/src/business/pdf/shared/convert.ts +514 -0
- package/src/business/pdf/shared/index.ts +12 -0
- package/src/business/pdf/themes.ts +78 -0
- package/src/business/pdf/types.ts +272 -0
- package/src/business/seo/__tests__/linking.test.ts +549 -0
- package/src/business/seo/__tests__/types.test.ts +404 -0
- package/src/business/seo/index.ts +2 -0
- package/src/business/seo/linking.ts +281 -0
- package/src/business/seo/types.ts +199 -0
- package/src/commands/index.ts +8 -0
- package/src/commands/queue/index.ts +3 -0
- package/src/commands/queue/schemas.test.ts +593 -0
- package/src/commands/queue/schemas.ts +125 -0
- package/src/commands/queue/sse-events.ts +61 -0
- package/src/commands/queue/types/action.ts +52 -0
- package/src/commands/queue/types/checkpoint.ts +44 -0
- package/src/commands/queue/types/index.ts +7 -0
- package/src/commands/queue/types/task.ts +116 -0
- package/src/commands/queue/types.ts +14 -0
- package/src/content/distribution-metadata.ts +61 -0
- package/src/content/index.ts +10 -0
- package/src/deployments/index.ts +22 -0
- package/src/execution/calibration/__tests__/schemas.test.ts +320 -0
- package/src/execution/calibration/index.ts +3 -0
- package/src/execution/calibration/schemas.ts +121 -0
- package/src/execution/calibration/sse-events.ts +125 -0
- package/src/execution/calibration/types.ts +190 -0
- package/src/execution/core/__tests__/api-schemas.test.ts +667 -0
- package/src/execution/core/__tests__/archived-logs.test.ts +72 -0
- package/src/execution/core/api-schemas.ts +312 -0
- package/src/execution/core/index.ts +11 -0
- package/src/execution/core/resource-validator.test.ts +63 -0
- package/src/execution/core/runner-types.ts +80 -0
- package/src/execution/core/server/environment.ts +31 -0
- package/src/execution/core/sse-executions.ts +119 -0
- package/src/execution/core/types.ts +29 -0
- package/src/execution/engine/__tests__/fixtures/index.ts +2 -0
- package/src/execution/engine/__tests__/fixtures/mock-scenarios.ts +60 -0
- package/src/execution/engine/__tests__/fixtures/test-agents.ts +85 -0
- package/src/execution/engine/__tests__/integration/agent-framework.integration.test.ts +1031 -0
- package/src/execution/engine/__tests__/timeout.test.ts +565 -0
- package/src/execution/engine/agent/__tests__/errors.test.ts +508 -0
- package/src/execution/engine/agent/actions/__tests__/processor.test.ts +531 -0
- package/src/execution/engine/agent/actions/executor.ts +205 -0
- package/src/execution/engine/agent/actions/navigate-knowledge-executor.ts +230 -0
- package/src/execution/engine/agent/actions/processor.ts +116 -0
- package/src/execution/engine/agent/actions/types.ts +70 -0
- package/src/execution/engine/agent/core/__tests__/agent.test.ts +614 -0
- package/src/execution/engine/agent/core/__tests__/error-passthrough.test.ts +134 -0
- package/src/execution/engine/agent/core/agent.ts +810 -0
- package/src/execution/engine/agent/core/types.ts +155 -0
- package/src/execution/engine/agent/errors.ts +251 -0
- package/src/execution/engine/agent/index.ts +78 -0
- package/src/execution/engine/agent/knowledge-map/__tests__/navigate-knowledge-executor.test.ts +580 -0
- package/src/execution/engine/agent/knowledge-map/__tests__/utils.test.ts +622 -0
- package/src/execution/engine/agent/knowledge-map/types.ts +106 -0
- package/src/execution/engine/agent/knowledge-map/utils.ts +101 -0
- package/src/execution/engine/agent/memory/__tests__/domains.test.ts +72 -0
- package/src/execution/engine/agent/memory/__tests__/manager.test.ts +754 -0
- package/src/execution/engine/agent/memory/__tests__/utils.test.ts +285 -0
- package/src/execution/engine/agent/memory/domains.ts +99 -0
- package/src/execution/engine/agent/memory/manager.ts +365 -0
- package/src/execution/engine/agent/memory/processor.ts +66 -0
- package/src/execution/engine/agent/memory/types.ts +90 -0
- package/src/execution/engine/agent/memory/utils.ts +134 -0
- package/src/execution/engine/agent/observability/logging.ts +467 -0
- package/src/execution/engine/agent/observability/types.ts +64 -0
- package/src/execution/engine/agent/reasoning/__tests__/request-builder.test.ts +209 -0
- package/src/execution/engine/agent/reasoning/adapters/agent-adapter-helpers.ts +349 -0
- package/src/execution/engine/agent/reasoning/processor.ts +92 -0
- package/src/execution/engine/agent/reasoning/prompt-sections/base-actions.ts +134 -0
- package/src/execution/engine/agent/reasoning/prompt-sections/completion.ts +49 -0
- package/src/execution/engine/agent/reasoning/prompt-sections/knowledge-map.ts +93 -0
- package/src/execution/engine/agent/reasoning/prompt-sections/memory.ts +65 -0
- package/src/execution/engine/agent/reasoning/prompt-sections/security.ts +32 -0
- package/src/execution/engine/agent/reasoning/prompt-sections/tools.ts +44 -0
- package/src/execution/engine/agent/reasoning/request-builder.ts +169 -0
- package/src/execution/engine/agent/reasoning/types.ts +18 -0
- package/src/execution/engine/base/__tests__/errors.test.ts +246 -0
- package/src/execution/engine/base/__tests__/serialization.test.ts +670 -0
- package/src/execution/engine/base/__tests__/utils.test.ts +45 -0
- package/src/execution/engine/base/errors.ts +118 -0
- package/src/execution/engine/base/index.ts +2 -0
- package/src/execution/engine/base/logging.ts +31 -0
- package/src/execution/engine/base/serialization.ts +324 -0
- package/src/execution/engine/base/types.ts +126 -0
- package/src/execution/engine/base/utils.ts +41 -0
- package/src/execution/engine/index.ts +440 -0
- package/src/execution/engine/interface/index.ts +1 -0
- package/src/execution/engine/interface/types.ts +62 -0
- package/src/execution/engine/llm/__tests__/errors.test.ts +318 -0
- package/src/execution/engine/llm/__tests__/input-sanitizer.test.ts +286 -0
- package/src/execution/engine/llm/__tests__/model-info.test.ts +50 -0
- package/src/execution/engine/llm/__tests__/model-validation.test.ts +321 -0
- package/src/execution/engine/llm/__tests__/response-schema-validator.test.ts +115 -0
- package/src/execution/engine/llm/adapters/__tests__/adapter-factory.test.ts +375 -0
- package/src/execution/engine/llm/adapters/__tests__/anthropic-adapter.test.ts +463 -0
- package/src/execution/engine/llm/adapters/__tests__/anthropic.integration.test.ts +177 -0
- package/src/execution/engine/llm/adapters/__tests__/circuit-breaker-error.test.ts +94 -0
- package/src/execution/engine/llm/adapters/__tests__/google-adapter.test.ts +722 -0
- package/src/execution/engine/llm/adapters/__tests__/google.integration.test.ts +376 -0
- package/src/execution/engine/llm/adapters/__tests__/mock-adapter.test.ts +432 -0
- package/src/execution/engine/llm/adapters/__tests__/openai-adapter.test.ts +551 -0
- package/src/execution/engine/llm/adapters/__tests__/openrouter-adapter.test.ts +563 -0
- package/src/execution/engine/llm/adapters/__tests__/openrouter.integration.test.ts +105 -0
- package/src/execution/engine/llm/adapters/__tests__/universal-adapter.test.ts +537 -0
- package/src/execution/engine/llm/adapters/circuit-breaker.ts +147 -0
- package/src/execution/engine/llm/adapters/index.ts +17 -0
- package/src/execution/engine/llm/adapters/mock-adapter.ts +116 -0
- package/src/execution/engine/llm/adapters/server/adapter-factory.ts +130 -0
- package/src/execution/engine/llm/adapters/server/anthropic.ts +137 -0
- package/src/execution/engine/llm/adapters/server/compose-signal.ts +18 -0
- package/src/execution/engine/llm/adapters/server/google.ts +283 -0
- package/src/execution/engine/llm/adapters/server/index.ts +12 -0
- package/src/execution/engine/llm/adapters/server/openai.ts +206 -0
- package/src/execution/engine/llm/adapters/server/openrouter.ts +235 -0
- package/src/execution/engine/llm/adapters/universal-adapter.ts +230 -0
- package/src/execution/engine/llm/errors.ts +186 -0
- package/src/execution/engine/llm/input-sanitizer.ts +129 -0
- package/src/execution/engine/llm/model-info.ts +332 -0
- package/src/execution/engine/llm/response-schema-validator.ts +113 -0
- package/src/execution/engine/llm/types.ts +86 -0
- package/src/execution/engine/test-utils/index.ts +6 -0
- package/src/execution/engine/test-utils/mocks.ts +56 -0
- package/src/execution/engine/tools/__tests__/tooling-error.test.ts +265 -0
- package/src/execution/engine/tools/__tests__/types.test.ts +47 -0
- package/src/execution/engine/tools/integration/base-integration-adapter.ts +50 -0
- package/src/execution/engine/tools/integration/index.ts +53 -0
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-adapter.ts +73 -0
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-tools.ts +209 -0
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-company-email/index.ts +82 -0
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-decision-maker-email/index.ts +122 -0
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-person-email/index.ts +89 -0
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/verify-email/index.ts +84 -0
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/index.ts +16 -0
- package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +293 -0
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +100 -0
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-tools.ts +217 -0
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/get-dataset-items/index.ts +92 -0
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/run-actor/index.ts +218 -0
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/start-actor/index.ts +87 -0
- package/src/execution/engine/tools/integration/server/adapters/apify/index.ts +11 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +362 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/attio-adapter.ts +162 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/attio-tools.ts +594 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/README.md +632 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-attribute/index.ts +214 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-note/index.ts +152 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-record/index.ts +141 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-note/index.ts +86 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-record/index.ts +105 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.test.ts +186 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.ts +118 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-attributes/index.ts +165 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-notes/index.ts +96 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-objects/index.ts +104 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.test.ts +338 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.ts +156 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-attribute/index.ts +220 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-record/index.ts +140 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/utils/types.ts +147 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/index.ts +31 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/__tests__/dropbox-adapter.test.ts +409 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/dropbox-adapter.ts +281 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/dropbox-tools.ts +106 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/fetch/create-folder/__tests__/index.test.ts +451 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/fetch/create-folder/index.ts +114 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/fetch/upload-file/__tests__/index.test.ts +415 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/fetch/upload-file/index.ts +111 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/index.ts +25 -0
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +210 -0
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +104 -0
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -0
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-adapter.ts +1189 -0
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-tools.ts +641 -0
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/index.ts +18 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/activate-campaign/index.ts +86 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/__tests__/index.test.ts +289 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/index.ts +154 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/__tests__/index.test.ts +325 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/index.ts +153 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-delete-leads/index.ts +84 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-campaign/index.ts +125 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-inbox-test/index.ts +107 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/delete-campaign/index.ts +85 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-account-health/index.ts +91 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign/index.ts +92 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/__tests__/index.test.ts +195 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/index.ts +113 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-daily-campaign-analytics/index.ts +104 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-emails/index.ts +155 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/__tests__/index.test.ts +196 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/index.ts +102 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/__tests__/index.test.ts +189 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/index.ts +87 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-leads/index.ts +112 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/patch-lead/index.ts +76 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/pause-campaign/index.ts +86 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/remove-from-subsequence/index.ts +98 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/send-reply/index.ts +126 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/__tests__/index.test.ts +193 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/index.ts +99 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/__tests__/index.test.ts +621 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/index.ts +125 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/index.ts +29 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-adapter.ts +178 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1473 -0
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/check-credits/index.ts +59 -0
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/verify-email/index.ts +102 -0
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/index.ts +17 -0
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-adapter.ts +80 -0
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +102 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/get-email/index.ts +102 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +134 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +75 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/index.ts +27 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/resend-adapter.ts +108 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/resend-tools.ts +132 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/types.ts +44 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/create-envelope/index.ts +274 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/download-document/index.ts +230 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/get-envelope/index.ts +133 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/utils/types.ts +246 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/void-envelope/index.ts +90 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/index.ts +38 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/signature-api-adapter.ts +87 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/signature-api-tools.ts +179 -0
- package/src/execution/engine/tools/integration/server/adapters/stripe/fetch/utils/types.ts +210 -0
- package/src/execution/engine/tools/integration/server/adapters/stripe/index.ts +44 -0
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-adapter.ts +517 -0
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +309 -0
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/domain-search/index.ts +133 -0
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-finder/index.ts +122 -0
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-verifier/index.ts +111 -0
- package/src/execution/engine/tools/integration/server/adapters/tomba/index.ts +11 -0
- package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-adapter.ts +78 -0
- package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-tools.ts +222 -0
- package/src/execution/engine/tools/integration/server/index.ts +61 -0
- package/src/execution/engine/tools/integration/service.ts +161 -0
- package/src/execution/engine/tools/integration/tool.ts +253 -0
- package/src/execution/engine/tools/integration/types/anymailfinder.ts +74 -0
- package/src/execution/engine/tools/integration/types/apify.ts +92 -0
- package/src/execution/engine/tools/integration/types/attio.ts +354 -0
- package/src/execution/engine/tools/integration/types/dropbox.ts +64 -0
- package/src/execution/engine/tools/integration/types/gmail.ts +35 -0
- package/src/execution/engine/tools/integration/types/google-sheets.ts +303 -0
- package/src/execution/engine/tools/integration/types/index.ts +19 -0
- package/src/execution/engine/tools/integration/types/instantly.ts +557 -0
- package/src/execution/engine/tools/integration/types/millionverifier.ts +56 -0
- package/src/execution/engine/tools/integration/types/resend.ts +63 -0
- package/src/execution/engine/tools/integration/types/signature-api.ts +164 -0
- package/src/execution/engine/tools/integration/types/stripe.ts +162 -0
- package/src/execution/engine/tools/integration/types/tomba.ts +94 -0
- package/src/execution/engine/tools/lead-service-types.ts +884 -0
- package/src/execution/engine/tools/llm/index.ts +11 -0
- package/src/execution/engine/tools/llm/server/index.ts +8 -0
- package/src/execution/engine/tools/llm/server/llm-call-tool.ts +118 -0
- package/src/execution/engine/tools/platform/__tests__/approval.test.ts +242 -0
- package/src/execution/engine/tools/platform/__tests__/email.test.ts +482 -0
- package/src/execution/engine/tools/platform/__tests__/hitl-cancel.test.ts +97 -0
- package/src/execution/engine/tools/platform/__tests__/notification.test.ts +208 -0
- package/src/execution/engine/tools/platform/__tests__/pdf.test.ts +441 -0
- package/src/execution/engine/tools/platform/__tests__/scheduler.test.ts +189 -0
- package/src/execution/engine/tools/platform/__tests__/schedules.test.ts +336 -0
- package/src/execution/engine/tools/platform/acquisition/company-tools.ts +248 -0
- package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +319 -0
- package/src/execution/engine/tools/platform/acquisition/index.ts +43 -0
- package/src/execution/engine/tools/platform/acquisition/list-tools.ts +148 -0
- package/src/execution/engine/tools/platform/acquisition/types.ts +260 -0
- package/src/execution/engine/tools/platform/approval/cancel-by-metadata.ts +65 -0
- package/src/execution/engine/tools/platform/approval/index.ts +4 -0
- package/src/execution/engine/tools/platform/approval/tool.ts +99 -0
- package/src/execution/engine/tools/platform/email/index.ts +122 -0
- package/src/execution/engine/tools/platform/email/types.ts +96 -0
- package/src/execution/engine/tools/platform/index.ts +181 -0
- package/src/execution/engine/tools/platform/notification.ts +81 -0
- package/src/execution/engine/tools/platform/pdf/index.ts +110 -0
- package/src/execution/engine/tools/platform/pdf/types.ts +77 -0
- package/src/execution/engine/tools/platform/resource-invocation/__tests__/edge-cases.test.ts +507 -0
- package/src/execution/engine/tools/platform/resource-invocation/__tests__/resource-invocation-service.test.ts +500 -0
- package/src/execution/engine/tools/platform/resource-invocation/__tests__/tool.test.ts +555 -0
- package/src/execution/engine/tools/platform/resource-invocation/dynamic-tool.ts +94 -0
- package/src/execution/engine/tools/platform/resource-invocation/index.ts +14 -0
- package/src/execution/engine/tools/platform/resource-invocation/resource-invocation-service.ts +147 -0
- package/src/execution/engine/tools/platform/resource-invocation/tool.ts +115 -0
- package/src/execution/engine/tools/platform/resource-invocation/types.ts +31 -0
- package/src/execution/engine/tools/platform/scheduler.ts +87 -0
- package/src/execution/engine/tools/platform/schedules/cancel-by-key-tool.ts +48 -0
- package/src/execution/engine/tools/platform/schedules/cancel-by-metadata-tool.ts +42 -0
- package/src/execution/engine/tools/platform/schedules/delete-by-key-tool.ts +43 -0
- package/src/execution/engine/tools/platform/schedules/index.ts +13 -0
- package/src/execution/engine/tools/platform/schedules/list-tool.ts +56 -0
- package/src/execution/engine/tools/platform/schedules/types.ts +88 -0
- package/src/execution/engine/tools/platform/storage/__tests__/storage.test.ts +998 -0
- package/src/execution/engine/tools/platform/storage/index.ts +370 -0
- package/src/execution/engine/tools/platform/storage/types.ts +128 -0
- package/src/execution/engine/tools/platform/types.ts +148 -0
- package/src/execution/engine/tools/registry.ts +590 -0
- package/src/execution/engine/tools/tool-maps.ts +694 -0
- package/src/execution/engine/tools/types.ts +233 -0
- package/src/execution/engine/workflow/__tests__/errors.test.ts +139 -0
- package/src/execution/engine/workflow/__tests__/utils.test.ts +645 -0
- package/src/execution/engine/workflow/__tests__/workflow.test.ts +818 -0
- package/src/execution/engine/workflow/errors.ts +63 -0
- package/src/execution/engine/workflow/helpers/index.ts +11 -0
- package/src/execution/engine/workflow/helpers/server/index.ts +8 -0
- package/src/execution/engine/workflow/helpers/server/llm-call.ts +93 -0
- package/src/execution/engine/workflow/index.ts +19 -0
- package/src/execution/engine/workflow/log-truncate.ts +26 -0
- package/src/execution/engine/workflow/logging.ts +191 -0
- package/src/execution/engine/workflow/types.ts +183 -0
- package/src/execution/engine/workflow/utils.ts +280 -0
- package/src/execution/engine/workflow/workflow.ts +168 -0
- package/src/execution/index.ts +20 -0
- package/src/execution/scheduler/__tests__/api-schemas.test.ts +733 -0
- package/src/execution/scheduler/__tests__/retry.test.ts +37 -0
- package/src/execution/scheduler/__tests__/utils.test.ts +1009 -0
- package/src/execution/scheduler/api-schemas.ts +296 -0
- package/src/execution/scheduler/index.ts +50 -0
- package/src/execution/scheduler/schemas.ts +264 -0
- package/src/execution/scheduler/types.ts +111 -0
- package/src/execution/scheduler/utils.ts +364 -0
- package/src/forms/index.ts +7 -0
- package/src/forms/schemas.test.ts +113 -0
- package/src/forms/schemas.ts +69 -0
- package/src/forms/types.ts +70 -0
- package/src/index.ts +54 -0
- package/src/integrations/credentials/__tests__/api-schemas.test.ts +496 -0
- package/src/integrations/credentials/__tests__/schemas.test.ts +82 -0
- package/src/integrations/credentials/__tests__/utils.test.ts +144 -0
- package/src/integrations/credentials/api-schemas.ts +143 -0
- package/src/integrations/credentials/index.ts +32 -0
- package/src/integrations/credentials/schemas.ts +164 -0
- package/src/integrations/credentials/utils.ts +59 -0
- package/src/integrations/oauth/__tests__/provider-registry.test.ts +59 -0
- package/src/integrations/oauth/api-schemas.ts +92 -0
- package/src/integrations/oauth/index.ts +19 -0
- package/src/integrations/oauth/provider-registry.ts +61 -0
- package/src/integrations/oauth/server/__tests__/refresh-concurrent.test.ts +183 -0
- package/src/integrations/oauth/server/__tests__/refresh.integration.test.ts +257 -0
- package/src/integrations/oauth/server/__tests__/refresh.test.ts +577 -0
- package/src/integrations/oauth/server/credentials.ts +39 -0
- package/src/integrations/oauth/server/refresh.ts +214 -0
- package/src/integrations/oauth/types.ts +34 -0
- package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +318 -0
- package/src/integrations/webhook-endpoints/api-schemas.ts +102 -0
- package/src/integrations/webhook-endpoints/index.ts +28 -0
- package/src/integrations/webhook-endpoints/types.ts +51 -0
- package/src/operations/activities/api-schemas.ts +79 -0
- package/src/operations/activities/index.ts +9 -0
- package/src/operations/activities/sse-events.ts +30 -0
- package/src/operations/activities/types.ts +63 -0
- package/src/operations/debug-logs/client.ts +60 -0
- package/src/operations/debug-logs/debug-logger.ts +83 -0
- package/src/operations/debug-logs/index.ts +8 -0
- package/src/operations/debug-logs/server.ts +19 -0
- package/src/operations/debug-logs/types.ts +33 -0
- package/src/operations/index.ts +50 -0
- package/src/operations/notifications/__tests__/api-schemas.test.ts +216 -0
- package/src/operations/notifications/api-schemas.ts +91 -0
- package/src/operations/notifications/index.ts +3 -0
- package/src/operations/notifications/sse-events.ts +21 -0
- package/src/operations/notifications/types.ts +47 -0
- package/src/operations/observability/__tests__/openrouter-cost-flow.test.ts +297 -0
- package/src/operations/observability/__tests__/schemas.test.ts +151 -0
- package/src/operations/observability/__tests__/types.test.ts +109 -0
- package/src/operations/observability/__tests__/utils.test.ts +54 -0
- package/src/operations/observability/ai-usage-collector.ts +64 -0
- package/src/operations/observability/index.ts +13 -0
- package/src/operations/observability/metrics-collector.ts +49 -0
- package/src/operations/observability/schemas.ts +39 -0
- package/src/operations/observability/types.ts +463 -0
- package/src/operations/observability/utils.ts +77 -0
- package/src/operations/sessions/__tests__/api-schemas.test.ts +361 -0
- package/src/operations/sessions/__tests__/manager.test.ts +821 -0
- package/src/operations/sessions/api-schemas.ts +166 -0
- package/src/operations/sessions/index.ts +26 -0
- package/src/operations/sessions/server/manager.ts +90 -0
- package/src/operations/sessions/server/session.ts +180 -0
- package/src/operations/sessions/types.ts +98 -0
- package/src/operations/triggers/index.ts +12 -0
- package/src/operations/triggers/webhook/definitions/__tests__/instantly-reply-received.test.ts +72 -0
- package/src/operations/triggers/webhook/definitions/instantly-account-error.ts +44 -0
- package/src/operations/triggers/webhook/definitions/instantly-auto-reply-received.ts +51 -0
- package/src/operations/triggers/webhook/definitions/instantly-campaign-completed.ts +45 -0
- package/src/operations/triggers/webhook/definitions/instantly-email-bounced.ts +49 -0
- package/src/operations/triggers/webhook/definitions/instantly-lead-unsubscribed.ts +45 -0
- package/src/operations/triggers/webhook/definitions/instantly-reply-received.ts +54 -0
- package/src/operations/triggers/webhook/index.ts +35 -0
- package/src/operations/triggers/webhook/types.ts +74 -0
- package/src/organization-model/README.md +79 -0
- package/src/organization-model/__tests__/graph.test.ts +250 -0
- package/src/organization-model/__tests__/resolve.test.ts +47 -0
- package/src/organization-model/defaults.ts +60 -0
- package/src/organization-model/domains/branding.ts +22 -0
- package/src/organization-model/domains/crm.ts +46 -0
- package/src/organization-model/domains/delivery.ts +48 -0
- package/src/organization-model/domains/features.ts +57 -0
- package/src/organization-model/domains/lead-gen.ts +33 -0
- package/src/organization-model/domains/navigation.ts +103 -0
- package/src/organization-model/domains/shared.ts +42 -0
- package/src/organization-model/graph/build.ts +432 -0
- package/src/organization-model/graph/index.ts +4 -0
- package/src/organization-model/graph/schema.ts +50 -0
- package/src/organization-model/graph/types.ts +52 -0
- package/src/organization-model/index.ts +11 -0
- package/src/organization-model/published.ts +18 -0
- package/src/organization-model/resolve.ts +42 -0
- package/src/organization-model/schema.ts +21 -0
- package/src/organization-model/types.ts +27 -0
- package/src/platform/api/index.ts +1 -0
- package/src/platform/api/types.ts +35 -0
- package/src/platform/constants/http.ts +37 -0
- package/src/platform/constants/index.ts +5 -0
- package/src/platform/constants/limits.ts +32 -0
- package/src/platform/constants/resilience.ts +51 -0
- package/src/platform/constants/timeouts.ts +20 -0
- package/src/platform/constants/versions.ts +3 -0
- package/src/platform/index.ts +27 -0
- package/src/platform/registry/__tests__/command-view.test.ts +410 -0
- package/src/platform/registry/__tests__/resource-registry-static.test.ts +347 -0
- package/src/platform/registry/__tests__/resource-registry.integration.test.ts +1004 -0
- package/src/platform/registry/__tests__/resource-registry.list-executable.test.ts +393 -0
- package/src/platform/registry/__tests__/resource-registry.test.ts +1942 -0
- package/src/platform/registry/__tests__/serialization.test.ts +1127 -0
- package/src/platform/registry/__tests__/validation.test.ts +1086 -0
- package/src/platform/registry/command-view.ts +180 -0
- package/src/platform/registry/domains.ts +165 -0
- package/src/platform/registry/index.ts +93 -0
- package/src/platform/registry/reserved.ts +24 -0
- package/src/platform/registry/resource-metadata.ts +59 -0
- package/src/platform/registry/resource-registry.command-queue-groups.test.ts +129 -0
- package/src/platform/registry/resource-registry.ts +788 -0
- package/src/platform/registry/serialization.ts +273 -0
- package/src/platform/registry/serialized-types.ts +231 -0
- package/src/platform/registry/stats-types.ts +66 -0
- package/src/platform/registry/types.ts +404 -0
- package/src/platform/registry/validation.ts +513 -0
- package/src/platform/resilience/__tests__/circuit-breaker.test.ts +291 -0
- package/src/platform/resilience/__tests__/http-error-mapper.test.ts +173 -0
- package/src/platform/resilience/__tests__/rate-limiter.test.ts +471 -0
- package/src/platform/resilience/__tests__/retry.test.ts +380 -0
- package/src/platform/resilience/__tests__/timeout.test.ts +219 -0
- package/src/platform/resilience/circuit-breaker.ts +164 -0
- package/src/platform/resilience/errors.ts +68 -0
- package/src/platform/resilience/http-error-mapper.ts +129 -0
- package/src/platform/resilience/index.ts +93 -0
- package/src/platform/resilience/rate-limiter-types.ts +46 -0
- package/src/platform/resilience/rate-limiter.ts +140 -0
- package/src/platform/resilience/retry.ts +89 -0
- package/src/platform/resilience/timeout.ts +63 -0
- package/src/platform/sse/events.ts +67 -0
- package/src/platform/sse/index.ts +7 -0
- package/src/platform/utils/__tests__/currency.test.ts +77 -0
- package/src/platform/utils/__tests__/validation.test.ts +1083 -0
- package/src/platform/utils/currency.ts +96 -0
- package/src/platform/utils/debounce.ts +52 -0
- package/src/platform/utils/error.ts +42 -0
- package/src/platform/utils/hmac.test.ts +97 -0
- package/src/platform/utils/index.ts +32 -0
- package/src/platform/utils/server/betterstack-logger.ts +210 -0
- package/src/platform/utils/server/hmac.ts +44 -0
- package/src/platform/utils/server/unsubscribe.ts +111 -0
- package/src/platform/utils/token-counter.ts +96 -0
- package/src/platform/utils/validation.ts +425 -0
- package/src/projects/api-schemas.ts +265 -0
- package/src/published.ts +1 -0
- package/src/server.ts +273 -0
- package/src/supabase/__tests__/helpers.test.ts +51 -0
- package/src/supabase/database.types.ts +2674 -0
- package/src/supabase/helpers.ts +20 -0
- package/src/supabase/index.ts +52 -0
- package/src/supabase/server/client.ts +58 -0
- package/src/test-utils/README.md +150 -0
- package/src/test-utils/browser-mocks.ts +54 -0
- package/src/test-utils/fixtures/api-keys.ts +52 -0
- package/src/test-utils/fixtures/index.ts +4 -0
- package/src/test-utils/fixtures/memberships.ts +80 -0
- package/src/test-utils/fixtures/organizations.ts +69 -0
- package/src/test-utils/fixtures/users.ts +79 -0
- package/src/test-utils/index.ts +11 -0
- package/src/test-utils/mocks/index.ts +2 -0
- package/src/test-utils/mocks/supabase.ts +142 -0
- package/src/test-utils/mocks/workos.ts +108 -0
- package/src/test-utils/rls/RLSTestContext.ts +586 -0
- package/src/test-utils/rls/index.ts +1 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { CREDENTIAL_SCHEMAS, getCredentialSchema, listCredentialSchemas, getCredentialTypes } from '../schemas'
|
|
3
|
+
|
|
4
|
+
describe('Credential Schema Registry', () => {
|
|
5
|
+
describe('CREDENTIAL_SCHEMAS', () => {
|
|
6
|
+
it('should have OAuth schemas', () => {
|
|
7
|
+
expect(CREDENTIAL_SCHEMAS['google-sheets']).toBeDefined()
|
|
8
|
+
expect(CREDENTIAL_SCHEMAS['google-sheets'].type).toBe('oauth')
|
|
9
|
+
expect(CREDENTIAL_SCHEMAS['google-sheets'].oauthProvider).toBe('google-sheets')
|
|
10
|
+
|
|
11
|
+
expect(CREDENTIAL_SCHEMAS.dropbox).toBeDefined()
|
|
12
|
+
expect(CREDENTIAL_SCHEMAS.dropbox.type).toBe('oauth')
|
|
13
|
+
expect(CREDENTIAL_SCHEMAS.dropbox.oauthProvider).toBe('dropbox')
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it('should have api-key single-field schema', () => {
|
|
17
|
+
expect(CREDENTIAL_SCHEMAS['api-key']).toBeDefined()
|
|
18
|
+
expect(CREDENTIAL_SCHEMAS['api-key'].type).toBe('single_field')
|
|
19
|
+
expect(CREDENTIAL_SCHEMAS['api-key'].fields).toHaveLength(1)
|
|
20
|
+
expect(CREDENTIAL_SCHEMAS['api-key'].fields?.[0].key).toBe('apiKey')
|
|
21
|
+
})
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
describe('getCredentialSchema', () => {
|
|
25
|
+
it('should return schema for valid type', () => {
|
|
26
|
+
const schema = getCredentialSchema('google-sheets')
|
|
27
|
+
expect(schema).toStrictEqual(CREDENTIAL_SCHEMAS['google-sheets'])
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
it('should return api-key schema for unknown type', () => {
|
|
31
|
+
const schema = getCredentialSchema('unknown')
|
|
32
|
+
expect(schema).toStrictEqual(CREDENTIAL_SCHEMAS['api-key'])
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('should validate schema with Zod', () => {
|
|
36
|
+
// Should not throw - schemas are valid
|
|
37
|
+
expect(() => getCredentialSchema('google-sheets')).not.toThrow()
|
|
38
|
+
expect(() => getCredentialSchema('api-key')).not.toThrow()
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('should return OAuth schemas correctly', () => {
|
|
42
|
+
const googleSheetsSchema = getCredentialSchema('google-sheets')
|
|
43
|
+
expect(googleSheetsSchema.type).toBe('oauth')
|
|
44
|
+
expect(googleSheetsSchema.oauthProvider).toBe('google-sheets')
|
|
45
|
+
expect(googleSheetsSchema.fields).toBeUndefined()
|
|
46
|
+
})
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
describe('listCredentialSchemas', () => {
|
|
50
|
+
it('should return all schemas as array', () => {
|
|
51
|
+
const schemas = listCredentialSchemas()
|
|
52
|
+
expect(schemas.length).toBeGreaterThan(0)
|
|
53
|
+
expect(schemas).toContainEqual(CREDENTIAL_SCHEMAS['google-sheets'])
|
|
54
|
+
expect(schemas).toContainEqual(CREDENTIAL_SCHEMAS['api-key'])
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('should return array with correct schema structure', () => {
|
|
58
|
+
const schemas = listCredentialSchemas()
|
|
59
|
+
schemas.forEach((schema) => {
|
|
60
|
+
expect(schema).toHaveProperty('type')
|
|
61
|
+
expect(schema).toHaveProperty('label')
|
|
62
|
+
expect(schema).toHaveProperty('description')
|
|
63
|
+
expect(schema).toHaveProperty('nameSuggestions')
|
|
64
|
+
})
|
|
65
|
+
})
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
describe('getCredentialTypes', () => {
|
|
69
|
+
it('should return all type keys', () => {
|
|
70
|
+
const types = getCredentialTypes()
|
|
71
|
+
expect(types).toContain('dropbox')
|
|
72
|
+
expect(types).toContain('google-sheets')
|
|
73
|
+
expect(types).toContain('api-key')
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
it('should return unique types', () => {
|
|
77
|
+
const types = getCredentialTypes()
|
|
78
|
+
const uniqueTypes = [...new Set(types)]
|
|
79
|
+
expect(types).toEqual(uniqueTypes)
|
|
80
|
+
})
|
|
81
|
+
})
|
|
82
|
+
})
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { buildCredentialValue, extractFormValues } from '../utils'
|
|
3
|
+
|
|
4
|
+
describe('Credential Utilities', () => {
|
|
5
|
+
describe('buildCredentialValue', () => {
|
|
6
|
+
it('should build single-field credential value', () => {
|
|
7
|
+
const result = buildCredentialValue('api-key', {
|
|
8
|
+
apiKey: 'test-key-123'
|
|
9
|
+
})
|
|
10
|
+
expect(result).toEqual({ apiKey: 'test-key-123' })
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
it('should trim whitespace from values', () => {
|
|
14
|
+
const result = buildCredentialValue('api-key', {
|
|
15
|
+
apiKey: ' test-key '
|
|
16
|
+
})
|
|
17
|
+
expect(result).toEqual({ apiKey: 'test-key' })
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('should throw error for OAuth types', () => {
|
|
21
|
+
expect(() => buildCredentialValue('dropbox', { apiKey: 'test' })).toThrow(
|
|
22
|
+
'buildCredentialValue should not be used for OAuth type: dropbox'
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
expect(() => buildCredentialValue('google-sheets', { apiKey: 'test' })).toThrow(
|
|
26
|
+
'buildCredentialValue should not be used for OAuth type: google-sheets'
|
|
27
|
+
)
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
it('should ignore undefined and null values', () => {
|
|
31
|
+
const result = buildCredentialValue('api-key', {
|
|
32
|
+
apiKey: 'valid-key',
|
|
33
|
+
extra: undefined as unknown,
|
|
34
|
+
another: null as unknown
|
|
35
|
+
})
|
|
36
|
+
// Only includes defined fields from schema
|
|
37
|
+
expect(result).toEqual({
|
|
38
|
+
apiKey: 'valid-key'
|
|
39
|
+
})
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
it('should only include fields defined in schema', () => {
|
|
43
|
+
const result = buildCredentialValue('api-key', {
|
|
44
|
+
apiKey: 'test-key',
|
|
45
|
+
extraField: 'should-not-be-included'
|
|
46
|
+
})
|
|
47
|
+
// Only apiKey is in api-key schema
|
|
48
|
+
expect(result).toEqual({ apiKey: 'test-key' })
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it('should build webhook-secret credential with signingSecret field', () => {
|
|
52
|
+
const result = buildCredentialValue('webhook-secret', {
|
|
53
|
+
signingSecret: 'whsec_abc123'
|
|
54
|
+
})
|
|
55
|
+
// webhook-secret schema uses 'signingSecret' key (matches gateway.ts lookup)
|
|
56
|
+
expect(result).toEqual({ signingSecret: 'whsec_abc123' })
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('should trim whitespace from webhook-secret signingSecret', () => {
|
|
60
|
+
const result = buildCredentialValue('webhook-secret', {
|
|
61
|
+
signingSecret: ' whsec_abc123 '
|
|
62
|
+
})
|
|
63
|
+
expect(result).toEqual({ signingSecret: 'whsec_abc123' })
|
|
64
|
+
})
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
describe('extractFormValues', () => {
|
|
68
|
+
it('should extract string values from credential object', () => {
|
|
69
|
+
const credentialValue = {
|
|
70
|
+
apiKey: 'test-key',
|
|
71
|
+
token: 'test-token'
|
|
72
|
+
}
|
|
73
|
+
const result = extractFormValues(credentialValue)
|
|
74
|
+
expect(result).toEqual({
|
|
75
|
+
apiKey: 'test-key',
|
|
76
|
+
token: 'test-token'
|
|
77
|
+
})
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
it('should convert non-string values to strings', () => {
|
|
81
|
+
const credentialValue = {
|
|
82
|
+
apiKey: 'test-key',
|
|
83
|
+
count: 123,
|
|
84
|
+
enabled: true
|
|
85
|
+
}
|
|
86
|
+
const result = extractFormValues(credentialValue)
|
|
87
|
+
expect(result).toEqual({
|
|
88
|
+
apiKey: 'test-key',
|
|
89
|
+
count: '123',
|
|
90
|
+
enabled: 'true'
|
|
91
|
+
})
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
it('should skip null and undefined values', () => {
|
|
95
|
+
const credentialValue = {
|
|
96
|
+
apiKey: 'test-key',
|
|
97
|
+
nullField: null,
|
|
98
|
+
undefinedField: undefined
|
|
99
|
+
}
|
|
100
|
+
const result = extractFormValues(credentialValue)
|
|
101
|
+
expect(result).toEqual({
|
|
102
|
+
apiKey: 'test-key'
|
|
103
|
+
})
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
it('should handle empty objects', () => {
|
|
107
|
+
const result = extractFormValues({})
|
|
108
|
+
expect(result).toEqual({})
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
it('should handle nested objects by converting to string', () => {
|
|
112
|
+
const credentialValue = {
|
|
113
|
+
apiKey: 'test-key',
|
|
114
|
+
metadata: { nested: 'value' }
|
|
115
|
+
}
|
|
116
|
+
const result = extractFormValues(credentialValue)
|
|
117
|
+
expect(result.apiKey).toBe('test-key')
|
|
118
|
+
expect(result.metadata).toBe('[object Object]')
|
|
119
|
+
})
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
describe('Integration: Round-trip conversion', () => {
|
|
123
|
+
it('should preserve single-field credentials through round-trip', () => {
|
|
124
|
+
const original = { apiKey: 'test-key-123' }
|
|
125
|
+
const formValues = extractFormValues(original)
|
|
126
|
+
const rebuilt = buildCredentialValue('api-key', formValues)
|
|
127
|
+
expect(rebuilt).toEqual(original)
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
it('should handle whitespace during round-trip', () => {
|
|
131
|
+
const original = { apiKey: 'test-key' }
|
|
132
|
+
const formValuesWithSpace = { apiKey: ' test-key ' }
|
|
133
|
+
const rebuilt = buildCredentialValue('api-key', formValuesWithSpace)
|
|
134
|
+
expect(rebuilt).toEqual(original)
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
it('should preserve webhook-secret credentials through round-trip', () => {
|
|
138
|
+
const original = { signingSecret: 'whsec_abc123' }
|
|
139
|
+
const formValues = extractFormValues(original)
|
|
140
|
+
const rebuilt = buildCredentialValue('webhook-secret', formValues)
|
|
141
|
+
expect(rebuilt).toEqual(original)
|
|
142
|
+
})
|
|
143
|
+
})
|
|
144
|
+
})
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { UuidSchema, CredentialNameSchema } from '../../platform/utils/validation'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Credential API Validation Schemas
|
|
6
|
+
*
|
|
7
|
+
* Separate from credential configuration schemas (schemas.ts).
|
|
8
|
+
* - schemas.ts: Credential field definitions and type registry
|
|
9
|
+
* - api-schemas.ts: HTTP request/response validation
|
|
10
|
+
*
|
|
11
|
+
* Design: Input Validation Standardization
|
|
12
|
+
* @see apps/docs/content/docs/in-progress/active-development/security/active/credentials-integrations-validation-implementation.mdx
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Credential type validation
|
|
17
|
+
* These are the actual `type` values stored in the database:
|
|
18
|
+
* - 'oauth': All OAuth providers (notion, google-sheets) store this type
|
|
19
|
+
* - 'api-key': Generic single-field API key credentials
|
|
20
|
+
* - 'webhook-secret': Webhook signing secrets for signature validation
|
|
21
|
+
*
|
|
22
|
+
* Note: Provider-specific identifiers (notion, google-sheets) are CREDENTIAL_SCHEMAS
|
|
23
|
+
* keys used for UI lookup, NOT stored type values. OAuth credentials store type='oauth'.
|
|
24
|
+
*/
|
|
25
|
+
export const CredentialTypeSchema = z.enum(['oauth', 'api-key', 'webhook-secret', 'api-key-secret'])
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Credential value validation
|
|
29
|
+
* - Must be a non-empty object
|
|
30
|
+
* - Keys are strings, values can be any JSON type
|
|
31
|
+
* - Max 50 keys (prevents DoS)
|
|
32
|
+
* - Individual string values max 10KB (prevents DoS)
|
|
33
|
+
*
|
|
34
|
+
* SECURITY:
|
|
35
|
+
* - Prevents DoS via massive credential payloads
|
|
36
|
+
* - Enforces reasonable limits for credential storage
|
|
37
|
+
*/
|
|
38
|
+
const CredentialValueSchema = z
|
|
39
|
+
.record(z.string(), z.unknown())
|
|
40
|
+
.refine((val) => Object.keys(val).length > 0, { message: 'Credential value must not be empty' })
|
|
41
|
+
.refine((val) => Object.keys(val).length <= 50, { message: 'Credential value has too many keys (max 50)' })
|
|
42
|
+
.refine(
|
|
43
|
+
(val) => {
|
|
44
|
+
// Check individual string values for size
|
|
45
|
+
for (const v of Object.values(val)) {
|
|
46
|
+
if (typeof v === 'string' && v.length > 10240) {
|
|
47
|
+
return false
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return true
|
|
51
|
+
},
|
|
52
|
+
{ message: 'Individual credential values too large (max 10KB per string)' }
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* POST /api/credentials - Create credential
|
|
57
|
+
*/
|
|
58
|
+
export const CreateCredentialRequestSchema = z
|
|
59
|
+
.object({
|
|
60
|
+
name: CredentialNameSchema,
|
|
61
|
+
type: CredentialTypeSchema,
|
|
62
|
+
value: CredentialValueSchema,
|
|
63
|
+
provider: z.string().optional() // OAuth provider ID ('dropbox', 'notion', 'google-sheets')
|
|
64
|
+
})
|
|
65
|
+
.strict() // Reject unknown fields (prevents mass assignment)
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Response for credential creation
|
|
69
|
+
*/
|
|
70
|
+
export const CreateCredentialResponseSchema = z.object({
|
|
71
|
+
id: UuidSchema,
|
|
72
|
+
name: z.string()
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* GET /api/credentials - List credentials
|
|
77
|
+
*/
|
|
78
|
+
export const ListCredentialsResponseSchema = z.object({
|
|
79
|
+
credentials: z.array(
|
|
80
|
+
z.object({
|
|
81
|
+
id: UuidSchema,
|
|
82
|
+
name: z.string(),
|
|
83
|
+
type: z.string(),
|
|
84
|
+
provider: z.string().nullable(), // OAuth provider or null for non-OAuth
|
|
85
|
+
createdAt: z.string().datetime()
|
|
86
|
+
})
|
|
87
|
+
)
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
/** API response type for a single credential list item */
|
|
91
|
+
export type CredentialListItem = z.infer<typeof ListCredentialsResponseSchema>['credentials'][number]
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* PATCH /api/credentials/:credentialId - Update credential
|
|
95
|
+
*/
|
|
96
|
+
export const UpdateCredentialParamsSchema = z.object({
|
|
97
|
+
credentialId: UuidSchema
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
export const UpdateCredentialRequestSchema = z
|
|
101
|
+
.object({
|
|
102
|
+
value: CredentialValueSchema.optional(),
|
|
103
|
+
name: CredentialNameSchema.optional()
|
|
104
|
+
})
|
|
105
|
+
.strict()
|
|
106
|
+
.refine((data) => data.value !== undefined || data.name !== undefined, {
|
|
107
|
+
message: 'At least one field (value or name) must be provided'
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* DELETE /api/credentials/:credentialId - Delete credential
|
|
112
|
+
*/
|
|
113
|
+
export const DeleteCredentialParamsSchema = z.object({
|
|
114
|
+
credentialId: UuidSchema
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* GET /api/credentials/:credentialName/decrypt - CRITICAL ENDPOINT
|
|
119
|
+
* Decrypt credential value for agent/tool use
|
|
120
|
+
*
|
|
121
|
+
* SECURITY: credentialName validated with strict regex to prevent path traversal
|
|
122
|
+
*/
|
|
123
|
+
export const DecryptCredentialParamsSchema = z.object({
|
|
124
|
+
credentialName: CredentialNameSchema
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
export const DecryptCredentialResponseSchema = z.object({
|
|
128
|
+
value: z.record(z.string(), z.unknown())
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Export all schemas for use in routes
|
|
133
|
+
*/
|
|
134
|
+
export const CredentialSchemas = {
|
|
135
|
+
CreateRequest: CreateCredentialRequestSchema,
|
|
136
|
+
CreateResponse: CreateCredentialResponseSchema,
|
|
137
|
+
ListResponse: ListCredentialsResponseSchema,
|
|
138
|
+
UpdateParams: UpdateCredentialParamsSchema,
|
|
139
|
+
UpdateRequest: UpdateCredentialRequestSchema,
|
|
140
|
+
DeleteParams: DeleteCredentialParamsSchema,
|
|
141
|
+
DecryptParams: DecryptCredentialParamsSchema,
|
|
142
|
+
DecryptResponse: DecryptCredentialResponseSchema
|
|
143
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential Type System
|
|
3
|
+
*
|
|
4
|
+
* Dynamic credential form system with type-based field rendering.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* - Add new integration → Update CREDENTIAL_SCHEMAS registry
|
|
8
|
+
* - No modal changes needed
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { getCredentialSchema, buildCredentialValue } from '@repo/core'
|
|
13
|
+
*
|
|
14
|
+
* const schema = getCredentialSchema('attio')
|
|
15
|
+
* const value = buildCredentialValue('api-key', { apiKey: '...' })
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
export {
|
|
20
|
+
CREDENTIAL_SCHEMAS,
|
|
21
|
+
getCredentialSchema,
|
|
22
|
+
listCredentialSchemas,
|
|
23
|
+
getCredentialTypes,
|
|
24
|
+
} from './schemas'
|
|
25
|
+
|
|
26
|
+
export type { CredentialSchema, CredentialField } from './schemas'
|
|
27
|
+
|
|
28
|
+
export { buildCredentialValue, extractFormValues } from './utils'
|
|
29
|
+
|
|
30
|
+
// API validation schemas
|
|
31
|
+
export * from './api-schemas'
|
|
32
|
+
export { CredentialSchemas } from './api-schemas'
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Credential field definition
|
|
5
|
+
*/
|
|
6
|
+
export interface CredentialField {
|
|
7
|
+
key: string
|
|
8
|
+
label: string
|
|
9
|
+
type: 'password' | 'text'
|
|
10
|
+
required: boolean
|
|
11
|
+
placeholder?: string
|
|
12
|
+
description?: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Credential schema definition
|
|
17
|
+
*/
|
|
18
|
+
export interface CredentialSchema {
|
|
19
|
+
type: string
|
|
20
|
+
label: string
|
|
21
|
+
description: string
|
|
22
|
+
fields?: CredentialField[]
|
|
23
|
+
docsUrl?: string
|
|
24
|
+
nameSuggestions: string[]
|
|
25
|
+
oauthProvider?: string // For OAuth types
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Zod schemas for runtime validation
|
|
30
|
+
*/
|
|
31
|
+
const CredentialFieldSchema = z.object({
|
|
32
|
+
key: z.string(),
|
|
33
|
+
label: z.string(),
|
|
34
|
+
type: z.enum(['password', 'text']),
|
|
35
|
+
required: z.boolean(),
|
|
36
|
+
placeholder: z.string().optional(),
|
|
37
|
+
description: z.string().optional()
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
const CredentialSchemaZod = z.object({
|
|
41
|
+
type: z.string(),
|
|
42
|
+
label: z.string(),
|
|
43
|
+
description: z.string(),
|
|
44
|
+
fields: z.array(CredentialFieldSchema).optional(),
|
|
45
|
+
docsUrl: z.string().url().optional(),
|
|
46
|
+
nameSuggestions: z.array(z.string()),
|
|
47
|
+
oauthProvider: z.string().optional()
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Credential Schema Registry
|
|
52
|
+
*
|
|
53
|
+
* Add new integration = add schema object here (no modal changes needed)
|
|
54
|
+
*
|
|
55
|
+
* Schema types:
|
|
56
|
+
* - oauth: OAuth-based authentication (handled via OAuth flow)
|
|
57
|
+
* - single_field: Single API key field (generic)
|
|
58
|
+
*/
|
|
59
|
+
export const CREDENTIAL_SCHEMAS: Record<string, CredentialSchema> = {
|
|
60
|
+
'google-sheets': {
|
|
61
|
+
type: 'oauth',
|
|
62
|
+
label: 'Google Sheets',
|
|
63
|
+
description: 'Google Sheets OAuth integration',
|
|
64
|
+
oauthProvider: 'google-sheets',
|
|
65
|
+
nameSuggestions: ['google-sheets-prod', 'google-sheets-dev', 'sheets-workspace']
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
dropbox: {
|
|
69
|
+
type: 'oauth',
|
|
70
|
+
label: 'Dropbox',
|
|
71
|
+
description: 'Dropbox OAuth integration',
|
|
72
|
+
oauthProvider: 'dropbox',
|
|
73
|
+
nameSuggestions: ['dropbox-prod', 'dropbox-dev', 'elevasis-dropbox']
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
oauth: {
|
|
77
|
+
type: 'oauth',
|
|
78
|
+
label: 'OAuth',
|
|
79
|
+
description: 'Generic OAuth credential',
|
|
80
|
+
nameSuggestions: []
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
'api-key': {
|
|
84
|
+
type: 'single_field',
|
|
85
|
+
label: 'API Key',
|
|
86
|
+
description: 'Single-field API key credential',
|
|
87
|
+
fields: [
|
|
88
|
+
{
|
|
89
|
+
key: 'apiKey',
|
|
90
|
+
label: 'API Key',
|
|
91
|
+
type: 'password',
|
|
92
|
+
required: true,
|
|
93
|
+
placeholder: 'Enter your API key',
|
|
94
|
+
description: 'API key for the service'
|
|
95
|
+
}
|
|
96
|
+
],
|
|
97
|
+
nameSuggestions: ['service-prod', 'service-dev', 'api-key']
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
'webhook-secret': {
|
|
101
|
+
type: 'single_field',
|
|
102
|
+
label: 'Webhook Secret',
|
|
103
|
+
description: 'Webhook signing secret for signature validation',
|
|
104
|
+
fields: [
|
|
105
|
+
{
|
|
106
|
+
key: 'signingSecret',
|
|
107
|
+
label: 'Signing Secret',
|
|
108
|
+
type: 'password',
|
|
109
|
+
required: true,
|
|
110
|
+
placeholder: 'whsec_...',
|
|
111
|
+
description: 'Webhook signing secret from provider dashboard'
|
|
112
|
+
}
|
|
113
|
+
],
|
|
114
|
+
nameSuggestions: ['my-org-cal-com-webhook', 'my-org-stripe-webhook', 'my-org-signature-api-webhook']
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
'api-key-secret': {
|
|
118
|
+
type: 'api-key-secret',
|
|
119
|
+
label: 'API Key + Secret',
|
|
120
|
+
description: 'API key and secret pair authentication',
|
|
121
|
+
fields: [
|
|
122
|
+
{
|
|
123
|
+
key: 'apiKey',
|
|
124
|
+
label: 'API Key',
|
|
125
|
+
type: 'password',
|
|
126
|
+
required: true
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
key: 'apiSecret',
|
|
130
|
+
label: 'API Secret',
|
|
131
|
+
type: 'password',
|
|
132
|
+
required: true
|
|
133
|
+
}
|
|
134
|
+
],
|
|
135
|
+
nameSuggestions: []
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Get credential schema by type
|
|
141
|
+
* @param type - Credential type identifier
|
|
142
|
+
* @returns Validated credential schema
|
|
143
|
+
* @throws ZodError if schema is malformed
|
|
144
|
+
*/
|
|
145
|
+
export function getCredentialSchema(type: string): CredentialSchema {
|
|
146
|
+
const schema = CREDENTIAL_SCHEMAS[type] || CREDENTIAL_SCHEMAS['api-key']
|
|
147
|
+
return CredentialSchemaZod.parse(schema)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* List all available credential types (for frontend dropdown)
|
|
152
|
+
* @returns Array of credential schemas
|
|
153
|
+
*/
|
|
154
|
+
export function listCredentialSchemas(): CredentialSchema[] {
|
|
155
|
+
return Object.values(CREDENTIAL_SCHEMAS)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Get all credential type identifiers
|
|
160
|
+
* @returns Array of type strings
|
|
161
|
+
*/
|
|
162
|
+
export function getCredentialTypes(): string[] {
|
|
163
|
+
return Object.keys(CREDENTIAL_SCHEMAS)
|
|
164
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { getCredentialSchema } from './schemas'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Build credential value object from form values
|
|
5
|
+
*
|
|
6
|
+
* Constructs the credential value object based on the schema's field definitions:
|
|
7
|
+
* - Single field: { apiKey: "..." }
|
|
8
|
+
* - Multi field: { apiKey: "...", token: "..." }
|
|
9
|
+
* - OAuth: Not used (OAuth flow handles this)
|
|
10
|
+
*
|
|
11
|
+
* @param type - Credential type identifier
|
|
12
|
+
* @param formValues - Form field values (key-value pairs)
|
|
13
|
+
* @returns Credential value object ready for API submission
|
|
14
|
+
*/
|
|
15
|
+
export function buildCredentialValue(type: string, formValues: Record<string, string>): Record<string, unknown> {
|
|
16
|
+
const schema = getCredentialSchema(type)
|
|
17
|
+
|
|
18
|
+
// OAuth types shouldn't use this function (handled via OAuth flow)
|
|
19
|
+
if (schema.type === 'oauth') {
|
|
20
|
+
throw new Error(`buildCredentialValue should not be used for OAuth type: ${type}`)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Build value object from schema fields
|
|
24
|
+
const value: Record<string, unknown> = {}
|
|
25
|
+
|
|
26
|
+
if (schema.fields) {
|
|
27
|
+
for (const field of schema.fields) {
|
|
28
|
+
const fieldValue = formValues[field.key]
|
|
29
|
+
if (fieldValue !== undefined && fieldValue !== null) {
|
|
30
|
+
value[field.key] = fieldValue.trim()
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return value
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Extract form field values from credential value object
|
|
40
|
+
*
|
|
41
|
+
* Inverse of buildCredentialValue - used in Edit modal to populate form fields
|
|
42
|
+
*
|
|
43
|
+
* @param credentialValue - Credential value object from database
|
|
44
|
+
* @returns Form field values (key-value pairs)
|
|
45
|
+
*/
|
|
46
|
+
export function extractFormValues(credentialValue: Record<string, unknown>): Record<string, string> {
|
|
47
|
+
const formValues: Record<string, string> = {}
|
|
48
|
+
|
|
49
|
+
for (const [key, value] of Object.entries(credentialValue)) {
|
|
50
|
+
if (typeof value === 'string') {
|
|
51
|
+
formValues[key] = value
|
|
52
|
+
} else if (value !== null && value !== undefined) {
|
|
53
|
+
// Convert non-string values to strings for form inputs
|
|
54
|
+
formValues[key] = String(value)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return formValues
|
|
59
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { OAUTH_PROVIDERS, getProviderConfig, listProviders } from '../provider-registry'
|
|
3
|
+
|
|
4
|
+
describe('OAuth Provider Registry', () => {
|
|
5
|
+
describe('OAUTH_PROVIDERS', () => {
|
|
6
|
+
it('should have Google Sheets configured', () => {
|
|
7
|
+
expect(OAUTH_PROVIDERS['google-sheets']).toBeDefined()
|
|
8
|
+
expect(OAUTH_PROVIDERS['google-sheets'].id).toBe('google-sheets')
|
|
9
|
+
expect(OAUTH_PROVIDERS['google-sheets'].name).toBe('Google Sheets')
|
|
10
|
+
expect(OAUTH_PROVIDERS['google-sheets'].authUrl).toBe('https://accounts.google.com/o/oauth2/v2/auth')
|
|
11
|
+
expect(OAUTH_PROVIDERS['google-sheets'].tokenUrl).toBe('https://oauth2.googleapis.com/token')
|
|
12
|
+
expect(OAUTH_PROVIDERS['google-sheets'].tokenExchange).toBe('form-encoded')
|
|
13
|
+
expect(OAUTH_PROVIDERS['google-sheets'].authParams).toEqual({
|
|
14
|
+
access_type: 'offline',
|
|
15
|
+
prompt: 'consent'
|
|
16
|
+
})
|
|
17
|
+
expect(OAUTH_PROVIDERS['google-sheets'].scopes).toContain('https://www.googleapis.com/auth/spreadsheets')
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('should use correct token exchange methods', () => {
|
|
21
|
+
// Verify Google Sheets uses form-encoded (standard OAuth 2.0)
|
|
22
|
+
expect(OAUTH_PROVIDERS['google-sheets'].tokenExchange).toBe('form-encoded')
|
|
23
|
+
|
|
24
|
+
// Verify Dropbox uses form-encoded
|
|
25
|
+
expect(OAUTH_PROVIDERS.dropbox.tokenExchange).toBe('form-encoded')
|
|
26
|
+
})
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
describe('getProviderConfig', () => {
|
|
30
|
+
it('should return config for valid provider', () => {
|
|
31
|
+
const config = getProviderConfig('google-sheets')
|
|
32
|
+
expect(config).toBe(OAUTH_PROVIDERS['google-sheets'])
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('should throw for unknown provider', () => {
|
|
36
|
+
expect(() => getProviderConfig('unknown')).toThrow('Unknown OAuth provider: unknown')
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
describe('listProviders', () => {
|
|
41
|
+
it('should return all providers as array', () => {
|
|
42
|
+
const providers = listProviders()
|
|
43
|
+
expect(providers).toHaveLength(2)
|
|
44
|
+
expect(providers).toContainEqual(OAUTH_PROVIDERS['google-sheets'])
|
|
45
|
+
expect(providers).toContainEqual(OAUTH_PROVIDERS.dropbox)
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
it('should return array with correct provider structure', () => {
|
|
49
|
+
const providers = listProviders()
|
|
50
|
+
providers.forEach((provider) => {
|
|
51
|
+
expect(provider).toHaveProperty('id')
|
|
52
|
+
expect(provider).toHaveProperty('name')
|
|
53
|
+
expect(provider).toHaveProperty('authUrl')
|
|
54
|
+
expect(provider).toHaveProperty('tokenUrl')
|
|
55
|
+
expect(provider).toHaveProperty('tokenExchange')
|
|
56
|
+
})
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
})
|