@pagelines/sdk 1.0.757 → 1.0.759
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/dist/AgentProvider.js +234 -232
- package/dist/AgentProvider.js.map +1 -1
- package/dist/AgentWidgetModal.js +184 -29
- package/dist/AgentWidgetModal.js.map +1 -1
- package/dist/AgentWrap.js +819 -611
- package/dist/AgentWrap.js.map +1 -1
- package/dist/agent/AgentController.d.ts +80 -22
- package/dist/agent/index.d.ts +4 -2
- package/dist/agent/schema.d.ts +2 -17
- package/dist/agent/ui/AgentAvatar.vue.d.ts +2 -0
- package/dist/agent/ui/AgentChat.vue.d.ts +3 -0
- package/dist/agent/ui/ElCreateAgent.vue.d.ts +2 -0
- package/dist/agent/ui/{AgentModal.vue.d.ts → VoiceMode.vue.d.ts} +7 -10
- package/dist/agent/utils.d.ts +0 -4
- package/dist/agent/voice/provider.d.ts +28 -0
- package/dist/agent/voice/providers/elevenlabs/provider.d.ts +30 -0
- package/dist/agent/voice/providers/livekit/provider.d.ts +55 -0
- package/dist/agent/voice/voice-session-client.d.ts +44 -0
- package/dist/agent.js +173 -74
- package/dist/agent.js.map +1 -1
- package/dist/clients/ChatClient.d.ts +1 -9
- package/dist/contract.js +564 -490
- package/dist/contract.js.map +1 -1
- package/dist/demo/index.d.ts +1 -0
- package/dist/provider.js +40 -0
- package/dist/provider.js.map +1 -0
- package/dist/provider2.js +16451 -0
- package/dist/provider2.js.map +1 -0
- package/dist/provider3.js +18439 -0
- package/dist/provider3.js.map +1 -0
- package/dist/sdk.css +1 -1
- package/dist/sdkClient.d.ts +8 -0
- package/dist/sdkClient.js +37 -47
- package/dist/sdkClient.js.map +1 -1
- package/dist/widget/composables/useWidgetState.d.ts +3 -0
- package/dist/widget.js +23 -23
- package/package.json +3 -1
- package/dist/FModal.js +0 -165
- package/dist/FModal.js.map +0 -1
package/dist/agent.js
CHANGED
|
@@ -1,58 +1,18 @@
|
|
|
1
1
|
import "./rolldown-runtime.js";
|
|
2
|
-
import {
|
|
3
|
-
import { n as o,
|
|
4
|
-
import { t as
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
props: {
|
|
11
|
-
vis: {
|
|
12
|
-
type: Boolean,
|
|
13
|
-
default: !1
|
|
14
|
-
},
|
|
15
|
-
sdk: {},
|
|
16
|
-
agent: {},
|
|
17
|
-
handle: {},
|
|
18
|
-
context: {},
|
|
19
|
-
firstMessage: {}
|
|
20
|
-
},
|
|
21
|
-
emits: ["update:vis"],
|
|
22
|
-
setup(e, { emit: t }) {
|
|
23
|
-
let n = t;
|
|
24
|
-
return (t, r) => (y(), u(c, {
|
|
25
|
-
vis: e.vis,
|
|
26
|
-
"modal-class": "max-w-4xl p-0",
|
|
27
|
-
"style-class": "bg-transparent shadow-2xl rounded-2xl",
|
|
28
|
-
"has-close": !1,
|
|
29
|
-
"onUpdate:vis": r[1] || (r[1] = (e) => n("update:vis", e))
|
|
30
|
-
}, {
|
|
31
|
-
default: C(() => [p("div", w, [m(s, {
|
|
32
|
-
sdk: e.sdk,
|
|
33
|
-
agent: e.agent,
|
|
34
|
-
handle: e.handle,
|
|
35
|
-
context: e.context,
|
|
36
|
-
"first-message": e.firstMessage,
|
|
37
|
-
"has-close": !0,
|
|
38
|
-
onClose: r[0] || (r[0] = (e) => n("update:vis", !1))
|
|
39
|
-
}, null, 8, [
|
|
40
|
-
"sdk",
|
|
41
|
-
"agent",
|
|
42
|
-
"handle",
|
|
43
|
-
"context",
|
|
44
|
-
"first-message"
|
|
45
|
-
])])]),
|
|
46
|
-
_: 1
|
|
47
|
-
}, 8, ["vis"]));
|
|
48
|
-
}
|
|
49
|
-
}), E = {
|
|
2
|
+
import { c as e, s as t } from "./sdkClient.js";
|
|
3
|
+
import { f as n, i as r, m as i, n as a, p as o, r as s, t as c } from "./AgentWrap.js";
|
|
4
|
+
import { n as l, t as u } from "./AgentProvider.js";
|
|
5
|
+
import { t as d } from "./provider.js";
|
|
6
|
+
import { SettingsObject as f, zVoiceSessionMint as p } from "@pagelines/core";
|
|
7
|
+
import { Fragment as m, createBlock as h, createCommentVNode as g, createElementBlock as _, createElementVNode as v, createVNode as y, defineComponent as b, nextTick as x, normalizeClass as S, normalizeStyle as C, openBlock as w, ref as T, renderList as E, watch as D, withCtx as O } from "vue";
|
|
8
|
+
//#region agent/ui/AgentWidget.vue?vue&type=script&setup=true&lang.ts
|
|
9
|
+
var k = {
|
|
50
10
|
key: 0,
|
|
51
11
|
class: "relative h-full w-full"
|
|
52
|
-
},
|
|
12
|
+
}, A = { class: "group relative h-full w-full rounded-3xl overflow-hidden shadow-lg transition-all duration-300 ease-[cubic-bezier(0.25,1,0.33,1)] hover:shadow-2xl hover:translate-y-[-1px] hover:brightness-110 active:scale-[1.06] active:-translate-y-0.5 active:duration-100" }, j = ["src", "alt"], M = {
|
|
53
13
|
key: 0,
|
|
54
14
|
class: "absolute top-0.5 right-0.5"
|
|
55
|
-
},
|
|
15
|
+
}, N = /* @__PURE__ */ b({
|
|
56
16
|
__name: "AgentWidget",
|
|
57
17
|
props: {
|
|
58
18
|
sdk: {},
|
|
@@ -62,12 +22,12 @@ var w = { class: "relative w-full h-[80vh] md:h-[600px]" }, T = /* @__PURE__ */
|
|
|
62
22
|
position: {}
|
|
63
23
|
},
|
|
64
24
|
setup(e, { expose: t }) {
|
|
65
|
-
let n = e, r =
|
|
25
|
+
let n = e, r = T(!1), i = T(!1);
|
|
66
26
|
function toggle() {
|
|
67
27
|
r.value = !r.value;
|
|
68
28
|
}
|
|
69
|
-
|
|
70
|
-
e ? (await
|
|
29
|
+
D(r, async (e) => {
|
|
30
|
+
e ? (await x(), setTimeout(() => {
|
|
71
31
|
i.value = !0;
|
|
72
32
|
}, 400)) : i.value = !1;
|
|
73
33
|
});
|
|
@@ -84,32 +44,32 @@ var w = { class: "relative w-full h-[80vh] md:h-[600px]" }, T = /* @__PURE__ */
|
|
|
84
44
|
toggle,
|
|
85
45
|
open,
|
|
86
46
|
close
|
|
87
|
-
}), (t,
|
|
47
|
+
}), (t, a) => (w(), h(c, {
|
|
88
48
|
sdk: e.sdk,
|
|
89
49
|
handle: e.handle,
|
|
90
50
|
context: e.context,
|
|
91
51
|
"first-message": e.firstMessage
|
|
92
52
|
}, {
|
|
93
|
-
default:
|
|
53
|
+
default: O(({ agent: t, sdk: o }) => [t ? (w(), _("div", {
|
|
94
54
|
key: 0,
|
|
95
|
-
class:
|
|
96
|
-
}, [
|
|
97
|
-
class:
|
|
98
|
-
style:
|
|
99
|
-
onClick:
|
|
100
|
-
}, [r.value ?
|
|
55
|
+
class: S(["fixed z-[999999] pointer-events-auto", [n.position === "bottom-left" ? "bottom-6 left-6" : n.position === "top-right" ? "top-6 right-6" : n.position === "top-left" ? "top-6 left-6" : "bottom-6 right-6"]])
|
|
56
|
+
}, [v("div", {
|
|
57
|
+
class: S(["transition-all duration-500 ease-[cubic-bezier(0.25,1,0.33,1)] transform-gpu", [r.value ? "widget-expanded w-96 h-[600px] max-w-[calc(100vw-48px)] max-h-[calc(100vh-48px)] rounded-3xl opacity-100 scale-100" : "widget-button w-[80px] h-[80px] opacity-100 scale-100 flex items-center justify-center cursor-pointer"]]),
|
|
58
|
+
style: C({ "transform-origin": n.position === "bottom-left" ? "bottom left" : n.position === "top-right" ? "top right" : n.position === "top-left" ? "top left" : "bottom right" }),
|
|
59
|
+
onClick: a[0] || (a[0] = (e) => r.value ? void 0 : toggle())
|
|
60
|
+
}, [r.value ? g("", !0) : (w(), _("div", k, [v("div", A, [v("img", {
|
|
101
61
|
src: t.avatarUrl.value,
|
|
102
62
|
alt: `${t.displayName.value} assistant`,
|
|
103
63
|
class: "h-full w-full object-cover pointer-events-none",
|
|
104
64
|
width: "80",
|
|
105
65
|
height: "80"
|
|
106
|
-
}, null, 8,
|
|
66
|
+
}, null, 8, j), a[1] || (a[1] = v("div", { class: "absolute inset-0 pointer-events-none bg-gradient-to-br from-transparent via-black/10 to-black/40 opacity-60 transition-opacity duration-300 group-hover:opacity-40" }, null, -1))]), t.state.value.lifecycle === "running" ? (w(), _("div", M, [...a[2] || (a[2] = [v("div", {
|
|
107
67
|
class: "size-3 bg-green-500 rounded-full ring-2 ring-white absolute animate-ping",
|
|
108
68
|
style: { "animation-duration": "3s" }
|
|
109
|
-
}, null, -1),
|
|
69
|
+
}, null, -1), v("div", { class: "size-3 bg-green-500 rounded-full ring-2 ring-white" }, null, -1)])])) : g("", !0)])), r.value && t ? (w(), h(l, {
|
|
110
70
|
key: 1,
|
|
111
71
|
class: "rounded-3xl shadow-2xl border border-white/10",
|
|
112
|
-
sdk:
|
|
72
|
+
sdk: o,
|
|
113
73
|
agent: t,
|
|
114
74
|
context: e.context,
|
|
115
75
|
"first-message": e.firstMessage,
|
|
@@ -122,7 +82,7 @@ var w = { class: "relative w-full h-[80vh] md:h-[600px]" }, T = /* @__PURE__ */
|
|
|
122
82
|
"context",
|
|
123
83
|
"first-message",
|
|
124
84
|
"is-active"
|
|
125
|
-
])) :
|
|
85
|
+
])) : g("", !0)], 6)], 2)) : g("", !0)]),
|
|
126
86
|
_: 1
|
|
127
87
|
}, 8, [
|
|
128
88
|
"sdk",
|
|
@@ -131,28 +91,167 @@ var w = { class: "relative w-full h-[80vh] md:h-[600px]" }, T = /* @__PURE__ */
|
|
|
131
91
|
"first-message"
|
|
132
92
|
]));
|
|
133
93
|
}
|
|
134
|
-
}),
|
|
94
|
+
}), P = ["data-sender"], F = /* @__PURE__ */ b({
|
|
135
95
|
__name: "ElAgentChatPreview",
|
|
136
96
|
props: {
|
|
137
97
|
messages: {},
|
|
138
98
|
variant: {}
|
|
139
99
|
},
|
|
140
100
|
setup(e) {
|
|
141
|
-
return (t, n) => (
|
|
142
|
-
class:
|
|
101
|
+
return (t, n) => (w(), _("div", {
|
|
102
|
+
class: S(["@container/chat-preview flex flex-col gap-3", e.variant === "dark" ? "text-white" : "text-slate-950"]),
|
|
143
103
|
"data-test": "agent-chat-preview"
|
|
144
|
-
}, [(
|
|
104
|
+
}, [(w(!0), _(m, null, E(e.messages, (t, n) => (w(), _("div", {
|
|
145
105
|
key: `${t.sender}-${n}`,
|
|
146
|
-
class:
|
|
106
|
+
class: S(["flex", t.sender === "user" ? "justify-end" : "justify-start"]),
|
|
147
107
|
"data-test": "agent-chat-preview-message",
|
|
148
108
|
"data-sender": t.sender
|
|
149
|
-
}, [
|
|
109
|
+
}, [v("div", { class: S(["max-w-[88%] rounded-2xl px-4 py-3 text-sm shadow-sm @sm/chat-preview:max-w-[78%]", t.sender === "user" ? "bg-slate-950 text-white" : e.variant === "dark" ? "border border-white/10 bg-white/10 text-white" : "border border-slate-200 bg-white text-slate-950"]) }, [y(r, {
|
|
150
110
|
text: t.text,
|
|
151
111
|
inverted: t.sender === "user" || e.variant === "dark"
|
|
152
|
-
}, null, 8, ["text", "inverted"])], 2)], 10,
|
|
112
|
+
}, null, 8, ["text", "inverted"])], 2)], 10, P))), 128))], 2));
|
|
113
|
+
}
|
|
114
|
+
}), I = {
|
|
115
|
+
start: "/audio/start-call.mp3",
|
|
116
|
+
end: "/audio/end-call.mp3"
|
|
117
|
+
}, L = .7, R = 50;
|
|
118
|
+
function createBrowserVoiceChimePlayer() {
|
|
119
|
+
let e = {};
|
|
120
|
+
for (let t of ["start", "end"]) try {
|
|
121
|
+
let n = new Audio(I[t]);
|
|
122
|
+
n.preload = "auto", n.volume = L, e[t] = n;
|
|
123
|
+
} catch {}
|
|
124
|
+
return (t) => {
|
|
125
|
+
try {
|
|
126
|
+
let n = e[t];
|
|
127
|
+
if (!n) return;
|
|
128
|
+
n.currentTime = 0, n.play().catch(() => {});
|
|
129
|
+
} catch {}
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
var VoiceSessionClient = class extends f {
|
|
133
|
+
constructor(e) {
|
|
134
|
+
super("VoiceSessionClient", e), t(this, "state", T("idle")), t(this, "provider", void 0), t(this, "chime", void 0), t(this, "generation", 0), t(this, "levelTimer", void 0), this.chime = e.playChime ?? createBrowserVoiceChimePlayer();
|
|
135
|
+
}
|
|
136
|
+
async start() {
|
|
137
|
+
if (this.state.value !== "idle") return;
|
|
138
|
+
let e = ++this.generation;
|
|
139
|
+
this.setState("minting");
|
|
140
|
+
try {
|
|
141
|
+
let t = await this.mintSession(e);
|
|
142
|
+
if (!t || e !== this.generation) return;
|
|
143
|
+
this.setState("connecting"), await this.connect({
|
|
144
|
+
mint: t,
|
|
145
|
+
generation: e
|
|
146
|
+
});
|
|
147
|
+
} catch (t) {
|
|
148
|
+
if (e !== this.generation) return;
|
|
149
|
+
this.fail(this.toSessionError(t, "VOICE_MINT_FAILED"));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
end() {
|
|
153
|
+
if (this.state.value === "idle" || this.state.value === "ended") return;
|
|
154
|
+
let e = this.state.value === "live";
|
|
155
|
+
this.generation++, e && this.chime("end"), this.setState("ended"), this.teardown();
|
|
156
|
+
}
|
|
157
|
+
async connect(e) {
|
|
158
|
+
let { mint: t, generation: n } = e, r = await (this.settings.createProvider ?? d)(t);
|
|
159
|
+
if (n !== this.generation) {
|
|
160
|
+
await r.disconnect().catch(() => {});
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
this.provider = r;
|
|
164
|
+
try {
|
|
165
|
+
await r.connect({
|
|
166
|
+
onDisconnected: () => {
|
|
167
|
+
n !== this.generation || this.provider !== r || this.fail({
|
|
168
|
+
code: this.state.value === "live" ? "VOICE_CONNECTION_LOST" : "VOICE_CONNECT_FAILED",
|
|
169
|
+
message: this.state.value === "live" ? "The voice connection dropped." : "Could not open the voice connection."
|
|
170
|
+
});
|
|
171
|
+
},
|
|
172
|
+
onError: (e) => {
|
|
173
|
+
n === this.generation && this.provider === r && this.fail(e);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
} catch (e) {
|
|
177
|
+
if (n !== this.generation || this.provider !== r) return;
|
|
178
|
+
this.fail(this.toSessionError(e, "VOICE_CONNECT_FAILED"));
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
n !== this.generation || this.provider !== r || (this.startLevelTimer(r, n), this.setState("live"), this.chime("start"));
|
|
182
|
+
}
|
|
183
|
+
setState(e) {
|
|
184
|
+
this.state.value !== e && (this.state.value = e, this.settings.onStateChange?.(e));
|
|
185
|
+
}
|
|
186
|
+
fail(e) {
|
|
187
|
+
this.generation++, this.settings.onError?.(e), this.setState("ended"), this.teardown();
|
|
188
|
+
}
|
|
189
|
+
teardown() {
|
|
190
|
+
this.levelTimer !== void 0 && (clearInterval(this.levelTimer), this.levelTimer = void 0);
|
|
191
|
+
let e = this.provider;
|
|
192
|
+
this.provider = void 0, e && e.disconnect().catch(() => {}), this.settings.onLevel?.({
|
|
193
|
+
source: "playback",
|
|
194
|
+
level: 0
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
startLevelTimer(e, t) {
|
|
198
|
+
this.levelTimer === void 0 && (this.levelTimer = setInterval(() => {
|
|
199
|
+
if (t !== this.generation || this.provider !== e) return;
|
|
200
|
+
let n = e.sampleLevel();
|
|
201
|
+
n && this.settings.onLevel?.(n);
|
|
202
|
+
}, R));
|
|
203
|
+
}
|
|
204
|
+
authHeaders() {
|
|
205
|
+
return this.settings.token ? { Authorization: `Bearer ${this.settings.token}` } : {};
|
|
206
|
+
}
|
|
207
|
+
async post(t) {
|
|
208
|
+
let n = e(this.settings.apiBase, this.settings.isDev), r = await (this.settings.fetchFn ?? fetch)(`${n}${t.path}`, {
|
|
209
|
+
method: "POST",
|
|
210
|
+
headers: {
|
|
211
|
+
"Content-Type": "application/json",
|
|
212
|
+
...this.authHeaders()
|
|
213
|
+
},
|
|
214
|
+
credentials: "include",
|
|
215
|
+
body: JSON.stringify(t.body)
|
|
216
|
+
}), i = await r.json();
|
|
217
|
+
if (!r.ok || !i.ok) {
|
|
218
|
+
let e = i.ok ? `HTTP ${r.status}` : i.error, t = !i.ok && i.code ? i.code : "VOICE_MINT_FAILED";
|
|
219
|
+
throw Object.assign(Error(e || "Voice request failed."), { code: t });
|
|
220
|
+
}
|
|
221
|
+
return i.data;
|
|
222
|
+
}
|
|
223
|
+
async mintSession(e) {
|
|
224
|
+
let t = this.settings.conversationId;
|
|
225
|
+
if (!t && (t = (await this.post({
|
|
226
|
+
path: "/api/conversations",
|
|
227
|
+
body: {
|
|
228
|
+
orgId: this.settings.orgId,
|
|
229
|
+
participants: [{
|
|
230
|
+
type: "agent",
|
|
231
|
+
id: this.settings.agentId
|
|
232
|
+
}]
|
|
233
|
+
}
|
|
234
|
+
})).conversationId, e !== this.generation)) return null;
|
|
235
|
+
let n = await this.post({
|
|
236
|
+
path: "/api/voice/sessions",
|
|
237
|
+
body: { conversationId: t }
|
|
238
|
+
});
|
|
239
|
+
if (e !== this.generation) return null;
|
|
240
|
+
let r = p.safeParse(n);
|
|
241
|
+
if (!r.success) throw Object.assign(/* @__PURE__ */ Error("Voice session mint returned an unexpected shape."), { code: "VOICE_MINT_INVALID" });
|
|
242
|
+
return r.data;
|
|
243
|
+
}
|
|
244
|
+
toSessionError(e, t) {
|
|
245
|
+
return e instanceof Error ? {
|
|
246
|
+
code: "code" in e ? String(e.code) : t,
|
|
247
|
+
message: e.message
|
|
248
|
+
} : {
|
|
249
|
+
code: t,
|
|
250
|
+
message: "Voice session failed to start."
|
|
251
|
+
};
|
|
153
252
|
}
|
|
154
|
-
}
|
|
253
|
+
};
|
|
155
254
|
//#endregion
|
|
156
|
-
export {
|
|
255
|
+
export { o as AGENT_MODES, i as Agent, l as AgentChat, n as AgentChatController, n as AgentController, u as AgentProvider, N as AgentWidget, c as AgentWrap, a as ElAgentChat, F as ElAgentChatPreview, s as VoiceMode, VoiceSessionClient };
|
|
157
256
|
|
|
158
257
|
//# sourceMappingURL=agent.js.map
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","names":[],"sources":["../agent/ui/AgentModal.vue","../agent/ui/AgentModal.vue","../agent/ui/AgentWidget.vue","../agent/ui/AgentWidget.vue","../agent/ui/ElAgentChatPreview.vue","../agent/ui/ElAgentChatPreview.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { PageLinesSDK } from '../../sdkClient'\nimport type { AgentConfig } from '../schema'\nimport FModal from '../../ui/FModal.vue'\nimport AgentProvider from './AgentProvider.vue'\n\ndefineOptions({ name: 'AgentModal' })\n\nconst {\n vis = false,\n sdk,\n agent,\n handle,\n context,\n firstMessage,\n} = defineProps<{\n vis?: boolean\n sdk?: PageLinesSDK\n agent?: AgentConfig\n handle?: string\n context?: string\n firstMessage?: string\n}>()\n\nconst emit = defineEmits<{\n 'update:vis': [value: boolean]\n}>()\n</script>\n\n<template>\n <FModal\n :vis=\"vis\"\n modal-class=\"max-w-4xl p-0\"\n style-class=\"bg-transparent shadow-2xl rounded-2xl\"\n :has-close=\"false\"\n @update:vis=\"(val) => emit('update:vis', val)\"\n >\n <div class=\"relative w-full h-[80vh] md:h-[600px]\">\n <AgentProvider\n :sdk=\"sdk\"\n :agent=\"agent\"\n :handle=\"handle\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n :has-close=\"true\"\n @close=\"emit('update:vis', false)\"\n />\n </div>\n </FModal>\n</template>\n","<script setup lang=\"ts\">\nimport type { PageLinesSDK } from '../../sdkClient'\nimport type { AgentConfig } from '../schema'\nimport FModal from '../../ui/FModal.vue'\nimport AgentProvider from './AgentProvider.vue'\n\ndefineOptions({ name: 'AgentModal' })\n\nconst {\n vis = false,\n sdk,\n agent,\n handle,\n context,\n firstMessage,\n} = defineProps<{\n vis?: boolean\n sdk?: PageLinesSDK\n agent?: AgentConfig\n handle?: string\n context?: string\n firstMessage?: string\n}>()\n\nconst emit = defineEmits<{\n 'update:vis': [value: boolean]\n}>()\n</script>\n\n<template>\n <FModal\n :vis=\"vis\"\n modal-class=\"max-w-4xl p-0\"\n style-class=\"bg-transparent shadow-2xl rounded-2xl\"\n :has-close=\"false\"\n @update:vis=\"(val) => emit('update:vis', val)\"\n >\n <div class=\"relative w-full h-[80vh] md:h-[600px]\">\n <AgentProvider\n :sdk=\"sdk\"\n :agent=\"agent\"\n :handle=\"handle\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n :has-close=\"true\"\n @close=\"emit('update:vis', false)\"\n />\n </div>\n </FModal>\n</template>\n","<script setup lang=\"ts\">\nimport type { PageLinesSDK } from '../../sdkClient'\nimport { nextTick, ref, watch } from 'vue'\nimport AgentChat from './AgentChat.vue'\nimport AgentWrap from './AgentWrap.vue'\n\ninterface Props {\n sdk?: PageLinesSDK\n handle: string\n context?: string\n firstMessage?: string\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n}\n\nconst props = defineProps<Props>()\nconst isOpen = ref(false)\nconst isAgentActive = ref(false)\n\nfunction toggle() {\n isOpen.value = !isOpen.value\n}\n\n// Watch isOpen to delay agent activation for smooth transition\nwatch(isOpen, async (newValue) => {\n if (newValue) {\n // When opening, delay agent activation until transition starts\n await nextTick()\n setTimeout(() => {\n isAgentActive.value = true\n }, 400) // Delay to let container expand first\n } else {\n // When closing, immediately deactivate agent\n isAgentActive.value = false\n }\n})\n\nfunction open() {\n isOpen.value = true\n}\n\nfunction close() {\n isOpen.value = false\n}\n\nfunction handleClose() {\n close()\n}\n\ndefineExpose({\n toggle,\n open,\n close,\n})\n</script>\n\n<template>\n <AgentWrap\n v-slot=\"{ agent, sdk: resolvedSdk }\"\n :sdk=\"sdk\"\n :handle=\"handle\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n >\n <!-- Fixed Widget Wrapper -->\n <div\n v-if=\"agent\"\n class=\"fixed z-[999999] pointer-events-auto\"\n :class=\"[\n props.position === 'bottom-left' ? 'bottom-6 left-6'\n : props.position === 'top-right' ? 'top-6 right-6'\n : props.position === 'top-left' ? 'top-6 left-6'\n : 'bottom-6 right-6',\n ]\"\n >\n <!-- Widget Content with Transition -->\n <div\n class=\"transition-all duration-500 ease-[cubic-bezier(0.25,1,0.33,1)] transform-gpu\"\n :class=\"[\n isOpen\n ? 'widget-expanded w-96 h-[600px] max-w-[calc(100vw-48px)] max-h-[calc(100vh-48px)] rounded-3xl opacity-100 scale-100'\n : 'widget-button w-[80px] h-[80px] opacity-100 scale-100 flex items-center justify-center cursor-pointer',\n ]\"\n :style=\"{\n 'transform-origin':\n props.position === 'bottom-left' ? 'bottom left'\n : props.position === 'top-right' ? 'top right'\n : props.position === 'top-left' ? 'top left'\n : 'bottom right',\n }\"\n @click=\"!isOpen ? toggle() : undefined\"\n >\n <!-- Button Content (visible when closed) -->\n <div v-if=\"!isOpen\" class=\"relative h-full w-full\">\n <div class=\"group relative h-full w-full rounded-3xl overflow-hidden shadow-lg transition-all duration-300 ease-[cubic-bezier(0.25,1,0.33,1)] hover:shadow-2xl hover:translate-y-[-1px] hover:brightness-110 active:scale-[1.06] active:-translate-y-0.5 active:duration-100\">\n <img\n :src=\"agent.avatarUrl.value\"\n :alt=\"`${agent.displayName.value} assistant`\"\n class=\"h-full w-full object-cover pointer-events-none\"\n width=\"80\"\n height=\"80\"\n />\n <!-- Gradient overlay for contrast -->\n <div class=\"absolute inset-0 pointer-events-none bg-gradient-to-br from-transparent via-black/10 to-black/40 opacity-60 transition-opacity duration-300 group-hover:opacity-40\" />\n </div>\n <!-- Online indicator -->\n <div v-if=\"agent.state.value.lifecycle === 'running'\" class=\"absolute top-0.5 right-0.5\">\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white absolute animate-ping\" style=\"animation-duration: 3s;\" />\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white\" />\n </div>\n </div>\n\n <!-- Chat Content (visible when open) -->\n <AgentChat\n v-if=\"isOpen && agent\"\n class=\"rounded-3xl shadow-2xl border border-white/10\"\n :sdk=\"resolvedSdk\"\n :agent=\"agent\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n :has-close=\"true\"\n :is-active=\"isAgentActive\"\n @close=\"handleClose\"\n />\n </div>\n </div>\n </AgentWrap>\n</template>\n","<script setup lang=\"ts\">\nimport type { PageLinesSDK } from '../../sdkClient'\nimport { nextTick, ref, watch } from 'vue'\nimport AgentChat from './AgentChat.vue'\nimport AgentWrap from './AgentWrap.vue'\n\ninterface Props {\n sdk?: PageLinesSDK\n handle: string\n context?: string\n firstMessage?: string\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n}\n\nconst props = defineProps<Props>()\nconst isOpen = ref(false)\nconst isAgentActive = ref(false)\n\nfunction toggle() {\n isOpen.value = !isOpen.value\n}\n\n// Watch isOpen to delay agent activation for smooth transition\nwatch(isOpen, async (newValue) => {\n if (newValue) {\n // When opening, delay agent activation until transition starts\n await nextTick()\n setTimeout(() => {\n isAgentActive.value = true\n }, 400) // Delay to let container expand first\n } else {\n // When closing, immediately deactivate agent\n isAgentActive.value = false\n }\n})\n\nfunction open() {\n isOpen.value = true\n}\n\nfunction close() {\n isOpen.value = false\n}\n\nfunction handleClose() {\n close()\n}\n\ndefineExpose({\n toggle,\n open,\n close,\n})\n</script>\n\n<template>\n <AgentWrap\n v-slot=\"{ agent, sdk: resolvedSdk }\"\n :sdk=\"sdk\"\n :handle=\"handle\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n >\n <!-- Fixed Widget Wrapper -->\n <div\n v-if=\"agent\"\n class=\"fixed z-[999999] pointer-events-auto\"\n :class=\"[\n props.position === 'bottom-left' ? 'bottom-6 left-6'\n : props.position === 'top-right' ? 'top-6 right-6'\n : props.position === 'top-left' ? 'top-6 left-6'\n : 'bottom-6 right-6',\n ]\"\n >\n <!-- Widget Content with Transition -->\n <div\n class=\"transition-all duration-500 ease-[cubic-bezier(0.25,1,0.33,1)] transform-gpu\"\n :class=\"[\n isOpen\n ? 'widget-expanded w-96 h-[600px] max-w-[calc(100vw-48px)] max-h-[calc(100vh-48px)] rounded-3xl opacity-100 scale-100'\n : 'widget-button w-[80px] h-[80px] opacity-100 scale-100 flex items-center justify-center cursor-pointer',\n ]\"\n :style=\"{\n 'transform-origin':\n props.position === 'bottom-left' ? 'bottom left'\n : props.position === 'top-right' ? 'top right'\n : props.position === 'top-left' ? 'top left'\n : 'bottom right',\n }\"\n @click=\"!isOpen ? toggle() : undefined\"\n >\n <!-- Button Content (visible when closed) -->\n <div v-if=\"!isOpen\" class=\"relative h-full w-full\">\n <div class=\"group relative h-full w-full rounded-3xl overflow-hidden shadow-lg transition-all duration-300 ease-[cubic-bezier(0.25,1,0.33,1)] hover:shadow-2xl hover:translate-y-[-1px] hover:brightness-110 active:scale-[1.06] active:-translate-y-0.5 active:duration-100\">\n <img\n :src=\"agent.avatarUrl.value\"\n :alt=\"`${agent.displayName.value} assistant`\"\n class=\"h-full w-full object-cover pointer-events-none\"\n width=\"80\"\n height=\"80\"\n />\n <!-- Gradient overlay for contrast -->\n <div class=\"absolute inset-0 pointer-events-none bg-gradient-to-br from-transparent via-black/10 to-black/40 opacity-60 transition-opacity duration-300 group-hover:opacity-40\" />\n </div>\n <!-- Online indicator -->\n <div v-if=\"agent.state.value.lifecycle === 'running'\" class=\"absolute top-0.5 right-0.5\">\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white absolute animate-ping\" style=\"animation-duration: 3s;\" />\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white\" />\n </div>\n </div>\n\n <!-- Chat Content (visible when open) -->\n <AgentChat\n v-if=\"isOpen && agent\"\n class=\"rounded-3xl shadow-2xl border border-white/10\"\n :sdk=\"resolvedSdk\"\n :agent=\"agent\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n :has-close=\"true\"\n :is-active=\"isAgentActive\"\n @close=\"handleClose\"\n />\n </div>\n </div>\n </AgentWrap>\n</template>\n","<script setup lang=\"ts\">\nimport ChatRichText from './ChatRichText.vue'\n\nexport type ChatPreviewMessage = {\n sender: 'user' | 'agent'\n text: string\n}\n\ndefineProps<{\n messages: ChatPreviewMessage[]\n variant?: 'light' | 'dark'\n}>()\n</script>\n\n<template>\n <div\n class=\"@container/chat-preview flex flex-col gap-3\"\n :class=\"variant === 'dark' ? 'text-white' : 'text-slate-950'\"\n data-test=\"agent-chat-preview\"\n >\n <div\n v-for=\"(message, index) in messages\"\n :key=\"`${message.sender}-${index}`\"\n class=\"flex\"\n :class=\"message.sender === 'user' ? 'justify-end' : 'justify-start'\"\n data-test=\"agent-chat-preview-message\"\n :data-sender=\"message.sender\"\n >\n <div\n class=\"max-w-[88%] rounded-2xl px-4 py-3 text-sm shadow-sm @sm/chat-preview:max-w-[78%]\"\n :class=\"message.sender === 'user'\n ? 'bg-slate-950 text-white'\n : variant === 'dark'\n ? 'border border-white/10 bg-white/10 text-white'\n : 'border border-slate-200 bg-white text-slate-950'\"\n >\n <ChatRichText\n :text=\"message.text\"\n :inverted=\"message.sender === 'user' || variant === 'dark'\"\n />\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport ChatRichText from './ChatRichText.vue'\n\nexport type ChatPreviewMessage = {\n sender: 'user' | 'agent'\n text: string\n}\n\ndefineProps<{\n messages: ChatPreviewMessage[]\n variant?: 'light' | 'dark'\n}>()\n</script>\n\n<template>\n <div\n class=\"@container/chat-preview flex flex-col gap-3\"\n :class=\"variant === 'dark' ? 'text-white' : 'text-slate-950'\"\n data-test=\"agent-chat-preview\"\n >\n <div\n v-for=\"(message, index) in messages\"\n :key=\"`${message.sender}-${index}`\"\n class=\"flex\"\n :class=\"message.sender === 'user' ? 'justify-end' : 'justify-start'\"\n data-test=\"agent-chat-preview-message\"\n :data-sender=\"message.sender\"\n >\n <div\n class=\"max-w-[88%] rounded-2xl px-4 py-3 text-sm shadow-sm @sm/chat-preview:max-w-[78%]\"\n :class=\"message.sender === 'user'\n ? 'bg-slate-950 text-white'\n : variant === 'dark'\n ? 'border border-white/10 bg-white/10 text-white'\n : 'border border-slate-200 bg-white text-slate-950'\"\n >\n <ChatRichText\n :text=\"message.text\"\n :inverted=\"message.sender === 'user' || variant === 'dark'\"\n />\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent.js","names":[],"sources":["../agent/ui/AgentWidget.vue","../agent/ui/AgentWidget.vue","../agent/ui/ElAgentChatPreview.vue","../agent/ui/ElAgentChatPreview.vue","../agent/voice/voice-session-client.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { PageLinesSDK } from '../../sdkClient'\nimport { nextTick, ref, watch } from 'vue'\nimport AgentChat from './AgentChat.vue'\nimport AgentWrap from './AgentWrap.vue'\n\ninterface Props {\n sdk?: PageLinesSDK\n handle: string\n context?: string\n firstMessage?: string\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n}\n\nconst props = defineProps<Props>()\nconst isOpen = ref(false)\nconst isAgentActive = ref(false)\n\nfunction toggle() {\n isOpen.value = !isOpen.value\n}\n\n// Watch isOpen to delay agent activation for smooth transition\nwatch(isOpen, async (newValue) => {\n if (newValue) {\n // When opening, delay agent activation until transition starts\n await nextTick()\n setTimeout(() => {\n isAgentActive.value = true\n }, 400) // Delay to let container expand first\n } else {\n // When closing, immediately deactivate agent\n isAgentActive.value = false\n }\n})\n\nfunction open() {\n isOpen.value = true\n}\n\nfunction close() {\n isOpen.value = false\n}\n\nfunction handleClose() {\n close()\n}\n\ndefineExpose({\n toggle,\n open,\n close,\n})\n</script>\n\n<template>\n <AgentWrap\n v-slot=\"{ agent, sdk: resolvedSdk }\"\n :sdk=\"sdk\"\n :handle=\"handle\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n >\n <!-- Fixed Widget Wrapper -->\n <div\n v-if=\"agent\"\n class=\"fixed z-[999999] pointer-events-auto\"\n :class=\"[\n props.position === 'bottom-left' ? 'bottom-6 left-6'\n : props.position === 'top-right' ? 'top-6 right-6'\n : props.position === 'top-left' ? 'top-6 left-6'\n : 'bottom-6 right-6',\n ]\"\n >\n <!-- Widget Content with Transition -->\n <div\n class=\"transition-all duration-500 ease-[cubic-bezier(0.25,1,0.33,1)] transform-gpu\"\n :class=\"[\n isOpen\n ? 'widget-expanded w-96 h-[600px] max-w-[calc(100vw-48px)] max-h-[calc(100vh-48px)] rounded-3xl opacity-100 scale-100'\n : 'widget-button w-[80px] h-[80px] opacity-100 scale-100 flex items-center justify-center cursor-pointer',\n ]\"\n :style=\"{\n 'transform-origin':\n props.position === 'bottom-left' ? 'bottom left'\n : props.position === 'top-right' ? 'top right'\n : props.position === 'top-left' ? 'top left'\n : 'bottom right',\n }\"\n @click=\"!isOpen ? toggle() : undefined\"\n >\n <!-- Button Content (visible when closed) -->\n <div v-if=\"!isOpen\" class=\"relative h-full w-full\">\n <div class=\"group relative h-full w-full rounded-3xl overflow-hidden shadow-lg transition-all duration-300 ease-[cubic-bezier(0.25,1,0.33,1)] hover:shadow-2xl hover:translate-y-[-1px] hover:brightness-110 active:scale-[1.06] active:-translate-y-0.5 active:duration-100\">\n <img\n :src=\"agent.avatarUrl.value\"\n :alt=\"`${agent.displayName.value} assistant`\"\n class=\"h-full w-full object-cover pointer-events-none\"\n width=\"80\"\n height=\"80\"\n />\n <!-- Gradient overlay for contrast -->\n <div class=\"absolute inset-0 pointer-events-none bg-gradient-to-br from-transparent via-black/10 to-black/40 opacity-60 transition-opacity duration-300 group-hover:opacity-40\" />\n </div>\n <!-- Online indicator -->\n <div v-if=\"agent.state.value.lifecycle === 'running'\" class=\"absolute top-0.5 right-0.5\">\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white absolute animate-ping\" style=\"animation-duration: 3s;\" />\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white\" />\n </div>\n </div>\n\n <!-- Chat Content (visible when open) -->\n <AgentChat\n v-if=\"isOpen && agent\"\n class=\"rounded-3xl shadow-2xl border border-white/10\"\n :sdk=\"resolvedSdk\"\n :agent=\"agent\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n :has-close=\"true\"\n :is-active=\"isAgentActive\"\n @close=\"handleClose\"\n />\n </div>\n </div>\n </AgentWrap>\n</template>\n","<script setup lang=\"ts\">\nimport type { PageLinesSDK } from '../../sdkClient'\nimport { nextTick, ref, watch } from 'vue'\nimport AgentChat from './AgentChat.vue'\nimport AgentWrap from './AgentWrap.vue'\n\ninterface Props {\n sdk?: PageLinesSDK\n handle: string\n context?: string\n firstMessage?: string\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n}\n\nconst props = defineProps<Props>()\nconst isOpen = ref(false)\nconst isAgentActive = ref(false)\n\nfunction toggle() {\n isOpen.value = !isOpen.value\n}\n\n// Watch isOpen to delay agent activation for smooth transition\nwatch(isOpen, async (newValue) => {\n if (newValue) {\n // When opening, delay agent activation until transition starts\n await nextTick()\n setTimeout(() => {\n isAgentActive.value = true\n }, 400) // Delay to let container expand first\n } else {\n // When closing, immediately deactivate agent\n isAgentActive.value = false\n }\n})\n\nfunction open() {\n isOpen.value = true\n}\n\nfunction close() {\n isOpen.value = false\n}\n\nfunction handleClose() {\n close()\n}\n\ndefineExpose({\n toggle,\n open,\n close,\n})\n</script>\n\n<template>\n <AgentWrap\n v-slot=\"{ agent, sdk: resolvedSdk }\"\n :sdk=\"sdk\"\n :handle=\"handle\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n >\n <!-- Fixed Widget Wrapper -->\n <div\n v-if=\"agent\"\n class=\"fixed z-[999999] pointer-events-auto\"\n :class=\"[\n props.position === 'bottom-left' ? 'bottom-6 left-6'\n : props.position === 'top-right' ? 'top-6 right-6'\n : props.position === 'top-left' ? 'top-6 left-6'\n : 'bottom-6 right-6',\n ]\"\n >\n <!-- Widget Content with Transition -->\n <div\n class=\"transition-all duration-500 ease-[cubic-bezier(0.25,1,0.33,1)] transform-gpu\"\n :class=\"[\n isOpen\n ? 'widget-expanded w-96 h-[600px] max-w-[calc(100vw-48px)] max-h-[calc(100vh-48px)] rounded-3xl opacity-100 scale-100'\n : 'widget-button w-[80px] h-[80px] opacity-100 scale-100 flex items-center justify-center cursor-pointer',\n ]\"\n :style=\"{\n 'transform-origin':\n props.position === 'bottom-left' ? 'bottom left'\n : props.position === 'top-right' ? 'top right'\n : props.position === 'top-left' ? 'top left'\n : 'bottom right',\n }\"\n @click=\"!isOpen ? toggle() : undefined\"\n >\n <!-- Button Content (visible when closed) -->\n <div v-if=\"!isOpen\" class=\"relative h-full w-full\">\n <div class=\"group relative h-full w-full rounded-3xl overflow-hidden shadow-lg transition-all duration-300 ease-[cubic-bezier(0.25,1,0.33,1)] hover:shadow-2xl hover:translate-y-[-1px] hover:brightness-110 active:scale-[1.06] active:-translate-y-0.5 active:duration-100\">\n <img\n :src=\"agent.avatarUrl.value\"\n :alt=\"`${agent.displayName.value} assistant`\"\n class=\"h-full w-full object-cover pointer-events-none\"\n width=\"80\"\n height=\"80\"\n />\n <!-- Gradient overlay for contrast -->\n <div class=\"absolute inset-0 pointer-events-none bg-gradient-to-br from-transparent via-black/10 to-black/40 opacity-60 transition-opacity duration-300 group-hover:opacity-40\" />\n </div>\n <!-- Online indicator -->\n <div v-if=\"agent.state.value.lifecycle === 'running'\" class=\"absolute top-0.5 right-0.5\">\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white absolute animate-ping\" style=\"animation-duration: 3s;\" />\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white\" />\n </div>\n </div>\n\n <!-- Chat Content (visible when open) -->\n <AgentChat\n v-if=\"isOpen && agent\"\n class=\"rounded-3xl shadow-2xl border border-white/10\"\n :sdk=\"resolvedSdk\"\n :agent=\"agent\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n :has-close=\"true\"\n :is-active=\"isAgentActive\"\n @close=\"handleClose\"\n />\n </div>\n </div>\n </AgentWrap>\n</template>\n","<script setup lang=\"ts\">\nimport ChatRichText from './ChatRichText.vue'\n\nexport type ChatPreviewMessage = {\n sender: 'user' | 'agent'\n text: string\n}\n\ndefineProps<{\n messages: ChatPreviewMessage[]\n variant?: 'light' | 'dark'\n}>()\n</script>\n\n<template>\n <div\n class=\"@container/chat-preview flex flex-col gap-3\"\n :class=\"variant === 'dark' ? 'text-white' : 'text-slate-950'\"\n data-test=\"agent-chat-preview\"\n >\n <div\n v-for=\"(message, index) in messages\"\n :key=\"`${message.sender}-${index}`\"\n class=\"flex\"\n :class=\"message.sender === 'user' ? 'justify-end' : 'justify-start'\"\n data-test=\"agent-chat-preview-message\"\n :data-sender=\"message.sender\"\n >\n <div\n class=\"max-w-[88%] rounded-2xl px-4 py-3 text-sm shadow-sm @sm/chat-preview:max-w-[78%]\"\n :class=\"message.sender === 'user'\n ? 'bg-slate-950 text-white'\n : variant === 'dark'\n ? 'border border-white/10 bg-white/10 text-white'\n : 'border border-slate-200 bg-white text-slate-950'\"\n >\n <ChatRichText\n :text=\"message.text\"\n :inverted=\"message.sender === 'user' || variant === 'dark'\"\n />\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport ChatRichText from './ChatRichText.vue'\n\nexport type ChatPreviewMessage = {\n sender: 'user' | 'agent'\n text: string\n}\n\ndefineProps<{\n messages: ChatPreviewMessage[]\n variant?: 'light' | 'dark'\n}>()\n</script>\n\n<template>\n <div\n class=\"@container/chat-preview flex flex-col gap-3\"\n :class=\"variant === 'dark' ? 'text-white' : 'text-slate-950'\"\n data-test=\"agent-chat-preview\"\n >\n <div\n v-for=\"(message, index) in messages\"\n :key=\"`${message.sender}-${index}`\"\n class=\"flex\"\n :class=\"message.sender === 'user' ? 'justify-end' : 'justify-start'\"\n data-test=\"agent-chat-preview-message\"\n :data-sender=\"message.sender\"\n >\n <div\n class=\"max-w-[88%] rounded-2xl px-4 py-3 text-sm shadow-sm @sm/chat-preview:max-w-[78%]\"\n :class=\"message.sender === 'user'\n ? 'bg-slate-950 text-white'\n : variant === 'dark'\n ? 'border border-white/10 bg-white/10 text-white'\n : 'border border-slate-200 bg-white text-slate-950'\"\n >\n <ChatRichText\n :text=\"message.text\"\n :inverted=\"message.sender === 'user' || variant === 'dark'\"\n />\n </div>\n </div>\n </div>\n</template>\n","/** Provider-neutral voice session state machine for web clients. */\nimport type { ApiResponse, VoiceSessionMint } from '@pagelines/core'\nimport type { Ref } from 'vue'\nimport type {\n CreateVoiceProviderClient,\n VoiceLevelEvent,\n VoiceProviderClient,\n VoiceSessionError,\n} from './provider'\nimport { SettingsObject, zVoiceSessionMint } from '@pagelines/core'\nimport { ref } from 'vue'\nimport { resolveApiBase } from '../../api'\nimport { createVoiceProviderClient } from './provider'\n\nexport type { VoiceLevelEvent, VoiceSessionError } from './provider'\nexport { VOICE_SPECTRUM_BANDS, voiceSpectrum } from './provider'\n\nexport type VoiceSessionClientState = 'idle' | 'minting' | 'connecting' | 'live' | 'ended'\nexport type VoiceChimeKind = 'start' | 'end'\n\nexport interface VoiceClientHandlers {\n onStateChange?: (state: VoiceSessionClientState) => void\n onLevel?: (event: VoiceLevelEvent) => void\n onError?: (error: VoiceSessionError) => void\n}\n\nexport interface VoiceSessionClientSettings extends VoiceClientHandlers, Record<string, unknown> {\n agentId: string\n orgId: string\n conversationId?: string\n apiBase?: string\n isDev?: boolean\n token?: string\n fetchFn?: typeof fetch\n /** Provider composition seam; the default dynamically loads the minted provider. */\n createProvider?: CreateVoiceProviderClient\n playChime?: (kind: VoiceChimeKind) => void\n}\n\nconst CHIME_SOURCES: Record<VoiceChimeKind, string> = {\n start: '/audio/start-call.mp3',\n end: '/audio/end-call.mp3',\n}\nconst CHIME_VOLUME = 0.7\nconst LEVEL_INTERVAL_MS = 50\n\nexport function createBrowserVoiceChimePlayer(): (kind: VoiceChimeKind) => void {\n const players: Partial<Record<VoiceChimeKind, HTMLAudioElement>> = {}\n for (const kind of ['start', 'end'] as const) {\n try {\n const audio = new Audio(CHIME_SOURCES[kind])\n audio.preload = 'auto'\n audio.volume = CHIME_VOLUME\n players[kind] = audio\n } catch {}\n }\n return (kind) => {\n try {\n const audio = players[kind]\n if (!audio)\n return\n audio.currentTime = 0\n void audio.play().catch(() => {})\n } catch {}\n }\n}\n\nexport class VoiceSessionClient extends SettingsObject<VoiceSessionClientSettings> {\n readonly state: Ref<VoiceSessionClientState> = ref('idle')\n\n private provider?: VoiceProviderClient\n private readonly chime: (kind: VoiceChimeKind) => void\n private generation = 0\n private levelTimer: ReturnType<typeof setInterval> | undefined\n\n constructor(settings: VoiceSessionClientSettings) {\n super('VoiceSessionClient', settings)\n this.chime = settings.playChime ?? createBrowserVoiceChimePlayer()\n }\n\n async start(): Promise<void> {\n if (this.state.value !== 'idle')\n return\n const generation = ++this.generation\n this.setState('minting')\n try {\n const mint = await this.mintSession(generation)\n if (!mint || generation !== this.generation)\n return\n this.setState('connecting')\n await this.connect({ mint, generation })\n } catch (error) {\n if (generation !== this.generation)\n return\n this.fail(this.toSessionError(error, 'VOICE_MINT_FAILED'))\n }\n }\n\n end(): void {\n if (this.state.value === 'idle' || this.state.value === 'ended')\n return\n const shouldChime = this.state.value === 'live'\n this.generation++\n if (shouldChime)\n this.chime('end')\n this.setState('ended')\n this.teardown()\n }\n\n private async connect(args: { mint: VoiceSessionMint, generation: number }): Promise<void> {\n const { mint, generation } = args\n const provider = await (this.settings.createProvider ?? createVoiceProviderClient)(mint)\n if (generation !== this.generation) {\n await provider.disconnect().catch(() => {})\n return\n }\n this.provider = provider\n\n try {\n await provider.connect({\n onDisconnected: () => {\n if (generation !== this.generation || this.provider !== provider)\n return\n this.fail({\n code: this.state.value === 'live' ? 'VOICE_CONNECTION_LOST' : 'VOICE_CONNECT_FAILED',\n message: this.state.value === 'live'\n ? 'The voice connection dropped.'\n : 'Could not open the voice connection.',\n })\n },\n onError: error => {\n if (generation === this.generation && this.provider === provider)\n this.fail(error)\n },\n })\n } catch (error) {\n if (generation !== this.generation || this.provider !== provider)\n return\n this.fail(this.toSessionError(error, 'VOICE_CONNECT_FAILED'))\n return\n }\n if (generation !== this.generation || this.provider !== provider)\n return\n\n this.startLevelTimer(provider, generation)\n this.setState('live')\n this.chime('start')\n }\n\n private setState(state: VoiceSessionClientState): void {\n if (this.state.value === state)\n return\n this.state.value = state\n this.settings.onStateChange?.(state)\n }\n\n private fail(error: VoiceSessionError): void {\n this.generation++\n this.settings.onError?.(error)\n this.setState('ended')\n this.teardown()\n }\n\n private teardown(): void {\n if (this.levelTimer !== undefined) {\n clearInterval(this.levelTimer)\n this.levelTimer = undefined\n }\n const provider = this.provider\n this.provider = undefined\n if (provider)\n void provider.disconnect().catch(() => {})\n this.settings.onLevel?.({ source: 'playback', level: 0 })\n }\n\n private startLevelTimer(provider: VoiceProviderClient, generation: number): void {\n if (this.levelTimer !== undefined)\n return\n this.levelTimer = setInterval(() => {\n if (generation !== this.generation || this.provider !== provider)\n return\n const level = provider.sampleLevel()\n if (level)\n this.settings.onLevel?.(level)\n }, LEVEL_INTERVAL_MS)\n }\n\n private authHeaders(): Record<string, string> {\n return this.settings.token ? { Authorization: `Bearer ${this.settings.token}` } : {}\n }\n\n private async post<T>(args: { path: string, body: unknown }): Promise<T> {\n const apiBase = resolveApiBase(this.settings.apiBase, this.settings.isDev)\n const fetchFn = this.settings.fetchFn ?? fetch\n const res = await fetchFn(`${apiBase}${args.path}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...this.authHeaders() },\n credentials: 'include',\n body: JSON.stringify(args.body),\n })\n const result = await res.json() as ApiResponse<T>\n if (!res.ok || !result.ok) {\n const message = !result.ok ? result.error : `HTTP ${res.status}`\n const code = !result.ok && result.code ? result.code : 'VOICE_MINT_FAILED'\n throw Object.assign(new Error(message || 'Voice request failed.'), { code })\n }\n return result.data\n }\n\n private async mintSession(generation: number): Promise<VoiceSessionMint | null> {\n let conversationId = this.settings.conversationId\n if (!conversationId) {\n conversationId = (await this.post<{ conversationId: string }>({\n path: '/api/conversations',\n body: {\n orgId: this.settings.orgId,\n participants: [{ type: 'agent', id: this.settings.agentId }],\n },\n })).conversationId\n if (generation !== this.generation)\n return null\n }\n\n const data = await this.post<unknown>({ path: '/api/voice/sessions', body: { conversationId } })\n if (generation !== this.generation)\n return null\n const parsed = zVoiceSessionMint.safeParse(data)\n if (!parsed.success)\n throw Object.assign(new Error('Voice session mint returned an unexpected shape.'), { code: 'VOICE_MINT_INVALID' })\n return parsed.data\n }\n\n private toSessionError(error: unknown, fallbackCode: string): VoiceSessionError {\n return error instanceof Error\n ? {\n code: 'code' in error ? String((error as Error & { code: unknown }).code) : fallbackCode,\n message: error.message,\n }\n : { code: fallbackCode, message: 'Voice session failed to start.' }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;EAcA,IAAM,IAAQ,GACR,IAAS,EAAI,EAAK,GAClB,IAAgB,EAAI,EAAK;EAE/B,SAAS,SAAS;GAChB,EAAO,QAAQ,CAAC,EAAO;EACzB;EAGA,EAAM,GAAQ,OAAO,MAAa;GAChC,AAAI,KAEF,MAAM,EAAS,GACf,iBAAiB;IACf,EAAc,QAAQ;GACxB,GAAG,GAAG,KAGN,EAAc,QAAQ;EAE1B,CAAC;EAED,SAAS,OAAO;GACd,EAAO,QAAQ;EACjB;EAEA,SAAS,QAAQ;GACf,EAAO,QAAQ;EACjB;EAEA,SAAS,cAAc;GACrB,MAAM;EACR;SAEA,EAAa;GACX;GACA;GACA;EACF,CAAC,mBAIC,EAqEY,GAAA;GAnET,KAAK,EAAA;GACL,QAAQ,EAAA;GACR,SAAS,EAAA;GACT,iBAAe,EAAA;;eA+DV,EAnEI,UAAK,KAAO,QAAW,CAQzB,KAAA,EAAA,GADR,EA4DM,OAAA;;IA1DJ,OAAK,EAAA,CAAC,wCAAsC,CAC1B,EAAM,aAAQ,gBAAA,oBAAiD,EAAM,aAAQ,cAAA,kBAA+C,EAAM,aAAQ,aAAA,iBAAA,kBAAA,CAAA,CAAA;OAQ5J,EAgDM,OAAA;IA/CJ,OAAK,EAAA,CAAC,gFAA8E,CAChE,EAAA,QAAA,uHAAA,yGAAA,CAAA,CAAA;IAKnB,OAAK,EAAA,EAAA,oBAA8C,EAAM,aAAQ,gBAAA,gBAAiD,EAAM,aAAQ,cAAA,cAA+C,EAAM,aAAQ,aAAA,aAAA,eAAA,CAAA;IAO7L,SAAK,EAAA,OAAA,EAAA,MAAA,MAAG,EAAA,QAAoB,KAAA,IAAX,OAAM;OAGZ,EAAA,QAeuD,EAAA,IAAA,EAAA,KAfvD,EAAA,GAAZ,EAiBM,OAjBN,GAiBM,CAhBJ,EAUM,OAVN,GAUM,CATJ,EAME,OAAA;IALC,KAAK,EAAM,UAAU;IACrB,KAAG,GAAK,EAAM,YAAY,MAAK;IAChC,OAAM;IACN,OAAM;IACN,QAAO;mCAGT,EAAkL,OAAA,EAA7K,OAAM,qKAAoK,GAAA,MAAA,EAAA,EAAA,CAAA,GAGtK,EAAM,MAAM,MAAM,cAAS,aAAA,EAAA,GAAtC,EAGM,OAHN,GAGM,CAAA,GAAA,EAAA,OAAA,EAAA,KAAA,CAFJ,EAAwH,OAAA;IAAnH,OAAM;IAA2E,OAAA,EAAA,sBAAA,KAAA;iBACtF,EAAkE,OAAA,EAA7D,OAAM,qDAAoD,GAAA,MAAA,EAAA,CAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,CAAA,IAM3D,EAAA,SAAU,KAAA,EAAA,GADlB,EAUE,GAAA;;IARA,OAAM;IACL,KAAK;IACE;IACP,SAAS,EAAA;IACT,iBAAe,EAAA;IACf,aAAW;IACX,aAAW,EAAA;IACX,SAAO;;;;;;;;;;;;;;;;;;;;;;;yBE1GhB,EA2BM,OAAA;GA1BJ,OAAK,EAAA,CAAC,+CACE,EAAA,YAAO,SAAA,eAAA,gBAAA,CAAA;GACf,aAAU;cAEV,EAqBM,GAAA,MAAA,EApBuB,EAAA,WAAnB,GAAS,YADnB,EAqBM,OAAA;GAnBH,KAAG,GAAK,EAAQ,OAAM,GAAI;GAC3B,OAAK,EAAA,CAAC,QACE,EAAQ,WAAM,SAAA,gBAAA,eAAA,CAAA;GACtB,aAAU;GACT,eAAa,EAAQ;MAEtB,EAYM,OAAA,EAXJ,OAAK,EAAA,CAAC,oFACE,EAAQ,WAAM,SAAA,4BAA8D,EAAA,YAAO,SAAA,kDAAA,iDAAA,CAAA,EAAA,GAAA,CAM3F,EAGE,GAAA;GAFC,MAAM,EAAQ;GACd,UAAU,EAAQ,WAAM,UAAe,EAAA,YAAO;;;IECnD,IAAgD;CACpD,OAAO;CACP,KAAK;AACP,GACM,IAAe,IACf,IAAoB;AAE1B,SAAgB,gCAAgE;CAC9E,IAAM,IAA6D,CAAC;CACpE,KAAK,IAAM,KAAQ,CAAC,SAAS,KAAK,GAChC,IAAI;EACF,IAAM,IAAQ,IAAI,MAAM,EAAc,EAAK;EAG3C,AAFA,EAAM,UAAU,QAChB,EAAM,SAAS,GACf,EAAQ,KAAQ;CAClB,QAAQ,CAAC;CAEX,QAAQ,MAAS;EACf,IAAI;GACF,IAAM,IAAQ,EAAQ;GACtB,IAAI,CAAC,GACH;GAEF,AADA,EAAM,cAAc,GACpB,EAAW,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC;EAClC,QAAQ,CAAC;CACX;AACF;AAEA,IAAa,qBAAb,cAAwC,EAA2C;CAQjF,YAAY,GAAsC;EAEhD,AADA,MAAM,sBAAsB,CAAQ,WARtC,SAA+C,EAAI,MAAM,CAAA,WAEzD,YAAA,KAAA,CAAA,WACA,SAAA,KAAA,CAAA,WACA,cAAqB,CAAA,WACrB,cAAA,KAAA,CAAA,GAIE,KAAK,QAAQ,EAAS,aAAa,8BAA8B;CACnE;CAEA,MAAM,QAAuB;EAC3B,IAAI,KAAK,MAAM,UAAU,QACvB;EACF,IAAM,IAAa,EAAE,KAAK;EAC1B,KAAK,SAAS,SAAS;EACvB,IAAI;GACF,IAAM,IAAO,MAAM,KAAK,YAAY,CAAU;GAC9C,IAAI,CAAC,KAAQ,MAAe,KAAK,YAC/B;GAEF,AADA,KAAK,SAAS,YAAY,GAC1B,MAAM,KAAK,QAAQ;IAAE;IAAM;GAAW,CAAC;EACzC,SAAS,GAAO;GACd,IAAI,MAAe,KAAK,YACtB;GACF,KAAK,KAAK,KAAK,eAAe,GAAO,mBAAmB,CAAC;EAC3D;CACF;CAEA,MAAY;EACV,IAAI,KAAK,MAAM,UAAU,UAAU,KAAK,MAAM,UAAU,SACtD;EACF,IAAM,IAAc,KAAK,MAAM,UAAU;EAKzC,AAJA,KAAK,cACD,KACF,KAAK,MAAM,KAAK,GAClB,KAAK,SAAS,OAAO,GACrB,KAAK,SAAS;CAChB;CAEA,MAAc,QAAQ,GAAqE;EACzF,IAAM,EAAE,SAAM,kBAAe,GACvB,IAAW,OAAO,KAAK,SAAS,kBAAkB,EAAA,CAA2B,CAAI;EACvF,IAAI,MAAe,KAAK,YAAY;GAClC,MAAM,EAAS,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC;GAC1C;EACF;EACA,KAAK,WAAW;EAEhB,IAAI;GACF,MAAM,EAAS,QAAQ;IACrB,sBAAsB;KAChB,MAAe,KAAK,cAAc,KAAK,aAAa,KAExD,KAAK,KAAK;MACR,MAAM,KAAK,MAAM,UAAU,SAAS,0BAA0B;MAC9D,SAAS,KAAK,MAAM,UAAU,SAC1B,kCACA;KACN,CAAC;IACH;IACA,UAAS,MAAS;KAChB,AAAI,MAAe,KAAK,cAAc,KAAK,aAAa,KACtD,KAAK,KAAK,CAAK;IACnB;GACF,CAAC;EACH,SAAS,GAAO;GACd,IAAI,MAAe,KAAK,cAAc,KAAK,aAAa,GACtD;GACF,KAAK,KAAK,KAAK,eAAe,GAAO,sBAAsB,CAAC;GAC5D;EACF;EACI,MAAe,KAAK,cAAc,KAAK,aAAa,MAGxD,KAAK,gBAAgB,GAAU,CAAU,GACzC,KAAK,SAAS,MAAM,GACpB,KAAK,MAAM,OAAO;CACpB;CAEA,SAAiB,GAAsC;EACjD,KAAK,MAAM,UAAU,MAEzB,KAAK,MAAM,QAAQ,GACnB,KAAK,SAAS,gBAAgB,CAAK;CACrC;CAEA,KAAa,GAAgC;EAI3C,AAHA,KAAK,cACL,KAAK,SAAS,UAAU,CAAK,GAC7B,KAAK,SAAS,OAAO,GACrB,KAAK,SAAS;CAChB;CAEA,WAAyB;EACvB,AAAI,KAAK,eAAe,KAAA,MACtB,cAAc,KAAK,UAAU,GAC7B,KAAK,aAAa,KAAA;EAEpB,IAAM,IAAW,KAAK;EAItB,AAHA,KAAK,WAAW,KAAA,GACZ,KACF,EAAc,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,GAC3C,KAAK,SAAS,UAAU;GAAE,QAAQ;GAAY,OAAO;EAAE,CAAC;CAC1D;CAEA,gBAAwB,GAA+B,GAA0B;EAC3E,KAAK,eAAe,KAAA,MAExB,KAAK,aAAa,kBAAkB;GAClC,IAAI,MAAe,KAAK,cAAc,KAAK,aAAa,GACtD;GACF,IAAM,IAAQ,EAAS,YAAY;GACnC,AAAI,KACF,KAAK,SAAS,UAAU,CAAK;EACjC,GAAG,CAAiB;CACtB;CAEA,cAA8C;EAC5C,OAAO,KAAK,SAAS,QAAQ,EAAE,eAAe,UAAU,KAAK,SAAS,QAAQ,IAAI,CAAC;CACrF;CAEA,MAAc,KAAQ,GAAmD;EACvE,IAAM,IAAU,EAAe,KAAK,SAAS,SAAS,KAAK,SAAS,KAAK,GAEnE,IAAM,OADI,KAAK,SAAS,WAAW,MAAA,CACf,GAAG,IAAU,EAAK,QAAQ;GAClD,QAAQ;GACR,SAAS;IAAE,gBAAgB;IAAoB,GAAG,KAAK,YAAY;GAAE;GACrE,aAAa;GACb,MAAM,KAAK,UAAU,EAAK,IAAI;EAChC,CAAC,GACK,IAAS,MAAM,EAAI,KAAK;EAC9B,IAAI,CAAC,EAAI,MAAM,CAAC,EAAO,IAAI;GACzB,IAAM,IAAW,EAAO,KAAoB,QAAQ,EAAI,WAA3B,EAAO,OAC9B,IAAO,CAAC,EAAO,MAAM,EAAO,OAAO,EAAO,OAAO;GACvD,MAAM,OAAO,OAAW,MAAM,KAAW,uBAAuB,GAAG,EAAE,QAAK,CAAC;EAC7E;EACA,OAAO,EAAO;CAChB;CAEA,MAAc,YAAY,GAAsD;EAC9E,IAAI,IAAiB,KAAK,SAAS;EACnC,IAAI,CAAC,MACH,KAAkB,MAAM,KAAK,KAAiC;GAC5D,MAAM;GACN,MAAM;IACJ,OAAO,KAAK,SAAS;IACrB,cAAc,CAAC;KAAE,MAAM;KAAS,IAAI,KAAK,SAAS;IAAQ,CAAC;GAC7D;EACF,CAAC,EAAA,CAAG,gBACA,MAAe,KAAK,aACtB,OAAO;EAGX,IAAM,IAAO,MAAM,KAAK,KAAc;GAAE,MAAM;GAAuB,MAAM,EAAE,kBAAe;EAAE,CAAC;EAC/F,IAAI,MAAe,KAAK,YACtB,OAAO;EACT,IAAM,IAAS,EAAkB,UAAU,CAAI;EAC/C,IAAI,CAAC,EAAO,SACV,MAAM,OAAO,OAAO,gBAAI,MAAM,kDAAkD,GAAG,EAAE,MAAM,qBAAqB,CAAC;EACnH,OAAO,EAAO;CAChB;CAEA,eAAuB,GAAgB,GAAyC;EAC9E,OAAO,aAAiB,QACpB;GACE,MAAM,UAAU,IAAQ,OAAQ,EAAoC,IAAI,IAAI;GAC5E,SAAS,EAAM;EACjB,IACA;GAAE,MAAM;GAAc,SAAS;EAAiC;CACtE;AACF"}
|
|
@@ -1,18 +1,10 @@
|
|
|
1
|
-
import { ChatAttachmentInput, ChatToolActivityData } from '@pagelines/core';
|
|
1
|
+
import { ChatAttachmentInput, ChatToolActivityData, ChatStreamError } from '@pagelines/core';
|
|
2
2
|
import { ChatMessage } from '../agent/schema';
|
|
3
3
|
import { SDKContext } from './types';
|
|
4
4
|
type CancelConversationTurnResponse = {
|
|
5
5
|
cancelled: boolean;
|
|
6
6
|
cancelledTurnIds: string[];
|
|
7
7
|
};
|
|
8
|
-
export interface ChatStreamError {
|
|
9
|
-
code: string;
|
|
10
|
-
error: string;
|
|
11
|
-
bucket?: 'account' | 'error';
|
|
12
|
-
actionLabel?: string;
|
|
13
|
-
actionUrl?: string;
|
|
14
|
-
help?: string;
|
|
15
|
-
}
|
|
16
8
|
export declare class ChatClient {
|
|
17
9
|
private ctx;
|
|
18
10
|
constructor(ctx: SDKContext);
|