@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,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM-related error classes
|
|
3
|
+
* Thrown from adapter layer, caught by execution layer
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { ExecutionError } from '../base/errors'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Base class for LLM-related errors
|
|
10
|
+
* Thrown from adapter layer, caught by execution layer
|
|
11
|
+
*
|
|
12
|
+
* Severity: warning (transient failures that may be retryable)
|
|
13
|
+
* Category: llm (LLM provider errors)
|
|
14
|
+
*/
|
|
15
|
+
export class LLMError extends ExecutionError {
|
|
16
|
+
readonly type: string = 'llm_error'
|
|
17
|
+
readonly severity: 'warning' | 'critical' = 'warning' as const
|
|
18
|
+
readonly category = 'llm' as const
|
|
19
|
+
|
|
20
|
+
constructor(message: string, context?: Record<string, unknown>) {
|
|
21
|
+
super(message, context)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
override isRetryable(): boolean {
|
|
25
|
+
return true
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Thrown when token configuration is insufficient for the model
|
|
31
|
+
* Wrapped as ExecutionError with code: AGENT_INSUFFICIENT_TOKENS
|
|
32
|
+
*
|
|
33
|
+
* Severity: critical (execution cannot continue without sufficient tokens)
|
|
34
|
+
* Category: llm
|
|
35
|
+
*/
|
|
36
|
+
export class InsufficientTokensError extends LLMError {
|
|
37
|
+
override readonly type = 'insufficient_tokens' as const
|
|
38
|
+
override readonly severity = 'critical' as const
|
|
39
|
+
|
|
40
|
+
constructor(message: string, context?: Record<string, unknown>) {
|
|
41
|
+
super(message, context)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
override isRetryable(): boolean {
|
|
45
|
+
return false
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Thrown when LLM hits token limit during generation
|
|
51
|
+
* Wrapped as ExecutionError with code: AGENT_TOKEN_LIMIT_EXCEEDED
|
|
52
|
+
*
|
|
53
|
+
* Severity: critical (execution cannot continue, token limit exceeded)
|
|
54
|
+
* Category: llm
|
|
55
|
+
*/
|
|
56
|
+
export class TokenLimitExceededError extends LLMError {
|
|
57
|
+
override readonly type = 'token_limit_exceeded' as const
|
|
58
|
+
override readonly severity = 'critical' as const
|
|
59
|
+
|
|
60
|
+
constructor(message: string, context?: Record<string, unknown>) {
|
|
61
|
+
super(message, context)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
override isRetryable(): boolean {
|
|
65
|
+
return false
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Thrown when LLM response cannot be parsed as valid JSON
|
|
71
|
+
* This is a transient error - the LLM may produce valid JSON on retry
|
|
72
|
+
*
|
|
73
|
+
* Severity: warning (transient failure that may succeed on retry)
|
|
74
|
+
* Category: llm
|
|
75
|
+
*/
|
|
76
|
+
export class LLMResponseParseError extends LLMError {
|
|
77
|
+
override readonly type = 'llm_response_parse_error' as const
|
|
78
|
+
override readonly severity = 'warning' as const
|
|
79
|
+
|
|
80
|
+
constructor(message: string, context?: Record<string, unknown>) {
|
|
81
|
+
super(message, context)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
override isRetryable(): boolean {
|
|
85
|
+
return true // JSON parse failures are transient LLM errors
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Thrown when model configuration is invalid
|
|
91
|
+
* Provides structured information for debugging
|
|
92
|
+
*
|
|
93
|
+
* Severity: warning (configuration error that blocks execution but is user-correctable)
|
|
94
|
+
* Category: validation (user/developer input validation)
|
|
95
|
+
*/
|
|
96
|
+
export class ModelConfigError extends ExecutionError {
|
|
97
|
+
readonly type = 'model_config_error' as const
|
|
98
|
+
readonly severity = 'warning' as const
|
|
99
|
+
readonly category = 'validation' as const
|
|
100
|
+
|
|
101
|
+
constructor(
|
|
102
|
+
message: string,
|
|
103
|
+
public field: string,
|
|
104
|
+
public model: string,
|
|
105
|
+
context?: Record<string, unknown>
|
|
106
|
+
) {
|
|
107
|
+
super(message, { ...context, field, model })
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Thrown when input is blocked by prompt injection sanitization
|
|
113
|
+
* This is NOT a service failure - it means the security layer is working correctly
|
|
114
|
+
*
|
|
115
|
+
* Severity: warning (system working as designed, not a failure)
|
|
116
|
+
* Category: validation (input validation, not infrastructure)
|
|
117
|
+
*/
|
|
118
|
+
export class LLMInputBlockedError extends ExecutionError {
|
|
119
|
+
readonly type = 'input_blocked' as const
|
|
120
|
+
readonly severity = 'warning' as const
|
|
121
|
+
readonly category = 'validation' as const
|
|
122
|
+
|
|
123
|
+
constructor(warnings: string[]) {
|
|
124
|
+
super(`Input blocked: ${warnings.join(', ')} prompt injection patterns detected`, {
|
|
125
|
+
warnings,
|
|
126
|
+
patternCount: warnings.length
|
|
127
|
+
})
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
override isRetryable(): boolean {
|
|
131
|
+
return false // Same input will always be blocked
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// ============================================================================
|
|
136
|
+
// Model Configuration Validation
|
|
137
|
+
// ============================================================================
|
|
138
|
+
|
|
139
|
+
import { getModelInfo, type ModelConfig } from './model-info'
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Validate model configuration using consolidated Zod schema
|
|
143
|
+
* Validates constraints (temperature, maxOutputTokens) AND model-specific options
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* // Valid config
|
|
147
|
+
* validateModelConfig({ model: 'gpt-5', temperature: 1, modelOptions: { reasoning_effort: 'low' } }) // ✓
|
|
148
|
+
*
|
|
149
|
+
* // Invalid temperature
|
|
150
|
+
* validateModelConfig({ model: 'gpt-5', temperature: 0.7 }) // ✗ Throws ModelConfigError
|
|
151
|
+
*
|
|
152
|
+
* // Invalid option
|
|
153
|
+
* validateModelConfig({ model: 'mock', modelOptions: { reasoning_effort: 'low' } }) // ✗ Throws ModelConfigError
|
|
154
|
+
*
|
|
155
|
+
* @param config - Complete model configuration to validate
|
|
156
|
+
* @throws {ModelConfigError} If validation fails (uses Zod for runtime validation)
|
|
157
|
+
*/
|
|
158
|
+
export function validateModelConfig(config: ModelConfig): void {
|
|
159
|
+
const model = config.model as string
|
|
160
|
+
|
|
161
|
+
if (!model) {
|
|
162
|
+
throw new ModelConfigError('Missing model field', 'model', 'unknown')
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const modelInfo = getModelInfo(model)
|
|
166
|
+
|
|
167
|
+
if (!modelInfo) {
|
|
168
|
+
throw new ModelConfigError(`Unknown model: ${model}`, 'model', model)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// If model has no schema, skip validation
|
|
172
|
+
if (!modelInfo.configSchema) {
|
|
173
|
+
return
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Validate using consolidated Zod schema
|
|
177
|
+
const result = modelInfo.configSchema.safeParse(config)
|
|
178
|
+
|
|
179
|
+
if (!result.success) {
|
|
180
|
+
const firstError = result.error.issues[0]
|
|
181
|
+
const fieldPath = firstError.path.join('.')
|
|
182
|
+
const fieldName = fieldPath || 'config'
|
|
183
|
+
|
|
184
|
+
throw new ModelConfigError(`Invalid config for ${model}: ${firstError.message}`, fieldName, model)
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// SECURITY FIX: Rank 5A - Basic Prompt Injection Pattern Blocking
|
|
2
|
+
// Sanitizes user input to detect and block common prompt injection attacks
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Result of input sanitization
|
|
6
|
+
*/
|
|
7
|
+
export interface SanitizationResult {
|
|
8
|
+
/** Original input (use this if not blocked) */
|
|
9
|
+
original: unknown
|
|
10
|
+
/** Sanitized input text (with attack patterns redacted) */
|
|
11
|
+
sanitized: string
|
|
12
|
+
/** List of detected attack pattern types */
|
|
13
|
+
warnings: string[]
|
|
14
|
+
/** Whether input is blocked (3+ distinct attack types) */
|
|
15
|
+
blocked: boolean
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Sanitize user input to detect and block prompt injection attacks
|
|
20
|
+
*
|
|
21
|
+
* Basic pattern blocking for common attack vectors:
|
|
22
|
+
* 1. System prompt extraction attempts
|
|
23
|
+
* 2. Role manipulation attempts
|
|
24
|
+
* 3. Delimiter injection (fake system sections)
|
|
25
|
+
* 4. Tool/function injection attempts
|
|
26
|
+
*
|
|
27
|
+
* Blocking threshold: 3+ distinct warning types indicates sophisticated attack
|
|
28
|
+
*
|
|
29
|
+
* @param input - User input (any format)
|
|
30
|
+
* @returns Sanitization result with warnings, sanitized text, and blocked status
|
|
31
|
+
*/
|
|
32
|
+
export function sanitizeUserInput(input: unknown): SanitizationResult {
|
|
33
|
+
let text: string
|
|
34
|
+
|
|
35
|
+
// Extract text from input (string or {message: "..."} format)
|
|
36
|
+
if (typeof input === 'string') {
|
|
37
|
+
text = input
|
|
38
|
+
} else if (input && typeof input === 'object' && 'message' in input) {
|
|
39
|
+
text = String((input as Record<string, unknown>).message)
|
|
40
|
+
} else if (input === null || input === undefined) {
|
|
41
|
+
text = ''
|
|
42
|
+
} else {
|
|
43
|
+
text = JSON.stringify(input)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const warnings: string[] = []
|
|
47
|
+
let sanitized = text
|
|
48
|
+
|
|
49
|
+
// Pattern 1: System prompt extraction attempts
|
|
50
|
+
const systemPromptPatterns = [
|
|
51
|
+
/ignore\s+(all\s+)?instructions?/i,
|
|
52
|
+
/ignore\s+(all\s+)?(previous|prior|above)/i,
|
|
53
|
+
/disregard\s+(all\s+)?(previous|system)\s+instructions?/i,
|
|
54
|
+
/print\s+(your\s+)?(system\s+)?prompt/i,
|
|
55
|
+
/(show|tell)\s+(me\s+)?your\s+(system\s+)?prompt/i,
|
|
56
|
+
/what\s+(are|is)\s+your\s+(system\s+)?instructions?/i,
|
|
57
|
+
/show\s+(me\s+)?your\s+configuration/i,
|
|
58
|
+
/repeat\s+everything\s+before/i
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
for (const pattern of systemPromptPatterns) {
|
|
62
|
+
if (pattern.test(text)) {
|
|
63
|
+
warnings.push('system_prompt_extraction')
|
|
64
|
+
sanitized = sanitized.replace(pattern, '[REDACTED: system prompt extraction attempt]')
|
|
65
|
+
break
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Pattern 2: Role manipulation attempts
|
|
70
|
+
const rolePatterns = [
|
|
71
|
+
/you\s+are\s+now\s+(a|an|the)/i,
|
|
72
|
+
/act\s+as\s+(a|an|the)/i,
|
|
73
|
+
/pretend\s+(you\s+are|to\s+be)/i,
|
|
74
|
+
/from\s+now\s+on,?\s+you/i,
|
|
75
|
+
/forget\s+your\s+(previous\s+)?role/i,
|
|
76
|
+
/jailbreak/i
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
for (const pattern of rolePatterns) {
|
|
80
|
+
if (pattern.test(text)) {
|
|
81
|
+
warnings.push('role_manipulation')
|
|
82
|
+
sanitized = sanitized.replace(pattern, '[REDACTED: role manipulation attempt]')
|
|
83
|
+
break
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Pattern 3: Delimiter injection (fake system sections)
|
|
88
|
+
const delimiterPatterns = [
|
|
89
|
+
/^\s*={3,}/m, // === at line start (with optional whitespace)
|
|
90
|
+
/^\s*-{3,}/m, // --- at line start (with optional whitespace)
|
|
91
|
+
/^\s*#{2,}\s*SYSTEM/mi, // ## SYSTEM headers (with optional whitespace)
|
|
92
|
+
/<\|?system\|?>/i // <system> or <|system|> tags
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
for (const pattern of delimiterPatterns) {
|
|
96
|
+
if (pattern.test(text)) {
|
|
97
|
+
warnings.push('delimiter_injection')
|
|
98
|
+
sanitized = sanitized.replace(pattern, '[REDACTED: delimiter injection]')
|
|
99
|
+
break
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Pattern 4: Tool/function injection attempts
|
|
104
|
+
const toolPatterns = [
|
|
105
|
+
/<function[>\s]/i,
|
|
106
|
+
/<tool[>\s]/i,
|
|
107
|
+
/"type":\s*"tool_call"/i
|
|
108
|
+
]
|
|
109
|
+
|
|
110
|
+
for (const pattern of toolPatterns) {
|
|
111
|
+
if (pattern.test(text)) {
|
|
112
|
+
warnings.push('tool_injection')
|
|
113
|
+
sanitized = sanitized.replace(pattern, '[REDACTED: tool injection attempt]')
|
|
114
|
+
break
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Decision: Block if 3+ distinct warning types detected
|
|
119
|
+
// (This indicates a sophisticated, multi-vector attack)
|
|
120
|
+
const uniqueWarnings = [...new Set(warnings)]
|
|
121
|
+
const blocked = uniqueWarnings.length >= 3
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
original: input,
|
|
125
|
+
sanitized,
|
|
126
|
+
warnings: uniqueWarnings,
|
|
127
|
+
blocked
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Configuration
|
|
3
|
+
* Centralized model information, configuration, options, constraints, and validation
|
|
4
|
+
* Single source of truth for all model-related definitions
|
|
5
|
+
* Update manually when pricing changes or new models are added
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { z } from 'zod'
|
|
9
|
+
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Model Types
|
|
12
|
+
// ============================================================================
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Supported Open AI models (direct SDK access)
|
|
16
|
+
*/
|
|
17
|
+
export type OpenAIModel = 'gpt-5' | 'gpt-5.4-mini' | 'gpt-5.4-nano'
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Supported OpenRouter models (explicit union for type safety)
|
|
21
|
+
*/
|
|
22
|
+
export type OpenRouterModel = 'openrouter/z-ai/glm-5'
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Supported Google models (direct SDK access)
|
|
26
|
+
*/
|
|
27
|
+
export type GoogleModel = 'gemini-3-flash-preview' | 'gemini-3.1-flash-lite-preview'
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Supported Anthropic models (direct SDK access via @anthropic-ai/sdk)
|
|
31
|
+
*/
|
|
32
|
+
export type AnthropicModel = 'claude-sonnet-4-5'
|
|
33
|
+
|
|
34
|
+
/** Supported LLM models */
|
|
35
|
+
export type LLMModel = OpenAIModel | OpenRouterModel | GoogleModel | AnthropicModel | 'mock'
|
|
36
|
+
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Model Configuration Schemas (Schema-First - Single Source of Truth)
|
|
39
|
+
// ============================================================================
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* GPT-5 model options schema
|
|
43
|
+
*/
|
|
44
|
+
const GPT5OptionsSchema = z.object({
|
|
45
|
+
reasoning_effort: z.enum(['minimal', 'low', 'medium', 'high']).optional(),
|
|
46
|
+
verbosity: z.enum(['low', 'medium', 'high']).optional()
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* GPT-5 family complete config schema
|
|
51
|
+
* Validates entire ModelConfig including constraints and options
|
|
52
|
+
* GPT-5, GPT-5.4-mini, and GPT-5.4-nano share same validation rules
|
|
53
|
+
*/
|
|
54
|
+
export const GPT5ConfigSchema = z.object({
|
|
55
|
+
model: z.enum(['gpt-5', 'gpt-5.4-mini', 'gpt-5.4-nano']),
|
|
56
|
+
provider: z.enum(['openai']),
|
|
57
|
+
apiKey: z.string(),
|
|
58
|
+
temperature: z.literal(1), // Required to be exactly 1
|
|
59
|
+
maxOutputTokens: z.number().min(4000).optional(),
|
|
60
|
+
topP: z.number().min(0).max(1).optional(),
|
|
61
|
+
modelOptions: GPT5OptionsSchema.optional()
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Mock model config schema
|
|
66
|
+
*/
|
|
67
|
+
export const MockConfigSchema = z.object({
|
|
68
|
+
model: z.enum(['mock']),
|
|
69
|
+
provider: z.enum(['mock']),
|
|
70
|
+
apiKey: z.string(),
|
|
71
|
+
temperature: z.number().min(0).max(2).optional(),
|
|
72
|
+
maxOutputTokens: z.number().min(500).optional(),
|
|
73
|
+
topP: z.number().min(0).max(1).optional(),
|
|
74
|
+
modelOptions: z.object({}).strict().optional() // No options supported
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* OpenRouter model options schema
|
|
79
|
+
* OpenRouter-specific options for routing and transforms
|
|
80
|
+
*/
|
|
81
|
+
const OpenRouterOptionsSchema = z.object({
|
|
82
|
+
/** Optional transforms to apply (e.g., 'middle-out' for long context) */
|
|
83
|
+
transforms: z.array(z.string()).optional(),
|
|
84
|
+
/** Routing strategy (e.g., 'fallback' for automatic provider failover) */
|
|
85
|
+
route: z.enum(['fallback']).optional()
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* OpenRouter config schema
|
|
90
|
+
* Validates ModelConfig for OpenRouter provider
|
|
91
|
+
*/
|
|
92
|
+
export const OpenRouterConfigSchema = z.object({
|
|
93
|
+
model: z.enum(['openrouter/z-ai/glm-5']),
|
|
94
|
+
provider: z.literal('openrouter'),
|
|
95
|
+
apiKey: z.string(),
|
|
96
|
+
temperature: z.number().min(0).max(2).optional(),
|
|
97
|
+
maxOutputTokens: z.number().min(500).optional(),
|
|
98
|
+
topP: z.number().min(0).max(1).optional(),
|
|
99
|
+
modelOptions: OpenRouterOptionsSchema.optional()
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Google model options schema
|
|
104
|
+
* Gemini 3 specific options for thinking depth control
|
|
105
|
+
*/
|
|
106
|
+
const GoogleOptionsSchema = z.object({
|
|
107
|
+
/** Thinking level for Gemini 3 models (controls reasoning depth) */
|
|
108
|
+
thinkingLevel: z.enum(['minimal', 'low', 'medium', 'high']).optional()
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Google config schema
|
|
113
|
+
* Validates ModelConfig for Google provider (direct SDK access)
|
|
114
|
+
*/
|
|
115
|
+
export const GoogleConfigSchema = z.object({
|
|
116
|
+
model: z.enum(['gemini-3-flash-preview', 'gemini-3.1-flash-lite-preview']),
|
|
117
|
+
provider: z.literal('google'),
|
|
118
|
+
apiKey: z.string(),
|
|
119
|
+
temperature: z.number().min(0).max(2).optional(),
|
|
120
|
+
maxOutputTokens: z.number().min(500).optional(),
|
|
121
|
+
topP: z.number().min(0).max(1).optional(),
|
|
122
|
+
modelOptions: GoogleOptionsSchema.optional()
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Anthropic model options schema
|
|
127
|
+
* Currently empty - future options: budget_tokens for extended thinking
|
|
128
|
+
*/
|
|
129
|
+
const AnthropicOptionsSchema = z.object({})
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Anthropic config schema
|
|
133
|
+
* Validates ModelConfig for Anthropic provider (direct SDK access)
|
|
134
|
+
*/
|
|
135
|
+
export const AnthropicConfigSchema = z.object({
|
|
136
|
+
model: z.enum(['claude-sonnet-4-5']),
|
|
137
|
+
provider: z.literal('anthropic'),
|
|
138
|
+
apiKey: z.string(),
|
|
139
|
+
temperature: z.number().min(0).max(1).optional(),
|
|
140
|
+
maxOutputTokens: z.number().min(1000).optional(), // Anthropic requires max_tokens
|
|
141
|
+
topP: z.number().min(0).max(1).optional(),
|
|
142
|
+
modelOptions: AnthropicOptionsSchema.optional()
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Infer TypeScript types from schemas
|
|
147
|
+
*/
|
|
148
|
+
export type GPT5Options = z.infer<typeof GPT5OptionsSchema>
|
|
149
|
+
export type MockOptions = Record<string, never>
|
|
150
|
+
export type OpenRouterOptions = z.infer<typeof OpenRouterOptionsSchema>
|
|
151
|
+
export type GoogleOptions = z.infer<typeof GoogleOptionsSchema>
|
|
152
|
+
export type AnthropicOptions = z.infer<typeof AnthropicOptionsSchema>
|
|
153
|
+
export type ModelSpecificOptions = GPT5Options | MockOptions | OpenRouterOptions | GoogleOptions | AnthropicOptions
|
|
154
|
+
|
|
155
|
+
// ============================================================================
|
|
156
|
+
// Model Configuration
|
|
157
|
+
// ============================================================================
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Model configuration for LLM execution
|
|
161
|
+
* Belongs in resource definition (AgentDefinition, WorkflowDefinition, etc.)
|
|
162
|
+
*/
|
|
163
|
+
export interface ModelConfig {
|
|
164
|
+
model: LLMModel
|
|
165
|
+
provider: 'openai' | 'anthropic' | 'openrouter' | 'google' | 'mock'
|
|
166
|
+
apiKey: string
|
|
167
|
+
temperature?: number
|
|
168
|
+
/** Maximum output tokens per LLM call. NOT the model's context window — see ModelInfo.maxTokens for that. */
|
|
169
|
+
maxOutputTokens?: number
|
|
170
|
+
topP?: number
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Model-specific options (flat structure)
|
|
174
|
+
* Options are model-specific, not vendor-specific
|
|
175
|
+
* Available options defined in MODEL_INFO per model
|
|
176
|
+
* Validated at build time via validateModelOptions()
|
|
177
|
+
*/
|
|
178
|
+
modelOptions?: ModelSpecificOptions
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// ============================================================================
|
|
182
|
+
// Model Metadata
|
|
183
|
+
// ============================================================================
|
|
184
|
+
|
|
185
|
+
export interface ModelInfo {
|
|
186
|
+
/** Cost in cents per 1M input tokens */
|
|
187
|
+
inputCostPer1M: number
|
|
188
|
+
/** Cost in cents per 1M output tokens */
|
|
189
|
+
outputCostPer1M: number
|
|
190
|
+
/** Minimum tokens required for reliable output generation */
|
|
191
|
+
minTokens: number
|
|
192
|
+
/** Recommended tokens for production use (typically 2x minimum) */
|
|
193
|
+
recommendedTokens: number
|
|
194
|
+
/** Maximum context window size (total tokens: input + output) */
|
|
195
|
+
maxTokens: number
|
|
196
|
+
/** Model category for grouping and documentation */
|
|
197
|
+
category: 'reasoning' | 'standard' | 'embedding'
|
|
198
|
+
/** Zod schema for validating complete ModelConfig (replaces constraints + optionsSchema) */
|
|
199
|
+
configSchema?: z.ZodType<ModelConfig>
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Model configuration as of 2026-03-17
|
|
203
|
+
export const MODEL_INFO: Record<LLMModel, ModelInfo> = {
|
|
204
|
+
// OpenAI GPT-5 (Reasoning Models)
|
|
205
|
+
'gpt-5': {
|
|
206
|
+
inputCostPer1M: 125, // $1.25 per 1M tokens
|
|
207
|
+
outputCostPer1M: 1000, // $10.00 per 1M tokens
|
|
208
|
+
minTokens: 4000, // Reasoning models need more
|
|
209
|
+
recommendedTokens: 8000,
|
|
210
|
+
maxTokens: 400000, // 400k context window
|
|
211
|
+
category: 'reasoning',
|
|
212
|
+
configSchema: GPT5ConfigSchema
|
|
213
|
+
},
|
|
214
|
+
'gpt-5.4-mini': {
|
|
215
|
+
inputCostPer1M: 75, // $0.75 per 1M tokens
|
|
216
|
+
outputCostPer1M: 450, // $4.50 per 1M tokens
|
|
217
|
+
minTokens: 4000, // Reasoning models need more
|
|
218
|
+
recommendedTokens: 8000,
|
|
219
|
+
maxTokens: 400000, // 400k context window
|
|
220
|
+
category: 'reasoning',
|
|
221
|
+
configSchema: GPT5ConfigSchema
|
|
222
|
+
},
|
|
223
|
+
'gpt-5.4-nano': {
|
|
224
|
+
inputCostPer1M: 20, // $0.20 per 1M tokens
|
|
225
|
+
outputCostPer1M: 125, // $1.25 per 1M tokens
|
|
226
|
+
minTokens: 4000,
|
|
227
|
+
recommendedTokens: 8000,
|
|
228
|
+
maxTokens: 400000, // 400k context window
|
|
229
|
+
category: 'standard',
|
|
230
|
+
configSchema: GPT5ConfigSchema
|
|
231
|
+
},
|
|
232
|
+
// Mock model for testing
|
|
233
|
+
mock: {
|
|
234
|
+
inputCostPer1M: 0, // Free for tests
|
|
235
|
+
outputCostPer1M: 0,
|
|
236
|
+
minTokens: 500, // Low minimum for test flexibility
|
|
237
|
+
recommendedTokens: 1000,
|
|
238
|
+
maxTokens: 100000, // 100k for testing
|
|
239
|
+
category: 'standard',
|
|
240
|
+
configSchema: MockConfigSchema
|
|
241
|
+
},
|
|
242
|
+
// OpenRouter Models (via openrouter.ai)
|
|
243
|
+
'openrouter/z-ai/glm-5': {
|
|
244
|
+
inputCostPer1M: 72, // $0.72 per 1M tokens
|
|
245
|
+
outputCostPer1M: 230, // $2.30 per 1M tokens
|
|
246
|
+
minTokens: 4000,
|
|
247
|
+
recommendedTokens: 4000,
|
|
248
|
+
maxTokens: 202752, // 202,752 context window
|
|
249
|
+
category: 'standard',
|
|
250
|
+
configSchema: OpenRouterConfigSchema
|
|
251
|
+
},
|
|
252
|
+
// Google Gemini Models (direct SDK access via @google/genai)
|
|
253
|
+
'gemini-3-flash-preview': {
|
|
254
|
+
inputCostPer1M: 50, // $0.50 per 1M tokens
|
|
255
|
+
outputCostPer1M: 300, // $3.00 per 1M tokens
|
|
256
|
+
minTokens: 4000,
|
|
257
|
+
recommendedTokens: 8000,
|
|
258
|
+
maxTokens: 1000000, // 1M context window
|
|
259
|
+
category: 'standard',
|
|
260
|
+
configSchema: GoogleConfigSchema
|
|
261
|
+
},
|
|
262
|
+
'gemini-3.1-flash-lite-preview': {
|
|
263
|
+
inputCostPer1M: 25, // $0.25 per 1M tokens
|
|
264
|
+
outputCostPer1M: 150, // $1.50 per 1M tokens
|
|
265
|
+
minTokens: 4000,
|
|
266
|
+
recommendedTokens: 8000,
|
|
267
|
+
maxTokens: 1000000, // 1M context window
|
|
268
|
+
category: 'standard',
|
|
269
|
+
configSchema: GoogleConfigSchema
|
|
270
|
+
},
|
|
271
|
+
// Anthropic Claude Models (direct SDK access via @anthropic-ai/sdk)
|
|
272
|
+
'claude-sonnet-4-5': {
|
|
273
|
+
inputCostPer1M: 300, // $3.00 per 1M tokens
|
|
274
|
+
outputCostPer1M: 1500, // $15.00 per 1M tokens
|
|
275
|
+
minTokens: 4000,
|
|
276
|
+
recommendedTokens: 8000,
|
|
277
|
+
maxTokens: 200000, // 200k context window
|
|
278
|
+
category: 'standard',
|
|
279
|
+
configSchema: AnthropicConfigSchema
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Get model information (pricing and token requirements)
|
|
285
|
+
* Supports exact match and prefix matching (e.g., 'gpt-5-preview' matches 'gpt-5')
|
|
286
|
+
*
|
|
287
|
+
* @param model - Model name (e.g., 'gpt-5.4-mini')
|
|
288
|
+
* @returns Model info or undefined if not found
|
|
289
|
+
*/
|
|
290
|
+
export function getModelInfo(model: string): ModelInfo | undefined {
|
|
291
|
+
// Check exact match first
|
|
292
|
+
if (model in MODEL_INFO) {
|
|
293
|
+
return MODEL_INFO[model as LLMModel]
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Check prefix match (e.g., gpt-5-preview -> gpt-5)
|
|
297
|
+
for (const [knownModel, info] of Object.entries(MODEL_INFO)) {
|
|
298
|
+
if (model.startsWith(knownModel)) {
|
|
299
|
+
return info
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return undefined
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Calculate cost in USD for LLM usage
|
|
308
|
+
*
|
|
309
|
+
* @param model - Model name (e.g., 'gpt-5.4-mini')
|
|
310
|
+
* @param inputTokens - Number of input tokens
|
|
311
|
+
* @param outputTokens - Number of output tokens
|
|
312
|
+
* @returns Cost in USD with full decimal precision (no rounding)
|
|
313
|
+
*/
|
|
314
|
+
export function calculateCost(model: string, inputTokens: number, outputTokens: number): number {
|
|
315
|
+
const info = getModelInfo(model)
|
|
316
|
+
|
|
317
|
+
if (!info) {
|
|
318
|
+
// Unknown model - return 0 cost but log warning
|
|
319
|
+
console.warn(
|
|
320
|
+
`[CostCalculator] Unknown model '${model}' - cannot calculate cost. Available models:`,
|
|
321
|
+
Object.keys(MODEL_INFO)
|
|
322
|
+
)
|
|
323
|
+
return 0
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Calculate in USD with full precision (pricing is in cents per 1M)
|
|
327
|
+
const inputCostUsd = (inputTokens / 1_000_000) * (info.inputCostPer1M / 100)
|
|
328
|
+
const outputCostUsd = (outputTokens / 1_000_000) * (info.outputCostPer1M / 100)
|
|
329
|
+
const totalCostUsd = inputCostUsd + outputCostUsd
|
|
330
|
+
|
|
331
|
+
return totalCostUsd
|
|
332
|
+
}
|