@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.
Files changed (407) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +129 -0
  3. package/agent/AGENTS.md +42 -0
  4. package/agent/CLAUDE.md +15 -0
  5. package/agent/claude/rules/ui-and-api-identity.md +9 -0
  6. package/agent/claude/rules/vapi-studio-best-practices.md +36 -0
  7. package/agent/cursor/ui-and-api-identity.mdc +16 -0
  8. package/agent/cursor/vapi-studio-best-practices.mdc +43 -0
  9. package/dist/adapters/vapi/vapi-sse.compiler.d.ts +61 -0
  10. package/dist/adapters/vapi/vapi-sse.compiler.d.ts.map +1 -0
  11. package/dist/adapters/vapi/vapi-sse.compiler.js +396 -0
  12. package/dist/adapters/vapi/vapi-sse.compiler.js.map +1 -0
  13. package/dist/analytics/analytics-tags.d.ts +60 -0
  14. package/dist/analytics/analytics-tags.d.ts.map +1 -0
  15. package/dist/analytics/analytics-tags.js +27 -0
  16. package/dist/analytics/analytics-tags.js.map +1 -0
  17. package/dist/brain/adapters/chatgpt-brain.adapter.d.ts +27 -0
  18. package/dist/brain/adapters/chatgpt-brain.adapter.d.ts.map +1 -0
  19. package/dist/brain/adapters/chatgpt-brain.adapter.js +94 -0
  20. package/dist/brain/adapters/chatgpt-brain.adapter.js.map +1 -0
  21. package/dist/brain/adapters/claude-brain.adapter.d.ts +24 -0
  22. package/dist/brain/adapters/claude-brain.adapter.d.ts.map +1 -0
  23. package/dist/brain/adapters/claude-brain.adapter.js +96 -0
  24. package/dist/brain/adapters/claude-brain.adapter.js.map +1 -0
  25. package/dist/brain/adapters/gemini-brain.adapter.d.ts +24 -0
  26. package/dist/brain/adapters/gemini-brain.adapter.d.ts.map +1 -0
  27. package/dist/brain/adapters/gemini-brain.adapter.js +106 -0
  28. package/dist/brain/adapters/gemini-brain.adapter.js.map +1 -0
  29. package/dist/brain/adapters/grok-brain.adapter.d.ts +24 -0
  30. package/dist/brain/adapters/grok-brain.adapter.d.ts.map +1 -0
  31. package/dist/brain/adapters/grok-brain.adapter.js +90 -0
  32. package/dist/brain/adapters/grok-brain.adapter.js.map +1 -0
  33. package/dist/brain/adapters/json-llm-brain.base.d.ts +63 -0
  34. package/dist/brain/adapters/json-llm-brain.base.d.ts.map +1 -0
  35. package/dist/brain/adapters/json-llm-brain.base.js +511 -0
  36. package/dist/brain/adapters/json-llm-brain.base.js.map +1 -0
  37. package/dist/brain/adapters/mock-brain.adapter.d.ts +32 -0
  38. package/dist/brain/adapters/mock-brain.adapter.d.ts.map +1 -0
  39. package/dist/brain/adapters/mock-brain.adapter.js +201 -0
  40. package/dist/brain/adapters/mock-brain.adapter.js.map +1 -0
  41. package/dist/brain/adapters/mock-provider-brains.adapter.d.ts +22 -0
  42. package/dist/brain/adapters/mock-provider-brains.adapter.d.ts.map +1 -0
  43. package/dist/brain/adapters/mock-provider-brains.adapter.js +48 -0
  44. package/dist/brain/adapters/mock-provider-brains.adapter.js.map +1 -0
  45. package/dist/brain/brain-clarify.d.ts +75 -0
  46. package/dist/brain/brain-clarify.d.ts.map +1 -0
  47. package/dist/brain/brain-clarify.js +146 -0
  48. package/dist/brain/brain-clarify.js.map +1 -0
  49. package/dist/brain/brain-config.d.ts +20 -0
  50. package/dist/brain/brain-config.d.ts.map +1 -0
  51. package/dist/brain/brain-config.js +20 -0
  52. package/dist/brain/brain-config.js.map +1 -0
  53. package/dist/brain/brain-judge.d.ts +68 -0
  54. package/dist/brain/brain-judge.d.ts.map +1 -0
  55. package/dist/brain/brain-judge.js +111 -0
  56. package/dist/brain/brain-judge.js.map +1 -0
  57. package/dist/brain/brain-ranking.d.ts +41 -0
  58. package/dist/brain/brain-ranking.d.ts.map +1 -0
  59. package/dist/brain/brain-ranking.js +103 -0
  60. package/dist/brain/brain-ranking.js.map +1 -0
  61. package/dist/brain/brain-usage.tracker.d.ts +48 -0
  62. package/dist/brain/brain-usage.tracker.d.ts.map +1 -0
  63. package/dist/brain/brain-usage.tracker.js +106 -0
  64. package/dist/brain/brain-usage.tracker.js.map +1 -0
  65. package/dist/brain/brain.port.d.ts +63 -0
  66. package/dist/brain/brain.port.d.ts.map +1 -0
  67. package/dist/brain/brain.port.js +7 -0
  68. package/dist/brain/brain.port.js.map +1 -0
  69. package/dist/brain/brain.service.d.ts +14 -0
  70. package/dist/brain/brain.service.d.ts.map +1 -0
  71. package/dist/brain/brain.service.js +27 -0
  72. package/dist/brain/brain.service.js.map +1 -0
  73. package/dist/brain/claude-cheap-models.d.ts +18 -0
  74. package/dist/brain/claude-cheap-models.d.ts.map +1 -0
  75. package/dist/brain/claude-cheap-models.js +53 -0
  76. package/dist/brain/claude-cheap-models.js.map +1 -0
  77. package/dist/brain/gemini-cheap-models.d.ts +18 -0
  78. package/dist/brain/gemini-cheap-models.d.ts.map +1 -0
  79. package/dist/brain/gemini-cheap-models.js +53 -0
  80. package/dist/brain/gemini-cheap-models.js.map +1 -0
  81. package/dist/brain/grok-cheap-models.d.ts +18 -0
  82. package/dist/brain/grok-cheap-models.d.ts.map +1 -0
  83. package/dist/brain/grok-cheap-models.js +53 -0
  84. package/dist/brain/grok-cheap-models.js.map +1 -0
  85. package/dist/brain/llm-model-pricing.d.ts +29 -0
  86. package/dist/brain/llm-model-pricing.d.ts.map +1 -0
  87. package/dist/brain/llm-model-pricing.js +38 -0
  88. package/dist/brain/llm-model-pricing.js.map +1 -0
  89. package/dist/brain/openai-cheap-models.d.ts +34 -0
  90. package/dist/brain/openai-cheap-models.d.ts.map +1 -0
  91. package/dist/brain/openai-cheap-models.js +72 -0
  92. package/dist/brain/openai-cheap-models.js.map +1 -0
  93. package/dist/brain/prompt-injection-guard.d.ts +34 -0
  94. package/dist/brain/prompt-injection-guard.d.ts.map +1 -0
  95. package/dist/brain/prompt-injection-guard.js +109 -0
  96. package/dist/brain/prompt-injection-guard.js.map +1 -0
  97. package/dist/channel/channel-tools.d.ts +72 -0
  98. package/dist/channel/channel-tools.d.ts.map +1 -0
  99. package/dist/channel/channel-tools.js +131 -0
  100. package/dist/channel/channel-tools.js.map +1 -0
  101. package/dist/conversation/call-turn-queue.d.ts +64 -0
  102. package/dist/conversation/call-turn-queue.d.ts.map +1 -0
  103. package/dist/conversation/call-turn-queue.js +156 -0
  104. package/dist/conversation/call-turn-queue.js.map +1 -0
  105. package/dist/conversation/conversation-bootstrap.service.d.ts +60 -0
  106. package/dist/conversation/conversation-bootstrap.service.d.ts.map +1 -0
  107. package/dist/conversation/conversation-bootstrap.service.js +383 -0
  108. package/dist/conversation/conversation-bootstrap.service.js.map +1 -0
  109. package/dist/conversation/conversation-entry.d.ts +38 -0
  110. package/dist/conversation/conversation-entry.d.ts.map +1 -0
  111. package/dist/conversation/conversation-entry.js +17 -0
  112. package/dist/conversation/conversation-entry.js.map +1 -0
  113. package/dist/conversation/conversation-history.d.ts +31 -0
  114. package/dist/conversation/conversation-history.d.ts.map +1 -0
  115. package/dist/conversation/conversation-history.js +53 -0
  116. package/dist/conversation/conversation-history.js.map +1 -0
  117. package/dist/conversation/conversation-limits.d.ts +49 -0
  118. package/dist/conversation/conversation-limits.d.ts.map +1 -0
  119. package/dist/conversation/conversation-limits.js +44 -0
  120. package/dist/conversation/conversation-limits.js.map +1 -0
  121. package/dist/conversation/conversation-resume.service.d.ts +39 -0
  122. package/dist/conversation/conversation-resume.service.d.ts.map +1 -0
  123. package/dist/conversation/conversation-resume.service.js +234 -0
  124. package/dist/conversation/conversation-resume.service.js.map +1 -0
  125. package/dist/conversation/conversation-schema.d.ts +23 -0
  126. package/dist/conversation/conversation-schema.d.ts.map +1 -0
  127. package/dist/conversation/conversation-schema.js +3 -0
  128. package/dist/conversation/conversation-schema.js.map +1 -0
  129. package/dist/conversation/listen-expectation.d.ts +145 -0
  130. package/dist/conversation/listen-expectation.d.ts.map +1 -0
  131. package/dist/conversation/listen-expectation.js +219 -0
  132. package/dist/conversation/listen-expectation.js.map +1 -0
  133. package/dist/conversation/listen-timeout.d.ts +42 -0
  134. package/dist/conversation/listen-timeout.d.ts.map +1 -0
  135. package/dist/conversation/listen-timeout.js +57 -0
  136. package/dist/conversation/listen-timeout.js.map +1 -0
  137. package/dist/conversation/supervised-conversation.d.ts +64 -0
  138. package/dist/conversation/supervised-conversation.d.ts.map +1 -0
  139. package/dist/conversation/supervised-conversation.js +198 -0
  140. package/dist/conversation/supervised-conversation.js.map +1 -0
  141. package/dist/conversation/supervised-conversation.registry.d.ts +14 -0
  142. package/dist/conversation/supervised-conversation.registry.d.ts.map +1 -0
  143. package/dist/conversation/supervised-conversation.registry.js +47 -0
  144. package/dist/conversation/supervised-conversation.registry.js.map +1 -0
  145. package/dist/conversation/types.d.ts +52 -0
  146. package/dist/conversation/types.d.ts.map +1 -0
  147. package/dist/conversation/types.js +3 -0
  148. package/dist/conversation/types.js.map +1 -0
  149. package/dist/events/conversation-console.d.ts +17 -0
  150. package/dist/events/conversation-console.d.ts.map +1 -0
  151. package/dist/events/conversation-console.js +863 -0
  152. package/dist/events/conversation-console.js.map +1 -0
  153. package/dist/events/daily-log.driver.d.ts +35 -0
  154. package/dist/events/daily-log.driver.d.ts.map +1 -0
  155. package/dist/events/daily-log.driver.js +206 -0
  156. package/dist/events/daily-log.driver.js.map +1 -0
  157. package/dist/events/event.service.d.ts +24 -0
  158. package/dist/events/event.service.d.ts.map +1 -0
  159. package/dist/events/event.service.js +141 -0
  160. package/dist/events/event.service.js.map +1 -0
  161. package/dist/events/route-forensics.d.ts +38 -0
  162. package/dist/events/route-forensics.d.ts.map +1 -0
  163. package/dist/events/route-forensics.js +85 -0
  164. package/dist/events/route-forensics.js.map +1 -0
  165. package/dist/events/studio-event-bus.d.ts +17 -0
  166. package/dist/events/studio-event-bus.d.ts.map +1 -0
  167. package/dist/events/studio-event-bus.js +37 -0
  168. package/dist/events/studio-event-bus.js.map +1 -0
  169. package/dist/events/studio-event.d.ts +44 -0
  170. package/dist/events/studio-event.d.ts.map +1 -0
  171. package/dist/events/studio-event.js +27 -0
  172. package/dist/events/studio-event.js.map +1 -0
  173. package/dist/flow/condition.d.ts +35 -0
  174. package/dist/flow/condition.d.ts.map +1 -0
  175. package/dist/flow/condition.js +246 -0
  176. package/dist/flow/condition.js.map +1 -0
  177. package/dist/flow/flow-loader.d.ts +71 -0
  178. package/dist/flow/flow-loader.d.ts.map +1 -0
  179. package/dist/flow/flow-loader.js +182 -0
  180. package/dist/flow/flow-loader.js.map +1 -0
  181. package/dist/forms/form-html.d.ts +30 -0
  182. package/dist/forms/form-html.d.ts.map +1 -0
  183. package/dist/forms/form-html.js +130 -0
  184. package/dist/forms/form-html.js.map +1 -0
  185. package/dist/forms/form.tokens.d.ts +3 -0
  186. package/dist/forms/form.tokens.d.ts.map +1 -0
  187. package/dist/forms/form.tokens.js +6 -0
  188. package/dist/forms/form.tokens.js.map +1 -0
  189. package/dist/forms/form.types.d.ts +81 -0
  190. package/dist/forms/form.types.d.ts.map +1 -0
  191. package/dist/forms/form.types.js +36 -0
  192. package/dist/forms/form.types.js.map +1 -0
  193. package/dist/forms/forms.service.d.ts +52 -0
  194. package/dist/forms/forms.service.d.ts.map +1 -0
  195. package/dist/forms/forms.service.js +434 -0
  196. package/dist/forms/forms.service.js.map +1 -0
  197. package/dist/forms/noop-form-dispose.adapter.d.ts +12 -0
  198. package/dist/forms/noop-form-dispose.adapter.d.ts.map +1 -0
  199. package/dist/forms/noop-form-dispose.adapter.js +27 -0
  200. package/dist/forms/noop-form-dispose.adapter.js.map +1 -0
  201. package/dist/forms/twilio-sms-form-dispose.adapter.d.ts +33 -0
  202. package/dist/forms/twilio-sms-form-dispose.adapter.d.ts.map +1 -0
  203. package/dist/forms/twilio-sms-form-dispose.adapter.js +125 -0
  204. package/dist/forms/twilio-sms-form-dispose.adapter.js.map +1 -0
  205. package/dist/forms/twilio-sms.env.d.ts +62 -0
  206. package/dist/forms/twilio-sms.env.d.ts.map +1 -0
  207. package/dist/forms/twilio-sms.env.js +147 -0
  208. package/dist/forms/twilio-sms.env.js.map +1 -0
  209. package/dist/forms/twilio-sms.sender.d.ts +27 -0
  210. package/dist/forms/twilio-sms.sender.d.ts.map +1 -0
  211. package/dist/forms/twilio-sms.sender.js +75 -0
  212. package/dist/forms/twilio-sms.sender.js.map +1 -0
  213. package/dist/identity/email-parse.d.ts +20 -0
  214. package/dist/identity/email-parse.d.ts.map +1 -0
  215. package/dist/identity/email-parse.js +102 -0
  216. package/dist/identity/email-parse.js.map +1 -0
  217. package/dist/identity/index.d.ts +17 -0
  218. package/dist/identity/index.d.ts.map +1 -0
  219. package/dist/identity/index.js +23 -0
  220. package/dist/identity/index.js.map +1 -0
  221. package/dist/index.d.ts +108 -0
  222. package/dist/index.d.ts.map +1 -0
  223. package/dist/index.js +300 -0
  224. package/dist/index.js.map +1 -0
  225. package/dist/integrations/integration-client.d.ts +41 -0
  226. package/dist/integrations/integration-client.d.ts.map +1 -0
  227. package/dist/integrations/integration-client.js +152 -0
  228. package/dist/integrations/integration-client.js.map +1 -0
  229. package/dist/integrations/jwt-hmac.d.ts +33 -0
  230. package/dist/integrations/jwt-hmac.d.ts.map +1 -0
  231. package/dist/integrations/jwt-hmac.js +108 -0
  232. package/dist/integrations/jwt-hmac.js.map +1 -0
  233. package/dist/intention/code-intention.d.ts +94 -0
  234. package/dist/intention/code-intention.d.ts.map +1 -0
  235. package/dist/intention/code-intention.js +89 -0
  236. package/dist/intention/code-intention.js.map +1 -0
  237. package/dist/intention/intention-constants.d.ts +37 -0
  238. package/dist/intention/intention-constants.d.ts.map +1 -0
  239. package/dist/intention/intention-constants.js +37 -0
  240. package/dist/intention/intention-constants.js.map +1 -0
  241. package/dist/intentions/standard-intentions.d.ts +26 -0
  242. package/dist/intentions/standard-intentions.d.ts.map +1 -0
  243. package/dist/intentions/standard-intentions.js +28 -0
  244. package/dist/intentions/standard-intentions.js.map +1 -0
  245. package/dist/node/agent-node.d.ts +156 -0
  246. package/dist/node/agent-node.d.ts.map +1 -0
  247. package/dist/node/agent-node.js +179 -0
  248. package/dist/node/agent-node.js.map +1 -0
  249. package/dist/node/catch-directive.d.ts +33 -0
  250. package/dist/node/catch-directive.d.ts.map +1 -0
  251. package/dist/node/catch-directive.js +41 -0
  252. package/dist/node/catch-directive.js.map +1 -0
  253. package/dist/output/conversation-output.d.ts +113 -0
  254. package/dist/output/conversation-output.d.ts.map +1 -0
  255. package/dist/output/conversation-output.js +100 -0
  256. package/dist/output/conversation-output.js.map +1 -0
  257. package/dist/persistence/conversation.entity.d.ts +27 -0
  258. package/dist/persistence/conversation.entity.d.ts.map +1 -0
  259. package/dist/persistence/conversation.entity.js +115 -0
  260. package/dist/persistence/conversation.entity.js.map +1 -0
  261. package/dist/persistence/conversation.repository.d.ts +82 -0
  262. package/dist/persistence/conversation.repository.d.ts.map +1 -0
  263. package/dist/persistence/conversation.repository.js +277 -0
  264. package/dist/persistence/conversation.repository.js.map +1 -0
  265. package/dist/persistence/project.entity.d.ts +12 -0
  266. package/dist/persistence/project.entity.d.ts.map +1 -0
  267. package/dist/persistence/project.entity.js +46 -0
  268. package/dist/persistence/project.entity.js.map +1 -0
  269. package/dist/persistence/project.repository.d.ts +17 -0
  270. package/dist/persistence/project.repository.d.ts.map +1 -0
  271. package/dist/persistence/project.repository.js +69 -0
  272. package/dist/persistence/project.repository.js.map +1 -0
  273. package/dist/persistence/provider-ingress.entity.d.ts +18 -0
  274. package/dist/persistence/provider-ingress.entity.d.ts.map +1 -0
  275. package/dist/persistence/provider-ingress.entity.js +91 -0
  276. package/dist/persistence/provider-ingress.entity.js.map +1 -0
  277. package/dist/persistence/provider-ingress.repository.d.ts +21 -0
  278. package/dist/persistence/provider-ingress.repository.d.ts.map +1 -0
  279. package/dist/persistence/provider-ingress.repository.js +76 -0
  280. package/dist/persistence/provider-ingress.repository.js.map +1 -0
  281. package/dist/studio-ui/assets/index-BGd2OhLv.js +84 -0
  282. package/dist/studio-ui/assets/index-BGd2OhLv.js.map +1 -0
  283. package/dist/studio-ui/assets/index-DnJos5x2.css +1 -0
  284. package/dist/studio-ui/index.html +13 -0
  285. package/dist/studio-ui-mount/index.d.ts +6 -0
  286. package/dist/studio-ui-mount/index.d.ts.map +1 -0
  287. package/dist/studio-ui-mount/index.js +13 -0
  288. package/dist/studio-ui-mount/index.js.map +1 -0
  289. package/dist/studio-ui-mount/resolve-studio-ui-root.d.ts +6 -0
  290. package/dist/studio-ui-mount/resolve-studio-ui-root.d.ts.map +1 -0
  291. package/dist/studio-ui-mount/resolve-studio-ui-root.js +25 -0
  292. package/dist/studio-ui-mount/resolve-studio-ui-root.js.map +1 -0
  293. package/dist/studio-ui-mount/studio-spa.controller.d.ts +18 -0
  294. package/dist/studio-ui-mount/studio-spa.controller.d.ts.map +1 -0
  295. package/dist/studio-ui-mount/studio-spa.controller.js +57 -0
  296. package/dist/studio-ui-mount/studio-spa.controller.js.map +1 -0
  297. package/dist/studio-ui-mount/studio-ui.module.d.ts +15 -0
  298. package/dist/studio-ui-mount/studio-ui.module.d.ts.map +1 -0
  299. package/dist/studio-ui-mount/studio-ui.module.js +47 -0
  300. package/dist/studio-ui-mount/studio-ui.module.js.map +1 -0
  301. package/dist/studio-ui-mount/studio-ui.tokens.d.ts +2 -0
  302. package/dist/studio-ui-mount/studio-ui.tokens.d.ts.map +1 -0
  303. package/dist/studio-ui-mount/studio-ui.tokens.js +5 -0
  304. package/dist/studio-ui-mount/studio-ui.tokens.js.map +1 -0
  305. package/dist/supervisor/supervisor-cascade.d.ts +55 -0
  306. package/dist/supervisor/supervisor-cascade.d.ts.map +1 -0
  307. package/dist/supervisor/supervisor-cascade.js +261 -0
  308. package/dist/supervisor/supervisor-cascade.js.map +1 -0
  309. package/dist/supervisor/supervisor-engine.d.ts +9 -0
  310. package/dist/supervisor/supervisor-engine.d.ts.map +1 -0
  311. package/dist/supervisor/supervisor-engine.js +64 -0
  312. package/dist/supervisor/supervisor-engine.js.map +1 -0
  313. package/dist/supervisor/supervisor-limits.d.ts +8 -0
  314. package/dist/supervisor/supervisor-limits.d.ts.map +1 -0
  315. package/dist/supervisor/supervisor-limits.js +36 -0
  316. package/dist/supervisor/supervisor-limits.js.map +1 -0
  317. package/dist/supervisor/supervisor-node-exec.d.ts +39 -0
  318. package/dist/supervisor/supervisor-node-exec.d.ts.map +1 -0
  319. package/dist/supervisor/supervisor-node-exec.js +201 -0
  320. package/dist/supervisor/supervisor-node-exec.js.map +1 -0
  321. package/dist/supervisor/supervisor-orchestration.d.ts +24 -0
  322. package/dist/supervisor/supervisor-orchestration.d.ts.map +1 -0
  323. package/dist/supervisor/supervisor-orchestration.js +395 -0
  324. package/dist/supervisor/supervisor-orchestration.js.map +1 -0
  325. package/dist/supervisor/supervisor-portal.d.ts +75 -0
  326. package/dist/supervisor/supervisor-portal.d.ts.map +1 -0
  327. package/dist/supervisor/supervisor-portal.js +320 -0
  328. package/dist/supervisor/supervisor-portal.js.map +1 -0
  329. package/dist/supervisor/supervisor-route.d.ts +53 -0
  330. package/dist/supervisor/supervisor-route.d.ts.map +1 -0
  331. package/dist/supervisor/supervisor-route.js +308 -0
  332. package/dist/supervisor/supervisor-route.js.map +1 -0
  333. package/dist/supervisor/supervisor-special-turns.d.ts +34 -0
  334. package/dist/supervisor/supervisor-special-turns.d.ts.map +1 -0
  335. package/dist/supervisor/supervisor-special-turns.js +308 -0
  336. package/dist/supervisor/supervisor-special-turns.js.map +1 -0
  337. package/dist/supervisor/supervisor.d.ts +44 -0
  338. package/dist/supervisor/supervisor.d.ts.map +1 -0
  339. package/dist/supervisor/supervisor.js +79 -0
  340. package/dist/supervisor/supervisor.js.map +1 -0
  341. package/dist/supervisor/supervisor.types.d.ts +71 -0
  342. package/dist/supervisor/supervisor.types.d.ts.map +1 -0
  343. package/dist/supervisor/supervisor.types.js +8 -0
  344. package/dist/supervisor/supervisor.types.js.map +1 -0
  345. package/dist/tasks/studio-task-queue.d.ts +93 -0
  346. package/dist/tasks/studio-task-queue.d.ts.map +1 -0
  347. package/dist/tasks/studio-task-queue.js +226 -0
  348. package/dist/tasks/studio-task-queue.js.map +1 -0
  349. package/dist/util/studio-env.d.ts +7 -0
  350. package/dist/util/studio-env.d.ts.map +1 -0
  351. package/dist/util/studio-env.js +32 -0
  352. package/dist/util/studio-env.js.map +1 -0
  353. package/dist/vapi-studio.module.d.ts +55 -0
  354. package/dist/vapi-studio.module.d.ts.map +1 -0
  355. package/dist/vapi-studio.module.js +166 -0
  356. package/dist/vapi-studio.module.js.map +1 -0
  357. package/dist/workflow/workflow-handoff.service.d.ts +29 -0
  358. package/dist/workflow/workflow-handoff.service.d.ts.map +1 -0
  359. package/dist/workflow/workflow-handoff.service.js +165 -0
  360. package/dist/workflow/workflow-handoff.service.js.map +1 -0
  361. package/dist/workflow/workflow-loader.d.ts +48 -0
  362. package/dist/workflow/workflow-loader.d.ts.map +1 -0
  363. package/dist/workflow/workflow-loader.js +87 -0
  364. package/dist/workflow/workflow-loader.js.map +1 -0
  365. package/docs/README.md +69 -0
  366. package/docs/assets/deterministic-assistant-flow.svg +128 -0
  367. package/docs/assets/vapi-studio-stack.svg +26 -0
  368. package/docs/best-practices/README.md +37 -0
  369. package/docs/best-practices/brain-and-prompt-injection.md +70 -0
  370. package/docs/best-practices/conversation-design.md +152 -0
  371. package/docs/best-practices/debugging-and-observability.md +49 -0
  372. package/docs/best-practices/documentation-layers.md +31 -0
  373. package/docs/best-practices/identity-and-pii.md +66 -0
  374. package/docs/best-practices/nodes-and-listens.md +116 -0
  375. package/docs/best-practices/ui-and-api-identity.md +51 -0
  376. package/docs/building-apps/creating-an-app.md +59 -0
  377. package/docs/building-apps/example-apps.md +23 -0
  378. package/docs/building-apps/overview.md +27 -0
  379. package/docs/getting-started/installation.md +52 -0
  380. package/docs/getting-started/introduction.md +23 -0
  381. package/docs/getting-started/quick-start.md +23 -0
  382. package/docs/guide/concepts.md +103 -0
  383. package/docs/guide/forms.md +102 -0
  384. package/docs/guide/handbook.md +21 -0
  385. package/docs/guide/introduction.md +56 -0
  386. package/docs/guide/module-setup.md +68 -0
  387. package/docs/guide/vapi-adapter.md +70 -0
  388. package/docs/guide/workflow-squad.md +59 -0
  389. package/docs/guides/agents.md +85 -0
  390. package/docs/guides/docker-compose.events.stub.yaml +27 -0
  391. package/docs/guides/documentation.md +13 -0
  392. package/docs/guides/extending-events.md +155 -0
  393. package/docs/guides/node-conventions.md +59 -0
  394. package/docs/guides/speckit.md +56 -0
  395. package/docs/reference/data-model.md +79 -0
  396. package/docs/reference/environment-variables.md +60 -0
  397. package/docs/reference/events-and-logging.md +137 -0
  398. package/docs/reference/flow-schema.md +79 -0
  399. package/docs/reference/runtime-api.md +708 -0
  400. package/docs/reference/security.md +41 -0
  401. package/docs/reference/standard-intentions.md +49 -0
  402. package/docs/reference/testing.md +15 -0
  403. package/docs/samples/events/nest-listener.example.ts +17 -0
  404. package/docs/samples/events/redis-bridge.example.ts +44 -0
  405. package/package.json +81 -0
  406. package/scripts/fix-access-modifiers.mjs +85 -0
  407. package/scripts/install-agent-refs.cjs +196 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Guidify AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,129 @@
