@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,152 @@
|
|
|
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
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.IntegrationClient = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const event_service_1 = require("../events/event.service");
|
|
15
|
+
const studio_event_1 = require("../events/studio-event");
|
|
16
|
+
const jwt_hmac_1 = require("./jwt-hmac");
|
|
17
|
+
const MAX_STORED_BODY_CHARS = 8_192;
|
|
18
|
+
function clipBody(value) {
|
|
19
|
+
if (value == null)
|
|
20
|
+
return value;
|
|
21
|
+
const raw = typeof value === 'string' ? value : JSON.stringify(value);
|
|
22
|
+
if (raw.length <= MAX_STORED_BODY_CHARS)
|
|
23
|
+
return value;
|
|
24
|
+
return `${raw.slice(0, MAX_STORED_BODY_CHARS)}…`;
|
|
25
|
+
}
|
|
26
|
+
function responseHeaders(headers) {
|
|
27
|
+
const out = {};
|
|
28
|
+
headers.forEach((value, key) => {
|
|
29
|
+
out[key] = value;
|
|
30
|
+
});
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
async function parseBody(res) {
|
|
34
|
+
const text = await res.text();
|
|
35
|
+
if (!text)
|
|
36
|
+
return null;
|
|
37
|
+
try {
|
|
38
|
+
return JSON.parse(text);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return text;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Pre-baked outbound HTTP client: JWT HS256 over the body, `x-signature` header.
|
|
46
|
+
* Every attempt emits INTEGRATION_REQUEST / RESPONSE / ERROR for listeners.
|
|
47
|
+
*/
|
|
48
|
+
let IntegrationClient = class IntegrationClient {
|
|
49
|
+
events;
|
|
50
|
+
constructor(events) {
|
|
51
|
+
this.events = events;
|
|
52
|
+
}
|
|
53
|
+
async request(input) {
|
|
54
|
+
const method = (input.method ?? 'POST').toUpperCase();
|
|
55
|
+
const rawBody = method === 'GET' ? '' : (0, jwt_hmac_1.canonicalRequestBody)(input.body);
|
|
56
|
+
const secret = (0, jwt_hmac_1.readSecretEnv)(input.secretEnvKey);
|
|
57
|
+
const signed = (0, jwt_hmac_1.signIntegrationRequest)({
|
|
58
|
+
secret,
|
|
59
|
+
method,
|
|
60
|
+
url: input.url,
|
|
61
|
+
body: rawBody,
|
|
62
|
+
ttlSeconds: input.ttlSeconds,
|
|
63
|
+
});
|
|
64
|
+
const headers = {
|
|
65
|
+
accept: 'application/json',
|
|
66
|
+
...(input.headers ?? {}),
|
|
67
|
+
[jwt_hmac_1.INTEGRATION_SIGNATURE_HEADER]: signed.token,
|
|
68
|
+
};
|
|
69
|
+
if (rawBody && !headers['content-type']) {
|
|
70
|
+
headers['content-type'] = 'application/json';
|
|
71
|
+
}
|
|
72
|
+
const started = Date.now();
|
|
73
|
+
await this.events.emit({
|
|
74
|
+
type: studio_event_1.STUDIO_EVENTS.INTEGRATION_REQUEST,
|
|
75
|
+
conversationId: input.meta?.conversationId,
|
|
76
|
+
runtimeInstanceId: input.meta?.runtimeInstanceId,
|
|
77
|
+
providerCallId: input.meta?.providerCallId,
|
|
78
|
+
payload: {
|
|
79
|
+
name: input.name,
|
|
80
|
+
method,
|
|
81
|
+
url: input.url,
|
|
82
|
+
secretEnvKey: input.secretEnvKey,
|
|
83
|
+
headers: { ...headers },
|
|
84
|
+
body: clipBody(method === 'GET' ? undefined : input.body ?? rawBody),
|
|
85
|
+
bodySha256: signed.bodySha256,
|
|
86
|
+
signatureHeader: jwt_hmac_1.INTEGRATION_SIGNATURE_HEADER,
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
try {
|
|
90
|
+
const res = await fetch(input.url, {
|
|
91
|
+
method,
|
|
92
|
+
headers,
|
|
93
|
+
body: rawBody && method !== 'GET' ? rawBody : undefined,
|
|
94
|
+
signal: AbortSignal.timeout(input.timeoutMs ?? 15_000),
|
|
95
|
+
});
|
|
96
|
+
const parsed = await parseBody(res);
|
|
97
|
+
const durationMs = Date.now() - started;
|
|
98
|
+
const result = {
|
|
99
|
+
ok: res.ok,
|
|
100
|
+
status: res.status,
|
|
101
|
+
body: parsed,
|
|
102
|
+
headers: responseHeaders(res.headers),
|
|
103
|
+
durationMs,
|
|
104
|
+
bodySha256: signed.bodySha256,
|
|
105
|
+
};
|
|
106
|
+
await this.events.emit({
|
|
107
|
+
type: studio_event_1.STUDIO_EVENTS.INTEGRATION_RESPONSE,
|
|
108
|
+
level: res.ok ? 'info' : 'warn',
|
|
109
|
+
conversationId: input.meta?.conversationId,
|
|
110
|
+
runtimeInstanceId: input.meta?.runtimeInstanceId,
|
|
111
|
+
providerCallId: input.meta?.providerCallId,
|
|
112
|
+
payload: {
|
|
113
|
+
name: input.name,
|
|
114
|
+
method,
|
|
115
|
+
url: input.url,
|
|
116
|
+
status: result.status,
|
|
117
|
+
ok: result.ok,
|
|
118
|
+
durationMs,
|
|
119
|
+
body: clipBody(result.body),
|
|
120
|
+
responseHeaders: result.headers,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
const durationMs = Date.now() - started;
|
|
127
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
128
|
+
await this.events.emit({
|
|
129
|
+
type: studio_event_1.STUDIO_EVENTS.INTEGRATION_ERROR,
|
|
130
|
+
level: 'error',
|
|
131
|
+
conversationId: input.meta?.conversationId,
|
|
132
|
+
runtimeInstanceId: input.meta?.runtimeInstanceId,
|
|
133
|
+
providerCallId: input.meta?.providerCallId,
|
|
134
|
+
payload: {
|
|
135
|
+
name: input.name,
|
|
136
|
+
method,
|
|
137
|
+
url: input.url,
|
|
138
|
+
durationMs,
|
|
139
|
+
error: message,
|
|
140
|
+
bodySha256: signed.bodySha256,
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
exports.IntegrationClient = IntegrationClient;
|
|
148
|
+
exports.IntegrationClient = IntegrationClient = __decorate([
|
|
149
|
+
(0, common_1.Injectable)(),
|
|
150
|
+
__metadata("design:paramtypes", [event_service_1.EventService])
|
|
151
|
+
], IntegrationClient);
|
|
152
|
+
//# sourceMappingURL=integration-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-client.js","sourceRoot":"","sources":["../../src/integrations/integration-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT HS256 (HMAC) helpers for outbound integration auth.
|
|
3
|
+
* No extra dependency — Node crypto only.
|
|
4
|
+
*/
|
|
5
|
+
export declare const INTEGRATION_SIGNATURE_HEADER = "x-signature";
|
|
6
|
+
export interface IntegrationJwtClaims {
|
|
7
|
+
iat: number;
|
|
8
|
+
exp: number;
|
|
9
|
+
method: string;
|
|
10
|
+
url: string;
|
|
11
|
+
bodySha256: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function sha256Hex(body: string): string;
|
|
14
|
+
export declare function canonicalRequestBody(body: unknown): string;
|
|
15
|
+
export declare function readSecretEnv(secretEnvKey: string): string;
|
|
16
|
+
export declare function signHs256Jwt(claims: Record<string, unknown>, secret: string): string;
|
|
17
|
+
export declare function verifyHs256Jwt(token: string, secret: string): IntegrationJwtClaims;
|
|
18
|
+
/**
|
|
19
|
+
* Sign the exact body bytes that will be sent.
|
|
20
|
+
* JWT is placed on `x-signature` by the integration client.
|
|
21
|
+
*/
|
|
22
|
+
export declare function signIntegrationRequest(input: {
|
|
23
|
+
secret: string;
|
|
24
|
+
method: string;
|
|
25
|
+
url: string;
|
|
26
|
+
body: string;
|
|
27
|
+
ttlSeconds?: number;
|
|
28
|
+
}): {
|
|
29
|
+
token: string;
|
|
30
|
+
bodySha256: string;
|
|
31
|
+
claims: IntegrationJwtClaims;
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=jwt-hmac.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-hmac.d.ts","sourceRoot":"","sources":["../../src/integrations/jwt-hmac.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,eAAO,MAAM,4BAA4B,gBAAgB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAiBD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAK1D;AAED,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAa1D;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,GACb,MAAM,CASR;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,oBAAoB,CAsBtB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAA;CAAE,CAiBtE"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* JWT HS256 (HMAC) helpers for outbound integration auth.
|
|
4
|
+
* No extra dependency — Node crypto only.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.INTEGRATION_SIGNATURE_HEADER = void 0;
|
|
8
|
+
exports.sha256Hex = sha256Hex;
|
|
9
|
+
exports.canonicalRequestBody = canonicalRequestBody;
|
|
10
|
+
exports.readSecretEnv = readSecretEnv;
|
|
11
|
+
exports.signHs256Jwt = signHs256Jwt;
|
|
12
|
+
exports.verifyHs256Jwt = verifyHs256Jwt;
|
|
13
|
+
exports.signIntegrationRequest = signIntegrationRequest;
|
|
14
|
+
const crypto_1 = require("crypto");
|
|
15
|
+
exports.INTEGRATION_SIGNATURE_HEADER = 'x-signature';
|
|
16
|
+
function base64UrlEncode(input) {
|
|
17
|
+
const buf = typeof input === 'string' ? Buffer.from(input, 'utf8') : input;
|
|
18
|
+
return buf
|
|
19
|
+
.toString('base64')
|
|
20
|
+
.replace(/=/g, '')
|
|
21
|
+
.replace(/\+/g, '-')
|
|
22
|
+
.replace(/\//g, '_');
|
|
23
|
+
}
|
|
24
|
+
function base64UrlDecode(input) {
|
|
25
|
+
const padded = input.replace(/-/g, '+').replace(/_/g, '/');
|
|
26
|
+
const pad = padded.length % 4 === 0 ? '' : '='.repeat(4 - (padded.length % 4));
|
|
27
|
+
return Buffer.from(padded + pad, 'base64');
|
|
28
|
+
}
|
|
29
|
+
function sha256Hex(body) {
|
|
30
|
+
return (0, crypto_1.createHash)('sha256').update(body, 'utf8').digest('hex');
|
|
31
|
+
}
|
|
32
|
+
function canonicalRequestBody(body) {
|
|
33
|
+
if (body === undefined || body === null)
|
|
34
|
+
return '';
|
|
35
|
+
if (typeof body === 'string')
|
|
36
|
+
return body;
|
|
37
|
+
if (Buffer.isBuffer(body))
|
|
38
|
+
return body.toString('utf8');
|
|
39
|
+
return JSON.stringify(body);
|
|
40
|
+
}
|
|
41
|
+
function readSecretEnv(secretEnvKey) {
|
|
42
|
+
const key = secretEnvKey.trim();
|
|
43
|
+
if (!key) {
|
|
44
|
+
throw new Error('Integration secretEnvKey must be a non-empty .env key name');
|
|
45
|
+
}
|
|
46
|
+
const secret = process.env[key];
|
|
47
|
+
if (!secret) {
|
|
48
|
+
throw new Error(`Integration HMAC secret missing: process.env.${key} is empty. ` +
|
|
49
|
+
`Set that .env key for this integration.`);
|
|
50
|
+
}
|
|
51
|
+
return secret;
|
|
52
|
+
}
|
|
53
|
+
function signHs256Jwt(claims, secret) {
|
|
54
|
+
const header = { alg: 'HS256', typ: 'JWT' };
|
|
55
|
+
const encodedHeader = base64UrlEncode(JSON.stringify(header));
|
|
56
|
+
const encodedPayload = base64UrlEncode(JSON.stringify(claims));
|
|
57
|
+
const signingInput = `${encodedHeader}.${encodedPayload}`;
|
|
58
|
+
const sig = (0, crypto_1.createHmac)('sha256', secret)
|
|
59
|
+
.update(signingInput)
|
|
60
|
+
.digest();
|
|
61
|
+
return `${signingInput}.${base64UrlEncode(sig)}`;
|
|
62
|
+
}
|
|
63
|
+
function verifyHs256Jwt(token, secret) {
|
|
64
|
+
const parts = token.split('.');
|
|
65
|
+
if (parts.length !== 3) {
|
|
66
|
+
throw new Error('Invalid JWT: expected header.payload.signature');
|
|
67
|
+
}
|
|
68
|
+
const [encodedHeader, encodedPayload, encodedSig] = parts;
|
|
69
|
+
const signingInput = `${encodedHeader}.${encodedPayload}`;
|
|
70
|
+
const expected = (0, crypto_1.createHmac)('sha256', secret).update(signingInput).digest();
|
|
71
|
+
const actual = base64UrlDecode(encodedSig);
|
|
72
|
+
if (expected.length !== actual.length || !(0, crypto_1.timingSafeEqual)(expected, actual)) {
|
|
73
|
+
throw new Error('Invalid JWT HMAC signature');
|
|
74
|
+
}
|
|
75
|
+
const payload = JSON.parse(base64UrlDecode(encodedPayload).toString('utf8'));
|
|
76
|
+
if (!payload || typeof payload !== 'object') {
|
|
77
|
+
throw new Error('Invalid JWT payload');
|
|
78
|
+
}
|
|
79
|
+
const claims = payload;
|
|
80
|
+
const now = Math.floor(Date.now() / 1000);
|
|
81
|
+
if (typeof claims.exp === 'number' && now > claims.exp) {
|
|
82
|
+
throw new Error('JWT expired');
|
|
83
|
+
}
|
|
84
|
+
return claims;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Sign the exact body bytes that will be sent.
|
|
88
|
+
* JWT is placed on `x-signature` by the integration client.
|
|
89
|
+
*/
|
|
90
|
+
function signIntegrationRequest(input) {
|
|
91
|
+
const now = Math.floor(Date.now() / 1000);
|
|
92
|
+
const ttl = input.ttlSeconds ?? 60;
|
|
93
|
+
const method = input.method.toUpperCase();
|
|
94
|
+
const bodySha256 = sha256Hex(input.body);
|
|
95
|
+
const claims = {
|
|
96
|
+
iat: now,
|
|
97
|
+
exp: now + ttl,
|
|
98
|
+
method,
|
|
99
|
+
url: input.url,
|
|
100
|
+
bodySha256,
|
|
101
|
+
};
|
|
102
|
+
return {
|
|
103
|
+
token: signHs256Jwt({ ...claims }, input.secret),
|
|
104
|
+
bodySha256,
|
|
105
|
+
claims,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=jwt-hmac.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-hmac.js","sourceRoot":"","sources":["../../src/integrations/jwt-hmac.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { SupervisedConversation } from '../conversation/supervised-conversation';
|
|
2
|
+
import type { ConversationHistory } from '../conversation/conversation-history';
|
|
3
|
+
import type { ConversationSchema, DefaultConversationSchema, SchemaMemory } from '../conversation/conversation-schema';
|
|
4
|
+
import type { EventService } from '../events/event.service';
|
|
5
|
+
import type { ConversationView } from '../node/agent-node';
|
|
6
|
+
import { INTENTION_RUN_KIND } from './intention-constants';
|
|
7
|
+
import type { IntentionCascadePhase } from './intention-constants';
|
|
8
|
+
export { INTENTION_CASCADE_PHASE, INTENTION_RUN_KIND, ROUTE_RESOLVED_VIA, DEFAULT_FORCE_INTENTION_PRIORITY, } from './intention-constants';
|
|
9
|
+
export type { IntentionCascadePhase, IntentionRunKind, RouteResolvedVia, } from './intention-constants';
|
|
10
|
+
/**
|
|
11
|
+
* When this intention participates in Supervisor cascade.
|
|
12
|
+
*
|
|
13
|
+
* - `force` — evaluate `before()` **before** listen_resolve + Brain; if true, route
|
|
14
|
+
* immediately (`resolvedVia: intention_force`). Absolute code freedom for gates.
|
|
15
|
+
* - `match` — after force cascade / with listen resolve: `match()` may return a
|
|
16
|
+
* local confidence and skip Brain for this name.
|
|
17
|
+
* - `scan` — default; name is a Brain/listen candidate only (lifecycle optional).
|
|
18
|
+
*
|
|
19
|
+
* Prefer `INTENTION_CASCADE_PHASE` over raw strings in app code.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Optional result of `run()` after this intention is selected.
|
|
23
|
+
* Prefer `goto` when the intention owns the destination (DRY breach OK).
|
|
24
|
+
*/
|
|
25
|
+
export type IntentionRunResult = {
|
|
26
|
+
kind: typeof INTENTION_RUN_KIND.Goto;
|
|
27
|
+
nodeId: string;
|
|
28
|
+
reason?: string;
|
|
29
|
+
} | {
|
|
30
|
+
kind: typeof INTENTION_RUN_KIND.Score;
|
|
31
|
+
confidence: number;
|
|
32
|
+
priority?: number;
|
|
33
|
+
reason?: string;
|
|
34
|
+
};
|
|
35
|
+
export interface IntentionContext<TSchema extends ConversationSchema = DefaultConversationSchema> {
|
|
36
|
+
runtime: SupervisedConversation;
|
|
37
|
+
conversation: ConversationView<TSchema>;
|
|
38
|
+
userText: string;
|
|
39
|
+
events: EventService;
|
|
40
|
+
memory: SchemaMemory<TSchema>;
|
|
41
|
+
history: ConversationHistory;
|
|
42
|
+
visitCount: (nodeId: string) => number;
|
|
43
|
+
previousNodeId: string | null;
|
|
44
|
+
/** Active listen intention names (empty when none). */
|
|
45
|
+
listenIntentionNames: string[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Intention = code, like a Node — free to read memory/history/regex and decide.
|
|
49
|
+
*
|
|
50
|
+
* Meta (`phase`, `boost`, `priority`, `toNodeId`) lives on the class so cascade
|
|
51
|
+
* and Brain hints are declared next to the logic, not only in YAML.
|
|
52
|
+
*
|
|
53
|
+
* Lifecycle (force / match phases):
|
|
54
|
+
* before() → authorize gate (false = skip)
|
|
55
|
+
* match() → optional local confidence (null = defer to Brain)
|
|
56
|
+
* run() → optional goto / score rewrite before Node walk
|
|
57
|
+
* after() → teardown after selection
|
|
58
|
+
*/
|
|
59
|
+
export declare abstract class CodeIntention<TSchema extends ConversationSchema = DefaultConversationSchema> {
|
|
60
|
+
/** Stable id — same string flow.yaml / listen lists / Brain candidates use. */
|
|
61
|
+
abstract readonly name: string;
|
|
62
|
+
/**
|
|
63
|
+
* Cascade phase. Default `scan` preserves today’s string-only intentions.
|
|
64
|
+
* Set `force` for Brain-free gates (phone missing, consent gap, …).
|
|
65
|
+
*/
|
|
66
|
+
phase: IntentionCascadePhase;
|
|
67
|
+
/** Brain scoring hint (listen/Brain). Does not by itself change walk order. */
|
|
68
|
+
boost: number;
|
|
69
|
+
/** Supervisor walk priority when this intention is ranked (default 1). */
|
|
70
|
+
priority: number;
|
|
71
|
+
/**
|
|
72
|
+
* Optional hard destination when force/match wins.
|
|
73
|
+
* Overridden if `run()` returns `{ kind: INTENTION_RUN_KIND.Goto, nodeId }`.
|
|
74
|
+
*/
|
|
75
|
+
toNodeId?: string;
|
|
76
|
+
/** Forensic / diagram label (optional). */
|
|
77
|
+
reason?: string;
|
|
78
|
+
before(_ctx: IntentionContext<TSchema>): Promise<boolean>;
|
|
79
|
+
/**
|
|
80
|
+
* Local confidence in `[0, 1]`, or `null` to leave scoring to Brain / listen.
|
|
81
|
+
* Force phase defaults to `1` when `before()` passed and this is not overridden.
|
|
82
|
+
*/
|
|
83
|
+
match(_ctx: IntentionContext<TSchema>): Promise<number | null>;
|
|
84
|
+
run(_ctx: IntentionContext<TSchema>): Promise<IntentionRunResult | null>;
|
|
85
|
+
after(_ctx: IntentionContext<TSchema>): Promise<void>;
|
|
86
|
+
}
|
|
87
|
+
export declare const STUDIO_INTENTION_REGISTRY: unique symbol;
|
|
88
|
+
export type CodeIntentionRegistry = Map<string, CodeIntention<any>>;
|
|
89
|
+
export declare function intentionContextFromRuntime(input: {
|
|
90
|
+
runtime: SupervisedConversation;
|
|
91
|
+
userText: string;
|
|
92
|
+
events: EventService;
|
|
93
|
+
}): IntentionContext;
|
|
94
|
+
//# sourceMappingURL=code-intention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-intention.d.ts","sourceRoot":"","sources":["../../src/intention/code-intention.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.STUDIO_INTENTION_REGISTRY = exports.CodeIntention = exports.DEFAULT_FORCE_INTENTION_PRIORITY = exports.ROUTE_RESOLVED_VIA = exports.INTENTION_RUN_KIND = exports.INTENTION_CASCADE_PHASE = void 0;
|
|
4
|
+
exports.intentionContextFromRuntime = intentionContextFromRuntime;
|
|
5
|
+
const conversation_history_1 = require("../conversation/conversation-history");
|
|
6
|
+
const intention_constants_1 = require("./intention-constants");
|
|
7
|
+
var intention_constants_2 = require("./intention-constants");
|
|
8
|
+
Object.defineProperty(exports, "INTENTION_CASCADE_PHASE", { enumerable: true, get: function () { return intention_constants_2.INTENTION_CASCADE_PHASE; } });
|
|
9
|
+
Object.defineProperty(exports, "INTENTION_RUN_KIND", { enumerable: true, get: function () { return intention_constants_2.INTENTION_RUN_KIND; } });
|
|
10
|
+
Object.defineProperty(exports, "ROUTE_RESOLVED_VIA", { enumerable: true, get: function () { return intention_constants_2.ROUTE_RESOLVED_VIA; } });
|
|
11
|
+
Object.defineProperty(exports, "DEFAULT_FORCE_INTENTION_PRIORITY", { enumerable: true, get: function () { return intention_constants_2.DEFAULT_FORCE_INTENTION_PRIORITY; } });
|
|
12
|
+
/**
|
|
13
|
+
* Intention = code, like a Node — free to read memory/history/regex and decide.
|
|
14
|
+
*
|
|
15
|
+
* Meta (`phase`, `boost`, `priority`, `toNodeId`) lives on the class so cascade
|
|
16
|
+
* and Brain hints are declared next to the logic, not only in YAML.
|
|
17
|
+
*
|
|
18
|
+
* Lifecycle (force / match phases):
|
|
19
|
+
* before() → authorize gate (false = skip)
|
|
20
|
+
* match() → optional local confidence (null = defer to Brain)
|
|
21
|
+
* run() → optional goto / score rewrite before Node walk
|
|
22
|
+
* after() → teardown after selection
|
|
23
|
+
*/
|
|
24
|
+
class CodeIntention {
|
|
25
|
+
/**
|
|
26
|
+
* Cascade phase. Default `scan` preserves today’s string-only intentions.
|
|
27
|
+
* Set `force` for Brain-free gates (phone missing, consent gap, …).
|
|
28
|
+
*/
|
|
29
|
+
phase = intention_constants_1.INTENTION_CASCADE_PHASE.Scan;
|
|
30
|
+
/** Brain scoring hint (listen/Brain). Does not by itself change walk order. */
|
|
31
|
+
boost = 0;
|
|
32
|
+
/** Supervisor walk priority when this intention is ranked (default 1). */
|
|
33
|
+
priority = 1;
|
|
34
|
+
/**
|
|
35
|
+
* Optional hard destination when force/match wins.
|
|
36
|
+
* Overridden if `run()` returns `{ kind: INTENTION_RUN_KIND.Goto, nodeId }`.
|
|
37
|
+
*/
|
|
38
|
+
toNodeId;
|
|
39
|
+
/** Forensic / diagram label (optional). */
|
|
40
|
+
reason;
|
|
41
|
+
async before(_ctx) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Local confidence in `[0, 1]`, or `null` to leave scoring to Brain / listen.
|
|
46
|
+
* Force phase defaults to `1` when `before()` passed and this is not overridden.
|
|
47
|
+
*/
|
|
48
|
+
async match(_ctx) {
|
|
49
|
+
return this.phase === intention_constants_1.INTENTION_CASCADE_PHASE.Force ? 1 : null;
|
|
50
|
+
}
|
|
51
|
+
async run(_ctx) {
|
|
52
|
+
if (this.toNodeId) {
|
|
53
|
+
return {
|
|
54
|
+
kind: intention_constants_1.INTENTION_RUN_KIND.Goto,
|
|
55
|
+
nodeId: this.toNodeId,
|
|
56
|
+
reason: this.reason,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
async after(_ctx) {
|
|
62
|
+
// no-op
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.CodeIntention = CodeIntention;
|
|
66
|
+
exports.STUDIO_INTENTION_REGISTRY = Symbol('STUDIO_INTENTION_REGISTRY');
|
|
67
|
+
function intentionContextFromRuntime(input) {
|
|
68
|
+
const { runtime, userText, events } = input;
|
|
69
|
+
const memory = runtime.memory;
|
|
70
|
+
const variables = runtime.variables;
|
|
71
|
+
return {
|
|
72
|
+
runtime,
|
|
73
|
+
conversation: {
|
|
74
|
+
id: runtime.conversationId ?? '',
|
|
75
|
+
providerCallId: runtime.providerCallId,
|
|
76
|
+
flowId: runtime.flowId,
|
|
77
|
+
variables,
|
|
78
|
+
memory,
|
|
79
|
+
},
|
|
80
|
+
userText,
|
|
81
|
+
events,
|
|
82
|
+
memory,
|
|
83
|
+
history: runtime.history,
|
|
84
|
+
visitCount: (nodeId) => (0, conversation_history_1.countNodeVisits)(runtime.history, nodeId),
|
|
85
|
+
previousNodeId: (0, conversation_history_1.lastVisitedNodeId)(runtime.history),
|
|
86
|
+
listenIntentionNames: (runtime.listenExpectation?.intentions ?? []).map((i) => i.name),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=code-intention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-intention.js","sourceRoot":"","sources":["../../src/intention/code-intention.ts"],"names":[],"mappings":";;;AAuJA,kEA2BC;AAhLD,+EAG8C;AAS9C,+DAG+B;AAK/B,6DAK+B;AAJ7B,8HAAA,uBAAuB,OAAA;AACvB,yHAAA,kBAAkB,OAAA;AAClB,yHAAA,kBAAkB,OAAA;AAClB,uIAAA,gCAAgC,OAAA;AAoDlC;;;;;;;;;;;GAWG;AACH,MAAsB,aAAa;IAMjC;;;OAGG;IACI,KAAK,GAA0B,6CAAuB,CAAC,IAAI,CAAC;IAEnE,+EAA+E;IACxE,KAAK,GAAW,CAAC,CAAC;IAEzB,0EAA0E;IACnE,QAAQ,GAAW,CAAC,CAAC;IAE5B;;;OAGG;IACI,QAAQ,CAAU;IAEzB,2CAA2C;IACpC,MAAM,CAAU;IAEhB,KAAK,CAAC,MAAM,CAAC,IAA+B;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,KAAK,CAAC,IAA+B;QAChD,OAAO,IAAI,CAAC,KAAK,KAAK,6CAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,CAAC;IAEM,KAAK,CAAC,GAAG,CACd,IAA+B;QAE/B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO;gBACL,IAAI,EAAE,wCAAkB,CAAC,IAAI;gBAC7B,MAAM,EAAE,IAAI,CAAC,QAAQ;gBACrB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,IAA+B;QAChD,QAAQ;IACV,CAAC;CACF;AAvDD,sCAuDC;AAEY,QAAA,yBAAyB,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAC;AAI7E,SAAgB,2BAA2B,CAAC,KAI3C;IACC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAiD,CAAC;IACzE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAuD,CAAC;IAClF,OAAO;QACL,OAAO;QACP,YAAY,EAAE;YACZ,EAAE,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;YAChC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS;YACT,MAAM;SACP;QACD,QAAQ;QACR,MAAM;QACN,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,sCAAe,EAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC;QAChE,cAAc,EAAE,IAAA,wCAAiB,EAAC,OAAO,CAAC,OAAO,CAAC;QAClD,oBAAoB,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CACrE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CACd;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Supervisor cascade phase for a code intention class. */
|
|
2
|
+
export declare const INTENTION_CASCADE_PHASE: {
|
|
3
|
+
/** Evaluate before listen resolve + Brain; route on `before()` / `run()`. */
|
|
4
|
+
readonly Force: "force";
|
|
5
|
+
/** Local `match()` confidence; may skip Brain for this name. */
|
|
6
|
+
readonly Match: "match";
|
|
7
|
+
/** Default — name is a Brain / listen candidate only. */
|
|
8
|
+
readonly Scan: "scan";
|
|
9
|
+
};
|
|
10
|
+
export type IntentionCascadePhase = (typeof INTENTION_CASCADE_PHASE)[keyof typeof INTENTION_CASCADE_PHASE];
|
|
11
|
+
/** Result discriminator from `CodeIntention.run()`. */
|
|
12
|
+
export declare const INTENTION_RUN_KIND: {
|
|
13
|
+
readonly Goto: "goto";
|
|
14
|
+
readonly Score: "score";
|
|
15
|
+
};
|
|
16
|
+
export type IntentionRunKind = (typeof INTENTION_RUN_KIND)[keyof typeof INTENTION_RUN_KIND];
|
|
17
|
+
/**
|
|
18
|
+
* `ROUTE_DECISION` / turn forensics — how the supervisor picked the next node.
|
|
19
|
+
* Apps may emit additional strings; these are the framework-defined values.
|
|
20
|
+
*/
|
|
21
|
+
export declare const ROUTE_RESOLVED_VIA: {
|
|
22
|
+
readonly ConditionForce: "condition_force";
|
|
23
|
+
readonly ConditionBoost: "condition_boost";
|
|
24
|
+
readonly IntentionForce: "intention_force";
|
|
25
|
+
readonly IntentionMatch: "intention_match";
|
|
26
|
+
readonly ListenResolve: "listen_resolve";
|
|
27
|
+
readonly Brain: "brain";
|
|
28
|
+
readonly ForceIntention: "force_intention";
|
|
29
|
+
readonly Continue: "continue";
|
|
30
|
+
/** Unknown portal restatement accepted against the origin listen. */
|
|
31
|
+
readonly UnknownOriginConsume: "unknown_origin_consume";
|
|
32
|
+
readonly RouteFallbackUnknown: "route_fallback_unknown";
|
|
33
|
+
};
|
|
34
|
+
export type RouteResolvedVia = (typeof ROUTE_RESOLVED_VIA)[keyof typeof ROUTE_RESOLVED_VIA];
|
|
35
|
+
/** Walk priority for force gates that must beat normal flow (phone missing, consent gap, …). */
|
|
36
|
+
export declare const DEFAULT_FORCE_INTENTION_PRIORITY = 1000000;
|
|
37
|
+
//# sourceMappingURL=intention-constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intention-constants.d.ts","sourceRoot":"","sources":["../../src/intention/intention-constants.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,uBAAuB;IAClC,6EAA6E;;IAE7E,gEAAgE;;IAEhE,yDAAyD;;CAEjD,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAC/B,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,OAAO,uBAAuB,CAAC,CAAC;AAEzE,uDAAuD;AACvD,eAAO,MAAM,kBAAkB;;;CAGrB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAC1B,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC;AAE/D;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;IAS7B,qEAAqE;;;CAG7D,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAC1B,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC;AAE/D,gGAAgG;AAChG,eAAO,MAAM,gCAAgC,UAAY,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_FORCE_INTENTION_PRIORITY = exports.ROUTE_RESOLVED_VIA = exports.INTENTION_RUN_KIND = exports.INTENTION_CASCADE_PHASE = void 0;
|
|
4
|
+
/** Supervisor cascade phase for a code intention class. */
|
|
5
|
+
exports.INTENTION_CASCADE_PHASE = {
|
|
6
|
+
/** Evaluate before listen resolve + Brain; route on `before()` / `run()`. */
|
|
7
|
+
Force: 'force',
|
|
8
|
+
/** Local `match()` confidence; may skip Brain for this name. */
|
|
9
|
+
Match: 'match',
|
|
10
|
+
/** Default — name is a Brain / listen candidate only. */
|
|
11
|
+
Scan: 'scan',
|
|
12
|
+
};
|
|
13
|
+
/** Result discriminator from `CodeIntention.run()`. */
|
|
14
|
+
exports.INTENTION_RUN_KIND = {
|
|
15
|
+
Goto: 'goto',
|
|
16
|
+
Score: 'score',
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* `ROUTE_DECISION` / turn forensics — how the supervisor picked the next node.
|
|
20
|
+
* Apps may emit additional strings; these are the framework-defined values.
|
|
21
|
+
*/
|
|
22
|
+
exports.ROUTE_RESOLVED_VIA = {
|
|
23
|
+
ConditionForce: 'condition_force',
|
|
24
|
+
ConditionBoost: 'condition_boost',
|
|
25
|
+
IntentionForce: 'intention_force',
|
|
26
|
+
IntentionMatch: 'intention_match',
|
|
27
|
+
ListenResolve: 'listen_resolve',
|
|
28
|
+
Brain: 'brain',
|
|
29
|
+
ForceIntention: 'force_intention',
|
|
30
|
+
Continue: 'continue',
|
|
31
|
+
/** Unknown portal restatement accepted against the origin listen. */
|
|
32
|
+
UnknownOriginConsume: 'unknown_origin_consume',
|
|
33
|
+
RouteFallbackUnknown: 'route_fallback_unknown',
|
|
34
|
+
};
|
|
35
|
+
/** Walk priority for force gates that must beat normal flow (phone missing, consent gap, …). */
|
|
36
|
+
exports.DEFAULT_FORCE_INTENTION_PRIORITY = 1_000_000;
|
|
37
|
+
//# sourceMappingURL=intention-constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intention-constants.js","sourceRoot":"","sources":["../../src/intention/intention-constants.ts"],"names":[],"mappings":";;;AAAA,2DAA2D;AAC9C,QAAA,uBAAuB,GAAG;IACrC,6EAA6E;IAC7E,KAAK,EAAE,OAAO;IACd,gEAAgE;IAChE,KAAK,EAAE,OAAO;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM;CACJ,CAAC;AAKX,uDAAuD;AAC1C,QAAA,kBAAkB,GAAG;IAChC,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACN,CAAC;AAKX;;;GAGG;AACU,QAAA,kBAAkB,GAAG;IAChC,cAAc,EAAE,iBAAiB;IACjC,cAAc,EAAE,iBAAiB;IACjC,cAAc,EAAE,iBAAiB;IACjC,cAAc,EAAE,iBAAiB;IACjC,aAAa,EAAE,gBAAgB;IAC/B,KAAK,EAAE,OAAO;IACd,cAAc,EAAE,iBAAiB;IACjC,QAAQ,EAAE,UAAU;IACpB,qEAAqE;IACrE,oBAAoB,EAAE,wBAAwB;IAC9C,oBAAoB,EAAE,wBAAwB;CACtC,CAAC;AAKX,gGAAgG;AACnF,QAAA,gCAAgC,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Framework-standard intention ids (use in flow.yaml and portal nodes). */
|
|
2
|
+
export declare const STANDARD_INTENTIONS: {
|
|
3
|
+
readonly isGoodbye: "studio.isGoodbye";
|
|
4
|
+
readonly isTransferToHuman: "studio.isTransferToHuman";
|
|
5
|
+
readonly isPause: "studio.isPause";
|
|
6
|
+
/** Caller is angry / mad — handle as a standalone portal, not normal flow. */
|
|
7
|
+
readonly isMad: "studio.isMad";
|
|
8
|
+
/**
|
|
9
|
+
* No candidate intention cleared the confidence threshold.
|
|
10
|
+
* Standalone portal — ask to clarify / recover.
|
|
11
|
+
*/
|
|
12
|
+
readonly isUnknownTransition: "studio.isUnknownTransition";
|
|
13
|
+
/** Affirmative answer (yes / correct / sure / okay). */
|
|
14
|
+
readonly isPositive: "studio.isPositive";
|
|
15
|
+
/** Negative answer (no / incorrect / decline). */
|
|
16
|
+
readonly isNegative: "studio.isNegative";
|
|
17
|
+
/**
|
|
18
|
+
* Caller went silent — Vapi idle hook / Studio timer injects this portal.
|
|
19
|
+
* Ask “still there?” twice, then endCall.
|
|
20
|
+
*/
|
|
21
|
+
readonly isStillThere: "studio.isStillThere";
|
|
22
|
+
/** Synthetic: channel delivered tool results for the pending toolCall. */
|
|
23
|
+
readonly isToolResult: "studio.isToolResult";
|
|
24
|
+
};
|
|
25
|
+
export type StandardIntention = (typeof STANDARD_INTENTIONS)[keyof typeof STANDARD_INTENTIONS];
|
|
26
|
+
//# sourceMappingURL=standard-intentions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standard-intentions.d.ts","sourceRoot":"","sources":["../../src/intentions/standard-intentions.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB;;;;IAI9B,8EAA8E;;IAE9E;;;OAGG;;IAEH,wDAAwD;;IAExD,kDAAkD;;IAElD;;;OAGG;;IAEH,0EAA0E;;CAElE,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAC3B,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC"}
|