@recombine-ai/platform 0.8.0-test.2 → 0.8.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/experiment.d.ts +21 -0
- package/build/agent/experiment.d.ts.map +1 -0
- package/build/agent/experiment.js +29 -0
- package/build/agent/index.d.ts +2 -0
- package/build/agent/index.d.ts.map +1 -1
- package/build/agent/index.js +1 -0
- package/build/bosun/index.d.ts +1 -0
- package/build/bosun/index.d.ts.map +1 -1
- package/build/bosun/interfaces/agent.d.ts +1 -0
- package/build/bosun/interfaces/agent.d.ts.map +1 -1
- package/build/bosun/interfaces/project.d.ts +25 -0
- package/build/bosun/interfaces/project.d.ts.map +1 -0
- package/build/bosun/interfaces/project.js +1 -0
- package/build/bosun-app/backend/server.js +252 -60
- package/build/bosun-app/backend/server.js.map +2 -2
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{CR5IRTqC.js → AmpxVxY6.js} +1 -1
- 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/{DjDpMqch.js → B-5g3xS8.js} +20 -20
- 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/{BBk8_Xpk.js → B1MxGo6p.js} +1 -1
- 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/{joiJcRPz.js → BqH4VDQz.js} +1 -1
- 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/{B3N9vN4_.js → CQvDMTjY.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CQvDMTjY.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CQvDMTjY.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{C0rPkxmP.js → CVZT6n14.js} +1 -1
- 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/{D89azUgT.js → CWPN78Jk.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CWPN78Jk.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CWPN78Jk.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{ouMvMh56.js → CkstLsmI.js} +1 -1
- 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/{C3cROXCy.js → CuwQtXBl.js} +1 -1
- 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/{BEdAvgYp.js → D9YsE4-8.js} +1 -1
- 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/{Diqx_kju.js → DK7_9Rr4.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/DK7_9Rr4.js.br +3 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/DK7_9Rr4.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{Bwiy-Sk7.js → O3fJLrRA.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/O3fJLrRA.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/O3fJLrRA.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{DJnDF3d9.js → dL_jwANm.js} +1 -1
- 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/chunks/w7_NKWP1.js +3 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/w7_NKWP1.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/w7_NKWP1.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/{app.DYrvpbQq.js → app.Bq7QRKSZ.js} +2 -2
- package/build/bosun-app/frontend/client/_app/immutable/entry/app.Bq7QRKSZ.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/app.Bq7QRKSZ.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.Ct26YHfm.js +1 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.Ct26YHfm.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.Ct26YHfm.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{0.DXIuJQso.js → 0.CIBqOQKB.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/0.CIBqOQKB.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/0.CIBqOQKB.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{1.CsX5iplT.js → 1.Dv78wD0F.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/1.Dv78wD0F.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/1.Dv78wD0F.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.Htrpia-u.js +35 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.Htrpia-u.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.Htrpia-u.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{17.BIO8m3DR.js → 17.DmVfus5a.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/17.DmVfus5a.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/17.DmVfus5a.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DvJVYeXp.js +11 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DvJVYeXp.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.DvJVYeXp.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.tyuQRxDb.js +35 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.tyuQRxDb.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.tyuQRxDb.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.B0NtJamE.js +1 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.B0NtJamE.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.B0NtJamE.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{4.BzhaMuo5.js → 4.DKTRRObl.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/4.DKTRRObl.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/4.DKTRRObl.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{5.BG8ylHWg.js → 5.D9SClLPX.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/5.D9SClLPX.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/5.D9SClLPX.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{6.DkDEANSN.js → 6.DdAs7BvU.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DdAs7BvU.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DdAs7BvU.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{8.3fEbISY6.js → 8.DNEyJy0a.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/8.DNEyJy0a.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/8.DNEyJy0a.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.DcyIUk-F.js +2 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.DcyIUk-F.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.DcyIUk-F.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-VTtwaKGp.js → ChatStepTrace.js-BY0y3Vbb.js} +3 -1
- package/build/bosun-app/frontend/server/chunks/chunks/ChatStepTrace.js-BY0y3Vbb.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-B7oaNMJQ.js → internal.js-CTNBeiir.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-B7oaNMJQ.js.map → internal.js-CTNBeiir.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/chunks/{source-selection.js-D5B8gfq2.js → source-selection.js-DFpObbhz.js} +3 -1
- package/build/bosun-app/frontend/server/chunks/chunks/source-selection.js-DFpObbhz.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/{_layout.svelte.js-B2wHKJV7.js → _layout.svelte.js-b9Q5TFEZ.js} +134 -24
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/_layout.svelte.js-b9Q5TFEZ.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/{_page.svelte.js-DDcIjgZD.js → _page.svelte.js-Chv8ybaj.js} +10 -4
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/_page.svelte.js-Chv8ybaj.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/{_page.svelte.js-UVUg89-t.js → _page.svelte.js-Dkst1C_3.js} +3 -1
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/_page.svelte.js-Dkst1C_3.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/latency/{_page.svelte.js-SjAtxtA0.js → _page.svelte.js-DFZznMhQ.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/latency/{_page.svelte.js-SjAtxtA0.js.map → _page.svelte.js-DFZznMhQ.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/{_page.svelte.js-DiZKDT2v.js → _page.svelte.js-Bxdn8vG5.js} +7 -3
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/_page.svelte.js-Bxdn8vG5.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/{_layout.svelte.js-CfkCQ2Th.js → _layout.svelte.js-DhdYiNVL.js} +61 -9
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_layout.svelte.js-DhdYiNVL.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/{handler-D9QLNo8w.js → handler-kZm9DU-v.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/{handler-D9QLNo8w.js.map → handler-kZm9DU-v.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/{index.js-B0gyG8Jr.js → index.js-BYV_PeV-.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/{index.js-B0gyG8Jr.js.map → index.js-BYV_PeV-.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/{manifest.js-BJwjpIJ3.js → manifest.js-DknJwtFc.js} +14 -14
- package/build/bosun-app/frontend/server/chunks/{manifest.js-BJwjpIJ3.js.map → manifest.js-DknJwtFc.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{0.js-CzIAnGix.js → 0.js-B947oA7Q.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{0.js-CzIAnGix.js.map → 0.js-B947oA7Q.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{1.js-dcMNeOrp.js → 1.js-D-bO8SBw.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{1.js-dcMNeOrp.js.map → 1.js-D-bO8SBw.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{10.js-BJiZIzMv.js → 10.js-BPINRsAS.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{10.js-BJiZIzMv.js.map → 10.js-BPINRsAS.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{17.js-D2Tp888g.js → 17.js-BvBqWcLx.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{17.js-D2Tp888g.js.map → 17.js-BvBqWcLx.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{18.js-u_njdfH1.js → 18.js-BEfVGplP.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{18.js-u_njdfH1.js.map → 18.js-BEfVGplP.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{2.js-CmkWii-m.js → 2.js-XaMsKwVG.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{2.js-CmkWii-m.js.map → 2.js-XaMsKwVG.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{3.js-CEcqDZwI.js → 3.js-9Rmo9ovG.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{3.js-CEcqDZwI.js.map → 3.js-9Rmo9ovG.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{4.js-DoWmHMTv.js → 4.js-DHzNp2kw.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{4.js-DoWmHMTv.js.map → 4.js-DHzNp2kw.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{5.js-hFh1mvzS.js → 5.js-BtTetd8U.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{5.js-hFh1mvzS.js.map → 5.js-BtTetd8U.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{6.js-C9qNqJg2.js → 6.js-dyYItn4O.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{6.js-C9qNqJg2.js.map → 6.js-dyYItn4O.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{8.js-Btfm0qj5.js → 8.js-D5qfNA9r.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{8.js-Btfm0qj5.js.map → 8.js-D5qfNA9r.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{9.js-Ca7GzK3u.js → 9.js-CxI4tPnx.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{9.js-Ca7GzK3u.js.map → 9.js-CxI4tPnx.js.map} +1 -1
- package/build/call-control/call-control.d.ts.map +1 -1
- package/build/call-control/call-control.js +0 -2
- package/build/call-control/index.d.ts +0 -1
- package/build/call-control/index.d.ts.map +1 -1
- package/build/call-control/index.js +0 -1
- package/build/call-control/schemas.generated.d.ts +2 -1
- package/build/call-control/schemas.generated.d.ts.map +1 -1
- package/build/call-control/schemas.generated.js +4 -4
- package/build/call-control/types.d.ts +156 -3
- package/build/call-control/types.d.ts.map +1 -1
- package/build/call-control/types.js +3 -3
- 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 +8 -2
- package/build/telescope/index.d.ts +1 -1
- package/build/telescope/index.d.ts.map +1 -1
- package/build/telescope/interfaces/conversation.d.ts +8 -0
- package/build/telescope/interfaces/conversation.d.ts.map +1 -1
- package/build/telescope/interfaces/event-tracer.d.ts +8 -0
- package/build/telescope/interfaces/event-tracer.d.ts.map +1 -1
- package/build/telescope/interfaces/storage.d.ts +2 -2
- package/build/telescope/interfaces/storage.d.ts.map +1 -1
- package/build/telescope/interfaces/telescope.d.ts +1 -0
- package/build/telescope/interfaces/telescope.d.ts.map +1 -1
- package/build/telescope/stub-storage.d.ts +2 -2
- package/build/telescope/stub-storage.d.ts.map +1 -1
- package/build/telescope/stub-storage.js +3 -8
- package/build/telescope/tracers/event-tracer.d.ts.map +1 -1
- package/build/telescope/tracers/event-tracer.js +5 -0
- package/build/text-agent-handlers/incoming-message.js +1 -1
- package/build/text-agent-handlers/index.d.ts +1 -0
- package/build/text-agent-handlers/index.d.ts.map +1 -1
- package/build/text-agent-handlers/index.js +1 -0
- package/build/text-agent-handlers/instrument.d.ts +1 -0
- package/build/text-agent-handlers/instrument.d.ts.map +1 -1
- package/build/text-agent-handlers/instrument.js +6 -2
- package/build/text-agent-handlers/jobs-handler.js +1 -1
- package/build/text-agent-handlers/jobs.d.ts +1 -0
- package/build/text-agent-handlers/jobs.d.ts.map +1 -1
- package/build/text-agent-handlers/message-acceptor.d.ts +4 -0
- package/build/text-agent-handlers/message-acceptor.d.ts.map +1 -1
- package/build/text-agent-handlers/message-acceptor.js +8 -2
- package/build/text-agent-handlers/ports.d.ts +2 -1
- package/build/text-agent-handlers/ports.d.ts.map +1 -1
- package/build/text-agent-handlers/ports.js +6 -5
- package/build/text-agent-handlers/variant-scheduler.d.ts +3 -0
- package/build/text-agent-handlers/variant-scheduler.d.ts.map +1 -0
- package/build/text-agent-handlers/variant-scheduler.js +9 -0
- package/build/voice-agent-api/index.d.ts +2 -0
- package/build/voice-agent-api/index.d.ts.map +1 -1
- package/build/voice-agent-api/index.js +1 -0
- package/build/voice-agent-api/route-resolver.d.ts +19 -0
- package/build/voice-agent-api/route-resolver.d.ts.map +1 -0
- package/build/voice-agent-api/route-resolver.js +57 -0
- package/build/voice-agent-api/voice-http.d.ts +8 -4
- package/build/voice-agent-api/voice-http.d.ts.map +1 -1
- package/build/voice-agent-api/voice-http.js +31 -32
- package/package.json +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/B3N9vN4_.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/B3N9vN4_.js.gz +0 -0
- 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/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/BaP19BGR.js +0 -3
- package/build/bosun-app/frontend/client/_app/immutable/chunks/BaP19BGR.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/BaP19BGR.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/Bwiy-Sk7.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/Bwiy-Sk7.js.gz +0 -0
- 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/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/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/D89azUgT.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/D89azUgT.js.gz +0 -0
- 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/Diqx_kju.js.br +0 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/Diqx_kju.js.gz +0 -0
- 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/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/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.DYrvpbQq.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/app.DYrvpbQq.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.ZRGJFDNa.js +0 -1
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.ZRGJFDNa.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.ZRGJFDNa.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/0.DXIuJQso.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/0.DXIuJQso.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/1.CsX5iplT.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/1.CsX5iplT.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.D6gFo5CY.js +0 -35
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.D6gFo5CY.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.D6gFo5CY.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/17.BIO8m3DR.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/17.BIO8m3DR.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.D4L67K6t.js +0 -11
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.D4L67K6t.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.D4L67K6t.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.6RK8LtTD.js +0 -35
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.6RK8LtTD.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.6RK8LtTD.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CbcbRLFb.js +0 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CbcbRLFb.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.CbcbRLFb.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/4.BzhaMuo5.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/4.BzhaMuo5.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/5.BG8ylHWg.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/5.BG8ylHWg.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DkDEANSN.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DkDEANSN.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/8.3fEbISY6.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/8.3fEbISY6.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.CoX3jzbC.js +0 -2
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.CoX3jzbC.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.CoX3jzbC.js.gz +0 -0
- package/build/bosun-app/frontend/server/chunks/chunks/ChatStepTrace.js-VTtwaKGp.js.map +0 -1
- package/build/bosun-app/frontend/server/chunks/chunks/source-selection.js-D5B8gfq2.js.map +0 -1
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/_layout.svelte.js-B2wHKJV7.js.map +0 -1
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/roleplay/_page.svelte.js-DDcIjgZD.js.map +0 -1
- package/build/bosun-app/frontend/server/chunks/entries/pages/edit/_agent_/tests/_page.svelte.js-UVUg89-t.js.map +0 -1
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_conversationId_/traces/_page.svelte.js-DiZKDT2v.js.map +0 -1
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_layout.svelte.js-CfkCQ2Th.js.map +0 -1
- package/build/call-control/voice-agent-config.d.ts +0 -155
- package/build/call-control/voice-agent-config.d.ts.map +0 -1
- package/build/call-control/voice-agent-config.js +0 -53
|
@@ -19,7 +19,7 @@ export function createIncomingMessageHandler(options) {
|
|
|
19
19
|
if (!agentRecord) {
|
|
20
20
|
throw new Error(`incoming-message, agent not found for ${conversationId}`);
|
|
21
21
|
}
|
|
22
|
-
const agent = await getTextAgent(agentRecord.agentId);
|
|
22
|
+
const agent = await getTextAgent(agentRecord.agentId, agentRecord.variantId);
|
|
23
23
|
return { agent, agentRecord };
|
|
24
24
|
}
|
|
25
25
|
async function handleChatMessage(event) {
|
|
@@ -11,5 +11,6 @@ export type { MessageAcceptorOptions } from './message-acceptor.js';
|
|
|
11
11
|
export { createNotificationHookHandler } from './notification-hook.js';
|
|
12
12
|
export type { NotificationHookOptions, NotificationHookRequest } from './notification-hook.js';
|
|
13
13
|
export { instrumentTextAgent } from './instrument.js';
|
|
14
|
+
export { scopeSchedulerToVariant } from './variant-scheduler.js';
|
|
14
15
|
export type { InstrumentTextAgentOptions } from './instrument.js';
|
|
15
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACpD,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC/D,YAAY,EACR,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,eAAe,EACf,SAAS,GACZ,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAA;AACpE,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAA;AACtE,YAAY,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,YAAY,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACpD,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC/D,YAAY,EACR,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,eAAe,EACf,SAAS,GACZ,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAA;AACpE,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAA;AACtE,YAAY,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,YAAY,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -4,3 +4,4 @@ export { createJobsHandler } from './jobs-handler.js';
|
|
|
4
4
|
export { createMessageAcceptor } from './message-acceptor.js';
|
|
5
5
|
export { createNotificationHookHandler } from './notification-hook.js';
|
|
6
6
|
export { instrumentTextAgent } from './instrument.js';
|
|
7
|
+
export { scopeSchedulerToVariant } from './variant-scheduler.js';
|
|
@@ -6,6 +6,7 @@ export interface InstrumentTextAgentOptions<TMeta> {
|
|
|
6
6
|
agent: TextAgent<TMeta>;
|
|
7
7
|
messagingProvider?: MonitoringProvider;
|
|
8
8
|
onEvent?: (event: Event<TMeta>) => Promise<void>;
|
|
9
|
+
variantId?: string;
|
|
9
10
|
}
|
|
10
11
|
export declare function instrumentTextAgent<TMeta>(options: InstrumentTextAgentOptions<TMeta>): TextAgent<TMeta>;
|
|
11
12
|
//# sourceMappingURL=instrument.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/instrument.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE3E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,WAAW,0BAA0B,CAAC,KAAK;IAC7C,SAAS,EAAE,UAAU,CAAA;IACrB,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;IAEvB,iBAAiB,CAAC,EAAE,kBAAkB,CAAA;IAEtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/instrument.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE3E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,WAAW,0BAA0B,CAAC,KAAK;IAC7C,SAAS,EAAE,UAAU,CAAA;IACrB,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;IAEvB,iBAAiB,CAAC,EAAE,kBAAkB,CAAA;IAEtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhD,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAaD,wBAAgB,mBAAmB,CAAC,KAAK,EACrC,OAAO,EAAE,0BAA0B,CAAC,KAAK,CAAC,GAC3C,SAAS,CAAC,KAAK,CAAC,CAwClB"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { emitConversationalTrace, textEventTrace } from '../telescope/index.js';
|
|
2
2
|
export function instrumentTextAgent(options) {
|
|
3
|
-
const { telescope, agent, messagingProvider, onEvent } = options;
|
|
4
|
-
const observation = (conversationId) => ({
|
|
3
|
+
const { telescope, agent, messagingProvider, onEvent, variantId } = options;
|
|
4
|
+
const observation = (conversationId) => ({
|
|
5
|
+
conversationId,
|
|
6
|
+
messagingProvider,
|
|
7
|
+
variantId,
|
|
8
|
+
});
|
|
5
9
|
async function traceReceivedMessage(event) {
|
|
6
10
|
if (event.kind !== 'message')
|
|
7
11
|
return;
|
|
@@ -5,7 +5,7 @@ export function createJobsHandler(options) {
|
|
|
5
5
|
return async function handleJob(input) {
|
|
6
6
|
let agent;
|
|
7
7
|
try {
|
|
8
|
-
agent = await getTextAgent(input.agentId);
|
|
8
|
+
agent = await getTextAgent(input.agentId, input.variantId);
|
|
9
9
|
}
|
|
10
10
|
catch (err) {
|
|
11
11
|
logger.error('jobs, unknown agentId', { agentId: input.agentId, err });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/jobs.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,GAAG;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;CACtB;AAKD,MAAM,WAAW,QAAQ;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/jobs.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,GAAG;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;CACtB;AAKD,MAAM,WAAW,QAAQ;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IAEf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC5B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACvC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,uBAAuB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;CACtE"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type Experiment } from '../agent/experiment.js';
|
|
1
2
|
import type { Logger } from '../dockyard/index.js';
|
|
2
3
|
import type { EventTracer } from '../telescope/index.js';
|
|
3
4
|
import type { Event } from './event.js';
|
|
@@ -5,6 +6,9 @@ import type { AgentRegistry, HandlerResponse } from './ports.js';
|
|
|
5
6
|
export interface MessageAcceptorOptions {
|
|
6
7
|
registry: AgentRegistry;
|
|
7
8
|
resolveAgentId: (event: Event) => string;
|
|
9
|
+
experiments?: Readonly<Record<string, Experiment<{
|
|
10
|
+
weight: number;
|
|
11
|
+
}>>>;
|
|
8
12
|
eventTracer: EventTracer;
|
|
9
13
|
invokeIncomingMessage: (event: Event) => Promise<void>;
|
|
10
14
|
logger: Logger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-acceptor.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/message-acceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAGhE,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,aAAa,CAAA;IAEvB,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"message-acceptor.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/message-acceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,wBAAwB,CAAA;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAGhE,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,aAAa,CAAA;IAEvB,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAA;IAExC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC,CAAA;IACtE,WAAW,EAAE,WAAW,CAAA;IAExB,qBAAqB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,MAAM,EAAE,MAAM,CAAA;CACjB;AAMD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,IAI7B,OAAO,KAAK,KAAG,OAAO,CAAC,eAAe,CAAC,CA0C9E"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { allocateVariant } from '../agent/experiment.js';
|
|
1
2
|
import { handlerResponse } from './ports.js';
|
|
2
3
|
export function createMessageAcceptor(options) {
|
|
3
|
-
const { registry, resolveAgentId, eventTracer, invokeIncomingMessage, logger } = options;
|
|
4
|
+
const { registry, resolveAgentId, experiments, eventTracer, invokeIncomingMessage, logger } = options;
|
|
4
5
|
return async function acceptMessage(event) {
|
|
5
6
|
logger.debug('acceptMessage from conversation', {
|
|
6
7
|
conversationId: event.conversationId,
|
|
@@ -8,9 +9,13 @@ export function createMessageAcceptor(options) {
|
|
|
8
9
|
});
|
|
9
10
|
let record = await registry.getAgent(event.conversationId);
|
|
10
11
|
if (!record) {
|
|
12
|
+
const agentId = resolveAgentId(event);
|
|
13
|
+
const experiment = experiments?.[agentId];
|
|
14
|
+
const variantId = experiment ? allocateVariant(experiment) : null;
|
|
11
15
|
record = {
|
|
12
16
|
conversationId: event.conversationId,
|
|
13
|
-
agentId
|
|
17
|
+
agentId,
|
|
18
|
+
...(variantId ? { variantId } : {}),
|
|
14
19
|
};
|
|
15
20
|
await registry.saveAgent(record);
|
|
16
21
|
eventTracer.emit({
|
|
@@ -18,6 +23,7 @@ export function createMessageAcceptor(options) {
|
|
|
18
23
|
attributes: {
|
|
19
24
|
conversationId: event.conversationId,
|
|
20
25
|
agentId: record.agentId,
|
|
26
|
+
variantId: record.variantId,
|
|
21
27
|
channel: event.channel,
|
|
22
28
|
region: typeof event.metadata.region === 'string'
|
|
23
29
|
? event.metadata.region
|
|
@@ -4,6 +4,7 @@ import type { JobInput } from './jobs.js';
|
|
|
4
4
|
export interface AgentRecord {
|
|
5
5
|
conversationId: string;
|
|
6
6
|
agentId: string;
|
|
7
|
+
variantId?: string;
|
|
7
8
|
}
|
|
8
9
|
export interface AgentRegistry {
|
|
9
10
|
getAgent(conversationId: string): Promise<AgentRecord | null>;
|
|
@@ -25,7 +26,7 @@ export interface ChatLockStore {
|
|
|
25
26
|
export interface JobRunner extends Scheduler {
|
|
26
27
|
runJob(input: JobInput): Promise<unknown>;
|
|
27
28
|
}
|
|
28
|
-
export type GetTextAgent<TMeta> = (agentId: string) => Promise<TextAgent<TMeta>>;
|
|
29
|
+
export type GetTextAgent<TMeta> = (agentId: string, variantId?: string) => Promise<TextAgent<TMeta>>;
|
|
29
30
|
export declare function cacheTextAgents<TMeta>(getTextAgent: GetTextAgent<TMeta>): GetTextAgent<TMeta>;
|
|
30
31
|
export type HandlerResponse = {
|
|
31
32
|
statusCode: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/ports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,WAAW,WAAW;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/ports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAGzC,MAAM,WAAW,WAAW;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IAEf,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAGD,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAC7D,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE;AAGD,MAAM,WAAW,QAAQ;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC1B,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IAE7D,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAE1C,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACjE,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/E,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACxD;AAGD,MAAM,WAAW,SAAU,SAAQ,SAAS;IACxC,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC5C;AAGD,MAAM,MAAM,YAAY,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;AAGpG,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAY7F;AAGD,MAAM,MAAM,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAElE,wBAAgB,eAAe,CAC3B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,eAAe,CAEjB"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
export function cacheTextAgents(getTextAgent) {
|
|
2
2
|
const agents = new Map();
|
|
3
|
-
return (agentId) => {
|
|
4
|
-
|
|
3
|
+
return (agentId, variantId) => {
|
|
4
|
+
const key = variantId ? `${agentId}#${variantId}` : agentId;
|
|
5
|
+
let agent = agents.get(key);
|
|
5
6
|
if (!agent) {
|
|
6
|
-
agent = getTextAgent(agentId);
|
|
7
|
-
agents.set(
|
|
8
|
-
agent.catch(() => agents.delete(
|
|
7
|
+
agent = getTextAgent(agentId, variantId);
|
|
8
|
+
agents.set(key, agent);
|
|
9
|
+
agent.catch(() => agents.delete(key));
|
|
9
10
|
}
|
|
10
11
|
return agent;
|
|
11
12
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variant-scheduler.d.ts","sourceRoot":"","sources":["../../src/text-agent-handlers/variant-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAMnD,wBAAgB,uBAAuB,CACnC,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC9B,SAAS,CAUX"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function scopeSchedulerToVariant(scheduler, variantId) {
|
|
2
|
+
if (!variantId) {
|
|
3
|
+
return scheduler;
|
|
4
|
+
}
|
|
5
|
+
return {
|
|
6
|
+
registerAction: (agentId, actionName, action) => scheduler.registerAction(agentId, actionName, action, variantId),
|
|
7
|
+
clearAllPendingActions: (conversationId) => scheduler.clearAllPendingActions(conversationId),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
@@ -3,4 +3,6 @@ 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
5
|
export type { VoiceHttpBindings } from './voice-http.js';
|
|
6
|
+
export { createVoiceRouteResolver } from './route-resolver.js';
|
|
7
|
+
export type { ResolvedVoiceAgent, VoiceRouteResolverOptions } from './route-resolver.js';
|
|
6
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,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,YAAY,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -1,3 +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 { createVoiceRouteResolver } from './route-resolver.js';
|
|
@@ -0,0 +1,19 @@
|
|
|
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 ResolvedVoiceAgent<TMeta> {
|
|
5
|
+
agent: VoiceAgent<TMeta>;
|
|
6
|
+
variantId?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface VoiceRouteResolverOptions<TMeta> {
|
|
9
|
+
getVoiceAgent: (agentName: string) => Promise<VoiceRoute<TMeta>>;
|
|
10
|
+
allocations?: ContextCache<{
|
|
11
|
+
variantId: string | null;
|
|
12
|
+
}>;
|
|
13
|
+
logger: Logger;
|
|
14
|
+
}
|
|
15
|
+
export declare function createVoiceRouteResolver<TMeta>({ getVoiceAgent, allocations, logger, }: VoiceRouteResolverOptions<TMeta>): {
|
|
16
|
+
resolve: (agentName: string, callId: string) => Promise<ResolvedVoiceAgent<TMeta>>;
|
|
17
|
+
release: (callId: string) => Promise<void>;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=route-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-resolver.d.ts","sourceRoot":"","sources":["../../src/voice-agent-api/route-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAwB,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;IACrC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IAExB,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,yBAAyB,CAAC,KAAK;IAC5C,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IAEhE,WAAW,CAAC,EAAE,YAAY,CAAC;QAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IACxD,MAAM,EAAE,MAAM,CAAA;CACjB;AAMD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,EAC5C,aAAa,EACb,WAAmC,EACnC,MAAM,GACT,EAAE,yBAAyB,CAAC,KAAK,CAAC;yBAiBG,MAAM,UAAU,MAAM,KAAG,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;sBAuCpE,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;EAKlD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { allocateVariant, isVoiceAgentExperiment } from '../agent/index.js';
|
|
2
|
+
import { createInMemoryCache } from '../context-cache/index.js';
|
|
3
|
+
export function createVoiceRouteResolver({ getVoiceAgent, allocations = createInMemoryCache(), logger, }) {
|
|
4
|
+
const routes = new Map();
|
|
5
|
+
const allocating = new Map();
|
|
6
|
+
function getRoute(agentName) {
|
|
7
|
+
let route = routes.get(agentName);
|
|
8
|
+
if (!route) {
|
|
9
|
+
logger.debug('Loading agent', { agentName });
|
|
10
|
+
route = getVoiceAgent(agentName);
|
|
11
|
+
routes.set(agentName, route);
|
|
12
|
+
route.catch(() => routes.delete(agentName));
|
|
13
|
+
}
|
|
14
|
+
return route;
|
|
15
|
+
}
|
|
16
|
+
async function resolve(agentName, callId) {
|
|
17
|
+
const route = await getRoute(agentName);
|
|
18
|
+
if (!isVoiceAgentExperiment(route)) {
|
|
19
|
+
return { agent: route };
|
|
20
|
+
}
|
|
21
|
+
const variantId = await allocate(route, callId);
|
|
22
|
+
const arm = variantId === null ? route.default : route.variants[variantId];
|
|
23
|
+
if (!arm) {
|
|
24
|
+
throw new Error(`Route ${agentName} has no arm ${variantId ?? 'default'}`);
|
|
25
|
+
}
|
|
26
|
+
return { agent: arm.agent, variantId: variantId ?? undefined };
|
|
27
|
+
}
|
|
28
|
+
function allocate(route, callId) {
|
|
29
|
+
let pending = allocating.get(callId);
|
|
30
|
+
if (!pending) {
|
|
31
|
+
pending = keepOrAllocate(route, callId);
|
|
32
|
+
allocating.set(callId, pending);
|
|
33
|
+
const done = () => allocating.delete(callId);
|
|
34
|
+
pending.then(done, done);
|
|
35
|
+
}
|
|
36
|
+
return pending;
|
|
37
|
+
}
|
|
38
|
+
async function keepOrAllocate(route, callId) {
|
|
39
|
+
const kept = await allocations.getContext(callId);
|
|
40
|
+
if (kept && hasArm(route, kept.variantId)) {
|
|
41
|
+
return kept.variantId;
|
|
42
|
+
}
|
|
43
|
+
const variantId = allocateVariant(route);
|
|
44
|
+
await allocations.setContext(callId, { variantId });
|
|
45
|
+
logger.log('Allocated experiment arm', { agentName: route.name, callId, variantId });
|
|
46
|
+
return variantId;
|
|
47
|
+
}
|
|
48
|
+
function release(callId) {
|
|
49
|
+
return allocations.clearContext(callId);
|
|
50
|
+
}
|
|
51
|
+
return { resolve, release };
|
|
52
|
+
}
|
|
53
|
+
function hasArm(route, variantId) {
|
|
54
|
+
return variantId === null
|
|
55
|
+
? route.default !== undefined
|
|
56
|
+
: Object.prototype.hasOwnProperty.call(route.variants, variantId);
|
|
57
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { FastifyRequest } from 'fastify';
|
|
2
|
-
import {
|
|
3
|
-
import CallControl from '../call-control/index.js';
|
|
2
|
+
import { VoiceRoute } from '../agent/index.js';
|
|
3
|
+
import type CallControl from '../call-control/index.js';
|
|
4
|
+
import type { ContextCache } from '../context-cache/index.js';
|
|
4
5
|
import type { NotificationRouter } from '../notifications/index.js';
|
|
5
6
|
import type { ITelescope } from '../telescope/index.js';
|
|
6
7
|
declare module 'fastify' {
|
|
@@ -13,7 +14,10 @@ declare module 'fastify' {
|
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
export interface VoiceHttpBindings<TMeta> {
|
|
16
|
-
getVoiceAgent: (agentName: string) => Promise<
|
|
17
|
+
getVoiceAgent: (agentName: string) => Promise<VoiceRoute<TMeta>>;
|
|
18
|
+
allocations?: ContextCache<{
|
|
19
|
+
variantId: string | null;
|
|
20
|
+
}>;
|
|
17
21
|
telescope: ITelescope;
|
|
18
22
|
onStart: () => Promise<void>;
|
|
19
23
|
hostsToPrewarm: string[];
|
|
@@ -27,7 +31,7 @@ export interface VoiceHttpBindings<TMeta> {
|
|
|
27
31
|
getExternalConversationId?: (headers: FastifyRequest['headers']) => string | undefined;
|
|
28
32
|
stickyCookieName?: string;
|
|
29
33
|
}
|
|
30
|
-
export declare function voiceHttpConnect<TMeta>({ getVoiceAgent, telescope, onStart, hostsToPrewarm, headersToMeta, getConversationMeta, callControl, notificationRouter, getExternalConversationId, stickyCookieName, }: VoiceHttpBindings<TMeta>): {
|
|
34
|
+
export declare function voiceHttpConnect<TMeta>({ getVoiceAgent, allocations, telescope, onStart, hostsToPrewarm, headersToMeta, getConversationMeta, callControl, notificationRouter, getExternalConversationId, stickyCookieName, }: VoiceHttpBindings<TMeta>): {
|
|
31
35
|
start: () => Promise<void>;
|
|
32
36
|
};
|
|
33
37
|
//# 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;AAG/D,OAAO,EAAY,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,
|
|
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;AAG/D,OAAO,EAAY,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,WAAW,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,uBAAuB,CAAA;AAY9E,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,iBAAiB,CAAC,KAAK;IAEpC,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IAKhE,WAAW,CAAC,EAAE,YAAY,CAAC;QAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IACxD,SAAS,EAAE,UAAU,CAAA;IAErB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,aAAa,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,KAAK,CAAA;IAE5D,mBAAmB,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK;QACzD,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB,CAAA;IAED,WAAW,EAAE,WAAW,CAAA;IACxB,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;IAEtF,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,EACpC,aAAa,EACb,WAAW,EACX,SAAS,EACT,OAAO,EACP,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,GACnB,EAAE,iBAAiB,CAAC,KAAK,CAAC;;EA+b1B"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as dns from 'node:dns';
|
|
2
2
|
import { promisify } from 'node:util';
|
|
3
3
|
import Fastify from 'fastify';
|
|
4
|
-
import { validateVoiceAgentTurnDetectionSettings } from '../call-control/index.js';
|
|
5
4
|
import { loggerContext } from '../dockyard/index.js';
|
|
6
5
|
import { LATENCY_EVENT_SCHEMA, LATENCY_EVENT_TYPES, } from '../telescope/index.js';
|
|
7
6
|
import { fail, isRecoverableError, mapFromOpenAiMessages } from './http-helpers.js';
|
|
8
7
|
import { llmCompletionHandler } from './llm-completion-handler.js';
|
|
9
8
|
import { logger } from './logger.js';
|
|
10
|
-
|
|
9
|
+
import { createVoiceRouteResolver } from './route-resolver.js';
|
|
10
|
+
export function voiceHttpConnect({ getVoiceAgent, allocations, telescope, onStart, hostsToPrewarm, headersToMeta, getConversationMeta, callControl, notificationRouter, getExternalConversationId, stickyCookieName, }) {
|
|
11
11
|
const activeRequests = new Set();
|
|
12
12
|
let started = false;
|
|
13
13
|
const app = Fastify({
|
|
@@ -41,10 +41,11 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
|
|
|
41
41
|
if (!(error instanceof Error)) {
|
|
42
42
|
throw new Error(String(error));
|
|
43
43
|
}
|
|
44
|
+
const { agent, variantId } = await getAgent(request);
|
|
44
45
|
if (!isRecoverableError(error)) {
|
|
45
|
-
await
|
|
46
|
+
await agent.onFatalError(reqToCallInfo(request), error.message);
|
|
46
47
|
}
|
|
47
|
-
await createTelescopeConversation(request);
|
|
48
|
+
await createTelescopeConversation(request, variantId);
|
|
48
49
|
fail(reply, 500, error.message, error);
|
|
49
50
|
});
|
|
50
51
|
app.addHook('onRequest', async (req, res) => {
|
|
@@ -85,19 +86,16 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
|
|
|
85
86
|
if (!req.agentName) {
|
|
86
87
|
return fail(res, 400, 'Cannot start call without agent name');
|
|
87
88
|
}
|
|
88
|
-
const agent = await getAgent(req);
|
|
89
|
+
const { agent, variantId } = await getAgent(req);
|
|
89
90
|
await telescope.runObservation(async () => {
|
|
90
91
|
const response = await agent.onCallStart(reqToCallInfo(req));
|
|
91
|
-
if (response.initialSettings) {
|
|
92
|
-
validateVoiceAgentTurnDetectionSettings(response.initialSettings);
|
|
93
|
-
}
|
|
94
92
|
res.status(200);
|
|
95
93
|
res.send(response);
|
|
96
|
-
}, { conversationId: req.callId, agentId: agent.name });
|
|
94
|
+
}, { conversationId: req.callId, agentId: agent.name, variantId });
|
|
97
95
|
});
|
|
98
96
|
app.all('/on-call-ready', async (req, res) => {
|
|
99
97
|
logger.setGlobalId(req.callId);
|
|
100
|
-
const agent = await getAgent(req);
|
|
98
|
+
const { agent, variantId } = await getAgent(req);
|
|
101
99
|
notificationRouter?.register({
|
|
102
100
|
conversationId: req.callId,
|
|
103
101
|
externalConversationId: getExternalConversationId?.(req.headers),
|
|
@@ -108,69 +106,76 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
|
|
|
108
106
|
attributes: {
|
|
109
107
|
callId: req.callId,
|
|
110
108
|
agentId: agent.name,
|
|
109
|
+
variantId,
|
|
111
110
|
phoneNumber: phoneNumber ?? req.phoneNumber,
|
|
112
111
|
region,
|
|
113
112
|
},
|
|
114
113
|
});
|
|
115
114
|
await telescope.runObservation(async () => {
|
|
116
115
|
await agent.onCallReady(reqToCallInfo(req));
|
|
117
|
-
}, { conversationId: req.callId, agentId: agent.name });
|
|
116
|
+
}, { conversationId: req.callId, agentId: agent.name, variantId });
|
|
118
117
|
});
|
|
119
118
|
app.all('/on-call-end', async (req, res) => {
|
|
120
119
|
logger.setGlobalId(req.callId);
|
|
121
120
|
logger.debug('agent-service, on-call-end');
|
|
122
|
-
let
|
|
121
|
+
let resolved;
|
|
123
122
|
try {
|
|
124
|
-
|
|
123
|
+
resolved = await getAgent(req);
|
|
125
124
|
}
|
|
126
125
|
catch (e) {
|
|
127
126
|
return fail(res, 400, String(e), e);
|
|
128
127
|
}
|
|
128
|
+
const { agent, variantId } = resolved;
|
|
129
129
|
notificationRouter?.unregister(req.callId);
|
|
130
130
|
await telescope.runObservation(async () => {
|
|
131
131
|
await agent.onCallEnd(reqToCallInfo(req));
|
|
132
|
-
await createTelescopeConversation(req);
|
|
132
|
+
await createTelescopeConversation(req, variantId);
|
|
133
|
+
await resolver.release(req.callId);
|
|
133
134
|
res.status(200);
|
|
134
|
-
}, { conversationId: req.callId, agentId: agent.name });
|
|
135
|
+
}, { conversationId: req.callId, agentId: agent.name, variantId });
|
|
135
136
|
});
|
|
136
137
|
app.post('/on-fatal-error', async (req, res) => {
|
|
137
138
|
logger.setGlobalId(req.callId);
|
|
138
139
|
logger.debug('agent-service, on-fatal-error');
|
|
139
|
-
let
|
|
140
|
+
let resolved;
|
|
140
141
|
try {
|
|
141
|
-
|
|
142
|
+
resolved = await getAgent(req);
|
|
142
143
|
}
|
|
143
144
|
catch (e) {
|
|
144
145
|
return fail(res, 400, String(e), e);
|
|
145
146
|
}
|
|
147
|
+
const { agent, variantId } = resolved;
|
|
146
148
|
await telescope.runObservation(async () => {
|
|
147
149
|
await agent.onFatalError(reqToCallInfo(req), req.body?.error ?? 'Fatal error');
|
|
148
150
|
res.status(200);
|
|
149
|
-
}, { conversationId: req.callId, agentId: agent.name });
|
|
151
|
+
}, { conversationId: req.callId, agentId: agent.name, variantId });
|
|
150
152
|
});
|
|
151
153
|
app.all('/chat/completions', async (req, res) => {
|
|
152
154
|
logger.setGlobalId(req.callId);
|
|
153
155
|
logger.debug('agent-service, /chat/completions');
|
|
154
|
-
let
|
|
156
|
+
let resolved;
|
|
155
157
|
try {
|
|
156
|
-
|
|
158
|
+
resolved = await getAgent(req);
|
|
157
159
|
}
|
|
158
160
|
catch (err) {
|
|
159
161
|
return fail(res, 400, String(err), err);
|
|
160
162
|
}
|
|
163
|
+
const { agent, variantId } = resolved;
|
|
161
164
|
return telescope.runObservation(async () => llmCompletionHandler(agent, telescope.getConversationalTracer(), headersToMeta, req, res), {
|
|
162
165
|
conversationId: req.callId,
|
|
163
166
|
agentId: agent.name,
|
|
167
|
+
variantId,
|
|
164
168
|
});
|
|
165
169
|
});
|
|
166
170
|
app.post('/on-agent-speech-done', async (req, res) => {
|
|
167
171
|
logger.setGlobalId(req.callId);
|
|
168
|
-
const agent = await getAgent(req);
|
|
172
|
+
const { agent, variantId } = await getAgent(req);
|
|
169
173
|
return telescope.runObservation(async () => {
|
|
170
174
|
await agent.onAgentSpeechDone(mapFromOpenAiMessages(req.body.messages), reqToCallInfo(req));
|
|
171
175
|
}, {
|
|
172
176
|
conversationId: req.callId,
|
|
173
177
|
agentId: agent.name,
|
|
178
|
+
variantId,
|
|
174
179
|
});
|
|
175
180
|
});
|
|
176
181
|
app.post('/latency-event', async (req, res) => {
|
|
@@ -245,7 +250,7 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
|
|
|
245
250
|
const requests = [...activeRequests];
|
|
246
251
|
activeRequests.clear();
|
|
247
252
|
const notify = Promise.allSettled(requests.map(async (res) => {
|
|
248
|
-
const agent = await getAgent(res.request);
|
|
253
|
+
const { agent } = await getAgent(res.request);
|
|
249
254
|
await agent.onFatalError(reqToCallInfo(res.request), message);
|
|
250
255
|
fail(res, 500, `${label}: ${message}`);
|
|
251
256
|
}));
|
|
@@ -284,16 +289,9 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
|
|
|
284
289
|
started = true;
|
|
285
290
|
await prewarmDNS();
|
|
286
291
|
}
|
|
287
|
-
const
|
|
292
|
+
const resolver = createVoiceRouteResolver({ getVoiceAgent, allocations, logger });
|
|
288
293
|
function getAgent(req) {
|
|
289
|
-
|
|
290
|
-
if (!agent) {
|
|
291
|
-
logger.debug('Loading agent', { agentName: req.agentName });
|
|
292
|
-
agent = getVoiceAgent(req.agentName);
|
|
293
|
-
agents.set(req.agentName, agent);
|
|
294
|
-
agent.catch(() => agents.delete(req.agentName));
|
|
295
|
-
}
|
|
296
|
-
return agent;
|
|
294
|
+
return resolver.resolve(req.agentName, req.callId);
|
|
297
295
|
}
|
|
298
296
|
async function prewarmDNS() {
|
|
299
297
|
const dnsLookup = promisify(dns.lookup);
|
|
@@ -307,7 +305,7 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
|
|
|
307
305
|
}
|
|
308
306
|
}
|
|
309
307
|
}
|
|
310
|
-
async function createTelescopeConversation(req) {
|
|
308
|
+
async function createTelescopeConversation(req, variantId) {
|
|
311
309
|
const conversationId = req.callId;
|
|
312
310
|
if (!conversationId) {
|
|
313
311
|
logger.error('No call ID provided, cannot create Telescope conversation');
|
|
@@ -319,6 +317,7 @@ export function voiceHttpConnect({ getVoiceAgent, telescope, onStart, hostsToPre
|
|
|
319
317
|
conversationId,
|
|
320
318
|
medium: 'phone',
|
|
321
319
|
agentId: req.agentName || undefined,
|
|
320
|
+
variantId,
|
|
322
321
|
region,
|
|
323
322
|
phoneNumber: phoneNumber ?? req.phoneNumber,
|
|
324
323
|
createdAt: Date.now(),
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@recombine-ai/platform",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.8.0
|
|
4
|
+
"version": "0.8.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",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|