1
+ # Vapi Studio
2
+
3
+ **[@guidify-ai/vapi-studio](https://www.npmjs.com/package/@guidify-ai/vapi-studio)** — a **code-driven toolkit for [Vapi](https://vapi.ai)**.
4
+
5
+ **Website:** [vapi-studio.guidify.ca](https://vapi-studio.guidify.ca)
6
+
7
+ This repo is the **framework** (npm package). Your bot is a separate NestJS app — start from the public starter below.
8
+
9
+ ---
10
+
11
+ ## Create a new project
12
+
13
+ ```bash
14
+ git clone git@github.com:guidify-ai/vapi-studio-project.git my-bot
15
+ cd my-bot
16
+ cp .env.example .env
17
+ # Edit PROJECT_NAME=… (PROJECT_SLUG optional)
18
+ yarn install
19
+ yarn start # Docker + Postgres + ngrok
20
+ ```
21
+
22
+ Wire Vapi to the printed URLs:
23
+
24
+ | Setting | URL |
25
+ | --- | --- |
26
+ | Webhook | `{PUBLIC_BASE_URL}/vapi/webhook` |
27
+ | Custom LLM | `{PUBLIC_BASE_URL}/vapi/chat/completions` |
28
+
29
+ - Starter: [guidify-ai/vapi-studio-project](https://github.com/guidify-ai/vapi-studio-project)
30
+ - Walkthrough: [Creating an app](./docs/building-apps/creating-an-app.md)
31
+ - Quick start: [docs/getting-started/quick-start.md](./docs/getting-started/quick-start.md)
32
+
33
+ **Requirements:** Node 22+, Yarn or npm, Docker Compose, [ngrok](https://ngrok.com/download), a Vapi account.
34
+
35
+ **Showcase (not a blank starter):** [vapi-studio-landing-page-sample-model](https://github.com/guidify-ai/vapi-studio-landing-page-sample-model) — Planner LLM demo.
36
+
37
+ ---
38
+
39
+ ## Repos
40
+
41
+ | Repo | Role |
42
+ | --- | --- |
43
+ | **This package** | [`guidify-ai/vapi-studio`](https://github.com/guidify-ai/vapi-studio) → `@guidify-ai/vapi-studio` on npm |
44
+ | **Starter** | [`guidify-ai/vapi-studio-project`](https://github.com/guidify-ai/vapi-studio-project) — fork this to ship a bot |
45
+ | **Showcase** | [`guidify-ai/vapi-studio-landing-page-sample-model`](https://github.com/guidify-ai/vapi-studio-landing-page-sample-model) — full Planner sample |
46
+
47
+ **Self-hosted and Dockerized.** No Guidify-hosted runtime. Vapi is the voice channel; your app is the Custom LLM + webhook endpoint.
48
+
49
+ <p align="center">
50
+ <img src="./docs/assets/vapi-studio-stack.svg" alt="Vapi to Vapi Studio to nodes to optional Brain" width="720" />
51
+ </p>
52
+
53
+ ---
54
+
55
+ ## Tools
56
+
57
+ | # | Tool | Status | Summary |
58
+ | --- | --- | --- | --- |
59
+ | 1 | **Vapi Studio** | Shipped | Deterministic agents — typed steps + `flow.yaml`. Supervisor routes every turn; Brain only at listen boundaries. |
60
+ | 2 | **Conversation events** | Shipped | Event-driven bus — `onStudioEvent` + Nest `eventListeners`. Build any custom logic on the hooks; Guidify tools use the same surface. |
61
+ | 3 | **Vapi Custom Transcriber** | Coming soon | Controllable ASR for digit listens, names, and constrained extracts — fewer junk transcripts as PII. |
62
+ | 4 | **Vapi Voice Profiles** | Coming soon | Reusable voice + persona packs for Vapi assistants — consistent brand sound across flows. |
63
+ | 5 | **Vapi Integrations** | Coming soon | Signed outbound hooks to CRM and tools — BYOK wiring without leaking provider protocols into Nodes. |
64
+ | — | **And more** | Coming soon | More controllable surfaces for Vapi — same self-hosted stack, same graph-owned philosophy. |
65
+
66
+ **Vapi Studio** — [Introduction](./docs/getting-started/introduction.md) · [Concepts](./docs/guide/concepts.md) · [Runtime API](./docs/reference/runtime-api.md).
67
+
68
+ **Conversation events** — [Events & logging](./docs/reference/events-and-logging.md) · [Extending events](./docs/guides/extending-events.md).
69
+
70
+ ---
71
+
72
+ ## How it fits with Vapi
73
+
74
+ Vapi Studio assistants are **Custom LLM + webhook** endpoints — fully compatible with ordinary Vapi assistants:
75
+
76
+ | # | Mode | When to use |
77
+ | --- | --- | --- |
78
+ | 1 | **Single-assistant flow** | New bots. One Vapi assistant; the graph lives in Studio (`flow.yaml` + nodes). |
79
+ | 2 | **Multi-assistant Squad** | Several Studio-backed assistants in one Squad. See [Workflow & Squad](./docs/guide/workflow-squad.md). |
80
+ | 3 | **Inject into an existing Squad** | Mix Studio and native Vapi members in Squads you already run. |
81
+
82
+ Most greenfield work starts with **(1)** via the starter clone above.
83
+
84
+ ---
85
+
86
+ ## How multi-intention routing works
87
+
88
+ One listen can surface **several competing intentions**. Main path left → right; portal nodes on a row below.
89
+
90
+ <p align="center">
91
+ <img src="./docs/assets/deterministic-assistant-flow.svg" alt="Multi-intention flow: main path left to right, three lane branches, portal nodes below, re-entry loop" width="1200" />
92
+ </p>
93
+
94
+ **Supervisor** picks the next agent step each turn (scores intentions, checks portals, follows `flow.yaml`).
95
+
96
+ | Shape | Meaning |
97
+ | --- | --- |
98
+ | **NODE** | Agent step — speaks, listens, writes memory |
99
+ | **PORTAL NODE** | Global interrupt (`portal: true` in `flow.yaml`) |
100
+ | **INTENTION** | Routing signal on an edge |
101
+
102
+ ---
103
+
104
+ ## Contribute to the framework
105
+
106
+ Only when changing this library (not when starting a bot):
107
+
108
+ ```bash
109
+ git clone git@github.com:guidify-ai/vapi-studio.git
110
+ cd vapi-studio
111
+ yarn install && yarn build && yarn test
112
+ ```
113
+
114
+ ---
115
+
116
+ ## Documentation
117
+
118
+ | | |
119
+ | --- | --- |
120
+ | **Create a new project** | [Starter](https://github.com/guidify-ai/vapi-studio-project) · [Creating an app](./docs/building-apps/creating-an-app.md) |
121
+ | Showcase | [landing-page-sample-model](https://github.com/guidify-ai/vapi-studio-landing-page-sample-model) · [Example apps](./docs/building-apps/example-apps.md) |
122
+ | Doc site index | [`docs/README.md`](./docs/README.md) |
123
+ | Runtime handbook | [`docs/reference/runtime-api.md`](./docs/reference/runtime-api.md) |
124
+ | Best practices | [`docs/best-practices/`](./docs/best-practices/) |
125
+ | Env presets | [`.env.example`](./.env.example) |
126
+
127
+ ## License
128
+
129
+ MIT — see [LICENSE](./LICENSE).
@@ -0,0 +1,42 @@
1
+ # Agents: Vapi Studio
2
+
3
+ You are working in a NestJS app that depends on `@guidify-ai/vapi-studio`.
4
+
5
+ ## Mandatory reading (best practices)
6
+
7
+ Before changing conversation copy, agent steps, listens, extracts, or identity/SMS flows, read:
8
+
9
+ 1. `docs/best-practices/README.md` (index)
10
+ 2. The matching guide under `docs/best-practices/` (conversation design, nodes and listens, identity and PII, debugging and observability, documentation layers)
11
+
12
+ Resolve paths from the installed package:
13
+
14
+ ```text
15
+ node_modules/@guidify-ai/vapi-studio/docs/best-practices/
16
+ ```
17
+
18
+ In a **vapi-studio** source checkout, the same files live at `docs/best-practices/` in the repo root.
19
+
20
+ ## Hard rules (summary)
21
+
22
+ - **One CTA per turn** — never stack unrelated questions; prefer more agent steps / `continueTo`.
23
+ - **`before()` / `after()` for async** — JWT/API warm and teardown belong in lifecycle hooks; keep `run()` to speech + one terminal output (`docs/best-practices/nodes-and-listens.md`, `docs/guides/node-conventions.md`).
24
+ - **`ctx.tasks.dispatch` / `require`** — multi-second I/O via the conversation-scoped Task Queue (`async` in an early node, `require(dedupeKey)` in a later node = postponed debt; never speak `taskId`s) (`docs/reference/runtime-api.md` § Tasks).
25
+ - **Conversations must end** — framework `limits.maxTurns` / `limits.maxDurationMs` always apply (defaults 40 / 20m); never ship unlimited calls (`docs/best-practices/conversation-design.md`).
26
+ - **Fail closed** on constrained fields (e.g. NA phone = exactly 10 digits).
27
+ - **Listen timeouts** match answer type (short for digits).
28
+ - **Do not store ASR junk** as names or profile verify summaries.
29
+ - **Name the caller sparingly** — at most once per spoken turn; no “Thanks, {name}. {name}, …” stacks without a clear reason (`docs/best-practices/conversation-design.md`).
30
+ - **Soft affirmatives on multi-choice** — “yeah, why not” / “sure” that do **not** name a lane are not a choice; `resolveIntention` must re-ask which option locally — never leave that to Brain/unknown (`conversation-design.md` § Do not auto-pick lanes).
31
+ - **Mad: one re-engage then human** — do not reason with angry callers across multiple turns; first mad hit = one short re-engage, still mad = transfer (`nodes-and-listens.md` § Mad).
32
+ - **Portal re-engage needs a CTA** — transfer/mad/after-hours deferrals must end with one clear ask, not a dead-end statement (`nodes-and-listens.md`).
33
+ - **Silent handoffs** — `continueTo` / `handoff` must not speak filler that restates what just happened before the next real CTA or farewell (`conversation-design.md` § Copy hygiene).
34
+ - **No prompt injection surface** — Brain JSON only; never speak raw `userText` or off-topic LLM output (`docs/best-practices/brain-and-prompt-injection.md`).
35
+ - **Human-like UX** — never speak node/transition/intention names, event types, or graph state to the caller; product language only (`docs/best-practices/conversation-design.md` § Human-like UX).
36
+ - **Logs/events must explain the call** — if you cannot answer “why this step / what was said / what memory changed” from daily logs + structured events, add fields in the same change (`docs/best-practices/debugging-and-observability.md`). Studio is event-driven (`onStudioEvent` / Nest `eventListeners`); attach custom listeners for any sink. Guidify tools use the same hooks — OSS does not limit app-owned logic (`docs/guides/extending-events.md`).
37
+ - **Analytics funnels** — code catalog (`AnalyticsFunnelDefinition[]`); stamp tags only (`persistAnalyticsTag` / `stampAnalyticsTag`). Catalog step bindings decide which chart a tag appears on — do not put `funnels[]` on the event.
38
+ - **UI / API identity** — FE and external clients use `uuid` only (never internal `id`); durable rows are `id` + `uuid`; every UI DTO includes human `label` so the UI never prints UUIDs as titles (`docs/best-practices/ui-and-api-identity.md`).
39
+ - **Update docs in the same change** — `docs/reference/runtime-api.md` for behavior; best-practices guides for doctrine; app README for northern stars only.
40
+ - **TypeScript style** — explicit `public` / `protected` / `private` on every class member; typed class properties (no bare `name = '…'`). Run `yarn lint` in the framework repo.
41
+
42
+ Runtime contracts (Supervisor, Brain, Vapi, env, public API): `docs/reference/runtime-api.md`. Package root `README.md` is an entry index only.
@@ -0,0 +1,15 @@
1
+ # Vapi Studio — Claude Code
2
+
3
+ Canonical agent handbook (shared with Cursor / other agents):
4
+
5
+ @AGENTS.md
6
+
7
+ ## Framework checkout
8
+
9
+ - Package source: `src/` → build with `yarn build` (output `dist/`, gitignored).
10
+ - Consumer apps: separate NestJS repos depending on `@guidify-ai/vapi-studio` (npm).
11
+ - Contracts: `docs/reference/runtime-api.md` (update in the same change as behavior).
12
+ - Doctrine: `docs/best-practices/`.
13
+ - Cursor rule templates (copied into **apps** on postinstall): `agent/cursor/`.
14
+ - Claude rule templates (copied into **apps** on postinstall): `agent/claude/rules/`.
15
+ - SpecKit config / templates: `.specify/` (see `docs/guides/speckit.md`).
@@ -0,0 +1,9 @@
1
+ # UI and API identity
2
+
3
+ When editing Nest APIs, persistence entities, Studio UI, or app FE that talks to Studio:
4
+
5
+ 1. Read `node_modules/@guidify-ai/vapi-studio/docs/best-practices/ui-and-api-identity.md` (repo: `docs/best-practices/ui-and-api-identity.md`).
6
+ 2. **External (FE / clients):** identify records by `uuid` only — never numeric/`bigint` `id` in paths, bodies, or links.
7
+ 3. **Internal (BE):** durable entities use `id` (int/`bigint` PK) + unique `uuid` — `id` for joins/filters/sorts; `uuid` for HTTP and external comms.
8
+ 4. **UI DTOs:** always include human `label`; UI prints `label`, not UUID (UUID only as opaque key / URL).
9
+ 5. New APIs: JSON field is `uuid`, not `id`. Update `docs/reference/runtime-api.md` when the public contract changes.
@@ -0,0 +1,36 @@
1
+ # Vapi Studio best practices (from `@guidify-ai/vapi-studio`)
2
+
3
+ This file is **managed by** `@guidify-ai/vapi-studio` `postinstall`. App-specific Claude rules go in a separate `.md` under `.claude/rules/`.
4
+
5
+ ## Before you change conversation behavior
6
+
7
+ Read the framework guides (prefer the installed package path):
8
+
9
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/README.md`
10
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/conversation-design.md`
11
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/nodes-and-listens.md`
12
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/identity-and-pii.md`
13
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/ui-and-api-identity.md`
14
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/brain-and-prompt-injection.md`
15
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/debugging-and-observability.md`
16
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/documentation-layers.md`
17
+
18
+ Also: `node_modules/@guidify-ai/vapi-studio/agent/AGENTS.md`.
19
+
20
+ ## Non-negotiables
21
+
22
+ 1. **One CTA per turn** — split stacked questions into more agent steps or `continueTo` hops.
23
+ 2. **Conversations must end** — `limits.maxTurns` / `limits.maxDurationMs` always on (defaults 40 / 20m); never unlimited.
24
+ 3. **Constrained extracts fail closed** — e.g. NA mobile exactly 10 digits; never keep trailing ASR junk as PII.
25
+ 4. **Listen timeout matches the answer** — short windows for digit collection.
26
+ 5. **Name the caller sparingly** — at most once per spoken turn; avoid repetitive “Thanks, {name}. {name}, …” (`conversation-design.md`).
27
+ 6. **Soft affirmatives on multi-choice** — “yeah, why not” / bare “sure” that do not name a lane → local `resolveIntention` re-ask which option; never Brain/unknown (`conversation-design.md`).
28
+ 7. **Silent handoffs** — no filler `continueTo`/`handoff` speech that restates the last beat; destination speaks the next CTA or farewell (`conversation-design.md`).
29
+ 8. **Mad: one re-engage then human** — do not keep reasoning with angry callers; second mad hit → transfer (`nodes-and-listens.md`).
30
+ 9. **`before()` / `after()` for async** — JWT/API warm and non-speech teardown belong in lifecycle hooks; keep `run()` to speech + one terminal output (`nodes-and-listens.md`).
31
+ 10. **No prompt injection** — caller speech is untrusted; Brain returns JSON only; never speak raw ASR or off-topic LLM text (`brain-and-prompt-injection.md`).
32
+ 11. **Human-like UX** — never speak node/transition/intention names, analytics/events, or graph state; callers hear product language only (`conversation-design.md` § Human-like UX).
33
+ 12. **Logs/events explain every turn** — `ROUTE_DECISION`, memory flags, raw+normalized constrained fields; see debugging-and-observability guide.
34
+ 13. **Analytics funnels** — code catalog (`AnalyticsFunnelDefinition[]`); stamp stable tags only. Catalog membership = which funnel lists the tag (no `payload.funnels`).
35
+ 14. **UI / API identity** — FE uses `uuid` only (never internal `id`); BE stores `id`+`uuid`; UI DTOs always include human `label` (`ui-and-api-identity.md`).
36
+ 15. **App README = northern stars only** — no flow dumps; doctrine lives in the guides above; runtime contracts in `docs/reference/runtime-api.md`.
@@ -0,0 +1,16 @@
1
+ ---
2
+ description: FE↔BE identity — UUID only externally; id+uuid in DB; human labels on UI DTOs
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # UI and API identity
7
+
8
+ This file is **managed by** `@guidify-ai/vapi-studio` (canonical template: `agent/cursor/ui-and-api-identity.mdc`; doctrine: `docs/best-practices/ui-and-api-identity.md`). App-specific rules go in a separate `.mdc`.
9
+
10
+ When editing Nest APIs, persistence entities, Studio UI, or app FE that talks to Studio:
11
+
12
+ 1. Read `node_modules/@guidify-ai/vapi-studio/docs/best-practices/ui-and-api-identity.md` (repo: `docs/best-practices/ui-and-api-identity.md`).
13
+ 2. **External (FE / clients):** identify records by `uuid` only — never numeric/`bigint` `id` in paths, bodies, or links.
14
+ 3. **Internal (BE):** durable entities use `id` (int/`bigint` PK) + unique `uuid` — `id` for joins/filters/sorts; `uuid` for HTTP and external comms.
15
+ 4. **UI DTOs:** always include human `label`; UI prints `label`, not UUID (UUID only as opaque key / URL).
16
+ 5. New APIs: JSON field is `uuid`, not `id`. Update `docs/reference/runtime-api.md` when the public contract changes.
@@ -0,0 +1,43 @@
1
+ ---
2
+ description: Vapi Studio conversation best practices — read framework guides before changing agents/copy
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Vapi Studio best practices (from `@guidify-ai/vapi-studio`)
7
+
8
+ This file is **managed by** `@guidify-ai/vapi-studio` `postinstall` (`scripts/install-agent-refs.cjs`). Do not replace it with app-specific rules — put those in a separate `.mdc`.
9
+
10
+ ## Before you change conversation behavior
11
+
12
+ Read the framework guides (prefer the installed package path):
13
+
14
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/README.md`
15
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/conversation-design.md`
16
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/nodes-and-listens.md`
17
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/identity-and-pii.md`
18
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/ui-and-api-identity.md`
19
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/brain-and-prompt-injection.md`
20
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/debugging-and-observability.md`
21
+ - `node_modules/@guidify-ai/vapi-studio/docs/best-practices/documentation-layers.md`
22
+
23
+ Source checkout fallback: `docs/best-practices/` in the vapi-studio repository.
24
+
25
+ Also see `node_modules/@guidify-ai/vapi-studio/agent/AGENTS.md`.
26
+
27
+ ## Non-negotiables
28
+
29
+ 1. **One CTA per turn** — split stacked questions into more agent steps or `continueTo` hops.
30
+ 2. **Conversations must end** — `limits.maxTurns` / `limits.maxDurationMs` always on (defaults 40 / 20m); never unlimited.
31
+ 3. **Constrained extracts fail closed** — e.g. NA mobile exactly 10 digits; never keep trailing ASR junk as PII.
32
+ 4. **Listen timeout matches the answer** — short windows for digit collection.
33
+ 5. **Name the caller sparingly** — at most once per spoken turn; avoid repetitive “Thanks, {name}. {name}, …” (`conversation-design.md`).
34
+ 6. **Soft affirmatives on multi-choice** — “yeah, why not” / bare “sure” that do not name a lane → local `resolveIntention` re-ask which option; never Brain/unknown (`conversation-design.md`).
35
+ 7. **Silent handoffs** — no filler `continueTo`/`handoff` speech that restates the last beat; destination speaks the next CTA or farewell (`conversation-design.md`).
36
+ 8. **Mad: one re-engage then human** — do not keep reasoning with angry callers; second mad hit → transfer (`nodes-and-listens.md`).
37
+ 9. **`before()` / `after()` for async** — JWT/API warm and non-speech teardown belong in lifecycle hooks; keep `run()` to speech + one terminal output (`nodes-and-listens.md`).
38
+ 10. **No prompt injection** — caller speech is untrusted; Brain returns JSON only; never speak raw ASR or off-topic LLM text (`brain-and-prompt-injection.md`).
39
+ 11. **Human-like UX** — never speak node/transition/intention names, analytics/events, or graph state; callers hear product language only (`conversation-design.md` § Human-like UX).
40
+ 12. **Logs/events explain every turn** — `ROUTE_DECISION`, memory flags, raw+normalized constrained fields; see debugging-and-observability guide.
41
+ 13. **Analytics funnels** — code catalog (`AnalyticsFunnelDefinition[]`); stamp stable tags only. Catalog membership = which funnel lists the tag (no `payload.funnels`).
42
+ 14. **UI / API identity** — FE uses `uuid` only (never internal `id`); BE stores `id`+`uuid`; UI DTOs always include human `label` (`ui-and-api-identity.md`).
43
+ 15. **App README = northern stars only** — no flow dumps; doctrine lives in the guides above; runtime contracts in `docs/reference/runtime-api.md` (package README is an entry index only).
@@ -0,0 +1,61 @@
1
+ import type { OutputAction } from '../../output/conversation-output';
2
+ export interface VapiStreamWriter {
3
+ write(chunk: string): void;
4
+ end(): void;
5
+ }
6
+ export type VapiToolLike = {
7
+ type?: string;
8
+ function?: {
9
+ name?: string;
10
+ };
11
+ name?: string;
12
+ } | Record<string, unknown>;
13
+ export declare function extractToolFunctionNames(tools: unknown): string[];
14
+ export declare function resolveEndCallToolName(tools?: unknown): string;
15
+ export declare function resolveTransferCallToolName(tools?: unknown): string;
16
+ export declare function resolveHandoffToolName(tools?: unknown, assistantName?: string): string;
17
+ /**
18
+ * Vapi Squad handoff tool-call arguments.
19
+ * `destination` MUST be a string (assistantName / assistantId enum value) —
20
+ * not an object. See https://docs.vapi.ai/squads/handoff
21
+ */
22
+ export declare function buildVapiHandoffToolArgs(input: {
23
+ assistantName: string;
24
+ reason?: string;
25
+ payload?: Record<string, unknown>;
26
+ }): Record<string, unknown>;
27
+ /** True when the Custom LLM request advertises at least one handoff tool. */
28
+ export declare function hasAdvertisedHandoffTool(tools?: unknown): boolean;
29
+ /**
30
+ * Compiles Vapi Studio output actions into OpenAI-compatible SSE for Vapi Custom LLM.
31
+ */
32
+ export declare class VapiSseCompiler {
33
+ private readonly model;
34
+ private readonly id;
35
+ private readonly tools;
36
+ constructor(opts?: {
37
+ model?: string;
38
+ id?: string;
39
+ tools?: unknown;
40
+ });
41
+ /** Replay prior assistant utterances onto this SSE (coalesced waiter). */
42
+ replayAssistantSpeech(writer: VapiStreamWriter, texts: string[]): void;
43
+ writeAssistantText(writer: VapiStreamWriter, text: string): void;
44
+ writeToolCall(writer: VapiStreamWriter, name: string, args: Record<string, unknown>, index?: number): void;
45
+ /** Close stream after normal speech (no tool call). */
46
+ finish(writer: VapiStreamWriter): void;
47
+ /** Close stream after a tool call — do not emit finish_reason=stop. */
48
+ finishAfterToolCalls(writer: VapiStreamWriter): void;
49
+ streamTerminalActions(writer: VapiStreamWriter, actions: OutputAction[]): Promise<{
50
+ emittedTools: string[];
51
+ }>;
52
+ }
53
+ export declare function extractNewestUserText(body: {
54
+ messages?: Array<{
55
+ role?: string;
56
+ content?: unknown;
57
+ }>;
58
+ }): string;
59
+ export declare function extractVapiCallId(body: Record<string, unknown>): string | null;
60
+ export declare function extractVapiCallerNumber(body: Record<string, unknown> | null | undefined): string | null;
61
+ //# sourceMappingURL=vapi-sse.compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vapi-sse.compiler.d.ts","sourceRoot":"","sources":["../../../src/adapters/vapi/vapi-sse.compiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAErE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,IAAI,IAAI,CAAC;CACb;AAED,MAAM,MAAM,YAAY,GACpB;IACE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GACD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAM5B,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CA0BjE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAmB9D;AAED,wBAAgB,2BAA2B,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAYnE;AAED,wBAAgB,sBAAsB,CACpC,KAAK,CAAC,EAAE,OAAO,EACf,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAoBR;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAc1B;AAED,6EAA6E;AAC7E,wBAAgB,wBAAwB,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAEjE;AAwED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;gBAEb,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;IAM1E,0EAA0E;IACnE,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAWtE,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAkBhE,aAAa,CAClB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,SAAI,GACR,IAAI;IA2EP,uDAAuD;IAChD,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAc7C,uEAAuE;IAChE,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAK9C,qBAAqB,CAChC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,YAAY,EAAE,GACtB,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CA4DvC;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACxD,GAAG,MAAM,CAqBT;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAe9E;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAC/C,MAAM,GAAG,IAAI,CAwBf"}