@guidify-ai/vapi-studio 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/LICENSE +21 -0
- package/README.md +129 -0
- package/agent/AGENTS.md +42 -0
- package/agent/CLAUDE.md +15 -0
- package/agent/claude/rules/ui-and-api-identity.md +9 -0
- package/agent/claude/rules/vapi-studio-best-practices.md +36 -0
- package/agent/cursor/ui-and-api-identity.mdc +16 -0
- package/agent/cursor/vapi-studio-best-practices.mdc +43 -0
- package/dist/adapters/vapi/vapi-sse.compiler.d.ts +61 -0
- package/dist/adapters/vapi/vapi-sse.compiler.d.ts.map +1 -0
- package/dist/adapters/vapi/vapi-sse.compiler.js +396 -0
- package/dist/adapters/vapi/vapi-sse.compiler.js.map +1 -0
- package/dist/analytics/analytics-tags.d.ts +60 -0
- package/dist/analytics/analytics-tags.d.ts.map +1 -0
- package/dist/analytics/analytics-tags.js +27 -0
- package/dist/analytics/analytics-tags.js.map +1 -0
- package/dist/brain/adapters/chatgpt-brain.adapter.d.ts +27 -0
- package/dist/brain/adapters/chatgpt-brain.adapter.d.ts.map +1 -0
- package/dist/brain/adapters/chatgpt-brain.adapter.js +94 -0
- package/dist/brain/adapters/chatgpt-brain.adapter.js.map +1 -0
- package/dist/brain/adapters/claude-brain.adapter.d.ts +24 -0
- package/dist/brain/adapters/claude-brain.adapter.d.ts.map +1 -0
- package/dist/brain/adapters/claude-brain.adapter.js +96 -0
- package/dist/brain/adapters/claude-brain.adapter.js.map +1 -0
- package/dist/brain/adapters/gemini-brain.adapter.d.ts +24 -0
- package/dist/brain/adapters/gemini-brain.adapter.d.ts.map +1 -0
- package/dist/brain/adapters/gemini-brain.adapter.js +106 -0
- package/dist/brain/adapters/gemini-brain.adapter.js.map +1 -0
- package/dist/brain/adapters/grok-brain.adapter.d.ts +24 -0
- package/dist/brain/adapters/grok-brain.adapter.d.ts.map +1 -0
- package/dist/brain/adapters/grok-brain.adapter.js +90 -0
- package/dist/brain/adapters/grok-brain.adapter.js.map +1 -0
- package/dist/brain/adapters/json-llm-brain.base.d.ts +63 -0
- package/dist/brain/adapters/json-llm-brain.base.d.ts.map +1 -0
- package/dist/brain/adapters/json-llm-brain.base.js +511 -0
- package/dist/brain/adapters/json-llm-brain.base.js.map +1 -0
- package/dist/brain/adapters/mock-brain.adapter.d.ts +32 -0
- package/dist/brain/adapters/mock-brain.adapter.d.ts.map +1 -0
- package/dist/brain/adapters/mock-brain.adapter.js +201 -0
- package/dist/brain/adapters/mock-brain.adapter.js.map +1 -0
- package/dist/brain/adapters/mock-provider-brains.adapter.d.ts +22 -0
- package/dist/brain/adapters/mock-provider-brains.adapter.d.ts.map +1 -0
- package/dist/brain/adapters/mock-provider-brains.adapter.js +48 -0
- package/dist/brain/adapters/mock-provider-brains.adapter.js.map +1 -0
- package/dist/brain/brain-clarify.d.ts +75 -0
- package/dist/brain/brain-clarify.d.ts.map +1 -0
- package/dist/brain/brain-clarify.js +146 -0
- package/dist/brain/brain-clarify.js.map +1 -0
- package/dist/brain/brain-config.d.ts +20 -0
- package/dist/brain/brain-config.d.ts.map +1 -0
- package/dist/brain/brain-config.js +20 -0
- package/dist/brain/brain-config.js.map +1 -0
- package/dist/brain/brain-judge.d.ts +68 -0
- package/dist/brain/brain-judge.d.ts.map +1 -0
- package/dist/brain/brain-judge.js +111 -0
- package/dist/brain/brain-judge.js.map +1 -0
- package/dist/brain/brain-ranking.d.ts +41 -0
- package/dist/brain/brain-ranking.d.ts.map +1 -0
- package/dist/brain/brain-ranking.js +103 -0
- package/dist/brain/brain-ranking.js.map +1 -0
- package/dist/brain/brain-usage.tracker.d.ts +48 -0
- package/dist/brain/brain-usage.tracker.d.ts.map +1 -0
- package/dist/brain/brain-usage.tracker.js +106 -0
- package/dist/brain/brain-usage.tracker.js.map +1 -0
- package/dist/brain/brain.port.d.ts +63 -0
- package/dist/brain/brain.port.d.ts.map +1 -0
- package/dist/brain/brain.port.js +7 -0
- package/dist/brain/brain.port.js.map +1 -0
- package/dist/brain/brain.service.d.ts +14 -0
- package/dist/brain/brain.service.d.ts.map +1 -0
- package/dist/brain/brain.service.js +27 -0
- package/dist/brain/brain.service.js.map +1 -0
- package/dist/brain/claude-cheap-models.d.ts +18 -0
- package/dist/brain/claude-cheap-models.d.ts.map +1 -0
- package/dist/brain/claude-cheap-models.js +53 -0
- package/dist/brain/claude-cheap-models.js.map +1 -0
- package/dist/brain/gemini-cheap-models.d.ts +18 -0
- package/dist/brain/gemini-cheap-models.d.ts.map +1 -0
- package/dist/brain/gemini-cheap-models.js +53 -0
- package/dist/brain/gemini-cheap-models.js.map +1 -0
- package/dist/brain/grok-cheap-models.d.ts +18 -0
- package/dist/brain/grok-cheap-models.d.ts.map +1 -0
- package/dist/brain/grok-cheap-models.js +53 -0
- package/dist/brain/grok-cheap-models.js.map +1 -0
- package/dist/brain/llm-model-pricing.d.ts +29 -0
- package/dist/brain/llm-model-pricing.d.ts.map +1 -0
- package/dist/brain/llm-model-pricing.js +38 -0
- package/dist/brain/llm-model-pricing.js.map +1 -0
- package/dist/brain/openai-cheap-models.d.ts +34 -0
- package/dist/brain/openai-cheap-models.d.ts.map +1 -0
- package/dist/brain/openai-cheap-models.js +72 -0
- package/dist/brain/openai-cheap-models.js.map +1 -0
- package/dist/brain/prompt-injection-guard.d.ts +34 -0
- package/dist/brain/prompt-injection-guard.d.ts.map +1 -0
- package/dist/brain/prompt-injection-guard.js +109 -0
- package/dist/brain/prompt-injection-guard.js.map +1 -0
- package/dist/channel/channel-tools.d.ts +72 -0
- package/dist/channel/channel-tools.d.ts.map +1 -0
- package/dist/channel/channel-tools.js +131 -0
- package/dist/channel/channel-tools.js.map +1 -0
- package/dist/conversation/call-turn-queue.d.ts +64 -0
- package/dist/conversation/call-turn-queue.d.ts.map +1 -0
- package/dist/conversation/call-turn-queue.js +156 -0
- package/dist/conversation/call-turn-queue.js.map +1 -0
- package/dist/conversation/conversation-bootstrap.service.d.ts +60 -0
- package/dist/conversation/conversation-bootstrap.service.d.ts.map +1 -0
- package/dist/conversation/conversation-bootstrap.service.js +383 -0
- package/dist/conversation/conversation-bootstrap.service.js.map +1 -0
- package/dist/conversation/conversation-entry.d.ts +38 -0
- package/dist/conversation/conversation-entry.d.ts.map +1 -0
- package/dist/conversation/conversation-entry.js +17 -0
- package/dist/conversation/conversation-entry.js.map +1 -0
- package/dist/conversation/conversation-history.d.ts +31 -0
- package/dist/conversation/conversation-history.d.ts.map +1 -0
- package/dist/conversation/conversation-history.js +53 -0
- package/dist/conversation/conversation-history.js.map +1 -0
- package/dist/conversation/conversation-limits.d.ts +49 -0
- package/dist/conversation/conversation-limits.d.ts.map +1 -0
- package/dist/conversation/conversation-limits.js +44 -0
- package/dist/conversation/conversation-limits.js.map +1 -0
- package/dist/conversation/conversation-resume.service.d.ts +39 -0
- package/dist/conversation/conversation-resume.service.d.ts.map +1 -0
- package/dist/conversation/conversation-resume.service.js +234 -0
- package/dist/conversation/conversation-resume.service.js.map +1 -0
- package/dist/conversation/conversation-schema.d.ts +23 -0
- package/dist/conversation/conversation-schema.d.ts.map +1 -0
- package/dist/conversation/conversation-schema.js +3 -0
- package/dist/conversation/conversation-schema.js.map +1 -0
- package/dist/conversation/listen-expectation.d.ts +145 -0
- package/dist/conversation/listen-expectation.d.ts.map +1 -0
- package/dist/conversation/listen-expectation.js +219 -0
- package/dist/conversation/listen-expectation.js.map +1 -0
- package/dist/conversation/listen-timeout.d.ts +42 -0
- package/dist/conversation/listen-timeout.d.ts.map +1 -0
- package/dist/conversation/listen-timeout.js +57 -0
- package/dist/conversation/listen-timeout.js.map +1 -0
- package/dist/conversation/supervised-conversation.d.ts +64 -0
- package/dist/conversation/supervised-conversation.d.ts.map +1 -0
- package/dist/conversation/supervised-conversation.js +198 -0
- package/dist/conversation/supervised-conversation.js.map +1 -0
- package/dist/conversation/supervised-conversation.registry.d.ts +14 -0
- package/dist/conversation/supervised-conversation.registry.d.ts.map +1 -0
- package/dist/conversation/supervised-conversation.registry.js +47 -0
- package/dist/conversation/supervised-conversation.registry.js.map +1 -0
- package/dist/conversation/types.d.ts +52 -0
- package/dist/conversation/types.d.ts.map +1 -0
- package/dist/conversation/types.js +3 -0
- package/dist/conversation/types.js.map +1 -0
- package/dist/events/conversation-console.d.ts +17 -0
- package/dist/events/conversation-console.d.ts.map +1 -0
- package/dist/events/conversation-console.js +863 -0
- package/dist/events/conversation-console.js.map +1 -0
- package/dist/events/daily-log.driver.d.ts +35 -0
- package/dist/events/daily-log.driver.d.ts.map +1 -0
- package/dist/events/daily-log.driver.js +206 -0
- package/dist/events/daily-log.driver.js.map +1 -0
- package/dist/events/event.service.d.ts +24 -0
- package/dist/events/event.service.d.ts.map +1 -0
- package/dist/events/event.service.js +141 -0
- package/dist/events/event.service.js.map +1 -0
- package/dist/events/route-forensics.d.ts +38 -0
- package/dist/events/route-forensics.d.ts.map +1 -0
- package/dist/events/route-forensics.js +85 -0
- package/dist/events/route-forensics.js.map +1 -0
- package/dist/events/studio-event-bus.d.ts +17 -0
- package/dist/events/studio-event-bus.d.ts.map +1 -0
- package/dist/events/studio-event-bus.js +37 -0
- package/dist/events/studio-event-bus.js.map +1 -0
- package/dist/events/studio-event.d.ts +44 -0
- package/dist/events/studio-event.d.ts.map +1 -0
- package/dist/events/studio-event.js +27 -0
- package/dist/events/studio-event.js.map +1 -0
- package/dist/flow/condition.d.ts +35 -0
- package/dist/flow/condition.d.ts.map +1 -0
- package/dist/flow/condition.js +246 -0
- package/dist/flow/condition.js.map +1 -0
- package/dist/flow/flow-loader.d.ts +71 -0
- package/dist/flow/flow-loader.d.ts.map +1 -0
- package/dist/flow/flow-loader.js +182 -0
- package/dist/flow/flow-loader.js.map +1 -0
- package/dist/forms/form-html.d.ts +30 -0
- package/dist/forms/form-html.d.ts.map +1 -0
- package/dist/forms/form-html.js +130 -0
- package/dist/forms/form-html.js.map +1 -0
- package/dist/forms/form.tokens.d.ts +3 -0
- package/dist/forms/form.tokens.d.ts.map +1 -0
- package/dist/forms/form.tokens.js +6 -0
- package/dist/forms/form.tokens.js.map +1 -0
- package/dist/forms/form.types.d.ts +81 -0
- package/dist/forms/form.types.d.ts.map +1 -0
- package/dist/forms/form.types.js +36 -0
- package/dist/forms/form.types.js.map +1 -0
- package/dist/forms/forms.service.d.ts +52 -0
- package/dist/forms/forms.service.d.ts.map +1 -0
- package/dist/forms/forms.service.js +434 -0
- package/dist/forms/forms.service.js.map +1 -0
- package/dist/forms/noop-form-dispose.adapter.d.ts +12 -0
- package/dist/forms/noop-form-dispose.adapter.d.ts.map +1 -0
- package/dist/forms/noop-form-dispose.adapter.js +27 -0
- package/dist/forms/noop-form-dispose.adapter.js.map +1 -0
- package/dist/forms/twilio-sms-form-dispose.adapter.d.ts +33 -0
- package/dist/forms/twilio-sms-form-dispose.adapter.d.ts.map +1 -0
- package/dist/forms/twilio-sms-form-dispose.adapter.js +125 -0
- package/dist/forms/twilio-sms-form-dispose.adapter.js.map +1 -0
- package/dist/forms/twilio-sms.env.d.ts +62 -0
- package/dist/forms/twilio-sms.env.d.ts.map +1 -0
- package/dist/forms/twilio-sms.env.js +147 -0
- package/dist/forms/twilio-sms.env.js.map +1 -0
- package/dist/forms/twilio-sms.sender.d.ts +27 -0
- package/dist/forms/twilio-sms.sender.d.ts.map +1 -0
- package/dist/forms/twilio-sms.sender.js +75 -0
- package/dist/forms/twilio-sms.sender.js.map +1 -0
- package/dist/identity/email-parse.d.ts +20 -0
- package/dist/identity/email-parse.d.ts.map +1 -0
- package/dist/identity/email-parse.js +102 -0
- package/dist/identity/email-parse.js.map +1 -0
- package/dist/identity/index.d.ts +17 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +23 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/index.d.ts +108 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +300 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/integration-client.d.ts +41 -0
- package/dist/integrations/integration-client.d.ts.map +1 -0
- package/dist/integrations/integration-client.js +152 -0
- package/dist/integrations/integration-client.js.map +1 -0
- package/dist/integrations/jwt-hmac.d.ts +33 -0
- package/dist/integrations/jwt-hmac.d.ts.map +1 -0
- package/dist/integrations/jwt-hmac.js +108 -0
- package/dist/integrations/jwt-hmac.js.map +1 -0
- package/dist/intention/code-intention.d.ts +94 -0
- package/dist/intention/code-intention.d.ts.map +1 -0
- package/dist/intention/code-intention.js +89 -0
- package/dist/intention/code-intention.js.map +1 -0
- package/dist/intention/intention-constants.d.ts +37 -0
- package/dist/intention/intention-constants.d.ts.map +1 -0
- package/dist/intention/intention-constants.js +37 -0
- package/dist/intention/intention-constants.js.map +1 -0
- package/dist/intentions/standard-intentions.d.ts +26 -0
- package/dist/intentions/standard-intentions.d.ts.map +1 -0
- package/dist/intentions/standard-intentions.js +28 -0
- package/dist/intentions/standard-intentions.js.map +1 -0
- package/dist/node/agent-node.d.ts +156 -0
- package/dist/node/agent-node.d.ts.map +1 -0
- package/dist/node/agent-node.js +179 -0
- package/dist/node/agent-node.js.map +1 -0
- package/dist/node/catch-directive.d.ts +33 -0
- package/dist/node/catch-directive.d.ts.map +1 -0
- package/dist/node/catch-directive.js +41 -0
- package/dist/node/catch-directive.js.map +1 -0
- package/dist/output/conversation-output.d.ts +113 -0
- package/dist/output/conversation-output.d.ts.map +1 -0
- package/dist/output/conversation-output.js +100 -0
- package/dist/output/conversation-output.js.map +1 -0
- package/dist/persistence/conversation.entity.d.ts +27 -0
- package/dist/persistence/conversation.entity.d.ts.map +1 -0
- package/dist/persistence/conversation.entity.js +115 -0
- package/dist/persistence/conversation.entity.js.map +1 -0
- package/dist/persistence/conversation.repository.d.ts +82 -0
- package/dist/persistence/conversation.repository.d.ts.map +1 -0
- package/dist/persistence/conversation.repository.js +277 -0
- package/dist/persistence/conversation.repository.js.map +1 -0
- package/dist/persistence/project.entity.d.ts +12 -0
- package/dist/persistence/project.entity.d.ts.map +1 -0
- package/dist/persistence/project.entity.js +46 -0
- package/dist/persistence/project.entity.js.map +1 -0
- package/dist/persistence/project.repository.d.ts +17 -0
- package/dist/persistence/project.repository.d.ts.map +1 -0
- package/dist/persistence/project.repository.js +69 -0
- package/dist/persistence/project.repository.js.map +1 -0
- package/dist/persistence/provider-ingress.entity.d.ts +18 -0
- package/dist/persistence/provider-ingress.entity.d.ts.map +1 -0
- package/dist/persistence/provider-ingress.entity.js +91 -0
- package/dist/persistence/provider-ingress.entity.js.map +1 -0
- package/dist/persistence/provider-ingress.repository.d.ts +21 -0
- package/dist/persistence/provider-ingress.repository.d.ts.map +1 -0
- package/dist/persistence/provider-ingress.repository.js +76 -0
- package/dist/persistence/provider-ingress.repository.js.map +1 -0
- package/dist/studio-ui/assets/index-BGd2OhLv.js +84 -0
- package/dist/studio-ui/assets/index-BGd2OhLv.js.map +1 -0
- package/dist/studio-ui/assets/index-DnJos5x2.css +1 -0
- package/dist/studio-ui/index.html +13 -0
- package/dist/studio-ui-mount/index.d.ts +6 -0
- package/dist/studio-ui-mount/index.d.ts.map +1 -0
- package/dist/studio-ui-mount/index.js +13 -0
- package/dist/studio-ui-mount/index.js.map +1 -0
- package/dist/studio-ui-mount/resolve-studio-ui-root.d.ts +6 -0
- package/dist/studio-ui-mount/resolve-studio-ui-root.d.ts.map +1 -0
- package/dist/studio-ui-mount/resolve-studio-ui-root.js +25 -0
- package/dist/studio-ui-mount/resolve-studio-ui-root.js.map +1 -0
- package/dist/studio-ui-mount/studio-spa.controller.d.ts +18 -0
- package/dist/studio-ui-mount/studio-spa.controller.d.ts.map +1 -0
- package/dist/studio-ui-mount/studio-spa.controller.js +57 -0
- package/dist/studio-ui-mount/studio-spa.controller.js.map +1 -0
- package/dist/studio-ui-mount/studio-ui.module.d.ts +15 -0
- package/dist/studio-ui-mount/studio-ui.module.d.ts.map +1 -0
- package/dist/studio-ui-mount/studio-ui.module.js +47 -0
- package/dist/studio-ui-mount/studio-ui.module.js.map +1 -0
- package/dist/studio-ui-mount/studio-ui.tokens.d.ts +2 -0
- package/dist/studio-ui-mount/studio-ui.tokens.d.ts.map +1 -0
- package/dist/studio-ui-mount/studio-ui.tokens.js +5 -0
- package/dist/studio-ui-mount/studio-ui.tokens.js.map +1 -0
- package/dist/supervisor/supervisor-cascade.d.ts +55 -0
- package/dist/supervisor/supervisor-cascade.d.ts.map +1 -0
- package/dist/supervisor/supervisor-cascade.js +261 -0
- package/dist/supervisor/supervisor-cascade.js.map +1 -0
- package/dist/supervisor/supervisor-engine.d.ts +9 -0
- package/dist/supervisor/supervisor-engine.d.ts.map +1 -0
- package/dist/supervisor/supervisor-engine.js +64 -0
- package/dist/supervisor/supervisor-engine.js.map +1 -0
- package/dist/supervisor/supervisor-limits.d.ts +8 -0
- package/dist/supervisor/supervisor-limits.d.ts.map +1 -0
- package/dist/supervisor/supervisor-limits.js +36 -0
- package/dist/supervisor/supervisor-limits.js.map +1 -0
- package/dist/supervisor/supervisor-node-exec.d.ts +39 -0
- package/dist/supervisor/supervisor-node-exec.d.ts.map +1 -0
- package/dist/supervisor/supervisor-node-exec.js +201 -0
- package/dist/supervisor/supervisor-node-exec.js.map +1 -0
- package/dist/supervisor/supervisor-orchestration.d.ts +24 -0
- package/dist/supervisor/supervisor-orchestration.d.ts.map +1 -0
- package/dist/supervisor/supervisor-orchestration.js +395 -0
- package/dist/supervisor/supervisor-orchestration.js.map +1 -0
- package/dist/supervisor/supervisor-portal.d.ts +75 -0
- package/dist/supervisor/supervisor-portal.d.ts.map +1 -0
- package/dist/supervisor/supervisor-portal.js +320 -0
- package/dist/supervisor/supervisor-portal.js.map +1 -0
- package/dist/supervisor/supervisor-route.d.ts +53 -0
- package/dist/supervisor/supervisor-route.d.ts.map +1 -0
- package/dist/supervisor/supervisor-route.js +308 -0
- package/dist/supervisor/supervisor-route.js.map +1 -0
- package/dist/supervisor/supervisor-special-turns.d.ts +34 -0
- package/dist/supervisor/supervisor-special-turns.d.ts.map +1 -0
- package/dist/supervisor/supervisor-special-turns.js +308 -0
- package/dist/supervisor/supervisor-special-turns.js.map +1 -0
- package/dist/supervisor/supervisor.d.ts +44 -0
- package/dist/supervisor/supervisor.d.ts.map +1 -0
- package/dist/supervisor/supervisor.js +79 -0
- package/dist/supervisor/supervisor.js.map +1 -0
- package/dist/supervisor/supervisor.types.d.ts +71 -0
- package/dist/supervisor/supervisor.types.d.ts.map +1 -0
- package/dist/supervisor/supervisor.types.js +8 -0
- package/dist/supervisor/supervisor.types.js.map +1 -0
- package/dist/tasks/studio-task-queue.d.ts +93 -0
- package/dist/tasks/studio-task-queue.d.ts.map +1 -0
- package/dist/tasks/studio-task-queue.js +226 -0
- package/dist/tasks/studio-task-queue.js.map +1 -0
- package/dist/util/studio-env.d.ts +7 -0
- package/dist/util/studio-env.d.ts.map +1 -0
- package/dist/util/studio-env.js +32 -0
- package/dist/util/studio-env.js.map +1 -0
- package/dist/vapi-studio.module.d.ts +55 -0
- package/dist/vapi-studio.module.d.ts.map +1 -0
- package/dist/vapi-studio.module.js +166 -0
- package/dist/vapi-studio.module.js.map +1 -0
- package/dist/workflow/workflow-handoff.service.d.ts +29 -0
- package/dist/workflow/workflow-handoff.service.d.ts.map +1 -0
- package/dist/workflow/workflow-handoff.service.js +165 -0
- package/dist/workflow/workflow-handoff.service.js.map +1 -0
- package/dist/workflow/workflow-loader.d.ts +48 -0
- package/dist/workflow/workflow-loader.d.ts.map +1 -0
- package/dist/workflow/workflow-loader.js +87 -0
- package/dist/workflow/workflow-loader.js.map +1 -0
- package/docs/README.md +69 -0
- package/docs/assets/deterministic-assistant-flow.svg +128 -0
- package/docs/assets/vapi-studio-stack.svg +26 -0
- package/docs/best-practices/README.md +37 -0
- package/docs/best-practices/brain-and-prompt-injection.md +70 -0
- package/docs/best-practices/conversation-design.md +152 -0
- package/docs/best-practices/debugging-and-observability.md +49 -0
- package/docs/best-practices/documentation-layers.md +31 -0
- package/docs/best-practices/identity-and-pii.md +66 -0
- package/docs/best-practices/nodes-and-listens.md +116 -0
- package/docs/best-practices/ui-and-api-identity.md +51 -0
- package/docs/building-apps/creating-an-app.md +59 -0
- package/docs/building-apps/example-apps.md +23 -0
- package/docs/building-apps/overview.md +27 -0
- package/docs/getting-started/installation.md +52 -0
- package/docs/getting-started/introduction.md +23 -0
- package/docs/getting-started/quick-start.md +23 -0
- package/docs/guide/concepts.md +103 -0
- package/docs/guide/forms.md +102 -0
- package/docs/guide/handbook.md +21 -0
- package/docs/guide/introduction.md +56 -0
- package/docs/guide/module-setup.md +68 -0
- package/docs/guide/vapi-adapter.md +70 -0
- package/docs/guide/workflow-squad.md +59 -0
- package/docs/guides/agents.md +85 -0
- package/docs/guides/docker-compose.events.stub.yaml +27 -0
- package/docs/guides/documentation.md +13 -0
- package/docs/guides/extending-events.md +155 -0
- package/docs/guides/node-conventions.md +59 -0
- package/docs/guides/speckit.md +56 -0
- package/docs/reference/data-model.md +79 -0
- package/docs/reference/environment-variables.md +60 -0
- package/docs/reference/events-and-logging.md +137 -0
- package/docs/reference/flow-schema.md +79 -0
- package/docs/reference/runtime-api.md +708 -0
- package/docs/reference/security.md +41 -0
- package/docs/reference/standard-intentions.md +49 -0
- package/docs/reference/testing.md +15 -0
- package/docs/samples/events/nest-listener.example.ts +17 -0
- package/docs/samples/events/redis-bridge.example.ts +44 -0
- package/package.json +81 -0
- package/scripts/fix-access-modifiers.mjs +85 -0
- package/scripts/install-agent-refs.cjs +196 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"twilio-sms-form-dispose.adapter.js","sourceRoot":"","sources":["../../src/forms/twilio-sms-form-dispose.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reserved Twilio SMS env contract for form sendout.
|
|
3
|
+
* Live sends require the optional peer package `twilio` and dry-run off.
|
|
4
|
+
*/
|
|
5
|
+
export declare const TWILIO_SMS_ENV: {
|
|
6
|
+
readonly accountSid: "TWILIO_ACCOUNT_SID";
|
|
7
|
+
readonly authToken: "TWILIO_AUTH_TOKEN";
|
|
8
|
+
readonly fromNumber: "TWILIO_FROM_NUMBER";
|
|
9
|
+
readonly messagingServiceSid: "TWILIO_MESSAGING_SERVICE_SID";
|
|
10
|
+
readonly dryRun: "TWILIO_SMS_DRY_RUN";
|
|
11
|
+
};
|
|
12
|
+
export interface TwilioSmsConfig {
|
|
13
|
+
accountSid: string;
|
|
14
|
+
authToken: string;
|
|
15
|
+
/** E.164 from-number (mutually exclusive with messagingServiceSid in practice). */
|
|
16
|
+
fromNumber?: string;
|
|
17
|
+
messagingServiceSid?: string;
|
|
18
|
+
/**
|
|
19
|
+
* When true (default), log the intended SMS and do not call Twilio.
|
|
20
|
+
* Set `TWILIO_SMS_DRY_RUN=0` only when ready for live traffic.
|
|
21
|
+
*/
|
|
22
|
+
dryRun: boolean;
|
|
23
|
+
}
|
|
24
|
+
export type TwilioSmsConfigStatus = {
|
|
25
|
+
ok: true;
|
|
26
|
+
config: TwilioSmsConfig;
|
|
27
|
+
} | {
|
|
28
|
+
ok: false;
|
|
29
|
+
reason: string;
|
|
30
|
+
config: TwilioSmsConfig;
|
|
31
|
+
};
|
|
32
|
+
/** Read reserved Twilio env vars (does not validate completeness for live send). */
|
|
33
|
+
export declare function readTwilioSmsConfig(env?: NodeJS.ProcessEnv): TwilioSmsConfig;
|
|
34
|
+
/**
|
|
35
|
+
* Credentials ready for a live Twilio API call (dry-run may still be on).
|
|
36
|
+
* Needs account + token + (from number XOR messaging service).
|
|
37
|
+
*/
|
|
38
|
+
export declare function twilioSmsCredentialsReady(config: TwilioSmsConfig): boolean;
|
|
39
|
+
export declare function resolveTwilioSmsConfig(env?: NodeJS.ProcessEnv): TwilioSmsConfigStatus;
|
|
40
|
+
/** Normalize NA mobile / E.164 for Twilio `to`. */
|
|
41
|
+
export declare function normalizeSmsToE164(raw: string): string | null;
|
|
42
|
+
export interface TwilioSmsDisposeContext {
|
|
43
|
+
/** Destination mobile (E.164 or 10-digit NA). Aliases: `to`, `phone`. */
|
|
44
|
+
contactPhone?: string;
|
|
45
|
+
to?: string;
|
|
46
|
+
phone?: string;
|
|
47
|
+
/** Absolute HTTPS URL to the fillable form. */
|
|
48
|
+
formUrl?: string;
|
|
49
|
+
/** Optional full SMS body (otherwise a short default with formUrl). */
|
|
50
|
+
body?: string;
|
|
51
|
+
}
|
|
52
|
+
export declare function pickSmsDestination(ctx: Record<string, unknown> | undefined): string | null;
|
|
53
|
+
export declare function pickSmsFormUrl(ctx: Record<string, unknown> | undefined): string | null;
|
|
54
|
+
/**
|
|
55
|
+
* Absolute form URL for SMS: prefer `disposeContext.formUrl`, else
|
|
56
|
+
* `{PUBLIC_BASE_URL}/{PROJECT_UUID}/forms/{exposeId}` when PROJECT_UUID is set
|
|
57
|
+
* (ngrok-helper routes by UUID), else `{PUBLIC_BASE_URL}/forms/{exposeId}`.
|
|
58
|
+
*/
|
|
59
|
+
export declare function resolveSmsFormUrl(ctx: Record<string, unknown> | undefined, exposeId: string, env?: NodeJS.ProcessEnv): string | null;
|
|
60
|
+
export declare function buildDefaultSmsBody(formUrl: string): string;
|
|
61
|
+
export declare function resolveSmsBody(ctx: Record<string, unknown> | undefined, formUrl: string): string;
|
|
62
|
+
//# sourceMappingURL=twilio-sms.env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"twilio-sms.env.d.ts","sourceRoot":"","sources":["../../src/forms/twilio-sms.env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,cAAc;;;;;;CAMjB,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAAC;AAU3D,oFAAoF;AACpF,wBAAgB,mBAAmB,CACjC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,eAAe,CAajB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAK1E;AAED,wBAAgB,sBAAsB,CACpC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,qBAAqB,CA2BvB;AAED,mDAAmD;AACnD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS7D;AAED,MAAM,WAAW,uBAAuB;IACtC,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACvC,MAAM,GAAG,IAAI,CASf;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACvC,MAAM,GAAG,IAAI,CAIf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACxC,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,IAAI,CAYf;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACxC,OAAO,EAAE,MAAM,GACd,MAAM,CAKR"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Reserved Twilio SMS env contract for form sendout.
|
|
4
|
+
* Live sends require the optional peer package `twilio` and dry-run off.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.TWILIO_SMS_ENV = void 0;
|
|
8
|
+
exports.readTwilioSmsConfig = readTwilioSmsConfig;
|
|
9
|
+
exports.twilioSmsCredentialsReady = twilioSmsCredentialsReady;
|
|
10
|
+
exports.resolveTwilioSmsConfig = resolveTwilioSmsConfig;
|
|
11
|
+
exports.normalizeSmsToE164 = normalizeSmsToE164;
|
|
12
|
+
exports.pickSmsDestination = pickSmsDestination;
|
|
13
|
+
exports.pickSmsFormUrl = pickSmsFormUrl;
|
|
14
|
+
exports.resolveSmsFormUrl = resolveSmsFormUrl;
|
|
15
|
+
exports.buildDefaultSmsBody = buildDefaultSmsBody;
|
|
16
|
+
exports.resolveSmsBody = resolveSmsBody;
|
|
17
|
+
exports.TWILIO_SMS_ENV = {
|
|
18
|
+
accountSid: 'TWILIO_ACCOUNT_SID',
|
|
19
|
+
authToken: 'TWILIO_AUTH_TOKEN',
|
|
20
|
+
fromNumber: 'TWILIO_FROM_NUMBER',
|
|
21
|
+
messagingServiceSid: 'TWILIO_MESSAGING_SERVICE_SID',
|
|
22
|
+
dryRun: 'TWILIO_SMS_DRY_RUN',
|
|
23
|
+
};
|
|
24
|
+
function envFlag(name, defaultOn) {
|
|
25
|
+
const raw = (process.env[name] ?? (defaultOn ? '1' : '0')).trim().toLowerCase();
|
|
26
|
+
if (defaultOn) {
|
|
27
|
+
return !['0', 'false', 'no', 'off'].includes(raw);
|
|
28
|
+
}
|
|
29
|
+
return ['1', 'true', 'yes', 'on'].includes(raw);
|
|
30
|
+
}
|
|
31
|
+
/** Read reserved Twilio env vars (does not validate completeness for live send). */
|
|
32
|
+
function readTwilioSmsConfig(env = process.env) {
|
|
33
|
+
const accountSid = (env[exports.TWILIO_SMS_ENV.accountSid] ?? '').trim();
|
|
34
|
+
const authToken = (env[exports.TWILIO_SMS_ENV.authToken] ?? '').trim();
|
|
35
|
+
const fromNumber = (env[exports.TWILIO_SMS_ENV.fromNumber] ?? '').trim() || undefined;
|
|
36
|
+
const messagingServiceSid = (env[exports.TWILIO_SMS_ENV.messagingServiceSid] ?? '').trim() || undefined;
|
|
37
|
+
return {
|
|
38
|
+
accountSid,
|
|
39
|
+
authToken,
|
|
40
|
+
fromNumber,
|
|
41
|
+
messagingServiceSid,
|
|
42
|
+
dryRun: envFlag(exports.TWILIO_SMS_ENV.dryRun, true),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Credentials ready for a live Twilio API call (dry-run may still be on).
|
|
47
|
+
* Needs account + token + (from number XOR messaging service).
|
|
48
|
+
*/
|
|
49
|
+
function twilioSmsCredentialsReady(config) {
|
|
50
|
+
if (!config.accountSid || !config.authToken)
|
|
51
|
+
return false;
|
|
52
|
+
const from = Boolean(config.fromNumber);
|
|
53
|
+
const ms = Boolean(config.messagingServiceSid);
|
|
54
|
+
return from !== ms; // exactly one sender identity
|
|
55
|
+
}
|
|
56
|
+
function resolveTwilioSmsConfig(env = process.env) {
|
|
57
|
+
const config = readTwilioSmsConfig(env);
|
|
58
|
+
if (config.dryRun) {
|
|
59
|
+
return { ok: true, config };
|
|
60
|
+
}
|
|
61
|
+
if (!config.accountSid || !config.authToken) {
|
|
62
|
+
return {
|
|
63
|
+
ok: false,
|
|
64
|
+
reason: `Set ${exports.TWILIO_SMS_ENV.accountSid} and ${exports.TWILIO_SMS_ENV.authToken} (or keep ${exports.TWILIO_SMS_ENV.dryRun}=1)`,
|
|
65
|
+
config,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (!config.fromNumber && !config.messagingServiceSid) {
|
|
69
|
+
return {
|
|
70
|
+
ok: false,
|
|
71
|
+
reason: `Set ${exports.TWILIO_SMS_ENV.fromNumber} or ${exports.TWILIO_SMS_ENV.messagingServiceSid}`,
|
|
72
|
+
config,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if (config.fromNumber && config.messagingServiceSid) {
|
|
76
|
+
return {
|
|
77
|
+
ok: false,
|
|
78
|
+
reason: `Set only one of ${exports.TWILIO_SMS_ENV.fromNumber} / ${exports.TWILIO_SMS_ENV.messagingServiceSid}`,
|
|
79
|
+
config,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return { ok: true, config };
|
|
83
|
+
}
|
|
84
|
+
/** Normalize NA mobile / E.164 for Twilio `to`. */
|
|
85
|
+
function normalizeSmsToE164(raw) {
|
|
86
|
+
const trimmed = raw.trim();
|
|
87
|
+
if (!trimmed)
|
|
88
|
+
return null;
|
|
89
|
+
if (/^\+[1-9]\d{7,14}$/.test(trimmed))
|
|
90
|
+
return trimmed;
|
|
91
|
+
const digits = trimmed.replace(/\D/g, '');
|
|
92
|
+
if (digits.length === 10)
|
|
93
|
+
return `+1${digits}`;
|
|
94
|
+
if (digits.length === 11 && digits.startsWith('1'))
|
|
95
|
+
return `+${digits}`;
|
|
96
|
+
if (digits.length >= 8 && digits.length <= 15)
|
|
97
|
+
return `+${digits}`;
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
function pickSmsDestination(ctx) {
|
|
101
|
+
if (!ctx)
|
|
102
|
+
return null;
|
|
103
|
+
for (const key of ['contactPhone', 'to', 'phone']) {
|
|
104
|
+
const v = ctx[key];
|
|
105
|
+
if (typeof v === 'string' && v.trim()) {
|
|
106
|
+
return normalizeSmsToE164(v);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
function pickSmsFormUrl(ctx) {
|
|
112
|
+
if (!ctx)
|
|
113
|
+
return null;
|
|
114
|
+
const v = ctx.formUrl;
|
|
115
|
+
return typeof v === 'string' && v.trim() ? v.trim() : null;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Absolute form URL for SMS: prefer `disposeContext.formUrl`, else
|
|
119
|
+
* `{PUBLIC_BASE_URL}/{PROJECT_UUID}/forms/{exposeId}` when PROJECT_UUID is set
|
|
120
|
+
* (ngrok-helper routes by UUID), else `{PUBLIC_BASE_URL}/forms/{exposeId}`.
|
|
121
|
+
*/
|
|
122
|
+
function resolveSmsFormUrl(ctx, exposeId, env = process.env) {
|
|
123
|
+
const fromCtx = pickSmsFormUrl(ctx);
|
|
124
|
+
if (fromCtx)
|
|
125
|
+
return fromCtx;
|
|
126
|
+
const id = typeof exposeId === 'string' ? exposeId.trim() : '';
|
|
127
|
+
if (!id)
|
|
128
|
+
return null;
|
|
129
|
+
const base = (env.PUBLIC_BASE_URL ?? '').trim().replace(/\/$/, '');
|
|
130
|
+
if (!base)
|
|
131
|
+
return null;
|
|
132
|
+
const projectUuid = (env.PROJECT_UUID ?? '').trim().toLowerCase();
|
|
133
|
+
if (projectUuid) {
|
|
134
|
+
return `${base}/${projectUuid}/forms/${id}`;
|
|
135
|
+
}
|
|
136
|
+
return `${base}/forms/${id}`;
|
|
137
|
+
}
|
|
138
|
+
function buildDefaultSmsBody(formUrl) {
|
|
139
|
+
return `Please fill out this short form: ${formUrl}`;
|
|
140
|
+
}
|
|
141
|
+
function resolveSmsBody(ctx, formUrl) {
|
|
142
|
+
if (ctx && typeof ctx.body === 'string' && ctx.body.trim()) {
|
|
143
|
+
return ctx.body.trim();
|
|
144
|
+
}
|
|
145
|
+
return buildDefaultSmsBody(formUrl);
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=twilio-sms.env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"twilio-sms.env.js","sourceRoot":"","sources":["../../src/forms/twilio-sms.env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional Twilio REST sender — loads peer package `twilio` only for live sends.
|
|
3
|
+
*/
|
|
4
|
+
import type { TwilioSmsConfig } from './twilio-sms.env';
|
|
5
|
+
export interface TwilioSmsSendInput {
|
|
6
|
+
to: string;
|
|
7
|
+
body: string;
|
|
8
|
+
}
|
|
9
|
+
export interface TwilioSmsSendResult {
|
|
10
|
+
sid: string;
|
|
11
|
+
dryRun: boolean;
|
|
12
|
+
to: string;
|
|
13
|
+
body: string;
|
|
14
|
+
}
|
|
15
|
+
export interface TwilioSmsSender {
|
|
16
|
+
send(input: TwilioSmsSendInput): Promise<TwilioSmsSendResult>;
|
|
17
|
+
}
|
|
18
|
+
export declare class DryRunTwilioSmsSender implements TwilioSmsSender {
|
|
19
|
+
send(input: TwilioSmsSendInput): Promise<TwilioSmsSendResult>;
|
|
20
|
+
}
|
|
21
|
+
export declare class SdkTwilioSmsSender implements TwilioSmsSender {
|
|
22
|
+
private readonly config;
|
|
23
|
+
constructor(config: TwilioSmsConfig);
|
|
24
|
+
send(input: TwilioSmsSendInput): Promise<TwilioSmsSendResult>;
|
|
25
|
+
}
|
|
26
|
+
export declare function createTwilioSmsSender(config: TwilioSmsConfig): TwilioSmsSender;
|
|
27
|
+
//# sourceMappingURL=twilio-sms.sender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"twilio-sms.sender.d.ts","sourceRoot":"","sources":["../../src/forms/twilio-sms.sender.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC/D;AAED,qBAAa,qBAAsB,YAAW,eAAe;IAC9C,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAQ3E;AAmCD,qBAAa,kBAAmB,YAAW,eAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;IAE9C,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAoB3E;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,eAAe,GACtB,eAAe,CAKjB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Optional Twilio REST sender — loads peer package `twilio` only for live sends.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SdkTwilioSmsSender = exports.DryRunTwilioSmsSender = void 0;
|
|
7
|
+
exports.createTwilioSmsSender = createTwilioSmsSender;
|
|
8
|
+
const module_1 = require("module");
|
|
9
|
+
class DryRunTwilioSmsSender {
|
|
10
|
+
async send(input) {
|
|
11
|
+
return {
|
|
12
|
+
sid: `dryrun_${Date.now()}`,
|
|
13
|
+
dryRun: true,
|
|
14
|
+
to: input.to,
|
|
15
|
+
body: input.body,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.DryRunTwilioSmsSender = DryRunTwilioSmsSender;
|
|
20
|
+
function loadTwilioFactory() {
|
|
21
|
+
try {
|
|
22
|
+
const require = (0, module_1.createRequire)(__filename);
|
|
23
|
+
const mod = require('twilio');
|
|
24
|
+
const factory = typeof mod === 'function'
|
|
25
|
+
? mod
|
|
26
|
+
: typeof mod === 'object' &&
|
|
27
|
+
mod !== null &&
|
|
28
|
+
typeof mod.default === 'function'
|
|
29
|
+
? (mod.default)
|
|
30
|
+
: null;
|
|
31
|
+
if (!factory) {
|
|
32
|
+
throw new Error('twilio module did not export a client factory');
|
|
33
|
+
}
|
|
34
|
+
return factory;
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
38
|
+
throw new Error(`Install optional peer dependency "twilio" for live SMS sendout (${message})`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
class SdkTwilioSmsSender {
|
|
42
|
+
config;
|
|
43
|
+
constructor(config) {
|
|
44
|
+
this.config = config;
|
|
45
|
+
}
|
|
46
|
+
async send(input) {
|
|
47
|
+
const create = loadTwilioFactory();
|
|
48
|
+
const client = create(this.config.accountSid, this.config.authToken);
|
|
49
|
+
const params = {
|
|
50
|
+
to: input.to,
|
|
51
|
+
body: input.body,
|
|
52
|
+
};
|
|
53
|
+
if (this.config.messagingServiceSid) {
|
|
54
|
+
params.messagingServiceSid = this.config.messagingServiceSid;
|
|
55
|
+
}
|
|
56
|
+
else if (this.config.fromNumber) {
|
|
57
|
+
params.from = this.config.fromNumber;
|
|
58
|
+
}
|
|
59
|
+
const message = await client.messages.create(params);
|
|
60
|
+
return {
|
|
61
|
+
sid: message.sid,
|
|
62
|
+
dryRun: false,
|
|
63
|
+
to: input.to,
|
|
64
|
+
body: input.body,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.SdkTwilioSmsSender = SdkTwilioSmsSender;
|
|
69
|
+
function createTwilioSmsSender(config) {
|
|
70
|
+
if (config.dryRun) {
|
|
71
|
+
return new DryRunTwilioSmsSender();
|
|
72
|
+
}
|
|
73
|
+
return new SdkTwilioSmsSender(config);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=twilio-sms.sender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"twilio-sms.sender.js","sourceRoot":"","sources":["../../src/forms/twilio-sms.sender.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AA0FH,sDAOC;AA/FD,mCAAuC;AAmBvC,MAAa,qBAAqB;IACzB,KAAK,CAAC,IAAI,CAAC,KAAyB;QACzC,OAAO;YACL,GAAG,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,EAAE;YAC3B,MAAM,EAAE,IAAI;YACZ,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC;IACJ,CAAC;CACF;AATD,sDASC;AAWD,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,sBAAa,EAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAY,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,OAAO,GACX,OAAO,GAAG,KAAK,UAAU;YACvB,CAAC,CAAE,GAAqB;YACxB,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ;gBACrB,GAAG,KAAK,IAAI;gBACZ,OAAQ,GAA6B,CAAC,OAAO,KAAK,UAAU;gBAC9D,CAAC,CAAC,CAAE,GAAkC,CAAC,OAAO,CAAC;gBAC/C,CAAC,CAAC,IAAI,CAAC;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CACb,mEAAmE,OAAO,GAAG,CAC9E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAa,kBAAkB;IACO;IAApC,YAAoC,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAExD,KAAK,CAAC,IAAI,CAAC,KAAyB;QACzC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrE,MAAM,MAAM,GAA2B;YACrC,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACpC,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;QAC/D,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QACvC,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrD,OAAO;YACL,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM,EAAE,KAAK;YACb,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC;IACJ,CAAC;CACF;AAvBD,gDAuBC;AAED,SAAgB,qBAAqB,CACnC,MAAuB;IAEvB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,IAAI,qBAAqB,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice / ASR email recovery — boxed PII helper for apps.
|
|
3
|
+
*
|
|
4
|
+
* Prefer Brain extract + {@link EMAIL_EXTRACT_DESCRIPTION}, then fail-closed
|
|
5
|
+
* via {@link collectedEmail} / {@link parseSpelledEmail} before writing memory.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* GOT / listen `extract.fields[].description` for email collection.
|
|
9
|
+
* Teach the Brain spelled-out ASR as well as normal `name@domain` forms.
|
|
10
|
+
*/
|
|
11
|
+
export declare const EMAIL_EXTRACT_DESCRIPTION = "Caller email address. Accept normal forms (name@domain.tld) and spelled-out ASR (letter by letter, \"at\" / \"at sign\" / \"at the rate\", \"dot\" / \"period\"). Prefer the first recoverable address; fail if none can be parsed.";
|
|
12
|
+
/** Prefer Brain extract, then spoken / spelled email. */
|
|
13
|
+
export declare function collectedEmail(extracted: unknown, spoken: string): string | null;
|
|
14
|
+
/**
|
|
15
|
+
* Parse ASR / spelled-out emails into a normal address.
|
|
16
|
+
* e.g. "m a r k at e x a m p l e dot com" → mark@example.com
|
|
17
|
+
* Also tolerates digit “0” for letter “o” when spelling letter-by-letter.
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseSpelledEmail(raw: string): string | null;
|
|
20
|
+
//# sourceMappingURL=email-parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-parse.d.ts","sourceRoot":"","sources":["../../src/identity/email-parse.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,eAAO,MAAM,yBAAyB,wOACuL,CAAC;AAE9N,yDAAyD;AACzD,wBAAgB,cAAc,CAC5B,SAAS,EAAE,OAAO,EAClB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAMf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA+B5D"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Voice / ASR email recovery — boxed PII helper for apps.
|
|
4
|
+
*
|
|
5
|
+
* Prefer Brain extract + {@link EMAIL_EXTRACT_DESCRIPTION}, then fail-closed
|
|
6
|
+
* via {@link collectedEmail} / {@link parseSpelledEmail} before writing memory.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.EMAIL_EXTRACT_DESCRIPTION = void 0;
|
|
10
|
+
exports.collectedEmail = collectedEmail;
|
|
11
|
+
exports.parseSpelledEmail = parseSpelledEmail;
|
|
12
|
+
/**
|
|
13
|
+
* GOT / listen `extract.fields[].description` for email collection.
|
|
14
|
+
* Teach the Brain spelled-out ASR as well as normal `name@domain` forms.
|
|
15
|
+
*/
|
|
16
|
+
exports.EMAIL_EXTRACT_DESCRIPTION = 'Caller email address. Accept normal forms (name@domain.tld) and spelled-out ASR (letter by letter, "at" / "at sign" / "at the rate", "dot" / "period"). Prefer the first recoverable address; fail if none can be parsed.';
|
|
17
|
+
/** Prefer Brain extract, then spoken / spelled email. */
|
|
18
|
+
function collectedEmail(extracted, spoken) {
|
|
19
|
+
if (typeof extracted === 'string') {
|
|
20
|
+
const fromExtract = parseSpelledEmail(extracted);
|
|
21
|
+
if (fromExtract)
|
|
22
|
+
return fromExtract;
|
|
23
|
+
}
|
|
24
|
+
return parseSpelledEmail(spoken);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse ASR / spelled-out emails into a normal address.
|
|
28
|
+
* e.g. "m a r k at e x a m p l e dot com" → mark@example.com
|
|
29
|
+
* Also tolerates digit “0” for letter “o” when spelling letter-by-letter.
|
|
30
|
+
*/
|
|
31
|
+
function parseSpelledEmail(raw) {
|
|
32
|
+
const text = raw.trim().toLowerCase();
|
|
33
|
+
if (!text)
|
|
34
|
+
return null;
|
|
35
|
+
// Already looks like an email.
|
|
36
|
+
const direct = text.match(/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/i);
|
|
37
|
+
if (direct)
|
|
38
|
+
return direct[0].toLowerCase();
|
|
39
|
+
const normalized = text
|
|
40
|
+
.replace(/\b(at the rate|at sign)\b/g, ' @ ')
|
|
41
|
+
.replace(/\b(at|@)\b/g, ' @ ')
|
|
42
|
+
.replace(/\b(dot|period)\b/g, ' . ')
|
|
43
|
+
.replace(/\bzero\b/g, '0')
|
|
44
|
+
.replace(/[^a-z0-9@.\s_-]/g, ' ')
|
|
45
|
+
.replace(/\s+/g, ' ')
|
|
46
|
+
.trim();
|
|
47
|
+
if (!normalized.includes('@'))
|
|
48
|
+
return null;
|
|
49
|
+
const parts = normalized.split('@').map((p) => p.trim());
|
|
50
|
+
if (parts.length < 2)
|
|
51
|
+
return null;
|
|
52
|
+
const localPart = parts[0];
|
|
53
|
+
const domainPart = parts.slice(1).join('@');
|
|
54
|
+
if (!localPart || !domainPart)
|
|
55
|
+
return null;
|
|
56
|
+
const local = collapseSpelledEmailSegment(localPart);
|
|
57
|
+
const domain = collapseSpelledEmailSegment(domainPart);
|
|
58
|
+
if (!local || !domain.includes('.'))
|
|
59
|
+
return null;
|
|
60
|
+
if (!/^[a-z0-9._%+-]+$/i.test(local))
|
|
61
|
+
return null;
|
|
62
|
+
if (!/^[a-z0-9.-]+\.[a-z]{2,}$/i.test(domain))
|
|
63
|
+
return null;
|
|
64
|
+
return `${local}@${domain}`;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Join letter-by-letter ASR ("m a r k", "r o 0 f r") into a token.
|
|
68
|
+
* Isolated "0" between letters → "o" (common ASR for the letter O).
|
|
69
|
+
*/
|
|
70
|
+
function collapseSpelledEmailSegment(segment) {
|
|
71
|
+
const tokens = segment
|
|
72
|
+
.trim()
|
|
73
|
+
.split(/\s+/)
|
|
74
|
+
.filter(Boolean)
|
|
75
|
+
.map((tok) => {
|
|
76
|
+
if (tok === '0')
|
|
77
|
+
return 'o';
|
|
78
|
+
return tok;
|
|
79
|
+
});
|
|
80
|
+
if (!tokens.length)
|
|
81
|
+
return '';
|
|
82
|
+
// Mostly single-character tokens → join (classic spelling).
|
|
83
|
+
const singleLetterish = tokens.filter((t) => /^[a-z0-9]$/i.test(t)).length;
|
|
84
|
+
if (tokens.length >= 2 && singleLetterish >= Math.ceil(tokens.length * 0.6)) {
|
|
85
|
+
return tokens.join('');
|
|
86
|
+
}
|
|
87
|
+
// Mixed: join only runs of single letters; keep multi-char words.
|
|
88
|
+
let out = '';
|
|
89
|
+
for (const tok of tokens) {
|
|
90
|
+
if (/^[a-z0-9]$/i.test(tok)) {
|
|
91
|
+
out += tok;
|
|
92
|
+
}
|
|
93
|
+
else if (tok === '.' || tok === '_' || tok === '-' || tok === '+') {
|
|
94
|
+
out += tok;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
out += tok;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return out.replace(/\s+/g, '');
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=email-parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-parse.js","sourceRoot":"","sources":["../../src/identity/email-parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boxed identity / PII helpers for voice agents.
|
|
3
|
+
*
|
|
4
|
+
* Prefer the dedicated import path so apps do not dig through the main barrel:
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* import {
|
|
8
|
+
* EMAIL_EXTRACT_DESCRIPTION,
|
|
9
|
+
* collectedEmail,
|
|
10
|
+
* parseSpelledEmail,
|
|
11
|
+
* } from '@guidify-ai/vapi-studio/identity';
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* Also re-exported from `@guidify-ai/vapi-studio`.
|
|
15
|
+
*/
|
|
16
|
+
export { EMAIL_EXTRACT_DESCRIPTION, collectedEmail, parseSpelledEmail, } from './email-parse';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Boxed identity / PII helpers for voice agents.
|
|
4
|
+
*
|
|
5
|
+
* Prefer the dedicated import path so apps do not dig through the main barrel:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* import {
|
|
9
|
+
* EMAIL_EXTRACT_DESCRIPTION,
|
|
10
|
+
* collectedEmail,
|
|
11
|
+
* parseSpelledEmail,
|
|
12
|
+
* } from '@guidify-ai/vapi-studio/identity';
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* Also re-exported from `@guidify-ai/vapi-studio`.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.parseSpelledEmail = exports.collectedEmail = exports.EMAIL_EXTRACT_DESCRIPTION = void 0;
|
|
19
|
+
var email_parse_1 = require("./email-parse");
|
|
20
|
+
Object.defineProperty(exports, "EMAIL_EXTRACT_DESCRIPTION", { enumerable: true, get: function () { return email_parse_1.EMAIL_EXTRACT_DESCRIPTION; } });
|
|
21
|
+
Object.defineProperty(exports, "collectedEmail", { enumerable: true, get: function () { return email_parse_1.collectedEmail; } });
|
|
22
|
+
Object.defineProperty(exports, "parseSpelledEmail", { enumerable: true, get: function () { return email_parse_1.parseSpelledEmail; } });
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,6CAIuB;AAHrB,wHAAA,yBAAyB,OAAA;AACzB,6GAAA,cAAc,OAAA;AACd,gHAAA,iBAAiB,OAAA"}
|