@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,74 @@
|
|
|
1
|
+
/* eslint-disable no-undef */
|
|
2
|
+
/**
|
|
3
|
+
* Image Utilities for PDF Generation
|
|
4
|
+
*
|
|
5
|
+
* Converts image URLs to base64 data URLs for use with pdfmake.
|
|
6
|
+
* pdfmake requires images in base64 format for client-side PDF generation.
|
|
7
|
+
*
|
|
8
|
+
* @see https://pdfmake.github.io/docs/0.1/document-definition-object/images/
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Convert an image URL to a base64 data URL
|
|
13
|
+
*
|
|
14
|
+
* Uses canvas to convert the image, which handles CORS properly
|
|
15
|
+
* for same-origin images.
|
|
16
|
+
*
|
|
17
|
+
* @param url - Image URL (relative or absolute)
|
|
18
|
+
* @returns Promise resolving to base64 data URL
|
|
19
|
+
*/
|
|
20
|
+
export async function imageUrlToBase64(url: string): Promise<string> {
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
const img = new Image()
|
|
23
|
+
img.crossOrigin = 'anonymous'
|
|
24
|
+
|
|
25
|
+
img.onload = () => {
|
|
26
|
+
const canvas = document.createElement('canvas')
|
|
27
|
+
canvas.width = img.naturalWidth
|
|
28
|
+
canvas.height = img.naturalHeight
|
|
29
|
+
|
|
30
|
+
const ctx = canvas.getContext('2d')
|
|
31
|
+
if (!ctx) {
|
|
32
|
+
reject(new Error('Failed to get canvas context'))
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
ctx.drawImage(img, 0, 0)
|
|
37
|
+
|
|
38
|
+
// Get as PNG to preserve transparency
|
|
39
|
+
const dataUrl = canvas.toDataURL('image/png')
|
|
40
|
+
resolve(dataUrl)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
img.onerror = () => {
|
|
44
|
+
reject(new Error(`Failed to load image: ${url}`))
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
img.src = url
|
|
48
|
+
})
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Preload multiple images and return a map of URL to base64
|
|
53
|
+
*
|
|
54
|
+
* Useful for preloading all images before PDF generation.
|
|
55
|
+
*
|
|
56
|
+
* @param urls - Array of image URLs to preload
|
|
57
|
+
* @returns Promise resolving to map of URL -> base64 data URL
|
|
58
|
+
*/
|
|
59
|
+
export async function preloadImages(urls: string[]): Promise<Map<string, string>> {
|
|
60
|
+
const results = new Map<string, string>()
|
|
61
|
+
|
|
62
|
+
await Promise.all(
|
|
63
|
+
urls.map(async (url) => {
|
|
64
|
+
try {
|
|
65
|
+
const base64 = await imageUrlToBase64(url)
|
|
66
|
+
results.set(url, base64)
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.warn(`Failed to preload image: ${url}`, error)
|
|
69
|
+
}
|
|
70
|
+
})
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
return results
|
|
74
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDF Browser Module
|
|
3
|
+
*
|
|
4
|
+
* Browser-compatible PDF generation using pdfmake.
|
|
5
|
+
* Use this module for client-side PDF rendering in web applications.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* import { PdfMakeBrowserService } from '@repo/core/pdf/browser'
|
|
9
|
+
*
|
|
10
|
+
* const service = new PdfMakeBrowserService()
|
|
11
|
+
* const dataUrl = await service.generateDataUrl(document)
|
|
12
|
+
* // Use dataUrl as iframe src
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export { PdfMakeBrowserService, pdfMakeBrowserService } from './pdfmake-browser'
|
|
16
|
+
export { imageUrlToBase64, preloadImages } from './image-utils'
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDF Browser Service (pdfmake)
|
|
3
|
+
*
|
|
4
|
+
* Browser-compatible PDF rendering using pdfmake.
|
|
5
|
+
* Generates PDFs in the browser without server round-trips.
|
|
6
|
+
*
|
|
7
|
+
* Uses Roboto fonts from vfs_fonts for consistent rendering.
|
|
8
|
+
*
|
|
9
|
+
* @see https://pdfmake.github.io/docs/
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { TFontDictionary, TCreatedPdf, TDocumentDefinitions } from 'pdfmake/interfaces'
|
|
13
|
+
|
|
14
|
+
import { defaultTheme } from '../themes'
|
|
15
|
+
import type { PDFTheme } from '../themes'
|
|
16
|
+
import type { PDFDocument } from '../types'
|
|
17
|
+
import { convertDocument } from '../shared/convert'
|
|
18
|
+
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// Lazy pdfmake initialization
|
|
21
|
+
// ============================================================================
|
|
22
|
+
|
|
23
|
+
interface PdfMakeInstance {
|
|
24
|
+
createPdf: (docDefinition: TDocumentDefinitions) => TCreatedPdf
|
|
25
|
+
setFonts?: (fonts: TFontDictionary) => void
|
|
26
|
+
addVirtualFileSystem?: (vfs: Record<string, string>) => void
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// pdfmake module reference (loaded on first use)
|
|
30
|
+
let pdfMakeModule: PdfMakeInstance | null = null
|
|
31
|
+
let fontsConfigured = false
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Get pdfmake module with lazy initialization
|
|
35
|
+
* This avoids SSR issues and ensures proper browser-side loading
|
|
36
|
+
*/
|
|
37
|
+
async function getPdfMake(): Promise<PdfMakeInstance> {
|
|
38
|
+
if (pdfMakeModule) {
|
|
39
|
+
return pdfMakeModule
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Dynamic import to ensure browser-side loading
|
|
43
|
+
const [pdfMakeImport, pdfFontsImport] = await Promise.all([
|
|
44
|
+
import('pdfmake/build/pdfmake'),
|
|
45
|
+
import('pdfmake/build/vfs_fonts')
|
|
46
|
+
])
|
|
47
|
+
|
|
48
|
+
// Handle both default and named exports (CJS/ESM interop)
|
|
49
|
+
const mod = ((pdfMakeImport as { default?: PdfMakeInstance }).default ?? pdfMakeImport) as PdfMakeInstance
|
|
50
|
+
pdfMakeModule = mod
|
|
51
|
+
|
|
52
|
+
// Add virtual file system with font data
|
|
53
|
+
const vfsModule = pdfFontsImport as Record<string, unknown>
|
|
54
|
+
const vfsKeys = Object.keys(vfsModule).filter((k) => k !== 'default')
|
|
55
|
+
|
|
56
|
+
// vfs_fonts exports font files directly at top level (e.g., 'Roboto-Regular.ttf': base64data)
|
|
57
|
+
// Build VFS object from the import, excluding 'default' key
|
|
58
|
+
const vfsData: Record<string, string> = {}
|
|
59
|
+
for (const key of vfsKeys) {
|
|
60
|
+
if (typeof vfsModule[key] === 'string') {
|
|
61
|
+
vfsData[key] = vfsModule[key]
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (Object.keys(vfsData).length > 0 && mod.addVirtualFileSystem) {
|
|
66
|
+
mod.addVirtualFileSystem(vfsData)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Set fonts on first load (use Roboto from vfs_fonts)
|
|
70
|
+
if (!fontsConfigured && pdfMakeModule.setFonts) {
|
|
71
|
+
pdfMakeModule.setFonts({
|
|
72
|
+
Roboto: {
|
|
73
|
+
normal: 'Roboto-Regular.ttf',
|
|
74
|
+
bold: 'Roboto-Medium.ttf',
|
|
75
|
+
italics: 'Roboto-Italic.ttf',
|
|
76
|
+
bolditalics: 'Roboto-MediumItalic.ttf'
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
fontsConfigured = true
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return pdfMakeModule
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// ============================================================================
|
|
86
|
+
// Browser Service Class
|
|
87
|
+
// ============================================================================
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* PdfMakeBrowserService
|
|
91
|
+
*
|
|
92
|
+
* Browser-compatible PDF generation service using pdfmake.
|
|
93
|
+
* Generates PDFs client-side and returns them as data URLs, blobs, or triggers downloads.
|
|
94
|
+
*/
|
|
95
|
+
export class PdfMakeBrowserService {
|
|
96
|
+
/**
|
|
97
|
+
* Generate PDF and return as data URL for iframe src
|
|
98
|
+
*
|
|
99
|
+
* @param document - PDFDocument schema to render
|
|
100
|
+
* @param theme - Optional theme override (merged with defaults)
|
|
101
|
+
* @returns Data URL string (e.g., "data:application/pdf;base64,...")
|
|
102
|
+
*/
|
|
103
|
+
async generateDataUrl(document: PDFDocument, theme?: Partial<PDFTheme>): Promise<string> {
|
|
104
|
+
const pdfMake = await getPdfMake()
|
|
105
|
+
if (!pdfMake) throw new Error('pdfmake failed to load')
|
|
106
|
+
|
|
107
|
+
const mergedTheme = this.mergeTheme(theme)
|
|
108
|
+
const docDefinition = convertDocument(document, mergedTheme)
|
|
109
|
+
const pdf = pdfMake.createPdf(docDefinition)
|
|
110
|
+
|
|
111
|
+
// pdfmake browser API uses callbacks, wrap in Promise
|
|
112
|
+
// Note: @types/pdfmake doesn't properly type callback overloads
|
|
113
|
+
return new Promise<string>((resolve, reject) => {
|
|
114
|
+
try {
|
|
115
|
+
;(pdf.getDataUrl as (cb: (result: string) => void) => void)((result) => {
|
|
116
|
+
resolve(result)
|
|
117
|
+
})
|
|
118
|
+
} catch (err) {
|
|
119
|
+
reject(err)
|
|
120
|
+
}
|
|
121
|
+
})
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Generate PDF and return as Blob for download or processing
|
|
126
|
+
*
|
|
127
|
+
* @param document - PDFDocument schema to render
|
|
128
|
+
* @param theme - Optional theme override (merged with defaults)
|
|
129
|
+
* @returns Blob containing the PDF
|
|
130
|
+
*/
|
|
131
|
+
async generateBlob(document: PDFDocument, theme?: Partial<PDFTheme>): Promise<Blob> {
|
|
132
|
+
const pdfMake = await getPdfMake()
|
|
133
|
+
if (!pdfMake) throw new Error('pdfmake failed to load')
|
|
134
|
+
|
|
135
|
+
const mergedTheme = this.mergeTheme(theme)
|
|
136
|
+
const docDefinition = convertDocument(document, mergedTheme)
|
|
137
|
+
const pdf = pdfMake.createPdf(docDefinition)
|
|
138
|
+
// pdfmake browser API uses callbacks
|
|
139
|
+
// Note: @types/pdfmake doesn't properly type callback overloads
|
|
140
|
+
return new Promise<Blob>((resolve, reject) => {
|
|
141
|
+
try {
|
|
142
|
+
;(pdf.getBlob as (cb: (result: Blob) => void) => void)((result) => {
|
|
143
|
+
resolve(result)
|
|
144
|
+
})
|
|
145
|
+
} catch (err) {
|
|
146
|
+
reject(err)
|
|
147
|
+
}
|
|
148
|
+
})
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Trigger browser download of the PDF
|
|
153
|
+
*
|
|
154
|
+
* @param document - PDFDocument schema to render
|
|
155
|
+
* @param filename - Filename for the download (e.g., "proposal.pdf")
|
|
156
|
+
* @param theme - Optional theme override (merged with defaults)
|
|
157
|
+
*/
|
|
158
|
+
async download(document: PDFDocument, filename: string, theme?: Partial<PDFTheme>): Promise<void> {
|
|
159
|
+
const pdfMake = await getPdfMake()
|
|
160
|
+
if (!pdfMake) throw new Error('pdfmake failed to load')
|
|
161
|
+
|
|
162
|
+
const mergedTheme = this.mergeTheme(theme)
|
|
163
|
+
const docDefinition = convertDocument(document, mergedTheme)
|
|
164
|
+
const pdf = pdfMake.createPdf(docDefinition)
|
|
165
|
+
await pdf.download(filename)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Open PDF in a new browser tab
|
|
170
|
+
*
|
|
171
|
+
* @param document - PDFDocument schema to render
|
|
172
|
+
* @param theme - Optional theme override (merged with defaults)
|
|
173
|
+
*/
|
|
174
|
+
async openInNewTab(document: PDFDocument, theme?: Partial<PDFTheme>): Promise<void> {
|
|
175
|
+
const pdfMake = await getPdfMake()
|
|
176
|
+
if (!pdfMake) throw new Error('pdfmake failed to load')
|
|
177
|
+
|
|
178
|
+
const mergedTheme = this.mergeTheme(theme)
|
|
179
|
+
const docDefinition = convertDocument(document, mergedTheme)
|
|
180
|
+
const pdf = pdfMake.createPdf(docDefinition)
|
|
181
|
+
await pdf.open()
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Print PDF using browser's print dialog
|
|
186
|
+
*
|
|
187
|
+
* @param document - PDFDocument schema to render
|
|
188
|
+
* @param theme - Optional theme override (merged with defaults)
|
|
189
|
+
*/
|
|
190
|
+
async print(document: PDFDocument, theme?: Partial<PDFTheme>): Promise<void> {
|
|
191
|
+
const pdfMake = await getPdfMake()
|
|
192
|
+
if (!pdfMake) throw new Error('pdfmake failed to load')
|
|
193
|
+
|
|
194
|
+
const mergedTheme = this.mergeTheme(theme)
|
|
195
|
+
const docDefinition = convertDocument(document, mergedTheme)
|
|
196
|
+
const pdf = pdfMake.createPdf(docDefinition)
|
|
197
|
+
await pdf.print()
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// ==========================================================================
|
|
201
|
+
// Private Helpers
|
|
202
|
+
// ==========================================================================
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Merge theme override with defaults
|
|
206
|
+
*/
|
|
207
|
+
private mergeTheme(themeOverride?: Partial<PDFTheme>): PDFTheme {
|
|
208
|
+
if (!themeOverride) {
|
|
209
|
+
return defaultTheme
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
...defaultTheme,
|
|
213
|
+
...themeOverride,
|
|
214
|
+
colors: { ...defaultTheme.colors, ...themeOverride.colors },
|
|
215
|
+
typography: { ...defaultTheme.typography, ...themeOverride.typography },
|
|
216
|
+
spacing: { ...defaultTheme.spacing, ...themeOverride.spacing }
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Singleton instance for convenience
|
|
223
|
+
*
|
|
224
|
+
* Can be used directly without instantiation:
|
|
225
|
+
* @example
|
|
226
|
+
* import { pdfMakeBrowserService } from '@repo/core/pdf/browser'
|
|
227
|
+
* const dataUrl = await pdfMakeBrowserService.generateDataUrl(document)
|
|
228
|
+
*/
|
|
229
|
+
export const pdfMakeBrowserService = new PdfMakeBrowserService()
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Acceptance Section Builder
|
|
3
|
+
*
|
|
4
|
+
* Creates a dedicated signature/acceptance page for proposals.
|
|
5
|
+
* This page contains minimal terms and signature fields placement area.
|
|
6
|
+
*
|
|
7
|
+
* Pattern: Content-only configuration, styling handled by theme system.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { acceptanceSection } from '@repo/core/pdf/sections'
|
|
12
|
+
*
|
|
13
|
+
* const page = acceptanceSection({
|
|
14
|
+
* companyName: 'Acme Corp',
|
|
15
|
+
* contactName: 'John Smith',
|
|
16
|
+
* tier: 'tier2',
|
|
17
|
+
* initialFee: 5000,
|
|
18
|
+
* monthlyFee: 2500 // optional
|
|
19
|
+
* })
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import type { Page } from '../types'
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Configuration for acceptance section
|
|
27
|
+
*/
|
|
28
|
+
export interface AcceptanceSectionConfig {
|
|
29
|
+
/** Company name for personalization */
|
|
30
|
+
companyName: string
|
|
31
|
+
/** Contact name for personalization */
|
|
32
|
+
contactName: string
|
|
33
|
+
/** Service tier being proposed */
|
|
34
|
+
tier: 'tier1' | 'tier2' | 'tier3' | 'custom'
|
|
35
|
+
/** Initial fee amount in dollars (one-time implementation fee) */
|
|
36
|
+
initialFee: number
|
|
37
|
+
/** Monthly fee amount in dollars (optional, for ongoing support) */
|
|
38
|
+
monthlyFee?: number
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Build acceptance page with simplified terms and signature area
|
|
43
|
+
*
|
|
44
|
+
* Creates a dedicated page at the end of the proposal with:
|
|
45
|
+
* - Pricing summary
|
|
46
|
+
* - Key terms (audit timeline, training, support, guarantee)
|
|
47
|
+
* - Acceptance statement
|
|
48
|
+
* - Space for electronic signature fields (added by SignatureAPI)
|
|
49
|
+
*
|
|
50
|
+
* @param config - Acceptance section configuration
|
|
51
|
+
* @returns Page structure for terms and acceptance
|
|
52
|
+
*/
|
|
53
|
+
export function acceptanceSection(config: AcceptanceSectionConfig): Page {
|
|
54
|
+
const { companyName, contactName, tier, initialFee, monthlyFee } = config
|
|
55
|
+
|
|
56
|
+
const tierDescriptions = {
|
|
57
|
+
tier1: 'Standard Implementation',
|
|
58
|
+
tier2: 'Professional Implementation',
|
|
59
|
+
tier3: 'Enterprise Implementation',
|
|
60
|
+
custom: 'Custom Implementation'
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Build simplified terms list
|
|
64
|
+
const terms: string[] = [
|
|
65
|
+
`Initial fee: $${initialFee.toLocaleString()} (${tierDescriptions[tier]})`,
|
|
66
|
+
...(monthlyFee ? [`Monthly fee: $${monthlyFee.toLocaleString()}/month`] : []),
|
|
67
|
+
'Detailed audit begins within 5 business days of payment',
|
|
68
|
+
'Training materials provided',
|
|
69
|
+
...(monthlyFee ? ['Ongoing maintenance, support, and optimization included'] : []),
|
|
70
|
+
'Payment link provided via email after signing',
|
|
71
|
+
'60-day money-back guarantee'
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
header: { title: 'Agreement & Terms', variant: 'accent' },
|
|
76
|
+
footer: true,
|
|
77
|
+
sections: [
|
|
78
|
+
{
|
|
79
|
+
type: 'card',
|
|
80
|
+
content: [
|
|
81
|
+
{
|
|
82
|
+
type: 'list',
|
|
83
|
+
ordered: false,
|
|
84
|
+
items: terms
|
|
85
|
+
}
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
type: 'text',
|
|
90
|
+
content: `By signing below, ${contactName} of ${companyName} authorizes Elevasis to proceed.`,
|
|
91
|
+
variant: 'body'
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
type: 'card',
|
|
95
|
+
title: 'Signature',
|
|
96
|
+
variant: 'light',
|
|
97
|
+
content: [
|
|
98
|
+
{
|
|
99
|
+
type: 'text',
|
|
100
|
+
content: 'Electronic signature will be captured below via SignatureAPI',
|
|
101
|
+
variant: 'caption'
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
type: 'text',
|
|
105
|
+
content: '\n\n\n\n\n',
|
|
106
|
+
variant: 'body'
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Automation Section Builder
|
|
3
|
+
*
|
|
4
|
+
* Creates a detail page for a single automation.
|
|
5
|
+
* Consumer provides content only; styling is handled internally.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Page, ListItem } from '../types'
|
|
9
|
+
import type { AutomationConfig } from './types'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Creates an automation detail page with metrics, workflow, and impact
|
|
13
|
+
*
|
|
14
|
+
* @param config - Content-only configuration
|
|
15
|
+
* @returns Page object ready for PDFDocument.pages array
|
|
16
|
+
*/
|
|
17
|
+
export function automationSection(config: AutomationConfig): Page {
|
|
18
|
+
const { title, howItWorks, workflow, impact, hoursPerWeek, annualSavings } = config
|
|
19
|
+
|
|
20
|
+
// Convert workflow items to ListItem format
|
|
21
|
+
const workflowItems: ListItem[] = workflow.map(item => {
|
|
22
|
+
if (typeof item === 'string') {
|
|
23
|
+
return item
|
|
24
|
+
}
|
|
25
|
+
return { text: item.text, highlight: item.highlight }
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
sections: [
|
|
30
|
+
// Inline metrics without card container for compactness
|
|
31
|
+
{
|
|
32
|
+
type: 'columns',
|
|
33
|
+
content: [
|
|
34
|
+
{
|
|
35
|
+
type: 'metric',
|
|
36
|
+
value: String(hoursPerWeek),
|
|
37
|
+
label: 'Projected Hours/Week Saved'
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
type: 'metric',
|
|
41
|
+
value: `$${annualSavings.toLocaleString()}`,
|
|
42
|
+
label: 'Projected Annual Savings'
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
{ type: 'text', content: 'How It Works', variant: 'subtitle' },
|
|
47
|
+
{ type: 'text', content: howItWorks, variant: 'body' },
|
|
48
|
+
{ type: 'text', content: 'Workflow', variant: 'subtitle' },
|
|
49
|
+
{ type: 'list', ordered: true, items: workflowItems },
|
|
50
|
+
{ type: 'text', content: 'Expected Impact', variant: 'subtitle' },
|
|
51
|
+
{ type: 'list', items: impact }
|
|
52
|
+
],
|
|
53
|
+
header: { subtitle: 'Automation', title, variant: 'accent' },
|
|
54
|
+
footer: true
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cover Section Builder
|
|
3
|
+
*
|
|
4
|
+
* Creates a styled cover page for proposals.
|
|
5
|
+
* Consumer provides content only; styling is handled internally.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Page } from '../types'
|
|
9
|
+
import type { CoverConfig } from './types'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Creates a cover page with company info, vertical, and solutions
|
|
13
|
+
*
|
|
14
|
+
* @param config - Content-only configuration
|
|
15
|
+
* @returns Page object ready for PDFDocument.pages array
|
|
16
|
+
*/
|
|
17
|
+
export function coverSection(config: CoverConfig): Page {
|
|
18
|
+
const {
|
|
19
|
+
company,
|
|
20
|
+
contact,
|
|
21
|
+
vertical,
|
|
22
|
+
solutions,
|
|
23
|
+
date = new Date().toLocaleDateString('en-US', {
|
|
24
|
+
year: 'numeric',
|
|
25
|
+
month: 'long',
|
|
26
|
+
day: 'numeric'
|
|
27
|
+
}),
|
|
28
|
+
logoSrc
|
|
29
|
+
} = config
|
|
30
|
+
|
|
31
|
+
// Build bottom left text - handle empty contact gracefully
|
|
32
|
+
const preparedForText = contact && contact.trim()
|
|
33
|
+
? `Prepared for ${contact}`
|
|
34
|
+
: 'Prepared for You'
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
sections: [
|
|
38
|
+
{ type: 'text', content: company, variant: 'coverCompany' },
|
|
39
|
+
{ type: 'text', content: vertical, variant: 'coverVertical' },
|
|
40
|
+
{ type: 'text', content: solutions, variant: 'coverSolutions' }
|
|
41
|
+
],
|
|
42
|
+
cover: {
|
|
43
|
+
topLeft: logoSrc ? { src: logoSrc, width: 34 } : undefined,
|
|
44
|
+
topRight: [{ type: 'text', content: 'AUTOMATION PROPOSAL', variant: 'caption' }],
|
|
45
|
+
centerContent: true,
|
|
46
|
+
bottomLeft: [{ type: 'text', content: preparedForText, variant: 'caption' }],
|
|
47
|
+
bottomRight: [{ type: 'text', content: date, variant: 'caption' }]
|
|
48
|
+
},
|
|
49
|
+
footer: false
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDF Section Builders
|
|
3
|
+
*
|
|
4
|
+
* Composable section builders for creating styled PDF pages.
|
|
5
|
+
* Each builder takes content-only configuration and returns a Page object.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import {
|
|
10
|
+
* coverSection,
|
|
11
|
+
* summarySection,
|
|
12
|
+
* automationSection,
|
|
13
|
+
* summaryInvestmentSection // Combined section (recommended)
|
|
14
|
+
* } from '@repo/core/pdf/sections'
|
|
15
|
+
*
|
|
16
|
+
* // Recommended: 5-page layout with combined summary + investment
|
|
17
|
+
* const document: PDFDocument = {
|
|
18
|
+
* pages: [
|
|
19
|
+
* coverSection({ company: 'Acme', contact: 'John', vertical: 'Tech', solutions: 'Automation' }),
|
|
20
|
+
* summarySection({ totalSavings: 50000, automationCount: 2, description: '...' }),
|
|
21
|
+
* ...automations.map(a => automationSection(a)),
|
|
22
|
+
* summaryInvestmentSection({ automations, tier: 'tier2' }) // Combined final page
|
|
23
|
+
* ],
|
|
24
|
+
* metadata: { title: 'Proposal', author: 'Elevasis' }
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* // Legacy: 6-page layout with separate summary table and investment pages
|
|
28
|
+
* // Use tableSummarySection + investmentSection if you need them separate
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
// Section builders
|
|
33
|
+
export { coverSection } from './cover'
|
|
34
|
+
export { summarySection } from './summary'
|
|
35
|
+
export { automationSection } from './automation'
|
|
36
|
+
export { tableSummarySection } from './table-summary'
|
|
37
|
+
export { investmentSection } from './investment'
|
|
38
|
+
export { summaryInvestmentSection } from './summary-investment'
|
|
39
|
+
export { acceptanceSection } from './acceptance'
|
|
40
|
+
|
|
41
|
+
// Shared proposal document builder (used by sandbox, diagnostic, and production)
|
|
42
|
+
export {
|
|
43
|
+
buildProposalDocument,
|
|
44
|
+
generateExecutiveSummary,
|
|
45
|
+
type ProposalDocumentConfig
|
|
46
|
+
} from './proposal-document'
|
|
47
|
+
|
|
48
|
+
// Config types
|
|
49
|
+
export type {
|
|
50
|
+
CoverConfig,
|
|
51
|
+
SummaryConfig,
|
|
52
|
+
AutomationConfig,
|
|
53
|
+
TableSummaryConfig,
|
|
54
|
+
InvestmentConfig,
|
|
55
|
+
SummaryInvestmentConfig,
|
|
56
|
+
AcceptanceConfig
|
|
57
|
+
} from './types'
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Investment Section Builder
|
|
3
|
+
*
|
|
4
|
+
* Creates an investment and next steps page.
|
|
5
|
+
* Consumer provides content only; styling is handled internally.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Page } from '../types'
|
|
9
|
+
import type { InvestmentConfig } from './types'
|
|
10
|
+
|
|
11
|
+
/** Tier descriptions for standard packages */
|
|
12
|
+
const TIER_DESCRIPTIONS: Record<string, string> = {
|
|
13
|
+
tier1: 'Tier 1: Essential Automation - $1,500-3,000/month',
|
|
14
|
+
tier2: 'Tier 2: Growth Automation - $3,000-5,000/month',
|
|
15
|
+
tier3: 'Tier 3: Enterprise Automation - $5,000-10,000/month',
|
|
16
|
+
custom: 'Custom Package - Tailored to your needs'
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Default next steps if not provided */
|
|
20
|
+
const DEFAULT_NEXT_STEPS = [
|
|
21
|
+
'Review this proposal and note any questions',
|
|
22
|
+
'Schedule a follow-up call to discuss details',
|
|
23
|
+
"We'll provide a detailed SOW with timeline",
|
|
24
|
+
'Begin implementation within 2 weeks of approval'
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Creates an investment page with tier info and next steps
|
|
29
|
+
*
|
|
30
|
+
* @param config - Content-only configuration
|
|
31
|
+
* @returns Page object ready for PDFDocument.pages array
|
|
32
|
+
*/
|
|
33
|
+
export function investmentSection(config: InvestmentConfig): Page {
|
|
34
|
+
const {
|
|
35
|
+
tier,
|
|
36
|
+
customTierDescription,
|
|
37
|
+
nextSteps = DEFAULT_NEXT_STEPS,
|
|
38
|
+
contactCta = 'Questions? Reply to this email or book a call at elevasis.io/call'
|
|
39
|
+
} = config
|
|
40
|
+
|
|
41
|
+
const tierDescription = tier === 'custom' && customTierDescription
|
|
42
|
+
? customTierDescription
|
|
43
|
+
: TIER_DESCRIPTIONS[tier]
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
sections: [
|
|
47
|
+
{
|
|
48
|
+
type: 'card',
|
|
49
|
+
title: 'Recommended Package',
|
|
50
|
+
content: [
|
|
51
|
+
{ type: 'text', content: tierDescription, variant: 'subtitle' }
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
{ type: 'text', content: 'Next Steps', variant: 'subtitle' },
|
|
55
|
+
{
|
|
56
|
+
type: 'list',
|
|
57
|
+
ordered: true,
|
|
58
|
+
items: nextSteps
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
type: 'text',
|
|
62
|
+
content: contactCta,
|
|
63
|
+
variant: 'caption'
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
header: { title: 'Investment', variant: 'accent' },
|
|
67
|
+
footer: true
|
|
68
|
+
}
|
|
69
|
+
}
|