@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,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.FlowLoader = exports.CONDITION_GOTO_PREFIX = void 0;
|
|
10
|
+
exports.conditionGotoIntention = conditionGotoIntention;
|
|
11
|
+
exports.parseConditionGotoNodeId = parseConditionGotoNodeId;
|
|
12
|
+
const fs_1 = require("fs");
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const yaml_1 = require("yaml");
|
|
15
|
+
const conversation_history_1 = require("../conversation/conversation-history");
|
|
16
|
+
const condition_1 = require("./condition");
|
|
17
|
+
/** Synthetic intention → execute a node by id (condition transitions / goto). */
|
|
18
|
+
exports.CONDITION_GOTO_PREFIX = 'studio.goto.';
|
|
19
|
+
function conditionGotoIntention(nodeId) {
|
|
20
|
+
return `${exports.CONDITION_GOTO_PREFIX}${nodeId}`;
|
|
21
|
+
}
|
|
22
|
+
function parseConditionGotoNodeId(intention) {
|
|
23
|
+
if (!intention.startsWith(exports.CONDITION_GOTO_PREFIX))
|
|
24
|
+
return null;
|
|
25
|
+
const id = intention.slice(exports.CONDITION_GOTO_PREFIX.length);
|
|
26
|
+
return id.length > 0 ? id : null;
|
|
27
|
+
}
|
|
28
|
+
let FlowLoader = class FlowLoader {
|
|
29
|
+
flow = null;
|
|
30
|
+
loadFromFile(path) {
|
|
31
|
+
const raw = (0, yaml_1.parse)((0, fs_1.readFileSync)(path, 'utf8'));
|
|
32
|
+
return this.loadFromObject(raw);
|
|
33
|
+
}
|
|
34
|
+
loadFromObject(raw) {
|
|
35
|
+
if (!raw?.flow?.id || !raw?.flow?.start || !raw?.nodes) {
|
|
36
|
+
throw new Error('Invalid flow schema object');
|
|
37
|
+
}
|
|
38
|
+
const nodes = {};
|
|
39
|
+
for (const [id, def] of Object.entries(raw.nodes)) {
|
|
40
|
+
nodes[id] = {
|
|
41
|
+
id,
|
|
42
|
+
class: def.class,
|
|
43
|
+
intentions: def.intentions ?? [],
|
|
44
|
+
portal: def.portal,
|
|
45
|
+
priority: def.priority,
|
|
46
|
+
terminal: def.terminal,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (!nodes[raw.flow.start]) {
|
|
50
|
+
throw new Error(`Flow start node "${raw.flow.start}" missing`);
|
|
51
|
+
}
|
|
52
|
+
const transitions = [];
|
|
53
|
+
for (const [index, rawT] of (raw.transitions ?? []).entries()) {
|
|
54
|
+
const id = (rawT.id ?? `transition_${index}`).trim();
|
|
55
|
+
const to = String(rawT.to ?? '').trim();
|
|
56
|
+
if (!to || !nodes[to]) {
|
|
57
|
+
throw new Error(`Flow transition "${id}" targets unknown node "${to}"`);
|
|
58
|
+
}
|
|
59
|
+
const when = String(rawT.when ?? '').trim();
|
|
60
|
+
if (!when) {
|
|
61
|
+
throw new Error(`Flow transition "${id}" is missing when`);
|
|
62
|
+
}
|
|
63
|
+
let test;
|
|
64
|
+
try {
|
|
65
|
+
test = (0, condition_1.compileCondition)(when);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw new Error(`Flow transition "${id}" has invalid when "${when}": ${error instanceof Error ? error.message : String(error)}`);
|
|
69
|
+
}
|
|
70
|
+
const fromList = rawT.from
|
|
71
|
+
? (Array.isArray(rawT.from) ? rawT.from : [rawT.from]).map((s) => String(s).trim())
|
|
72
|
+
: undefined;
|
|
73
|
+
if (fromList) {
|
|
74
|
+
for (const fromId of fromList) {
|
|
75
|
+
if (!nodes[fromId]) {
|
|
76
|
+
throw new Error(`Flow transition "${id}" from unknown node "${fromId}"`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
transitions.push({
|
|
81
|
+
id,
|
|
82
|
+
from: fromList,
|
|
83
|
+
to,
|
|
84
|
+
when,
|
|
85
|
+
force: rawT.force === true,
|
|
86
|
+
priority: rawT.priority,
|
|
87
|
+
reason: rawT.reason,
|
|
88
|
+
test,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
this.flow = {
|
|
92
|
+
version: raw.version ?? 1,
|
|
93
|
+
id: raw.flow.id,
|
|
94
|
+
start: raw.flow.start,
|
|
95
|
+
nodes,
|
|
96
|
+
transitions,
|
|
97
|
+
};
|
|
98
|
+
return this.flow;
|
|
99
|
+
}
|
|
100
|
+
getFlow() {
|
|
101
|
+
if (!this.flow) {
|
|
102
|
+
throw new Error('Flow not loaded');
|
|
103
|
+
}
|
|
104
|
+
return this.flow;
|
|
105
|
+
}
|
|
106
|
+
nodesForIntention(intention) {
|
|
107
|
+
const flow = this.getFlow();
|
|
108
|
+
const gotoId = parseConditionGotoNodeId(intention);
|
|
109
|
+
if (gotoId) {
|
|
110
|
+
const node = flow.nodes[gotoId];
|
|
111
|
+
return node ? [node] : [];
|
|
112
|
+
}
|
|
113
|
+
const matches = Object.values(flow.nodes).filter((n) => n.intentions.includes(intention));
|
|
114
|
+
return matches.sort((a, b) => {
|
|
115
|
+
const pa = a.priority ?? conversation_history_1.DEFAULT_INTENTION_PRIORITY;
|
|
116
|
+
const pb = b.priority ?? conversation_history_1.DEFAULT_INTENTION_PRIORITY;
|
|
117
|
+
if (pb !== pa)
|
|
118
|
+
return pb - pa;
|
|
119
|
+
return a.id.localeCompare(b.id);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/** All intention names declared on portal nodes. */
|
|
123
|
+
portalIntentionNames() {
|
|
124
|
+
const flow = this.getFlow();
|
|
125
|
+
const names = new Set();
|
|
126
|
+
for (const node of Object.values(flow.nodes)) {
|
|
127
|
+
if (!node.portal)
|
|
128
|
+
continue;
|
|
129
|
+
for (const name of node.intentions) {
|
|
130
|
+
names.add(name);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return [...names];
|
|
134
|
+
}
|
|
135
|
+
/** All intention names on non-portal nodes. */
|
|
136
|
+
normalIntentionNames() {
|
|
137
|
+
const flow = this.getFlow();
|
|
138
|
+
const names = new Set();
|
|
139
|
+
for (const node of Object.values(flow.nodes)) {
|
|
140
|
+
if (node.portal)
|
|
141
|
+
continue;
|
|
142
|
+
for (const name of node.intentions) {
|
|
143
|
+
names.add(name);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return [...names];
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Condition transitions whose `when` is true for this runtime snapshot.
|
|
150
|
+
* Skips when current node is already `to`, or `from` does not include current.
|
|
151
|
+
*/
|
|
152
|
+
matchingConditionTransitions(input, opts) {
|
|
153
|
+
const flow = this.getFlow();
|
|
154
|
+
const current = input.currentNodeId ?? null;
|
|
155
|
+
const ctx = {
|
|
156
|
+
memory: input.memory,
|
|
157
|
+
variables: input.variables,
|
|
158
|
+
};
|
|
159
|
+
const out = [];
|
|
160
|
+
for (const t of flow.transitions) {
|
|
161
|
+
if (opts?.force === true && t.force !== true)
|
|
162
|
+
continue;
|
|
163
|
+
if (opts?.force === false && t.force === true)
|
|
164
|
+
continue;
|
|
165
|
+
if (current === t.to)
|
|
166
|
+
continue;
|
|
167
|
+
if (t.from && t.from.length > 0) {
|
|
168
|
+
if (!current || !t.from.includes(current))
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (!t.test(ctx))
|
|
172
|
+
continue;
|
|
173
|
+
out.push(t);
|
|
174
|
+
}
|
|
175
|
+
return out;
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
exports.FlowLoader = FlowLoader;
|
|
179
|
+
exports.FlowLoader = FlowLoader = __decorate([
|
|
180
|
+
(0, common_1.Injectable)()
|
|
181
|
+
], FlowLoader);
|
|
182
|
+
//# sourceMappingURL=flow-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-loader.js","sourceRoot":"","sources":["../../src/flow/flow-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* First-party HTML form renderer — builds a simple page from FormFieldSpec JSON.
|
|
3
|
+
* Apps serve this from GET /forms/:exposeId; submit posts back to FormsService.
|
|
4
|
+
*/
|
|
5
|
+
import type { FormExposeHandle } from './form.types';
|
|
6
|
+
export interface RenderFormHtmlOptions {
|
|
7
|
+
/** Absolute or relative form POST action (default: same expose path). */
|
|
8
|
+
action?: string;
|
|
9
|
+
title?: string;
|
|
10
|
+
subtitle?: string;
|
|
11
|
+
submitLabel?: string;
|
|
12
|
+
/** Optional error banner (e.g. missing required field). */
|
|
13
|
+
error?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Render a complete HTML document for a pending form expose.
|
|
17
|
+
* Field definitions come from the expose handle (JSON → HTML).
|
|
18
|
+
*/
|
|
19
|
+
export declare function renderFormHtml(handle: Pick<FormExposeHandle, 'exposeId' | 'formId' | 'fields'>, options?: RenderFormHtmlOptions): string;
|
|
20
|
+
/** Thank-you page after successful submit. */
|
|
21
|
+
export declare function renderFormThanksHtml(options?: {
|
|
22
|
+
title?: string;
|
|
23
|
+
body?: string;
|
|
24
|
+
/** Optional absolute or relative href shown under the body. */
|
|
25
|
+
backHref?: string;
|
|
26
|
+
backLabel?: string;
|
|
27
|
+
}): string;
|
|
28
|
+
/** Simple not-found / expired page. */
|
|
29
|
+
export declare function renderFormGoneHtml(message?: string): string;
|
|
30
|
+
//# sourceMappingURL=form-html.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-html.d.ts","sourceRoot":"","sources":["../../src/forms/form-html.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,cAAc,CAAC;AAEpE,MAAM,WAAW,qBAAqB;IACpC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmCD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC,EAChE,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAmDR;AAED,8CAA8C;AAC9C,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAgCT;AAED,uCAAuC;AACvC,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ3D"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* First-party HTML form renderer — builds a simple page from FormFieldSpec JSON.
|
|
4
|
+
* Apps serve this from GET /forms/:exposeId; submit posts back to FormsService.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.renderFormHtml = renderFormHtml;
|
|
8
|
+
exports.renderFormThanksHtml = renderFormThanksHtml;
|
|
9
|
+
exports.renderFormGoneHtml = renderFormGoneHtml;
|
|
10
|
+
function escapeHtml(raw) {
|
|
11
|
+
return raw
|
|
12
|
+
.replace(/&/g, '&')
|
|
13
|
+
.replace(/</g, '<')
|
|
14
|
+
.replace(/>/g, '>')
|
|
15
|
+
.replace(/"/g, '"')
|
|
16
|
+
.replace(/'/g, ''');
|
|
17
|
+
}
|
|
18
|
+
function inputType(field) {
|
|
19
|
+
switch (field.type) {
|
|
20
|
+
case 'email':
|
|
21
|
+
return 'email';
|
|
22
|
+
case 'tel':
|
|
23
|
+
return 'tel';
|
|
24
|
+
default:
|
|
25
|
+
return 'text';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function renderField(field) {
|
|
29
|
+
const req = field.required ? ' required' : '';
|
|
30
|
+
const ph = field.placeholder
|
|
31
|
+
? ` placeholder="${escapeHtml(field.placeholder)}"`
|
|
32
|
+
: '';
|
|
33
|
+
const name = escapeHtml(field.name);
|
|
34
|
+
const label = escapeHtml(field.label);
|
|
35
|
+
if (field.type === 'textarea') {
|
|
36
|
+
return `<label class="field"><span>${label}</span><textarea name="${name}" rows="3"${req}${ph}></textarea></label>`;
|
|
37
|
+
}
|
|
38
|
+
return `<label class="field"><span>${label}</span><input type="${inputType(field)}" name="${name}" autocomplete="on"${req}${ph} /></label>`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Render a complete HTML document for a pending form expose.
|
|
42
|
+
* Field definitions come from the expose handle (JSON → HTML).
|
|
43
|
+
*/
|
|
44
|
+
function renderFormHtml(handle, options = {}) {
|
|
45
|
+
const action = escapeHtml(options.action !== undefined ? options.action : '');
|
|
46
|
+
const title = escapeHtml(options.title ?? 'Your details');
|
|
47
|
+
const subtitle = escapeHtml(options.subtitle ?? 'Fill this out and submit — we are waiting on the line.');
|
|
48
|
+
const submitLabel = escapeHtml(options.submitLabel ?? 'Submit');
|
|
49
|
+
const error = options.error
|
|
50
|
+
? `<p class="error" role="alert">${escapeHtml(options.error)}</p>`
|
|
51
|
+
: '';
|
|
52
|
+
const fields = handle.fields.map(renderField).join('\n');
|
|
53
|
+
return `<!DOCTYPE html>
|
|
54
|
+
<html lang="en">
|
|
55
|
+
<head>
|
|
56
|
+
<meta charset="utf-8" />
|
|
57
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
58
|
+
<title>${title}</title>
|
|
59
|
+
<style>
|
|
60
|
+
:root { color-scheme: light; --ink: #14213d; --muted: #5c6b7a; --line: #d7dde5; --accent: #1b6ef3; --bg: #f4f6f8; }
|
|
61
|
+
* { box-sizing: border-box; }
|
|
62
|
+
body { margin: 0; font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif; background: var(--bg); color: var(--ink); }
|
|
63
|
+
main { max-width: 28rem; margin: 0 auto; padding: 1.5rem 1.25rem 3rem; }
|
|
64
|
+
h1 { font-size: 1.35rem; margin: 0 0 0.35rem; }
|
|
65
|
+
.sub { color: var(--muted); margin: 0 0 1.25rem; line-height: 1.4; font-size: 0.95rem; }
|
|
66
|
+
form { display: grid; gap: 0.9rem; background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 1.1rem; }
|
|
67
|
+
.field { display: grid; gap: 0.35rem; font-size: 0.9rem; }
|
|
68
|
+
.field span { font-weight: 600; }
|
|
69
|
+
input, textarea { width: 100%; font: inherit; padding: 0.65rem 0.7rem; border: 1px solid var(--line); border-radius: 8px; background: #fff; }
|
|
70
|
+
input:focus, textarea:focus { outline: 2px solid color-mix(in srgb, var(--accent) 45%, white); border-color: var(--accent); }
|
|
71
|
+
button { font: inherit; font-weight: 600; border: 0; border-radius: 999px; padding: 0.75rem 1rem; background: var(--accent); color: #fff; cursor: pointer; }
|
|
72
|
+
button:hover { filter: brightness(0.96); }
|
|
73
|
+
.error { background: #fde8e8; color: #8a1f1f; border-radius: 8px; padding: 0.65rem 0.75rem; margin: 0 0 0.75rem; }
|
|
74
|
+
.meta { margin-top: 1rem; color: var(--muted); font-size: 0.75rem; }
|
|
75
|
+
</style>
|
|
76
|
+
</head>
|
|
77
|
+
<body>
|
|
78
|
+
<main>
|
|
79
|
+
<h1>${title}</h1>
|
|
80
|
+
<p class="sub">${subtitle}</p>
|
|
81
|
+
${error}
|
|
82
|
+
<form method="post" action="${action}" novalidate>
|
|
83
|
+
${fields}
|
|
84
|
+
<button type="submit">${submitLabel}</button>
|
|
85
|
+
</form>
|
|
86
|
+
<p class="meta">Form ${handle.formId} · ${escapeHtml(handle.exposeId.slice(0, 8))}…</p>
|
|
87
|
+
</main>
|
|
88
|
+
</body>
|
|
89
|
+
</html>`;
|
|
90
|
+
}
|
|
91
|
+
/** Thank-you page after successful submit. */
|
|
92
|
+
function renderFormThanksHtml(options) {
|
|
93
|
+
const title = escapeHtml(options?.title ?? 'Thanks');
|
|
94
|
+
const body = escapeHtml(options?.body ??
|
|
95
|
+
'We received your details. You can return to the call — we are still on the line.');
|
|
96
|
+
const back = options?.backHref != null
|
|
97
|
+
? `<p><a href="${escapeHtml(options.backHref)}">${escapeHtml(options.backLabel ?? 'Back')}</a></p>`
|
|
98
|
+
: '';
|
|
99
|
+
return `<!DOCTYPE html>
|
|
100
|
+
<html lang="en">
|
|
101
|
+
<head>
|
|
102
|
+
<meta charset="utf-8" />
|
|
103
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
104
|
+
<title>${title}</title>
|
|
105
|
+
<style>
|
|
106
|
+
body { margin: 0; font-family: ui-sans-serif, system-ui, sans-serif; background: #f4f6f8; color: #14213d; }
|
|
107
|
+
main { max-width: 28rem; margin: 0 auto; padding: 2rem 1.25rem; }
|
|
108
|
+
h1 { font-size: 1.35rem; margin: 0 0 0.5rem; }
|
|
109
|
+
p { color: #5c6b7a; line-height: 1.45; }
|
|
110
|
+
a { color: #1b6ef3; }
|
|
111
|
+
</style>
|
|
112
|
+
</head>
|
|
113
|
+
<body>
|
|
114
|
+
<main>
|
|
115
|
+
<h1>${title}</h1>
|
|
116
|
+
<p>${body}</p>
|
|
117
|
+
${back}
|
|
118
|
+
</main>
|
|
119
|
+
</body>
|
|
120
|
+
</html>`;
|
|
121
|
+
}
|
|
122
|
+
/** Simple not-found / expired page. */
|
|
123
|
+
function renderFormGoneHtml(message) {
|
|
124
|
+
const body = escapeHtml(message ?? 'This form link is missing or has already been completed.');
|
|
125
|
+
return `<!DOCTYPE html>
|
|
126
|
+
<html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>Form unavailable</title>
|
|
127
|
+
<style>body{font-family:ui-sans-serif,system-ui,sans-serif;padding:2rem;color:#14213d;background:#f4f6f8}p{color:#5c6b7a}</style>
|
|
128
|
+
</head><body><h1>Form unavailable</h1><p>${body}</p></body></html>`;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=form-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-html.js","sourceRoot":"","sources":["../../src/forms/form-html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.tokens.d.ts","sourceRoot":"","sources":["../../src/forms/form.tokens.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,eAAiC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FORM_DISPOSE_ADAPTER = void 0;
|
|
4
|
+
/** Injection token for the channel FormDisposeAdapter (Studio, Formsster, …). */
|
|
5
|
+
exports.FORM_DISPOSE_ADAPTER = Symbol('FORM_DISPOSE_ADAPTER');
|
|
6
|
+
//# sourceMappingURL=form.tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.tokens.js","sourceRoot":"","sources":["../../src/forms/form.tokens.ts"],"names":[],"mappings":";;;AAAA,iFAAiF;AACpE,QAAA,oBAAoB,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export type FormFieldType = 'string' | 'email' | 'tel' | 'textarea';
|
|
2
|
+
export interface FormFieldSpec {
|
|
3
|
+
name: string;
|
|
4
|
+
label: string;
|
|
5
|
+
type: FormFieldType;
|
|
6
|
+
required?: boolean;
|
|
7
|
+
placeholder?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface FormExposeSpec {
|
|
10
|
+
/** App-defined form template id. */
|
|
11
|
+
formId: number;
|
|
12
|
+
fields: FormFieldSpec[];
|
|
13
|
+
/**
|
|
14
|
+
* Conversation branch this sendout belongs to (app-owned id for forensics /
|
|
15
|
+
* flow edges). Emitted on `FORM_SENDOUT` before delivery wait.
|
|
16
|
+
* Example: `identity_html_form`, `appointment_intake`.
|
|
17
|
+
*/
|
|
18
|
+
branch?: string;
|
|
19
|
+
/** Called after the channel ACKs delivery (≤15s). Use to speak “form exposed, waiting”. */
|
|
20
|
+
onDelivered?: () => Promise<void>;
|
|
21
|
+
/** Fillout wait (ms). Default 10 minutes. */
|
|
22
|
+
filloutTimeoutMs?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Optional channel hints for the dispose adapter (e.g. contactPhone, channel).
|
|
25
|
+
* Opaque to the framework — apps/adapters interpret it.
|
|
26
|
+
*/
|
|
27
|
+
disposeContext?: Record<string, unknown>;
|
|
28
|
+
}
|
|
29
|
+
export type FormValues = Record<string, string>;
|
|
30
|
+
export interface FormExposeHandle {
|
|
31
|
+
exposeId: string;
|
|
32
|
+
formId: number;
|
|
33
|
+
conversationId: string;
|
|
34
|
+
fields: FormFieldSpec[];
|
|
35
|
+
createdAt: string;
|
|
36
|
+
/** App conversation branch from the expose spec, if any. */
|
|
37
|
+
branch?: string;
|
|
38
|
+
/** Delivery branch reported by the dispose adapter. */
|
|
39
|
+
deliveryBranch?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface FormDisposePayload {
|
|
42
|
+
exposeId: string;
|
|
43
|
+
formId: number;
|
|
44
|
+
conversationId: string;
|
|
45
|
+
fields: FormFieldSpec[];
|
|
46
|
+
/** App conversation branch from FormExposeSpec.branch. */
|
|
47
|
+
branch?: string;
|
|
48
|
+
disposeContext?: Record<string, unknown>;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Channel-specific dispose (Studio modal, first-party HTML link, SMS later).
|
|
52
|
+
* Must make the form visible to the caller; ACK is separate via FormsService.ack
|
|
53
|
+
* (or the adapter may ACK once the link is ready / page is openable).
|
|
54
|
+
*
|
|
55
|
+
* `branch` is the **delivery** path this driver implements (html_link / sms / …).
|
|
56
|
+
* It is stamped on `FORM_SENDOUT` early so logs show which sendout lane ran
|
|
57
|
+
* before ACK / fillout.
|
|
58
|
+
*/
|
|
59
|
+
export interface FormDisposeAdapter {
|
|
60
|
+
readonly id: string;
|
|
61
|
+
/** Delivery branch id this driver owns (e.g. `html_link`, `sms`, `unavailable`). */
|
|
62
|
+
readonly branch: string;
|
|
63
|
+
dispose(payload: FormDisposePayload): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
export declare class FormDeliverTimeoutError extends Error {
|
|
66
|
+
readonly exposeId: string;
|
|
67
|
+
readonly conversationId: string;
|
|
68
|
+
readonly code: "FORM_DELIVER_TIMEOUT";
|
|
69
|
+
constructor(exposeId: string, conversationId: string);
|
|
70
|
+
}
|
|
71
|
+
export declare class FormFilloutTimeoutError extends Error {
|
|
72
|
+
readonly exposeId: string;
|
|
73
|
+
readonly conversationId: string;
|
|
74
|
+
readonly code: "FORM_FILLOUT_TIMEOUT";
|
|
75
|
+
constructor(exposeId: string, conversationId: string);
|
|
76
|
+
}
|
|
77
|
+
export declare class FormChannelUnavailableError extends Error {
|
|
78
|
+
readonly code: "FORM_CHANNEL_UNAVAILABLE";
|
|
79
|
+
constructor(message?: string);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=form.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.types.d.ts","sourceRoot":"","sources":["../../src/forms/form.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,oFAAoF;IACpF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;aAG9B,QAAQ,EAAE,MAAM;aAChB,cAAc,EAAE,MAAM;IAHxC,SAAgB,IAAI,EAAE,sBAAsB,CAAmC;gBAE7D,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM;CAOzC;AAED,qBAAa,uBAAwB,SAAQ,KAAK;aAG9B,QAAQ,EAAE,MAAM;aAChB,cAAc,EAAE,MAAM;IAHxC,SAAgB,IAAI,EAAE,sBAAsB,CAAmC;gBAE7D,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM;CAKzC;AAED,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,SAAgB,IAAI,EAAE,0BAA0B,CAAuC;gBACpE,OAAO,SAAwD;CAInF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FormChannelUnavailableError = exports.FormFilloutTimeoutError = exports.FormDeliverTimeoutError = void 0;
|
|
4
|
+
class FormDeliverTimeoutError extends Error {
|
|
5
|
+
exposeId;
|
|
6
|
+
conversationId;
|
|
7
|
+
code = 'FORM_DELIVER_TIMEOUT';
|
|
8
|
+
constructor(exposeId, conversationId) {
|
|
9
|
+
super(`Form expose ${exposeId} was not acknowledged within the delivery window`);
|
|
10
|
+
this.exposeId = exposeId;
|
|
11
|
+
this.conversationId = conversationId;
|
|
12
|
+
this.name = 'FormDeliverTimeoutError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.FormDeliverTimeoutError = FormDeliverTimeoutError;
|
|
16
|
+
class FormFilloutTimeoutError extends Error {
|
|
17
|
+
exposeId;
|
|
18
|
+
conversationId;
|
|
19
|
+
code = 'FORM_FILLOUT_TIMEOUT';
|
|
20
|
+
constructor(exposeId, conversationId) {
|
|
21
|
+
super(`Form expose ${exposeId} fillout timed out`);
|
|
22
|
+
this.exposeId = exposeId;
|
|
23
|
+
this.conversationId = conversationId;
|
|
24
|
+
this.name = 'FormFilloutTimeoutError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.FormFilloutTimeoutError = FormFilloutTimeoutError;
|
|
28
|
+
class FormChannelUnavailableError extends Error {
|
|
29
|
+
code = 'FORM_CHANNEL_UNAVAILABLE';
|
|
30
|
+
constructor(message = 'No form dispose adapter can deliver on this channel') {
|
|
31
|
+
super(message);
|
|
32
|
+
this.name = 'FormChannelUnavailableError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.FormChannelUnavailableError = FormChannelUnavailableError;
|
|
36
|
+
//# sourceMappingURL=form.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.types.js","sourceRoot":"","sources":["../../src/forms/form.types.ts"],"names":[],"mappings":";;;AAuEA,MAAa,uBAAwB,SAAQ,KAAK;IAG9B;IACA;IAHF,IAAI,GAA2B,sBAA+B,CAAC;IAC/E,YACkB,QAAgB,EAChB,cAAsB;QAEtC,KAAK,CACH,eAAe,QAAQ,kDAAkD,CAC1E,CAAC;QALc,aAAQ,GAAR,QAAQ,CAAQ;QAChB,mBAAc,GAAd,cAAc,CAAQ;QAKtC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAXD,0DAWC;AAED,MAAa,uBAAwB,SAAQ,KAAK;IAG9B;IACA;IAHF,IAAI,GAA2B,sBAA+B,CAAC;IAC/E,YACkB,QAAgB,EAChB,cAAsB;QAEtC,KAAK,CAAC,eAAe,QAAQ,oBAAoB,CAAC,CAAC;QAHnC,aAAQ,GAAR,QAAQ,CAAQ;QAChB,mBAAc,GAAd,cAAc,CAAQ;QAGtC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AATD,0DASC;AAED,MAAa,2BAA4B,SAAQ,KAAK;IACpC,IAAI,GAA+B,0BAAmC,CAAC;IACvF,YAAmB,OAAO,GAAG,qDAAqD;QAChF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AAND,kEAMC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { EventService } from '../events/event.service';
|
|
2
|
+
import { type FormDisposeAdapter, type FormExposeHandle, type FormExposeSpec, type FormValues } from './form.types';
|
|
3
|
+
export declare class FormsService {
|
|
4
|
+
private readonly events;
|
|
5
|
+
private readonly pending;
|
|
6
|
+
private readonly byConversation;
|
|
7
|
+
private readonly adapter;
|
|
8
|
+
constructor(events: EventService, adapter?: FormDisposeAdapter);
|
|
9
|
+
/**
|
|
10
|
+
* Deliver + ACK + onDelivered, then **block** until submit / fillout timeout.
|
|
11
|
+
* Prefer {@link open} on live Vapi — holding Custom LLM SSE open for minutes
|
|
12
|
+
* truncates TTS and races silence hangup.
|
|
13
|
+
*/
|
|
14
|
+
expose(conversationId: string, spec: FormExposeSpec): Promise<FormValues>;
|
|
15
|
+
/**
|
|
16
|
+
* Deliver + ACK + onDelivered, return immediately. Caller finishes the channel
|
|
17
|
+
* turn (so TTS can complete). Later: {@link submit} then {@link claimSubmitted}.
|
|
18
|
+
*/
|
|
19
|
+
open(conversationId: string, spec: FormExposeSpec): Promise<FormExposeHandle>;
|
|
20
|
+
/** Studio / channel ACK — form is openable on the client. */
|
|
21
|
+
ack(exposeId: string): FormExposeHandle | null;
|
|
22
|
+
/** Studio / channel submit — resolves blocking expose() or parks values for claim. */
|
|
23
|
+
submit(exposeId: string, values: FormValues): FormExposeHandle | null;
|
|
24
|
+
/**
|
|
25
|
+
* Take submitted values for a conversation (open() path) and remove the expose.
|
|
26
|
+
* Returns null when still waiting or nothing pending.
|
|
27
|
+
*/
|
|
28
|
+
claimSubmitted(conversationId: string): FormValues | null;
|
|
29
|
+
/** True when open() expose has been submitted but not yet claimed. */
|
|
30
|
+
hasUnclaimedSubmit(conversationId: string): boolean;
|
|
31
|
+
/** Pending undelivered/unsubmitted expose for Studio poll. */
|
|
32
|
+
getPending(conversationId: string): FormExposeHandle | null;
|
|
33
|
+
/**
|
|
34
|
+
* All open (unsubmitted) exposes — newest first.
|
|
35
|
+
* Operator / localhost watchers use this when conversationId is unknown.
|
|
36
|
+
*/
|
|
37
|
+
listPending(): FormExposeHandle[];
|
|
38
|
+
/** Newest open expose, or null. */
|
|
39
|
+
getLatestPending(): FormExposeHandle | null;
|
|
40
|
+
getByExposeId(exposeId: string): FormExposeHandle | null;
|
|
41
|
+
/**
|
|
42
|
+
* Re-run dispose for the conversation’s open (unsubmitted) expose — e.g. caller
|
|
43
|
+
* says they never got the SMS / link. Same exposeId; adapter may text again.
|
|
44
|
+
*/
|
|
45
|
+
resend(conversationId: string): Promise<FormExposeHandle | null>;
|
|
46
|
+
private beginExpose;
|
|
47
|
+
private toHandle;
|
|
48
|
+
private waitAck;
|
|
49
|
+
private waitFillout;
|
|
50
|
+
private cleanup;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=forms.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms.service.d.ts","sourceRoot":"","sources":["../../src/forms/forms.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAkCtB,qBACa,YAAY;IAMrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgE;IACxF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4D;IAC3F,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAG1B,MAAM,EAAE,YAAY,EAGrC,OAAO,CAAC,EAAE,kBAAkB;IAK9B;;;;OAIG;IACU,MAAM,CACjB,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,UAAU,CAAC;IAwCtB;;;OAGG;IACU,IAAI,CACf,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,gBAAgB,CAAC;IAsB5B,6DAA6D;IACtD,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IASrD,sFAAsF;IAC/E,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,gBAAgB,GAAG,IAAI;IAqC5E;;;OAGG;IACI,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAchE,sEAAsE;IAC/D,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAU1D,8DAA8D;IACvD,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAYlE;;;OAGG;IACI,WAAW,IAAI,gBAAgB,EAAE;IAQxC,mCAAmC;IAC5B,gBAAgB,IAAI,gBAAgB,GAAG,IAAI;IAI3C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAK/D;;;OAGG;IACU,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;YA8C/D,WAAW;IAiHzB,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,OAAO;CAWhB"}
|