@recombine-ai/platform 0.8.1 → 0.9.1-test.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/build/agent/index.d.ts +3 -3
- package/build/agent/index.d.ts.map +1 -1
- package/build/agent/index.js +1 -1
- package/build/agent/voice-agent.d.ts +2 -1
- package/build/agent/voice-agent.d.ts.map +1 -1
- package/build/agent/voice-route.d.ts +18 -0
- package/build/agent/voice-route.d.ts.map +1 -0
- package/build/agent/voice-route.js +3 -0
- package/build/bosun/interfaces/agent.d.ts +0 -1
- package/build/bosun/interfaces/agent.d.ts.map +1 -1
- package/build/bosun/interfaces/project.d.ts +0 -5
- package/build/bosun/interfaces/project.d.ts.map +1 -1
- package/build/bosun/std-mocks/call-control.d.ts.map +1 -1
- package/build/bosun/std-mocks/call-control.js +3 -0
- package/build/bosun-app/backend/server.js +60 -252
- package/build/bosun-app/backend/server.js.map +2 -2
- package/build/bosun-app/frontend/client/_app/immutable/chunks/7py9MbgR.js +3 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/7py9MbgR.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/7py9MbgR.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{Xf8YUGwh.js → B6DLXdp3.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/B6DLXdp3.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/B6DLXdp3.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{B1MxGo6p.js → BBk8_Xpk.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/BBk8_Xpk.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/BBk8_Xpk.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{D9YsE4-8.js → BEdAvgYp.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/BEdAvgYp.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/BEdAvgYp.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{BTw6JswM.js → ByRLqhAV.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/ByRLqhAV.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/ByRLqhAV.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{CVZT6n14.js → C0rPkxmP.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/C0rPkxmP.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/C0rPkxmP.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{CuwQtXBl.js → C3cROXCy.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/C3cROXCy.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/C3cROXCy.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{AmpxVxY6.js → CR5IRTqC.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CR5IRTqC.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CR5IRTqC.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{dL_jwANm.js → DJnDF3d9.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/DJnDF3d9.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/DJnDF3d9.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{CBW06aCF.js → DdpjwoIh.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/DdpjwoIh.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{CBW06aCF.js.gz → DdpjwoIh.js.gz} +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{B-5g3xS8.js → DjDpMqch.js} +20 -20
- package/build/bosun-app/frontend/client/_app/immutable/chunks/DjDpMqch.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/DjDpMqch.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{CXS28GEZ.js → YE72mAzG.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/YE72mAzG.js.br +1 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/YE72mAzG.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{BqH4VDQz.js → joiJcRPz.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/joiJcRPz.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/joiJcRPz.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{CkstLsmI.js → ouMvMh56.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/ouMvMh56.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/ouMvMh56.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/{app.DaDBScXg.js → app.B0WyhTXQ.js} +2 -2
- package/build/bosun-app/frontend/client/_app/immutable/entry/app.B0WyhTXQ.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/app.B0WyhTXQ.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.BPxqLgPa.js +1 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.BPxqLgPa.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.BPxqLgPa.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{0._S0yln6w.js → 0.B-xccOtn.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/0.B-xccOtn.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/0.B-xccOtn.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{1.BSNKOkyF.js → 1.D3-4ehn_.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/1.D3-4ehn_.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/1.D3-4ehn_.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.DWK1AGJD.js +35 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.DWK1AGJD.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.DWK1AGJD.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{17.Bn1yI4kt.js → 17.Bs51j1UA.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/17.Bs51j1UA.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/17.Bs51j1UA.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.Bjr8I-7a.js +11 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.Bjr8I-7a.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.Bjr8I-7a.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.BDwIMjum.js +35 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.BDwIMjum.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.BDwIMjum.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.BX2jDq0d.js +1 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.BX2jDq0d.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.BX2jDq0d.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{4.3i9fJNn9.js → 4.B0PTNAkY.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/4.B0PTNAkY.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/4.B0PTNAkY.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{5.C2R3wdz0.js → 5.DtXjhQi9.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/5.DtXjhQi9.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/5.DtXjhQi9.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{6.CarWVMPM.js → 6.CIpO8gDQ.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CIpO8gDQ.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CIpO8gDQ.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{8.joumIYrl.js → 8.Dljnutoy.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/8.Dljnutoy.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/8.Dljnutoy.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BQUquGeo.js +2 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BQUquGeo.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BQUquGeo.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/version.json +1 -1
- package/build/bosun-app/frontend/client/_app/version.json.br +0 -0
- package/build/bosun-app/frontend/client/_app/version.json.gz +0 -0
- package/build/bosun-app/frontend/handler.js +4 -4
- package/build/bosun-app/frontend/index.js +4 -4
- package/build/bosun-app/frontend/server/chunks/chunks/{ChatStepTrace.js-BY0y3Vbb.js → ChatStepTrace.js-VTtwaKGp.js} +1 -3
- package/build/bosun-app/frontend/server/chunks/chunks/ChatStepTrace.js-VTtwaKGp.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-ChM9druZ.js → internal.js-BzUEmxtM.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-ChM9druZ.js.map → internal.js-BzUEmxtM.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/chunks/{source-selection.js-DFpObbhz.js → source-selection.js-D5B8gfq2.js} +1 -3
- package/build/bosun-app/frontend/server/chunks/chunks/source-selection.js-D5B8gfq2.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/{_layout.svelte.js-b9Q5TFEZ.js → _layout.svelte.js-B2wHKJV7.js} +24 -134
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/_layout.svelte.js-B2wHKJV7.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/{_page.svelte.js-Chv8ybaj.js → _page.svelte.js-DDcIjgZD.js} +4 -10
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/_page.svelte.js-DDcIjgZD.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/{_page.svelte.js-Dkst1C_3.js → _page.svelte.js-UVUg89-t.js} +1 -3
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/_page.svelte.js-UVUg89-t.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/latency/{_page.svelte.js-DFZznMhQ.js → _page.svelte.js-SjAtxtA0.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/latency/{_page.svelte.js-DFZznMhQ.js.map → _page.svelte.js-SjAtxtA0.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/{_page.svelte.js-Bxdn8vG5.js → _page.svelte.js-DiZKDT2v.js} +3 -7
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/_page.svelte.js-DiZKDT2v.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/{_layout.svelte.js-UAHBCAaS.js → _layout.svelte.js-CfkCQ2Th.js} +10 -62
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_layout.svelte.js-CfkCQ2Th.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/{handler-KSixAuP8.js → handler-CFjEFb1h.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/{handler-KSixAuP8.js.map → handler-CFjEFb1h.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/{index.js-xzEg77OG.js → index.js-CxSWZHu3.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/{index.js-xzEg77OG.js.map → index.js-CxSWZHu3.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/{manifest.js-BW4X3pHs.js → manifest.js-B77RWxaX.js} +14 -14
- package/build/bosun-app/frontend/server/chunks/{manifest.js-BW4X3pHs.js.map → manifest.js-B77RWxaX.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{0.js-B1rx1DOM.js → 0.js-B7wbeJFl.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{0.js-B1rx1DOM.js.map → 0.js-B7wbeJFl.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{1.js-h7GlMehw.js → 1.js-CNTEs79R.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{1.js-h7GlMehw.js.map → 1.js-CNTEs79R.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{10.js-C6xRYZtL.js → 10.js-3vQy72mr.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{10.js-C6xRYZtL.js.map → 10.js-3vQy72mr.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{17.js-CavP10f9.js → 17.js-BQznQUjn.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{17.js-CavP10f9.js.map → 17.js-BQznQUjn.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{18.js-DC7Bv1j_.js → 18.js-Bo2MexI0.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{18.js-DC7Bv1j_.js.map → 18.js-Bo2MexI0.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{2.js-BhiMP7Sz.js → 2.js-BosH410E.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{2.js-BhiMP7Sz.js.map → 2.js-BosH410E.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{3.js-C7zctWo-.js → 3.js-mn0WrcAG.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{3.js-C7zctWo-.js.map → 3.js-mn0WrcAG.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{4.js-5G8VLxJe.js → 4.js-B8BFcPBH.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{4.js-5G8VLxJe.js.map → 4.js-B8BFcPBH.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{5.js-HO1CExm6.js → 5.js-C7XaU1e9.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{5.js-HO1CExm6.js.map → 5.js-C7XaU1e9.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{6.js-CDW8tRHL.js → 6.js-BeGnlxE4.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{6.js-CDW8tRHL.js.map → 6.js-BeGnlxE4.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{8.js-BjO10Jpo.js → 8.js-DFxb3iv1.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{8.js-BjO10Jpo.js.map → 8.js-DFxb3iv1.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{9.js-Csa_leV9.js → 9.js-DjLvoBf2.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{9.js-Csa_leV9.js.map → 9.js-DjLvoBf2.js.map} +1 -1
- package/build/call-control/call-control.d.ts +3 -1
- package/build/call-control/call-control.d.ts.map +1 -1
- package/build/call-control/call-control.js +15 -3
- package/build/call-control/index.d.ts +3 -1
- package/build/call-control/index.d.ts.map +1 -1
- package/build/call-control/index.js +2 -0
- package/build/call-control/port.d.ts +2 -1
- package/build/call-control/port.d.ts.map +1 -1
- package/build/call-control/schemas.generated.d.ts +3 -2
- package/build/call-control/schemas.generated.d.ts.map +1 -1
- package/build/call-control/schemas.generated.js +9 -4
- package/build/call-control/sip.d.ts +1 -0
- package/build/call-control/sip.d.ts.map +1 -1
- package/build/call-control/sip.js +19 -18
- package/build/call-control/types.d.ts +20 -167
- package/build/call-control/types.d.ts.map +1 -1
- package/build/call-control/types.js +3 -3
- package/build/call-control/user-message-scope.d.ts +4 -0
- package/build/call-control/user-message-scope.d.ts.map +1 -0
- package/build/call-control/user-message-scope.js +11 -0
- package/build/call-control/voice-agent-config.d.ts +157 -0
- package/build/call-control/voice-agent-config.d.ts.map +1 -0
- package/build/call-control/voice-agent-config.js +53 -0
- package/build/engine/interfaces/other.d.ts +1 -1
- package/build/engine/interfaces/other.d.ts.map +1 -1
- package/build/telescope/api.d.ts.map +1 -1
- package/build/telescope/api.js +1 -2
- package/build/telescope/interfaces/conversation.d.ts +0 -2
- package/build/telescope/interfaces/conversation.d.ts.map +1 -1
- package/build/telescope/interfaces/event-tracer.d.ts +0 -8
- package/build/telescope/interfaces/event-tracer.d.ts.map +1 -1
- package/build/telescope/interfaces/telescope.d.ts +0 -1
- package/build/telescope/interfaces/telescope.d.ts.map +1 -1
- package/build/telescope/latency-events.d.ts +1 -1
- package/build/telescope/latency-events.d.ts.map +1 -1
- package/build/telescope/latency-events.js +5 -0
- package/build/telescope/tracers/event-tracer.d.ts.map +1 -1
- package/build/telescope/tracers/event-tracer.js +0 -5
- package/build/text-agent-handlers/incoming-message.js +1 -1
- package/build/text-agent-handlers/index.d.ts +0 -1
- package/build/text-agent-handlers/index.d.ts.map +1 -1
- package/build/text-agent-handlers/index.js +0 -1
- package/build/text-agent-handlers/instrument.d.ts +0 -1
- package/build/text-agent-handlers/instrument.d.ts.map +1 -1
- package/build/text-agent-handlers/instrument.js +2 -6
- package/build/text-agent-handlers/jobs-handler.js +1 -1
- package/build/text-agent-handlers/jobs.d.ts +0 -1
- package/build/text-agent-handlers/jobs.d.ts.map +1 -1
- package/build/text-agent-handlers/message-acceptor.d.ts +0 -4
- package/build/text-agent-handlers/message-acceptor.d.ts.map +1 -1
- package/build/text-agent-handlers/message-acceptor.js +2 -11
- package/build/text-agent-handlers/ports.d.ts +1 -2
- package/build/text-agent-handlers/ports.d.ts.map +1 -1
- package/build/text-agent-handlers/ports.js +5 -6
- package/build/voice-agent-api/index.d.ts +3 -3
- package/build/voice-agent-api/index.d.ts.map +1 -1
- package/build/voice-agent-api/index.js +1 -1
- package/build/voice-agent-api/voice-http.d.ts +11 -14
- package/build/voice-agent-api/voice-http.d.ts.map +1 -1
- package/build/voice-agent-api/voice-http.js +67 -41
- package/build/voice-agent-api/voice-router.d.ts +21 -0
- package/build/voice-agent-api/voice-router.d.ts.map +1 -0
- package/build/voice-agent-api/voice-router.js +100 -0
- package/package.json +1 -1
- package/build/agent/experiment.d.ts +0 -21
- package/build/agent/experiment.d.ts.map +0 -1
- package/build/agent/experiment.js +0 -29
- package/build/bosun-app/frontend/client/_app/immutable/chunks/AmpxVxY6.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/AmpxVxY6.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/B-5g3xS8.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/B-5g3xS8.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/B1MxGo6p.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/B1MxGo6p.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/BTw6JswM.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/BTw6JswM.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/BqH4VDQz.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/BqH4VDQz.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CBW06aCF.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CVZT6n14.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CVZT6n14.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CXS28GEZ.js.br +0 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CXS28GEZ.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CkstLsmI.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CkstLsmI.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CuwQtXBl.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CuwQtXBl.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/D9YsE4-8.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/D9YsE4-8.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/DzqCKWaI.js +0 -3
- package/build/bosun-app/frontend/client/_app/immutable/chunks/DzqCKWaI.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/DzqCKWaI.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/Xf8YUGwh.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/Xf8YUGwh.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/dL_jwANm.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/dL_jwANm.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/app.DaDBScXg.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/app.DaDBScXg.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.CWqX8UwM.js +0 -1
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.CWqX8UwM.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.CWqX8UwM.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/0._S0yln6w.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/0._S0yln6w.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/1.BSNKOkyF.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/1.BSNKOkyF.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.NIQt0c21.js +0 -35
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.NIQt0c21.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.NIQt0c21.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/17.Bn1yI4kt.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/17.Bn1yI4kt.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DAa7yKtf.js +0 -11
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DAa7yKtf.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DAa7yKtf.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DTjCxUv0.js +0 -35
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DTjCxUv0.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DTjCxUv0.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CzgpFcXZ.js +0 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CzgpFcXZ.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CzgpFcXZ.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/4.3i9fJNn9.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/4.3i9fJNn9.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/5.C2R3wdz0.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/5.C2R3wdz0.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CarWVMPM.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CarWVMPM.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/8.joumIYrl.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/8.joumIYrl.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BGKMyDx1.js +0 -2
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BGKMyDx1.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BGKMyDx1.js.gz +0 -0
- package/build/bosun-app/frontend/server/chunks/chunks/ChatStepTrace.js-BY0y3Vbb.js.map +0 -1
- package/build/bosun-app/frontend/server/chunks/chunks/source-selection.js-DFpObbhz.js.map +0 -1
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/_layout.svelte.js-b9Q5TFEZ.js.map +0 -1
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/_page.svelte.js-Chv8ybaj.js.map +0 -1
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/_page.svelte.js-Dkst1C_3.js.map +0 -1
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/_page.svelte.js-Bxdn8vG5.js.map +0 -1
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_layout.svelte.js-UAHBCAaS.js.map +0 -1
- package/build/text-agent-handlers/variant-scheduler.d.ts +0 -3
- package/build/text-agent-handlers/variant-scheduler.d.ts.map +0 -1
- package/build/text-agent-handlers/variant-scheduler.js +0 -9
- package/build/voice-agent-api/route-resolver.d.ts +0 -19
- package/build/voice-agent-api/route-resolver.d.ts.map +0 -1
- package/build/voice-agent-api/route-resolver.js +0 -57
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
export function cacheTextAgents(getTextAgent) {
|
|
2
2
|
const agents = new Map();
|
|
3
|
-
return (agentId
|
|
4
|
-
|
|
5
|
-
let agent = agents.get(key);
|
|
3
|
+
return (agentId) => {
|
|
4
|
+
let agent = agents.get(agentId);
|
|
6
5
|
if (!agent) {
|
|
7
|
-
agent = getTextAgent(agentId
|
|
8
|
-
agents.set(
|
|
9
|
-
agent.catch(() => agents.delete(
|
|
6
|
+
agent = getTextAgent(agentId);
|
|
7
|
+
agents.set(agentId, agent);
|
|
8
|
+
agent.catch(() => agents.delete(agentId));
|
|
10
9
|
}
|
|
11
10
|
return agent;
|
|
12
11
|
};
|
|
@@ -2,7 +2,7 @@ export { extractMessageContent, fail, isRecoverableError, mapFromOpenAiMessages,
|
|
|
2
2
|
export type { ErrorCodes } from './http-helpers.js';
|
|
3
3
|
export { llmCompletionHandler } from './llm-completion-handler.js';
|
|
4
4
|
export { voiceHttpConnect } from './voice-http.js';
|
|
5
|
-
export type { VoiceHttpBindings } from './voice-http.js';
|
|
6
|
-
export {
|
|
7
|
-
export type {
|
|
5
|
+
export type { ConversationMeta, VoiceHttpBindings } from './voice-http.js';
|
|
6
|
+
export { createVoiceRouter } from './voice-router.js';
|
|
7
|
+
export type { VoiceRouter, VoiceRouterOptions } from './voice-router.js';
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,qBAAqB,EACrB,IAAI,EACJ,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,GACf,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,qBAAqB,EACrB,IAAI,EACJ,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,GACf,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { extractMessageContent, fail, isRecoverableError, mapFromOpenAiMessages, roleToSender, } from './http-helpers.js';
|
|
2
2
|
export { llmCompletionHandler } from './llm-completion-handler.js';
|
|
3
3
|
export { voiceHttpConnect } from './voice-http.js';
|
|
4
|
-
export {
|
|
4
|
+
export { createVoiceRouter } from './voice-router.js';
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { FastifyRequest } from 'fastify';
|
|
2
|
-
import { VoiceRoute } from '../agent/index.js';
|
|
3
2
|
import type CallControl from '../call-control/index.js';
|
|
4
|
-
import type { ContextCache } from '../context-cache/index.js';
|
|
5
3
|
import type { NotificationRouter } from '../notifications/index.js';
|
|
6
4
|
import type { ITelescope } from '../telescope/index.js';
|
|
5
|
+
import { type VoiceRouter } from './voice-router.js';
|
|
7
6
|
declare module 'fastify' {
|
|
8
7
|
interface FastifyRequest {
|
|
9
8
|
callId: string;
|
|
@@ -13,25 +12,23 @@ declare module 'fastify' {
|
|
|
13
12
|
phoneNumber?: string;
|
|
14
13
|
}
|
|
15
14
|
}
|
|
15
|
+
export interface ConversationMeta<TMeta> {
|
|
16
|
+
meta: TMeta;
|
|
17
|
+
region?: string;
|
|
18
|
+
phoneNumber?: string;
|
|
19
|
+
externalConversationId?: string;
|
|
20
|
+
}
|
|
16
21
|
export interface VoiceHttpBindings<TMeta> {
|
|
17
|
-
|
|
18
|
-
allocations?: ContextCache<{
|
|
19
|
-
variantId: string | null;
|
|
20
|
-
}>;
|
|
22
|
+
router: VoiceRouter<TMeta>;
|
|
21
23
|
telescope: ITelescope;
|
|
24
|
+
callControl: CallControl;
|
|
22
25
|
onStart: () => Promise<void>;
|
|
23
26
|
hostsToPrewarm: string[];
|
|
24
|
-
|
|
25
|
-
getConversationMeta: (headers: FastifyRequest['headers']) => {
|
|
26
|
-
region?: string;
|
|
27
|
-
phoneNumber?: string;
|
|
28
|
-
};
|
|
29
|
-
callControl: CallControl;
|
|
27
|
+
getConversationMeta: (headers: FastifyRequest['headers']) => ConversationMeta<TMeta>;
|
|
30
28
|
notificationRouter?: NotificationRouter;
|
|
31
|
-
getExternalConversationId?: (headers: FastifyRequest['headers']) => string | undefined;
|
|
32
29
|
stickyCookieName?: string;
|
|
33
30
|
}
|
|
34
|
-
export declare function voiceHttpConnect<TMeta>({
|
|
31
|
+
export declare function voiceHttpConnect<TMeta>({ router, telescope, callControl, onStart, hostsToPrewarm, getConversationMeta, notificationRouter, stickyCookieName, }: VoiceHttpBindings<TMeta>): {
|
|
35
32
|
start: () => Promise<void>;
|
|
36
33
|
};
|
|
37
34
|
//# sourceMappingURL=voice-http.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voice-http.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/voice-http.ts"],"names":[],"mappings":"AAGA,OAAgB,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"voice-http.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/voice-http.ts"],"names":[],"mappings":"AAGA,OAAgB,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAA;AAK/D,OAAO,KAAK,WAAW,MAAM,0BAA0B,CAAA;AAMvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,uBAAuB,CAAA;AAS9E,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG5E,OAAO,QAAQ,SAAS,CAAC;IACrB,UAAU,cAAc;QACpB,MAAM,EAAE,MAAM,CAAA;QACd,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC3B,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB;CACJ;AAED,MAAM,WAAW,gBAAgB,CAAC,KAAK;IAEnC,IAAI,EAAE,KAAK,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAClC;AAED,MAAM,WAAW,iBAAiB,CAAC,KAAK;IAEpC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAA;IAC1B,SAAS,EAAE,UAAU,CAAA;IAErB,WAAW,EAAE,WAAW,CAAA;IAExB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAA;IAExB,mBAAmB,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACpF,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IAEvC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,EACpC,MAAM,EACN,SAAS,EACT,WAAW,EACX,OAAO,EACP,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACnB,EAAE,iBAAiB,CAAC,KAAK,CAAC;;EAid1B"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import * as dns from 'node:dns';
|
|
2
2
|
import { promisify } from 'node:util';
|
|
3
3
|
import Fastify from 'fastify';
|
|
4
|
+
import { isRandomizedVoiceRoute } from '../agent/index.js';
|
|
5
|
+
import { runWithUserMessageId, validateVoiceAgentTurnDetectionSettings, } from '../call-control/index.js';
|
|
4
6
|
import { loggerContext } from '../dockyard/index.js';
|
|
5
7
|
import { LATENCY_EVENT_SCHEMA, LATENCY_EVENT_TYPES, } from '../telescope/index.js';
|
|
6
8
|
import { fail, isRecoverableError, mapFromOpenAiMessages } from './http-helpers.js';
|
|
7
9
|
import { llmCompletionHandler } from './llm-completion-handler.js';
|
|
8
10
|
import { logger } from './logger.js';
|
|
9
|
-
import {
|
|
10
|
-
export function voiceHttpConnect({
|
|
11
|
+
import { UnknownVoiceRouteError } from './voice-router.js';
|
|
12
|
+
export function voiceHttpConnect({ router, telescope, callControl, onStart, hostsToPrewarm, getConversationMeta, notificationRouter, stickyCookieName, }) {
|
|
11
13
|
const activeRequests = new Set();
|
|
12
14
|
let started = false;
|
|
13
15
|
const app = Fastify({
|
|
@@ -41,11 +43,11 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
|
|
|
41
43
|
if (!(error instanceof Error)) {
|
|
42
44
|
throw new Error(String(error));
|
|
43
45
|
}
|
|
44
|
-
const
|
|
46
|
+
const agent = await getAgent(request);
|
|
45
47
|
if (!isRecoverableError(error)) {
|
|
46
48
|
await agent.onFatalError(reqToCallInfo(request), error.message);
|
|
47
49
|
}
|
|
48
|
-
await createTelescopeConversation(request,
|
|
50
|
+
await createTelescopeConversation(request, agent.name);
|
|
49
51
|
fail(reply, 500, error.message, error);
|
|
50
52
|
});
|
|
51
53
|
app.addHook('onRequest', async (req, res) => {
|
|
@@ -86,19 +88,28 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
|
|
|
86
88
|
if (!req.agentName) {
|
|
87
89
|
return fail(res, 400, 'Cannot start call without agent name');
|
|
88
90
|
}
|
|
89
|
-
|
|
91
|
+
let agent;
|
|
92
|
+
try {
|
|
93
|
+
agent = await getAgent(req);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
return failToResolve(res, err);
|
|
97
|
+
}
|
|
90
98
|
await telescope.runObservation(async () => {
|
|
91
99
|
const response = await agent.onCallStart(reqToCallInfo(req));
|
|
100
|
+
if (response.initialSettings) {
|
|
101
|
+
validateVoiceAgentTurnDetectionSettings(response.initialSettings);
|
|
102
|
+
}
|
|
92
103
|
res.status(200);
|
|
93
104
|
res.send(response);
|
|
94
|
-
}, { conversationId: req.callId, agentId: agent.name
|
|
105
|
+
}, { conversationId: req.callId, agentId: agent.name });
|
|
95
106
|
});
|
|
96
107
|
app.all('/on-call-ready', async (req, res) => {
|
|
97
108
|
logger.setGlobalId(req.callId);
|
|
98
|
-
const
|
|
109
|
+
const agent = await getAgent(req);
|
|
99
110
|
notificationRouter?.register({
|
|
100
111
|
conversationId: req.callId,
|
|
101
|
-
externalConversationId:
|
|
112
|
+
externalConversationId: getConversationMeta(req.headers).externalConversationId,
|
|
102
113
|
}, agent);
|
|
103
114
|
const { region, phoneNumber } = getConversationMeta(req.headers);
|
|
104
115
|
telescope.getEventTracer().emit({
|
|
@@ -106,77 +117,71 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
|
|
|
106
117
|
attributes: {
|
|
107
118
|
callId: req.callId,
|
|
108
119
|
agentId: agent.name,
|
|
109
|
-
variantId,
|
|
110
120
|
phoneNumber: phoneNumber ?? req.phoneNumber,
|
|
111
121
|
region,
|
|
112
122
|
},
|
|
113
123
|
});
|
|
114
124
|
await telescope.runObservation(async () => {
|
|
115
125
|
await agent.onCallReady(reqToCallInfo(req));
|
|
116
|
-
}, { conversationId: req.callId, agentId: agent.name
|
|
126
|
+
}, { conversationId: req.callId, agentId: agent.name });
|
|
117
127
|
});
|
|
118
128
|
app.all('/on-call-end', async (req, res) => {
|
|
119
129
|
logger.setGlobalId(req.callId);
|
|
120
130
|
logger.debug('agent-service, on-call-end');
|
|
121
|
-
let
|
|
131
|
+
let agent;
|
|
122
132
|
try {
|
|
123
|
-
|
|
133
|
+
agent = await getAgent(req);
|
|
124
134
|
}
|
|
125
|
-
catch (
|
|
126
|
-
return
|
|
135
|
+
catch (err) {
|
|
136
|
+
return failToResolve(res, err);
|
|
127
137
|
}
|
|
128
|
-
const { agent, variantId } = resolved;
|
|
129
138
|
notificationRouter?.unregister(req.callId);
|
|
130
139
|
await telescope.runObservation(async () => {
|
|
131
140
|
await agent.onCallEnd(reqToCallInfo(req));
|
|
132
|
-
await createTelescopeConversation(req,
|
|
133
|
-
await
|
|
141
|
+
await createTelescopeConversation(req, agent.name);
|
|
142
|
+
await router.release(req.callId);
|
|
134
143
|
res.status(200);
|
|
135
|
-
}, { conversationId: req.callId, agentId: agent.name
|
|
144
|
+
}, { conversationId: req.callId, agentId: agent.name });
|
|
136
145
|
});
|
|
137
146
|
app.post('/on-fatal-error', async (req, res) => {
|
|
138
147
|
logger.setGlobalId(req.callId);
|
|
139
148
|
logger.debug('agent-service, on-fatal-error');
|
|
140
|
-
let
|
|
149
|
+
let agent;
|
|
141
150
|
try {
|
|
142
|
-
|
|
151
|
+
agent = await getAgent(req);
|
|
143
152
|
}
|
|
144
|
-
catch (
|
|
145
|
-
return
|
|
153
|
+
catch (err) {
|
|
154
|
+
return failToResolve(res, err);
|
|
146
155
|
}
|
|
147
|
-
const { agent, variantId } = resolved;
|
|
148
156
|
await telescope.runObservation(async () => {
|
|
149
157
|
await agent.onFatalError(reqToCallInfo(req), req.body?.error ?? 'Fatal error');
|
|
150
158
|
res.status(200);
|
|
151
|
-
}, { conversationId: req.callId, agentId: agent.name
|
|
159
|
+
}, { conversationId: req.callId, agentId: agent.name });
|
|
152
160
|
});
|
|
153
161
|
app.all('/chat/completions', async (req, res) => {
|
|
154
162
|
logger.setGlobalId(req.callId);
|
|
155
163
|
logger.debug('agent-service, /chat/completions');
|
|
156
|
-
let
|
|
164
|
+
let agent;
|
|
157
165
|
try {
|
|
158
|
-
|
|
166
|
+
agent = await getAgent(req);
|
|
159
167
|
}
|
|
160
168
|
catch (err) {
|
|
161
|
-
return
|
|
169
|
+
return failToResolve(res, err);
|
|
162
170
|
}
|
|
163
|
-
|
|
164
|
-
return telescope.runObservation(async () => llmCompletionHandler(agent, telescope.getConversationalTracer(), headersToMeta, req, res), {
|
|
171
|
+
return telescope.runObservation(async () => llmCompletionHandler(agent, telescope.getConversationalTracer(), (headers) => getConversationMeta(headers).meta, req, res), {
|
|
165
172
|
conversationId: req.callId,
|
|
166
173
|
agentId: agent.name,
|
|
167
|
-
variantId,
|
|
168
174
|
});
|
|
169
175
|
});
|
|
170
176
|
app.post('/on-agent-speech-done', async (req, res) => {
|
|
171
177
|
logger.setGlobalId(req.callId);
|
|
172
|
-
const
|
|
173
|
-
return telescope.runObservation(async () => {
|
|
178
|
+
const agent = await getAgent(req);
|
|
179
|
+
return runWithUserMessageId(req.body.userMessageId, () => telescope.runObservation(async () => {
|
|
174
180
|
await agent.onAgentSpeechDone(mapFromOpenAiMessages(req.body.messages), reqToCallInfo(req));
|
|
175
181
|
}, {
|
|
176
182
|
conversationId: req.callId,
|
|
177
183
|
agentId: agent.name,
|
|
178
|
-
|
|
179
|
-
});
|
|
184
|
+
}));
|
|
180
185
|
});
|
|
181
186
|
app.post('/latency-event', async (req, res) => {
|
|
182
187
|
logger.setGlobalId(req.callId);
|
|
@@ -250,7 +255,7 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
|
|
|
250
255
|
const requests = [...activeRequests];
|
|
251
256
|
activeRequests.clear();
|
|
252
257
|
const notify = Promise.allSettled(requests.map(async (res) => {
|
|
253
|
-
const
|
|
258
|
+
const agent = await getAgent(res.request);
|
|
254
259
|
await agent.onFatalError(reqToCallInfo(res.request), message);
|
|
255
260
|
fail(res, 500, `${label}: ${message}`);
|
|
256
261
|
}));
|
|
@@ -286,12 +291,22 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
|
|
|
286
291
|
}
|
|
287
292
|
}
|
|
288
293
|
await onStart();
|
|
294
|
+
const routes = await router.start();
|
|
295
|
+
for (const route of routes) {
|
|
296
|
+
await callControl.setUpInboundSip(route.name, route.inbound);
|
|
297
|
+
}
|
|
298
|
+
for (const agent of agentsOf(routes)) {
|
|
299
|
+
await agent.onServiceStartup();
|
|
300
|
+
}
|
|
289
301
|
started = true;
|
|
290
302
|
await prewarmDNS();
|
|
291
303
|
}
|
|
292
|
-
const resolver = createVoiceRouteResolver({ getVoiceAgent, allocations, logger });
|
|
293
304
|
function getAgent(req) {
|
|
294
|
-
return
|
|
305
|
+
return router.resolve(req.agentName, req.callId);
|
|
306
|
+
}
|
|
307
|
+
function failToResolve(res, err) {
|
|
308
|
+
const status = err instanceof UnknownVoiceRouteError ? 404 : 400;
|
|
309
|
+
return fail(res, status, String(err), err);
|
|
295
310
|
}
|
|
296
311
|
async function prewarmDNS() {
|
|
297
312
|
const dnsLookup = promisify(dns.lookup);
|
|
@@ -305,7 +320,7 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
|
|
|
305
320
|
}
|
|
306
321
|
}
|
|
307
322
|
}
|
|
308
|
-
async function createTelescopeConversation(req,
|
|
323
|
+
async function createTelescopeConversation(req, agentId) {
|
|
309
324
|
const conversationId = req.callId;
|
|
310
325
|
if (!conversationId) {
|
|
311
326
|
logger.error('No call ID provided, cannot create Telescope conversation');
|
|
@@ -316,8 +331,7 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
|
|
|
316
331
|
const conversation = {
|
|
317
332
|
conversationId,
|
|
318
333
|
medium: 'phone',
|
|
319
|
-
agentId
|
|
320
|
-
variantId,
|
|
334
|
+
agentId,
|
|
321
335
|
region,
|
|
322
336
|
phoneNumber: phoneNumber ?? req.phoneNumber,
|
|
323
337
|
createdAt: Date.now(),
|
|
@@ -337,7 +351,7 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
|
|
|
337
351
|
return {
|
|
338
352
|
callId: req.callId,
|
|
339
353
|
phoneNumber: req.phoneNumber,
|
|
340
|
-
meta:
|
|
354
|
+
meta: getConversationMeta(req.headers).meta,
|
|
341
355
|
};
|
|
342
356
|
}
|
|
343
357
|
return {
|
|
@@ -345,6 +359,18 @@ export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStar
|
|
|
345
359
|
};
|
|
346
360
|
}
|
|
347
361
|
const LATENCY_EVENT_TYPES_SET = new Set(LATENCY_EVENT_TYPES);
|
|
362
|
+
function agentsOf(routes) {
|
|
363
|
+
const agents = new Set();
|
|
364
|
+
for (const route of routes) {
|
|
365
|
+
if (isRandomizedVoiceRoute(route)) {
|
|
366
|
+
route.agents.forEach(({ agent }) => agents.add(agent));
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
agents.add(route.agent);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
return [...agents];
|
|
373
|
+
}
|
|
348
374
|
function isObject(value) {
|
|
349
375
|
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
350
376
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { VoiceAgent, VoiceRoute } from '../agent/index.js';
|
|
2
|
+
import type { ContextCache } from '../context-cache/index.js';
|
|
3
|
+
import type { Logger } from '../dockyard/index.js';
|
|
4
|
+
export interface VoiceRouterOptions<TMeta> {
|
|
5
|
+
getRoutes: () => Promise<readonly VoiceRoute<TMeta>[]>;
|
|
6
|
+
calls?: ContextCache<{
|
|
7
|
+
agentName: string;
|
|
8
|
+
}>;
|
|
9
|
+
logger: Logger;
|
|
10
|
+
random?: () => number;
|
|
11
|
+
}
|
|
12
|
+
export interface VoiceRouter<TMeta> {
|
|
13
|
+
start(): Promise<readonly VoiceRoute<TMeta>[]>;
|
|
14
|
+
resolve(routeName: string, callId: string): Promise<VoiceAgent<TMeta>>;
|
|
15
|
+
release(callId: string): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare class UnknownVoiceRouteError extends Error {
|
|
18
|
+
constructor(routeName: string);
|
|
19
|
+
}
|
|
20
|
+
export declare function createVoiceRouter<TMeta>({ getRoutes, calls, logger, random, }: VoiceRouterOptions<TMeta>): VoiceRouter<TMeta>;
|
|
21
|
+
//# sourceMappingURL=voice-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-router.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/voice-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAErF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElD,MAAM,WAAW,kBAAkB,CAAC,KAAK;IAErC,SAAS,EAAE,MAAM,OAAO,CAAC,SAAS,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAKtD,KAAK,CAAC,EAAE,YAAY,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,WAAW,CAAC,KAAK;IAE9B,KAAK,IAAI,OAAO,CAAC,SAAS,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAE9C,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IAEtE,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACzC;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACjC,SAAS,EAAE,MAAM;CAIhC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,EACrC,SAAS,EACT,KAA6B,EAC7B,MAAM,EACN,MAAoB,GACvB,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAwFhD"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { isRandomizedVoiceRoute } from '../agent/index.js';
|
|
2
|
+
import { createInMemoryCache } from '../context-cache/index.js';
|
|
3
|
+
export class UnknownVoiceRouteError extends Error {
|
|
4
|
+
constructor(routeName) {
|
|
5
|
+
super(`Unknown voice route: ${routeName}`);
|
|
6
|
+
this.name = 'UnknownVoiceRouteError';
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function createVoiceRouter({ getRoutes, calls = createInMemoryCache(), logger, random = Math.random, }) {
|
|
10
|
+
let byName;
|
|
11
|
+
let starting;
|
|
12
|
+
const picking = new Map();
|
|
13
|
+
function start() {
|
|
14
|
+
if (!starting) {
|
|
15
|
+
starting = build();
|
|
16
|
+
starting.catch(() => (starting = undefined));
|
|
17
|
+
}
|
|
18
|
+
return starting;
|
|
19
|
+
}
|
|
20
|
+
async function build() {
|
|
21
|
+
const routes = await getRoutes();
|
|
22
|
+
const index = new Map();
|
|
23
|
+
for (const route of routes) {
|
|
24
|
+
if (index.has(route.name)) {
|
|
25
|
+
throw new Error(`Duplicate voice route: ${route.name}`);
|
|
26
|
+
}
|
|
27
|
+
if (isRandomizedVoiceRoute(route)) {
|
|
28
|
+
validateRandomizedRoute(route);
|
|
29
|
+
}
|
|
30
|
+
index.set(route.name, route);
|
|
31
|
+
}
|
|
32
|
+
byName = index;
|
|
33
|
+
return routes;
|
|
34
|
+
}
|
|
35
|
+
async function resolve(routeName, callId) {
|
|
36
|
+
if (!byName) {
|
|
37
|
+
throw new Error('The voice router is not started');
|
|
38
|
+
}
|
|
39
|
+
const route = byName.get(routeName);
|
|
40
|
+
if (!route) {
|
|
41
|
+
throw new UnknownVoiceRouteError(routeName);
|
|
42
|
+
}
|
|
43
|
+
if (!isRandomizedVoiceRoute(route)) {
|
|
44
|
+
return route.agent;
|
|
45
|
+
}
|
|
46
|
+
let pending = picking.get(callId);
|
|
47
|
+
if (!pending) {
|
|
48
|
+
pending = keepOrPick(route, callId);
|
|
49
|
+
picking.set(callId, pending);
|
|
50
|
+
const done = () => picking.delete(callId);
|
|
51
|
+
pending.then(done, done);
|
|
52
|
+
}
|
|
53
|
+
return pending;
|
|
54
|
+
}
|
|
55
|
+
async function keepOrPick(route, callId) {
|
|
56
|
+
const kept = await calls.getContext(callId);
|
|
57
|
+
const keptAgent = kept && route.agents.find(({ agent }) => agent.name === kept.agentName);
|
|
58
|
+
if (keptAgent) {
|
|
59
|
+
return keptAgent.agent;
|
|
60
|
+
}
|
|
61
|
+
const agent = pick(route);
|
|
62
|
+
await calls.setContext(callId, { agentName: agent.name });
|
|
63
|
+
logger.log('Picked the agent of the call', {
|
|
64
|
+
routeName: route.name,
|
|
65
|
+
callId,
|
|
66
|
+
agentName: agent.name,
|
|
67
|
+
});
|
|
68
|
+
return agent;
|
|
69
|
+
}
|
|
70
|
+
function pick(route) {
|
|
71
|
+
const total = route.agents.reduce((sum, { weight }) => sum + weight, 0);
|
|
72
|
+
let selected = random() * total;
|
|
73
|
+
for (const { agent, weight } of route.agents) {
|
|
74
|
+
if (weight > 0 && selected < weight) {
|
|
75
|
+
return agent;
|
|
76
|
+
}
|
|
77
|
+
selected -= weight;
|
|
78
|
+
}
|
|
79
|
+
return route.agents.filter(({ weight }) => weight > 0).at(-1).agent;
|
|
80
|
+
}
|
|
81
|
+
function release(callId) {
|
|
82
|
+
return calls.clearContext(callId);
|
|
83
|
+
}
|
|
84
|
+
return { start, resolve, release };
|
|
85
|
+
}
|
|
86
|
+
function validateRandomizedRoute(route) {
|
|
87
|
+
const names = new Set();
|
|
88
|
+
for (const { agent, weight } of route.agents) {
|
|
89
|
+
if (!(weight >= 0)) {
|
|
90
|
+
throw new Error(`Route ${route.name}: the weight of ${agent.name} must be 0 or more`);
|
|
91
|
+
}
|
|
92
|
+
if (names.has(agent.name)) {
|
|
93
|
+
throw new Error(`Route ${route.name}: two agents are named ${agent.name}`);
|
|
94
|
+
}
|
|
95
|
+
names.add(agent.name);
|
|
96
|
+
}
|
|
97
|
+
if (!route.agents.some(({ weight }) => weight > 0)) {
|
|
98
|
+
throw new Error(`Route ${route.name}: no agent has a weight above 0`);
|
|
99
|
+
}
|
|
100
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@recombine-ai/platform",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.9.1-test.0",
|
|
5
5
|
"description": "The Recombine platform: engine, telescope, dockyard, call control, the voice agent API, and the Bosun bindings in one package",
|
|
6
6
|
"license": "EULA",
|
|
7
7
|
"author": "recombine.ai",
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { VoiceAgent } from './voice-agent.js';
|
|
2
|
-
export interface Experiment<TArm extends {
|
|
3
|
-
weight: number;
|
|
4
|
-
}> {
|
|
5
|
-
default?: TArm;
|
|
6
|
-
variants: Readonly<Record<string, TArm>>;
|
|
7
|
-
}
|
|
8
|
-
export declare function allocateVariant<TArm extends {
|
|
9
|
-
weight: number;
|
|
10
|
-
}>(experiment: Experiment<TArm>, random?: () => number): string | null;
|
|
11
|
-
export interface VoiceAgentArm<TMeta> {
|
|
12
|
-
agent: VoiceAgent<TMeta>;
|
|
13
|
-
weight: number;
|
|
14
|
-
}
|
|
15
|
-
export interface VoiceAgentExperiment<TMeta> extends Experiment<VoiceAgentArm<TMeta>> {
|
|
16
|
-
name: string;
|
|
17
|
-
onServiceStartup: () => Promise<void>;
|
|
18
|
-
}
|
|
19
|
-
export type VoiceRoute<TMeta> = VoiceAgent<TMeta> | VoiceAgentExperiment<TMeta>;
|
|
20
|
-
export declare function isVoiceAgentExperiment<TMeta>(route: VoiceRoute<TMeta>): route is VoiceAgentExperiment<TMeta>;
|
|
21
|
-
//# sourceMappingURL=experiment.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"experiment.d.ts","sourceRoot":"","sources":["../../src/agent/experiment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,MAAM,WAAW,UAAU,CAAC,IAAI,SAAS;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE;IAEvD,OAAO,CAAC,EAAE,IAAI,CAAA;IAEd,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;CAC3C;AAMD,wBAAgB,eAAe,CAAC,IAAI,SAAS;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAC3D,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,EAC5B,MAAM,GAAE,MAAM,MAAoB,GACnC,MAAM,GAAG,IAAI,CA0Bf;AAED,MAAM,WAAW,aAAa,CAAC,KAAK;IAChC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;CACjB;AAGD,MAAM,WAAW,oBAAoB,CAAC,KAAK,CAAE,SAAQ,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACjF,IAAI,EAAE,MAAM,CAAA;IAEZ,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACxC;AAED,MAAM,MAAM,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAA;AAE/E,wBAAgB,sBAAsB,CAAC,KAAK,EACxC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,GACzB,KAAK,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAEtC"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
export function allocateVariant(experiment, random = Math.random) {
|
|
2
|
-
const arms = Object.entries(experiment.variants).map(([id, arm]) => [
|
|
3
|
-
id,
|
|
4
|
-
arm.weight,
|
|
5
|
-
]);
|
|
6
|
-
if (experiment.default) {
|
|
7
|
-
arms.unshift([null, experiment.default.weight]);
|
|
8
|
-
}
|
|
9
|
-
for (const [id, weight] of arms) {
|
|
10
|
-
if (!(weight >= 0)) {
|
|
11
|
-
throw new Error(`The weight of the arm ${id ?? 'default'} must be 0 or more`);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
const total = arms.reduce((sum, [, weight]) => sum + weight, 0);
|
|
15
|
-
if (total <= 0) {
|
|
16
|
-
throw new Error('No experiment arm can win: the weights add up to 0');
|
|
17
|
-
}
|
|
18
|
-
let selected = random() * total;
|
|
19
|
-
for (const [id, weight] of arms) {
|
|
20
|
-
if (weight > 0 && selected < weight) {
|
|
21
|
-
return id;
|
|
22
|
-
}
|
|
23
|
-
selected -= weight;
|
|
24
|
-
}
|
|
25
|
-
throw new Error('No experiment arm can win');
|
|
26
|
-
}
|
|
27
|
-
export function isVoiceAgentExperiment(route) {
|
|
28
|
-
return 'variants' in route;
|
|
29
|
-
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
1@�Ś�K�>�Ȭ�Tu`s��ʬ�_�ēكF���j�4���'���f�ׯh���3��e�QL�8���Y�:��3O@�w�"mH�o�
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|