@recombine-ai/platform 0.8.0-test.2 → 0.8.1
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/BTw6JswM.js +1 -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/{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/CBW06aCF.js +1 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CBW06aCF.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CBW06aCF.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/{Diqx_kju.js → CXS28GEZ.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CXS28GEZ.js.br +1 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CXS28GEZ.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/DzqCKWaI.js +3 -0
- 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 +1 -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/{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/entry/{app.DYrvpbQq.js → app.DaDBScXg.js} +2 -2
- 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 +1 -0
- 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.DXIuJQso.js → 0._S0yln6w.js} +1 -1
- 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.CsX5iplT.js → 1.BSNKOkyF.js} +1 -1
- 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 +35 -0
- 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.BIO8m3DR.js → 17.Bn1yI4kt.js} +1 -1
- 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 +11 -0
- 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 +35 -0
- 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 +1 -0
- 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.BzhaMuo5.js → 4.3i9fJNn9.js} +1 -1
- 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.BG8ylHWg.js → 5.C2R3wdz0.js} +1 -1
- 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.DkDEANSN.js → 6.CarWVMPM.js} +1 -1
- 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.3fEbISY6.js → 8.joumIYrl.js} +1 -1
- 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 +2 -0
- 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/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-ChM9druZ.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-B7oaNMJQ.js.map → internal.js-ChM9druZ.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-UAHBCAaS.js} +62 -10
- package/build/bosun-app/frontend/server/chunks/entries/pages/traces/conversations/_layout.svelte.js-UAHBCAaS.js.map +1 -0
- package/build/bosun-app/frontend/server/chunks/{handler-D9QLNo8w.js → handler-KSixAuP8.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/{handler-D9QLNo8w.js.map → handler-KSixAuP8.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/{index.js-B0gyG8Jr.js → index.js-xzEg77OG.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/{index.js-B0gyG8Jr.js.map → index.js-xzEg77OG.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/{manifest.js-BJwjpIJ3.js → manifest.js-BW4X3pHs.js} +14 -14
- package/build/bosun-app/frontend/server/chunks/{manifest.js-BJwjpIJ3.js.map → manifest.js-BW4X3pHs.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{0.js-CzIAnGix.js → 0.js-B1rx1DOM.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{0.js-CzIAnGix.js.map → 0.js-B1rx1DOM.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{1.js-dcMNeOrp.js → 1.js-h7GlMehw.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{1.js-dcMNeOrp.js.map → 1.js-h7GlMehw.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{10.js-BJiZIzMv.js → 10.js-C6xRYZtL.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{10.js-BJiZIzMv.js.map → 10.js-C6xRYZtL.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{17.js-D2Tp888g.js → 17.js-CavP10f9.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{17.js-D2Tp888g.js.map → 17.js-CavP10f9.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{18.js-u_njdfH1.js → 18.js-DC7Bv1j_.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{18.js-u_njdfH1.js.map → 18.js-DC7Bv1j_.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{2.js-CmkWii-m.js → 2.js-BhiMP7Sz.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{2.js-CmkWii-m.js.map → 2.js-BhiMP7Sz.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{3.js-CEcqDZwI.js → 3.js-C7zctWo-.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{3.js-CEcqDZwI.js.map → 3.js-C7zctWo-.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{4.js-DoWmHMTv.js → 4.js-5G8VLxJe.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{4.js-DoWmHMTv.js.map → 4.js-5G8VLxJe.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{5.js-hFh1mvzS.js → 5.js-HO1CExm6.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{5.js-hFh1mvzS.js.map → 5.js-HO1CExm6.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{6.js-C9qNqJg2.js → 6.js-CDW8tRHL.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{6.js-C9qNqJg2.js.map → 6.js-CDW8tRHL.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{8.js-Btfm0qj5.js → 8.js-BjO10Jpo.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{8.js-Btfm0qj5.js.map → 8.js-BjO10Jpo.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{9.js-Ca7GzK3u.js → 9.js-Csa_leV9.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/nodes/{9.js-Ca7GzK3u.js.map → 9.js-Csa_leV9.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 +0 -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 +0 -1
- 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 +0 -1
- 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.
|
|
4
|
+
"version": "0.8.1",
|
|
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 +0,0 @@
|
|
|
1
|
-
import{T as tt,h as fe,bx as ue}from"./CR-uVjxM.js";import{w as de}from"./DNvczHUR.js";import{H as kt,S as St,R as xt}from"./-UyI9lYi.js";import{r as ft,o as Bt,H as j,N as F,n as T,i as Rt,b as L,s as $,a as wt,f as Vt,g as vt,c as et,d as mt,S as Lt,P as Yt,p as R,e as he,m as pe,h as me,u as zt,j as ge,k as Nt,l as B,q as _e,t as Gt,v as we,w as ve,x as Wt}from"./Bwiy-Sk7.js";import"./B0XwC4Ot.js";const ye=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/,be=/^\/\((?:[^)]+)\)$/;function Ee(t){const n=[];return{pattern:t==="/"||be.test(t)?/^\/$/:new RegExp(`^${Se(t).map(o=>{const a=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(o);if(a)return n.push({name:a[1],matcher:a[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const s=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(o);if(s)return n.push({name:s[1],matcher:s[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!o)return;const r=o.split(/\[(.+?)\](?!\])/);return"/"+r.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return gt(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return gt(String.fromCharCode(...l.slice(2).split("-").map(f=>parseInt(f,16))));const u=ye.exec(l),[,p,_,d,m]=u;return n.push({name:d,matcher:m,optional:!!p,rest:!!_,chained:_?c===1&&r[0]==="":!1}),_?"([^]*?)":p?"([^/]*)?":"([^/]+?)"}return gt(l)}).join("")}).join("")}/?$`),params:n}}function ke(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function Se(t){return t.slice(1).split("/").filter(ke)}function xe(t,n,e){const o={},a=t.slice(1),s=a.filter(i=>i!==void 0);let r=0;for(let i=0;i<n.length;i+=1){const l=n[i];let c=a[i-r];if(l.chained&&l.rest&&r&&(c=a.slice(i-r,i+1).filter(u=>u).join("/"),r=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||e[l.matcher](c)){o[l.name]=c;const u=n[i+1],p=a[i+1];u&&!u.rest&&u.optional&&p&&l.chained&&(r=0),!u&&!p&&Object.keys(o).length===s.length&&(r=0);continue}if(l.optional&&l.chained){r++;continue}return}if(!r)return o}function gt(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Re({nodes:t,server_loads:n,dictionary:e,matchers:o}){const a=new Set(n);return Object.entries(e).map(([i,[l,c,u]])=>{const{pattern:p,params:_}=Ee(i),d={id:i,exec:m=>{const f=p.exec(m);if(f)return xe(f,_,o)},errors:[1,...u||[]].map(m=>t[m]),layouts:[0,...c||[]].map(r),leaf:s(l)};return d.errors.length=d.layouts.length=Math.max(d.errors.length,d.layouts.length),d});function s(i){const l=i<0;return l&&(i=~i),[l,t[i]]}function r(i){return i===void 0?i:[a.has(i),t[i]]}}function Jt(t,n=JSON.parse){try{return n(sessionStorage[t])}catch{}}function Dt(t,n,e=JSON.stringify){const o=e(n);try{sessionStorage[t]=o}catch{}}function Le(t){return t.filter(n=>n!=null)}function Q(t,n){return t+"/"+n}function Pt(t){return t instanceof kt||t instanceof St?t.status:500}function Pe(t){return t instanceof St?t.text:"Internal Error"}const qt={spanContext(){return Ae},setAttribute(){return this},setAttributes(){return this},addEvent(){return this},setStatus(){return this},updateName(){return this},end(){return this},isRecording(){return!1},recordException(){return this},addLink(){return this},addLinks(){return this}},Ae={traceId:"",spanId:"",traceFlags:0},Ue=fe??(t=>t()),Te=new Set(["icon","shortcut icon","apple-touch-icon"]);let V=null;const C=Jt(Wt)??{},G=Jt(Gt)??{},I={url:Nt({}),page:Nt({}),navigating:de(null),updated:ge()};function At(t){C[t]=$()}function Ie(t,n){let e=t+1;for(;C[e];)delete C[e],e+=1;for(e=n+1;G[e];)delete G[e],e+=1}function W(t,n=!1){return n?location.replace(t.href):location.href=t.href,new Promise(T)}async function Xt(){if("serviceWorker"in navigator){const t=await navigator.serviceWorker.getRegistration(L||"/");t&&await t.update()}}let Ut,yt,nt,P,bt,b;const at=[],rt=[];let v=null;function ot(){var t;(t=v==null?void 0:v.fork)==null||t.then(n=>n==null?void 0:n.discard()),v=null,D={element:void 0,href:void 0}}const Z=new Map,Qt=new Set,Ce=new Set,z=new Set;let w={branch:[],error:null,url:null},Zt=!1,it=!1,Ft=!0,J=!1,Y=!1,te=!1,Tt=!1,It,E,x,U;const st=new Set,Ht=new Map,Kt=new Map;async function tn(t,n,e){var s,r,i,l;if(globalThis.__sveltekit_1vdanf5.data){const{q:c={},p:u={},l:p={},f:_={}}=globalThis.__sveltekit_1vdanf5.data;for(const d in c)c[d];for(const d in p)p[d];for(const d in _)_[d];for(const d in u)u[d]}document.URL!==location.href&&(location.href=location.href),b=t,await((r=(s=t.hooks).init)==null?void 0:r.call(s)),Ut=Re(t),P=document.documentElement,bt=n,yt=t.nodes[0],nt=t.nodes[1],yt(),nt(),E=(i=history.state)==null?void 0:i[j],x=(l=history.state)==null?void 0:l[F],E||(E=x=Date.now(),history.replaceState({...history.state,[j]:E,[F]:x},""));const o=C[E];function a(){o&&(history.scrollRestoration="manual",scrollTo(o.x,o.y))}e?(a(),await Ve(bt,e)):(await q({type:"enter",url:ft(b.hash?Ge(new URL(location.href)):location.href),replace_state:!0}),a()),Be()}function Oe(){at.length=0,Tt=!1}function ee(t){rt.some(n=>n==null?void 0:n.snapshot)&&(G[t]=rt.map(n=>{var e;return(e=n==null?void 0:n.snapshot)==null?void 0:e.capture()}))}function ne(t){var n;(n=G[t])==null||n.forEach((e,o)=>{var a,s;(s=(a=rt[o])==null?void 0:a.snapshot)==null||s.restore(e)})}function Mt(){At(E),Dt(Wt,C),ee(x),Dt(Gt,G)}async function ae(t,n,e,o){let a,s;n.invalidateAll&&ot(),await q({type:"goto",url:ft(t),keepfocus:n.keepFocus,noscroll:n.noScroll,replace_state:n.replaceState,state:n.state,redirect_count:e,nav_token:o,accept:()=>{var r;if(n.invalidateAll){Tt=!0,a=new Set;for(const[i,l]of Ht)for(const[c,u]of l)(r=u.resource)==null||r.reset(),a.add(Q(i,c));s=new Set;for(const[i,l]of Kt)for(const c of l.keys())s.add(Q(i,c))}n.invalidate&&n.invalidate.forEach(Me)}}),n.invalidateAll&&tt().then(tt).then(()=>{for(const[r,i]of Ht)for(const[l,{resource:c}]of i)a!=null&&a.has(Q(r,l))&&c.start();for(const[r,i]of Kt)for(const[l,{resource:c}]of i)s!=null&&s.has(Q(r,l))&&c.reconnect()})}async function je(t){if(t.id!==(v==null?void 0:v.id)){ot();const n={};st.add(n),v={id:t.id,token:n,promise:ie({...t,preload:n}).then(e=>(st.delete(n),e.type==="loaded"&&e.state.error&&ot(),e)),fork:null}}return v.promise}async function _t(t){var e;const n=(e=await ut(t,!1))==null?void 0:e.route;n&&await Promise.all([...n.layouts,n.leaf].filter(Boolean).map(o=>o[1]()))}async function re(t,n,e){var a;const o={params:w.params,route:{id:((a=w.route)==null?void 0:a.id)??null},url:new URL(location.href)};if(w={...t.state,nav:o},zt(t.props.page),It=new b.root({target:n,props:{...t.props,stores:I,components:rt},hydrate:e,sync:!1,transformError:void 0}),await Promise.resolve(),e){const s={from:null,to:{...o,scroll:C[E]??$()},willUnload:!1,type:"enter",complete:Promise.resolve()};z.forEach(r=>r(s))}ne(x),it=!0}async function lt({url:t,params:n,branch:e,errors:o,status:a,error:s,route:r,form:i}){let l="never";if(L&&(t.pathname===L||t.pathname===L+"/"))l="always";else for(const m of e)(m==null?void 0:m.slash)!==void 0&&(l=m.slash);t.pathname=me(t.pathname,l),t.search=t.search;const c={type:"loaded",state:{url:t,params:n,branch:e,error:s,route:r},props:{constructors:Le(e).map(m=>m.node.component),page:dt(R)}};i!==void 0&&(c.props.form=i);let u={},p=!R,_=0;for(let m=0;m<Math.max(e.length,w.branch.length);m+=1){const f=e[m],h=w.branch[m];(f==null?void 0:f.data)!==(h==null?void 0:h.data)&&(p=!0),f&&(u={...u,...f.data},p&&(c.props[`data_${_}`]=u),_+=1)}return(!w.url||t.href!==w.url.href||w.error!==s||i!==void 0&&i!==R.form||p)&&(c.props.page={error:s,params:n,route:{id:(r==null?void 0:r.id)??null},state:{},status:a,url:new URL(t),form:i??null,data:p?u:R.data}),c}async function Ct({loader:t,parent:n,url:e,params:o,route:a,server_data_node:s}){var u,p,_;let r=null,i=!0;const l={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},c=await t();if((u=c.universal)!=null&&u.load){let d=function(...f){for(const h of f){const{href:g}=new URL(h,e);l.dependencies.add(g)}};const m={tracing:{enabled:!1,root:qt,current:qt},route:new Proxy(a,{get:(f,h)=>(i&&(l.route=!0),f[h])}),params:new Proxy(o,{get:(f,h)=>(i&&l.params.add(h),f[h])}),data:(s==null?void 0:s.data)??null,url:pe(e,()=>{i&&(l.url=!0)},f=>{i&&l.search_params.add(f)},b.hash),async fetch(f,h){f instanceof Request&&(h={body:f.method==="GET"||f.method==="HEAD"?void 0:await f.blob(),cache:f.cache,credentials:f.credentials,headers:[...f.headers].length>0?f==null?void 0:f.headers:void 0,integrity:f.integrity,keepalive:f.keepalive,method:f.method,mode:f.mode,redirect:f.redirect,referrer:f.referrer,referrerPolicy:f.referrerPolicy,signal:f.signal,...h});const{resolved:g,promise:y}=oe(f,h,e);return i&&d(g.href),y},setHeaders:T,depends:d,parent(){return i&&(l.parent=!0),n()},untrack(f){i=!1;try{return f()}finally{i=!0}}};r=await c.universal.load.call(null,m)??null}return{node:c,loader:t,server:s,universal:(p=c.universal)!=null&&p.load?{type:"data",data:r,uses:l}:null,data:r??(s==null?void 0:s.data)??null,slash:((_=c.universal)==null?void 0:_.trailingSlash)??(s==null?void 0:s.slash)}}function oe(t,n,e){let o=t instanceof Request?t.url:t;const a=new URL(o,e);a.origin===e.origin&&(o=a.href.slice(e.origin.length));const s=it?we(o,a.href,n):ve(o,n);return{resolved:a,promise:s}}function $e(t,n,e,o,a,s){if(Tt)return!0;if(!a)return!1;if(a.parent&&t||a.route&&n||a.url&&e)return!0;for(const r of a.search_params)if(o.has(r))return!0;for(const r of a.params)if(s[r]!==w.params[r])return!0;for(const r of a.dependencies)if(at.some(i=>i(new URL(r))))return!0;return!1}function Ot(t,n){return(t==null?void 0:t.type)==="data"?t:(t==null?void 0:t.type)==="skip"?n??null:null}function Ne(t,n){if(!t)return new Set(n.searchParams.keys());const e=new Set([...t.searchParams.keys(),...n.searchParams.keys()]);for(const o of e){const a=t.searchParams.getAll(o),s=n.searchParams.getAll(o);a.every(r=>s.includes(r))&&s.every(r=>a.includes(r))&&e.delete(o)}return e}function De({error:t,url:n,route:e,params:o}){return{type:"loaded",state:{error:t,url:n,route:e,params:o,branch:[]},props:{page:dt(R),constructors:[]}}}async function ie({id:t,invalidating:n,url:e,params:o,route:a,preload:s}){if((v==null?void 0:v.id)===t)return st.delete(v.token),v.promise;const{errors:r,layouts:i,leaf:l}=a,c=[...i,l];r.forEach(h=>h==null?void 0:h().catch(T)),c.forEach(h=>h==null?void 0:h[1]().catch(T));const u=w.url?t!==ct(w.url):!1,p=w.route?a.id!==w.route.id:!1,_=Ne(w.url,e);let d=!1;const m=c.map(async(h,g)=>{var A;if(!h)return;const y=w.branch[g];return h[1]===(y==null?void 0:y.loader)&&!$e(d,p,u,_,(A=y.universal)==null?void 0:A.uses,o)?y:(d=!0,Ct({loader:h[1],url:e,params:o,route:a,parent:async()=>{var X;const O={};for(let N=0;N<g;N+=1)Object.assign(O,(X=await m[N])==null?void 0:X.data);return O},server_data_node:Ot(h[0]?{type:"skip"}:null,h[0]?y==null?void 0:y.server:void 0)}))});for(const h of m)h.catch(T);const f=[];for(let h=0;h<c.length;h+=1)if(c[h])try{f.push(await m[h])}catch(g){if(g instanceof xt)return{type:"redirect",location:g.location};if(s&&st.has(s))return De({error:await H(g,{params:o,url:e,route:{id:a.id}}),url:e,params:o,route:a});let y=Pt(g),S;if(g instanceof kt)S=g.body;else{if(await I.updated.check())return await Xt(),await W(e);S=await H(g,{params:o,url:e,route:{id:a.id}})}const A=await qe(h,f,r);return A?lt({url:e,params:o,branch:f.slice(0,A.idx).concat(A.node),errors:r,status:y,error:S,route:a}):await le(e,{id:a.id},S,y)}else f.push(void 0);return lt({url:e,params:o,branch:f,errors:r,status:200,error:null,route:a,form:n?void 0:null})}async function qe(t,n,e){for(;t--;)if(e[t]){let o=t;for(;!n[o];)o-=1;try{return{idx:o+1,node:{node:await e[t](),loader:e[t],data:{},server:null,universal:null}}}catch{continue}}}async function jt({status:t,error:n,url:e,route:o}){const a={};let s=null;try{const r=await Ct({loader:yt,url:e,params:a,route:o,parent:()=>Promise.resolve({}),server_data_node:Ot(s)}),i={node:await nt(),loader:nt,universal:null,server:null,data:null};return lt({url:e,params:a,branch:[r,i],status:t,error:n,errors:[],route:null})}catch(r){if(r instanceof xt){await ae(new URL(r.location,location.href),{},0);return}const i=await b.get_error_template(),l=await H(r,{url:e,params:a,route:o}),c=String((l==null?void 0:l.message)??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),u=i({status:t,message:c}),p=new DOMParser().parseFromString(u,"text/html");throw document.documentElement.replaceChild(document.adoptNode(p.head),document.head),document.documentElement.replaceChild(document.adoptNode(p.body),document.body),r}}async function Fe(t){const n=t.href;if(Z.has(n))return Z.get(n);let e;try{const o=(async()=>{let a=await b.hooks.reroute({url:new URL(t),fetch:async(s,r)=>oe(s,r,t).promise})??t;if(typeof a=="string"){const s=new URL(t);b.hash?s.hash=a:s.pathname=a,a=s}return a})();Z.set(n,o),e=await o}catch{Z.delete(n);return}return e}async function ut(t,n){if(t&&!Rt(t,L,b.hash)){const e=await Fe(t);if(!e)return;const o=He(e);for(const a of Ut){const s=a.exec(o);if(s)return{id:ct(t),invalidating:n,route:a,params:he(s),url:t}}}}function He(t){return _e(b.hash?t.hash.replace(/^#/,"").replace(/[?#].+/,""):t.pathname.slice(L.length))||"/"}function ct(t){return(b.hash?t.hash.replace(/^#/,""):t.pathname)+t.search}function se({url:t,type:n,intent:e,delta:o,event:a,scroll:s}){let r=!1;const i=$t(w,e,t,n,s??null);o!==void 0&&(i.navigation.delta=o),a!==void 0&&(i.navigation.event=a);const l={...i.navigation,cancel:()=>{r=!0,i.reject(new Error("navigation cancelled"))}};return J||Qt.forEach(c=>c(l)),r?null:i}async function q({type:t,url:n,popped:e,keepfocus:o,noscroll:a,replace_state:s,state:r={},redirect_count:i=0,nav_token:l={},accept:c=T,block:u=T,event:p}){var N;const _=U;U=l;const d=await ut(n,!1),m=t==="enter"?$t(w,d,n,t):se({url:n,type:t,delta:e==null?void 0:e.delta,intent:d,scroll:e==null?void 0:e.scroll,event:p});if(!m){u(),U===l&&(U=_);return}const f=E,h=x;c(),J=!0,it&&m.navigation.type!=="enter"&&I.navigating.set(wt.current=m.navigation);let g=d&&await ie(d);if(!g){if(Rt(n,L,b.hash))return await W(n,s);g=await le(n,{id:null},await H(new St(404,"Not Found",`Not found: ${n.pathname}`),{url:n,params:{},route:{id:null}}),404,s)}if(n=(d==null?void 0:d.url)||n,U!==l){m.reject(new Error("navigation aborted"));return}if(!g)return;if(g.type==="redirect"){if(i<20){await q({type:t,url:new URL(g.location,n),popped:e,keepfocus:o,noscroll:a,replace_state:s,state:r,redirect_count:i+1,nav_token:l}),m.fulfil(void 0);return}if(g=await jt({status:500,error:await H(new Error("Redirect loop"),{url:n,params:{},route:{id:null}}),url:n,route:{id:null}}),!g)return}else if(g.props.page.status>=400&&await I.updated.check())return await Xt(),await W(n,s);if(Oe(),At(f),ee(h),g.props.page.url.pathname!==n.pathname&&(n.pathname=g.props.page.url.pathname),r=e?e.state:r,!e){const k=s?0:1,K={[j]:E+=k,[F]:x+=k,[Lt]:r};(s?history.replaceState:history.pushState).call(history,K,"",n),s||Ie(E,x)}const y=d&&(v==null?void 0:v.id)===d.id?v.fork:null;v!=null&&v.fork&&!y?ot():(v=null,D={element:void 0,href:void 0}),g.props.page.state=r;let S;if(it){const k=(await Promise.all(Array.from(Ce,M=>M(m.navigation)))).filter(M=>typeof M=="function");if(k.length>0){let M=function(){k.forEach(pt=>{z.delete(pt)})};k.push(M),k.forEach(pt=>{z.add(pt)})}const K=m.navigation.to;w={...g.state,nav:{params:K.params,route:K.route,url:K.url}},g.props.page&&(g.props.page.url=n),!o&&document.activeElement instanceof HTMLElement&&document.activeElement!==document.body&&document.activeElement.blur();const ht=y&&await y;ht?S=ht.commit():(V=null,It.$set(g.props),V&&Object.assign(g.props.page,V),zt(g.props.page),S=(N=ue)==null?void 0:N()),te=!0}else await re(g,bt,!1);const{activeElement:A}=document;if(await S,await tt(),await tt(),U!==l){m.reject(new Error("navigation aborted"));return}g.props.page&&V&&Object.assign(g.props.page,V);let O=null;if(Ft){const k=e?e.scroll:a?$():null;k?scrollTo(k.x,k.y):(O=n.hash&&document.getElementById(ce(n)))?O.scrollIntoView():scrollTo(0,0)}const X=document.activeElement!==A&&document.activeElement!==document.body;!o&&!X&&ze(n,!O),Ft=!0,J=!1,m.fulfil(void 0),m.navigation.to&&(m.navigation.to.scroll=$()),z.forEach(k=>k(m.navigation)),t==="popstate"&&ne(x),I.navigating.set(wt.current=null)}async function le(t,n,e,o,a){return t.origin===Bt&&t.pathname===location.pathname&&!Zt?await jt({status:o,error:e,url:t,route:n}):await W(t,a)}let D={element:void 0,href:void 0};function Ke(){let t,n;P.addEventListener("mousemove",r=>{const i=r.target;clearTimeout(t),t=setTimeout(()=>{a(i,B.hover)},20)});function e(r){r.defaultPrevented||a(r.composedPath()[0],B.tap)}P.addEventListener("mousedown",e),P.addEventListener("touchstart",e,{passive:!0});const o=new IntersectionObserver(r=>{for(const i of r)i.isIntersecting&&(_t(new URL(i.target.href)),o.unobserve(i.target))},{threshold:0});async function a(r,i){const l=Vt(r,P),c=l===D.element&&(l==null?void 0:l.href)===D.href&&i>=n;if(!l||c)return;const{url:u,external:p,download:_}=vt(l,L,b.hash);if(p||_)return;const d=et(l),m=u&&ct(w.url)===ct(u);if(!(d.reload||m))if(i<=d.preload_data){D={element:l,href:l.href},n=B.tap;const f=await ut(u,!1);if(!f)return;je(f)}else i<=d.preload_code&&(D={element:l,href:l.href},n=i,_t(u))}function s(){o.disconnect();for(const r of P.querySelectorAll("a")){const{url:i,external:l,download:c}=vt(r,L,b.hash);if(l||c)continue;const u=et(r);u.reload||(u.preload_code===B.viewport&&o.observe(r),u.preload_code===B.eager&&_t(i))}}z.add(s),s()}function H(t,n){if(t instanceof kt)return t.body;const e=Pt(t),o=Pe(t);return b.hooks.handleError({error:t,event:n,status:e,message:o})??{message:o}}function en(t,n={}){return t=new URL(ft(t)),t.origin!==Bt?Promise.reject(new Error("goto: invalid URL")):ae(t,n,0)}function Me(t){if(typeof t=="function")at.push(t);else{const{href:n}=new URL(t,location.href);at.push(e=>e.href===n)}}function nn(t,n){const e={[j]:E,[F]:x,[Yt]:R.url.href,[Lt]:n};history.replaceState(e,"",ft(t)),R.state=n,It.$set({page:Ue(()=>dt(R))})}function Be(){var n;history.scrollRestoration="manual",addEventListener("beforeunload",e=>{let o=!1;if(Mt(),!J){const a=$t(w,void 0,null,"leave"),s={...a.navigation,cancel:()=>{o=!0,a.reject(new Error("navigation cancelled"))}};Qt.forEach(r=>r(s))}o?(e.preventDefault(),e.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&Mt()}),(n=navigator.connection)!=null&&n.saveData||Ke(),P.addEventListener("click",async e=>{if(e.button||e.which!==1||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||e.defaultPrevented)return;const o=Vt(e.composedPath()[0],P);if(!o)return;const{url:a,external:s,target:r,download:i}=vt(o,L,b.hash);if(!a)return;if(r==="_parent"||r==="_top"){if(window.parent!==window)return}else if(r&&r!=="_self")return;const l=et(o);if(!(o instanceof SVGAElement)&&a.protocol!==location.protocol&&!(a.protocol==="https:"||a.protocol==="http:")||i)return;const[u,p]=(b.hash?a.hash.replace(/^#/,""):a.href).split("#"),_=u===mt(location);if(s||l.reload&&(!_||!p)){se({url:a,type:"link",event:e})?J=!0:e.preventDefault();return}if(p!==void 0&&_){const[,d]=w.url.href.split("#");if(d===p){if(e.preventDefault(),p===""||p==="top"&&o.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const m=o.ownerDocument.getElementById(decodeURIComponent(p));m&&(m.scrollIntoView(),m.focus())}return}if(Y=!0,At(E),t(a),!l.replace_state)return;Y=!1}e.preventDefault(),await new Promise(d=>{requestAnimationFrame(()=>{setTimeout(d,0)}),setTimeout(d,100)}),await q({type:"link",url:a,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??a.href===location.href,event:e})}),P.addEventListener("submit",e=>{if(e.defaultPrevented)return;const o=HTMLFormElement.prototype.cloneNode.call(e.target),a=e.submitter;if(((a==null?void 0:a.formTarget)||o.target)==="_blank"||((a==null?void 0:a.formMethod)||o.method)!=="get")return;const i=new URL((a==null?void 0:a.hasAttribute("formaction"))&&(a==null?void 0:a.formAction)||o.action);if(Rt(i,L,!1))return;const l=e.target,c=et(l);if(c.reload)return;e.preventDefault(),e.stopPropagation();const u=new FormData(l,a);i.search=new URLSearchParams(u).toString(),q({type:"form",url:i,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??i.href===location.href,event:e})}),addEventListener("popstate",async e=>{var o;if(!Et){if((o=e.state)!=null&&o[j]){const a=e.state[j];if(U={},a===E)return;const s=C[a],r=e.state[Lt]??{},i=new URL(e.state[Yt]??location.href),l=e.state[F],c=w.url?mt(location)===mt(w.url):!1;if(l===x&&(te||c)){r!==R.state&&(R.state=r),t(i),C[E]=$(),s&&scrollTo(s.x,s.y),E=a;return}const p=a-E;await q({type:"popstate",url:i,popped:{state:r,scroll:s,delta:p},accept:()=>{E=a,x=l},block:()=>{history.go(-p)},nav_token:U,event:e})}else if(!Y){const a=new URL(location.href);t(a),b.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Y&&(Y=!1,history.replaceState({...history.state,[j]:++E,[F]:x},"",location.href))});for(const e of document.querySelectorAll("link"))Te.has(e.rel)&&(e.href=e.href);addEventListener("pageshow",e=>{e.persisted&&I.navigating.set(wt.current=null)});function t(e){w.url=R.url=e,I.page.set(dt(R)),I.page.notify()}}async function Ve(t,{status:n=200,error:e,node_ids:o,params:a,route:s,server_route:r,data:i,form:l}){Zt=!0;const c=new URL(location.href);let u;({params:a={},route:s={id:null}}=await ut(c,!1)||{}),u=Ut.find(({id:d})=>d===s.id);let p,_=!0;try{const d=o.map(async(f,h)=>{const g=i[h];return g!=null&&g.uses&&(g.uses=Ye(g.uses)),Ct({loader:b.nodes[f],url:c,params:a,route:s,parent:async()=>{const y={};for(let S=0;S<h;S+=1)Object.assign(y,(await d[S]).data);return y},server_data_node:Ot(g)})}),m=await Promise.all(d);if(u){const f=u.layouts;for(let h=0;h<f.length;h++)f[h]||m.splice(h,0,void 0)}p=await lt({url:c,params:a,branch:m,status:n,error:e,errors:u==null?void 0:u.errors,form:l,route:u??null})}catch(d){if(d instanceof xt)return await W(new URL(d.location,location.href));p=await jt({status:Pt(d),error:await H(d,{url:c,params:a,route:s}),url:c,route:s}),t.textContent="",_=!1}p&&(p.props.page&&(p.props.page.state={}),await re(p,t,_))}function Ye(t){return{dependencies:new Set((t==null?void 0:t.dependencies)??[]),params:new Set((t==null?void 0:t.params)??[]),parent:!!(t!=null&&t.parent),route:!!(t!=null&&t.route),url:!!(t!=null&&t.url),search_params:new Set((t==null?void 0:t.search_params)??[])}}let Et=!1;function ze(t,n=!0){const e=document.querySelector("[autofocus]");if(e)e.focus();else{const o=ce(t);if(o&&document.getElementById(o)){const{x:s,y:r}=$();setTimeout(()=>{const i=history.state;Et=!0,location.replace(new URL(`#${o}`,location.href)),history.replaceState(i,"",t),n&&scrollTo(s,r),Et=!1})}else{const s=document.body,r=s.getAttribute("tabindex");s.tabIndex=-1,s.focus({preventScroll:!0,focusVisible:!1}),r!==null?s.setAttribute("tabindex",r):s.removeAttribute("tabindex")}const a=getSelection();if(a&&a.type!=="None"){const s=[];for(let r=0;r<a.rangeCount;r+=1)s.push(a.getRangeAt(r));setTimeout(()=>{if(a.rangeCount===s.length){for(let r=0;r<a.rangeCount;r+=1){const i=s[r],l=a.getRangeAt(r);if(i.commonAncestorContainer!==l.commonAncestorContainer||i.startContainer!==l.startContainer||i.endContainer!==l.endContainer||i.startOffset!==l.startOffset||i.endOffset!==l.endOffset)return}a.removeAllRanges()}})}}}function $t(t,n,e,o,a=null){var c,u;let s,r;const i=new Promise((p,_)=>{s=p,r=_});return i.catch(T),{navigation:{from:{params:t.params,route:{id:((c=t.route)==null?void 0:c.id)??null},url:t.url,scroll:$()},to:e&&{params:(n==null?void 0:n.params)??null,route:{id:((u=n==null?void 0:n.route)==null?void 0:u.id)??null},url:e,scroll:a},willUnload:!n,type:o,complete:i},fulfil:s,reject:r}}function dt(t){return{data:t.data,error:t.error,form:t.form,params:t.params,route:t.route,state:t.state,status:t.status,url:t.url}}function Ge(t){const n=new URL(t);return n.hash=decodeURIComponent(t.hash),n}function ce(t){let n;if(b.hash){const[,,e]=t.hash.split("#",3);n=e??""}else n=t.hash.slice(1);return decodeURIComponent(n)}export{tn as a,en as g,nn as r,I as s};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|