@pagelines/sdk 1.0.148

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +542 -0
  2. package/dist/AgentProvider.vue_vue_type_script_setup_true_lang-BGCgpGEW.js +42 -0
  3. package/dist/AgentProvider.vue_vue_type_script_setup_true_lang-BGCgpGEW.js.map +1 -0
  4. package/dist/AgentWidgetInline-pTCUPNqY.js +35 -0
  5. package/dist/AgentWidgetInline-pTCUPNqY.js.map +1 -0
  6. package/dist/AgentWidgetModal-BA74AH8E.js +66 -0
  7. package/dist/AgentWidgetModal-BA74AH8E.js.map +1 -0
  8. package/dist/AgentWidgetPopup-pe5CmJfa.js +117 -0
  9. package/dist/AgentWidgetPopup-pe5CmJfa.js.map +1 -0
  10. package/dist/AgentWrap.vue_vue_type_script_setup_true_lang-Bvik7Wdb.js +5139 -0
  11. package/dist/AgentWrap.vue_vue_type_script_setup_true_lang-Bvik7Wdb.js.map +1 -0
  12. package/dist/FModal.vue_vue_type_script_setup_true_lang-cL0BFEkZ.js +172 -0
  13. package/dist/FModal.vue_vue_type_script_setup_true_lang-cL0BFEkZ.js.map +1 -0
  14. package/dist/agent/AgentController.d.ts +81 -0
  15. package/dist/agent/ClientAudio.d.ts +102 -0
  16. package/dist/agent/constants.d.ts +16 -0
  17. package/dist/agent/index.d.ts +10 -0
  18. package/dist/agent/schema.d.ts +46 -0
  19. package/dist/agent/test/AgentController.test.d.ts +1 -0
  20. package/dist/agent/test/utils.test.d.ts +1 -0
  21. package/dist/agent/ui/AgentChat.vue.d.ts +27 -0
  22. package/dist/agent/ui/AgentInputEmail.vue.d.ts +9 -0
  23. package/dist/agent/ui/AgentInputOneTimeCode.vue.d.ts +13 -0
  24. package/dist/agent/ui/AgentModal.vue.d.ts +16 -0
  25. package/dist/agent/ui/AgentProvider.vue.d.ts +22 -0
  26. package/dist/agent/ui/AgentSidebarClose.vue.d.ts +6 -0
  27. package/dist/agent/ui/AgentWidget.vue.d.ts +17 -0
  28. package/dist/agent/ui/AgentWrap.vue.d.ts +128 -0
  29. package/dist/agent/ui/ElAgentAbout.vue.d.ts +6 -0
  30. package/dist/agent/ui/ElAgentButton.vue.d.ts +26 -0
  31. package/dist/agent/ui/ElAgentChat.vue.d.ts +11 -0
  32. package/dist/agent/ui/ElAgentHeader.vue.d.ts +6 -0
  33. package/dist/agent/ui/ElAgentModeSidebar.vue.d.ts +11 -0
  34. package/dist/agent/ui/ElAgentSidebar.vue.d.ts +14 -0
  35. package/dist/agent/ui/ElAuthGate.vue.d.ts +6 -0
  36. package/dist/agent/ui/ElModeHeader.vue.d.ts +9 -0
  37. package/dist/agent/ui/ElSidebar.vue.d.ts +30 -0
  38. package/dist/agent/utils.d.ts +34 -0
  39. package/dist/agent.js +162 -0
  40. package/dist/agent.js.map +1 -0
  41. package/dist/api.d.ts +23 -0
  42. package/dist/constants/socialPlatforms.d.ts +10 -0
  43. package/dist/demo/index.d.ts +105 -0
  44. package/dist/demo.js +264 -0
  45. package/dist/demo.js.map +1 -0
  46. package/dist/index.d.ts +7 -0
  47. package/dist/sdk.css +1 -0
  48. package/dist/sdk.js +9 -0
  49. package/dist/sdk.js.map +1 -0
  50. package/dist/sdkClient-BmWhfelO.js +939 -0
  51. package/dist/sdkClient-BmWhfelO.js.map +1 -0
  52. package/dist/sdkClient.d.ts +762 -0
  53. package/dist/sdkStorage.d.ts +39 -0
  54. package/dist/socialPlatforms-Ck-b3SnQ.js +82 -0
  55. package/dist/socialPlatforms-Ck-b3SnQ.js.map +1 -0
  56. package/dist/test/api.test.d.ts +1 -0
  57. package/dist/test/build.test.d.ts +1 -0
  58. package/dist/types/SDKAppType.stub.d.ts +6 -0
  59. package/dist/vite-env.d.ts +13 -0
  60. package/dist/vite.config.sdk.d.ts +2 -0
  61. package/dist/vitest.config.d.ts +2 -0
  62. package/dist/widget/PLWidget.d.ts +55 -0
  63. package/dist/widget/composables/usePLWidget.d.ts +57 -0
  64. package/dist/widget/index.d.ts +4 -0
  65. package/dist/widget/ui/AgentWidgetInline.vue.d.ts +17 -0
  66. package/dist/widget/ui/AgentWidgetModal.vue.d.ts +22 -0
  67. package/dist/widget/ui/AgentWidgetPopup.vue.d.ts +24 -0
  68. package/dist/widget.js +188 -0
  69. package/dist/widget.js.map +1 -0
  70. package/package.json +94 -0
@@ -0,0 +1,172 @@
1
+ var M = Object.defineProperty;
2
+ var b = (e, l) => M(e, "name", { value: l, configurable: !0 });
3
+ import { defineComponent as z, ref as m, onMounted as g, createElementBlock as r, openBlock as s, createElementVNode as i, normalizeClass as d, watch as A, onUnmounted as S, computed as V, createBlock as C, createCommentVNode as n, Teleport as E, createVNode as x, Transition as h, withCtx as k, normalizeProps as N, guardReactiveProps as j, withModifiers as w, renderSlot as T, toDisplayString as P } from "vue";
4
+ const U = { class: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[28px] h-[28px] overflow-hidden" }, D = /* @__PURE__ */ z({
5
+ name: "FClose",
6
+ __name: "FClose",
7
+ emits: ["click"],
8
+ setup(e) {
9
+ const l = m(!1);
10
+ return g(() => {
11
+ setTimeout(() => {
12
+ l.value = !0;
13
+ }, 100);
14
+ }), (c, o) => (s(), r("a", {
15
+ class: "close block cursor-pointer w-[60px] h-[60px] rounded-full transition-all duration-1000 ease-[cubic-bezier(0.25,1,0.33,1)] hover:scale-110 active:scale-90 hover:rotate-90",
16
+ onClick: o[0] || (o[0] = (u) => c.$emit("click", u))
17
+ }, [
18
+ o[1] || (o[1] = i("span", { class: "absolute inset-0 rounded-full transition-all" }, null, -1)),
19
+ i("span", U, [
20
+ i("span", {
21
+ class: d(["absolute h-full w-[3px] rounded-[5px] left-[13px] transition-all duration-[400ms] ease-[cubic-bezier(0.52,0.01,0.16,1)]", l.value ? "translate-y-0 translate-x-0 rotate-45" : "translate-y-[30px] -translate-x-[30px] rotate-0"]),
22
+ style: { "background-color": "currentColor", "transition-delay": "0.15s" }
23
+ }, null, 2),
24
+ i("span", {
25
+ class: d(["absolute h-full w-[3px] rounded-[5px] left-[13px] transition-all duration-[400ms] ease-[cubic-bezier(0.52,0.01,0.16,1)]", l.value ? "translate-y-0 translate-x-0 -rotate-45" : "-translate-y-[30px] -translate-x-[30px] rotate-0"]),
26
+ style: { "background-color": "currentColor", "transition-delay": "0.45s" }
27
+ }, null, 2)
28
+ ])
29
+ ]));
30
+ }
31
+ }), R = { class: "flex h-full overflow-scroll no-scrollbar items-center justify-center text-center p-4 py-8" }, q = {
32
+ key: 0,
33
+ class: "text-base p-4 font-semibold"
34
+ }, G = {
35
+ key: 1,
36
+ class: "flex items-center gap-2 px-2"
37
+ }, H = {
38
+ inheritAttrs: !1
39
+ }, K = /* @__PURE__ */ z({
40
+ ...H,
41
+ name: "FModal",
42
+ __name: "FModal",
43
+ props: {
44
+ vis: { type: Boolean, default: !1 },
45
+ modalClass: {},
46
+ styleClass: {},
47
+ fullScreen: { type: Boolean, default: !1 },
48
+ hasClose: { type: Boolean, default: !1 },
49
+ title: { default: "" },
50
+ transitionMode: { default: "modal" },
51
+ teleportTo: { default: "body" },
52
+ disableTeleport: { type: Boolean, default: !1 }
53
+ },
54
+ emits: ["update:vis", "close", "escape"],
55
+ setup(e, { emit: l }) {
56
+ const c = l, o = m(!1);
57
+ function u(a) {
58
+ const { reason: t } = a;
59
+ c("update:vis", !1), c("close", !0), t === "escape" && c("escape", !0);
60
+ }
61
+ b(u, "close");
62
+ const f = e.modalClass ? [e.modalClass] : ["max-w-screen-md p-24"], $ = e.styleClass ? [e.styleClass] : ["bg-theme-0 text-theme-900", "shadow-xl"];
63
+ e.fullScreen ? f.push("fixed inset-0") : f.push("rounded-2xl my-6 mx-3");
64
+ const F = [
65
+ "relative",
66
+ "text-left",
67
+ "transform",
68
+ "transition-all",
69
+ "w-full",
70
+ "overflow-hidden",
71
+ ...f,
72
+ ...$
73
+ ], v = m(!1), y = [];
74
+ g(async () => {
75
+ o.value = !0;
76
+ const a = A(
77
+ () => e.vis,
78
+ (t) => {
79
+ t ? setTimeout(() => v.value = !0, 300) : v.value = !1;
80
+ },
81
+ { immediate: !0 }
82
+ );
83
+ y.push(a);
84
+ }), S(() => {
85
+ y.forEach((a) => a());
86
+ });
87
+ const B = V(() => e.transitionMode === "slideUp" ? {
88
+ enterActiveClass: "ease-[cubic-bezier(0.25,1,0.33,1)] duration-500",
89
+ enterFromClass: "opacity-0 translate-y-full scale-95",
90
+ enterToClass: "opacity-100 translate-y-0 scale-100",
91
+ leaveActiveClass: "ease-[cubic-bezier(0.25,1,0.33,1)] duration-500",
92
+ leaveFromClass: "opacity-100 translate-y-0 scale-100",
93
+ leaveToClass: "opacity-0 translate-y-full scale-95"
94
+ } : {
95
+ enterActiveClass: "ease-[cubic-bezier(0.25,1,0.33,1)] duration-500",
96
+ enterFromClass: "opacity-0 scale-75",
97
+ enterToClass: "opacity-100 translate-y-0 scale-100",
98
+ leaveActiveClass: "ease-[cubic-bezier(0.25,1,0.33,1)] duration-500",
99
+ leaveFromClass: "opacity-100 translate-y-0 scale-100",
100
+ leaveToClass: "opacity-0 scale-75"
101
+ });
102
+ return (a, t) => o.value ? (s(), C(E, {
103
+ key: 0,
104
+ to: e.teleportTo,
105
+ disabled: e.disableTeleport
106
+ }, [
107
+ i("div", {
108
+ class: d(["fixed inset-0 z-50", e.vis ? "" : "pointer-events-none"]),
109
+ "aria-labelledby": "modal-title",
110
+ role: "dialog",
111
+ "aria-modal": "true"
112
+ }, [
113
+ x(h, {
114
+ "enter-active-class": "ease-out duration-300",
115
+ "enter-from-class": "opacity-0",
116
+ "enter-to-class": "opacity-100",
117
+ "leave-active-class": "ease-in duration-200",
118
+ "leave-from-class": "opacity-100",
119
+ "leave-to-class": "opacity-0"
120
+ }, {
121
+ default: k(() => [
122
+ e.vis ? (s(), r("div", {
123
+ key: 0,
124
+ class: "fixed inset-0 bg-theme-800/60 active:bg-theme-800/80 cursor-pointer dark:bg-theme-600/90 backdrop-blur-sm transition-opacity",
125
+ onClick: t[0] || (t[0] = (p) => u({ reason: "escape" }))
126
+ })) : n("", !0)
127
+ ]),
128
+ _: 1
129
+ }),
130
+ i("div", {
131
+ class: "fixed inset-0 z-40 overflow-y-auto",
132
+ onClick: t[3] || (t[3] = (p) => u({ reason: "escape" }))
133
+ }, [
134
+ i("div", R, [
135
+ x(h, N(j(B.value)), {
136
+ default: k(() => [
137
+ e.vis ? (s(), r("div", {
138
+ key: 0,
139
+ class: d([F, "w-full"]),
140
+ onClick: t[2] || (t[2] = w(() => {
141
+ }, ["stop"]))
142
+ }, [
143
+ e.hasClose || e.title || a.$slots.actions ? (s(), r("div", {
144
+ key: 0,
145
+ class: d(!e.title && (e.hasClose || a.$slots.actions) ? "absolute top-0 right-0 z-10" : "flex justify-between items-center")
146
+ }, [
147
+ e.title ? (s(), r("h2", q, P(e.title), 1)) : n("", !0),
148
+ e.hasClose || a.$slots.actions ? (s(), r("div", G, [
149
+ T(a.$slots, "actions"),
150
+ e.hasClose ? (s(), C(D, {
151
+ key: 0,
152
+ class: "relative",
153
+ "data-test-id": "close-modal",
154
+ onClick: t[1] || (t[1] = w((p) => u({ reason: "escape" }), ["stop"]))
155
+ })) : n("", !0)
156
+ ])) : n("", !0)
157
+ ], 2)) : n("", !0),
158
+ T(a.$slots, "default")
159
+ ])) : n("", !0)
160
+ ]),
161
+ _: 3
162
+ }, 16)
163
+ ])
164
+ ])
165
+ ], 2)
166
+ ], 8, ["to", "disabled"])) : n("", !0);
167
+ }
168
+ });
169
+ export {
170
+ K as _
171
+ };
172
+ //# sourceMappingURL=FModal.vue_vue_type_script_setup_true_lang-cL0BFEkZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FModal.vue_vue_type_script_setup_true_lang-cL0BFEkZ.js","sources":["../../../src/ui/common/FClose.vue","../../../src/ui/common/FModal.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { onMounted, ref } from 'vue'\n\ndefineOptions({ name: 'FClose' })\n\ndefineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst inView = ref(false)\n\nonMounted(() => {\n setTimeout(() => {\n inView.value = true\n }, 100)\n})\n</script>\n\n<template>\n <a\n class=\"close block cursor-pointer w-[60px] h-[60px] rounded-full transition-all duration-1000 ease-[cubic-bezier(0.25,1,0.33,1)] hover:scale-110 active:scale-90 hover:rotate-90\"\n @click=\"$emit('click', $event)\"\n >\n <!-- Background circle (invisible, for hover area) -->\n <span class=\"absolute inset-0 rounded-full transition-all\" />\n\n <!-- Close lines container -->\n <span class=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[28px] h-[28px] overflow-hidden\">\n <!-- Line 1 - animates from bottom-left to center, rotates 45deg -->\n <span\n class=\"absolute h-full w-[3px] rounded-[5px] left-[13px] transition-all duration-[400ms] ease-[cubic-bezier(0.52,0.01,0.16,1)]\"\n :class=\"inView ? 'translate-y-0 translate-x-0 rotate-45' : 'translate-y-[30px] -translate-x-[30px] rotate-0'\"\n style=\"background-color: currentColor; transition-delay: 0.15s\"\n />\n\n <!-- Line 2 - animates from top-left to center, rotates -45deg -->\n <span\n class=\"absolute h-full w-[3px] rounded-[5px] left-[13px] transition-all duration-[400ms] ease-[cubic-bezier(0.52,0.01,0.16,1)]\"\n :class=\"inView ? 'translate-y-0 translate-x-0 -rotate-45' : '-translate-y-[30px] -translate-x-[30px] rotate-0'\"\n style=\"background-color: currentColor; transition-delay: 0.45s\"\n />\n </span>\n </a>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, onMounted, onUnmounted, ref, watch } from 'vue'\nimport FClose from './FClose.vue'\n\ndefineOptions({ name: 'FModal' })\n\nconst {\n vis = false,\n modalClass,\n styleClass,\n fullScreen = false,\n hasClose = false,\n title = '',\n transitionMode = 'modal',\n teleportTo = 'body',\n disableTeleport = false,\n} = defineProps<{\n vis?: boolean\n modalClass?: string\n styleClass?: string\n fullScreen?: boolean\n hasClose?: boolean\n title?: string\n transitionMode?: 'modal' | 'slideUp'\n teleportTo?: string | Element\n disableTeleport?: boolean\n}>()\n\nconst emit = defineEmits<{\n 'update:vis': [value: boolean]\n 'close': [value: boolean]\n 'escape': [value: boolean]\n}>()\n\nconst isMounted = ref(false)\n\nfunction close(args: { reason: 'escape' | 'reset' }): void {\n const { reason } = args\n emit('update:vis', false)\n emit('close', true)\n if (reason === 'escape')\n emit('escape', true)\n}\n\nconst cls = modalClass ? [modalClass] : ['max-w-screen-md p-24']\nconst defaultStyleClass = styleClass ? [styleClass] : ['bg-theme-0 text-theme-900', 'shadow-xl']\n\nif (fullScreen)\n cls.push('fixed inset-0')\nelse\n cls.push('rounded-2xl my-6 mx-3')\n\nconst classes = [\n 'relative',\n 'text-left',\n 'transform',\n 'transition-all',\n 'w-full',\n 'overflow-hidden',\n ...cls,\n ...defaultStyleClass,\n]\n\nconst afterVisible = ref(false)\nconst cleanups: (() => void)[] = []\n\nonMounted(async () => {\n isMounted.value = true\n\n const unwatch = watch(\n () => vis,\n (vis) => {\n if (vis) {\n setTimeout(() => (afterVisible.value = true), 300)\n } else {\n afterVisible.value = false\n }\n },\n { immediate: true },\n )\n\n cleanups.push(unwatch)\n})\n\nonUnmounted(() => {\n cleanups.forEach((c) => c())\n})\n\nconst modalTransition = computed(() => {\n if (transitionMode === 'slideUp') {\n return {\n enterActiveClass: 'ease-[cubic-bezier(0.25,1,0.33,1)] duration-500',\n enterFromClass: 'opacity-0 translate-y-full scale-95',\n enterToClass: 'opacity-100 translate-y-0 scale-100',\n leaveActiveClass: 'ease-[cubic-bezier(0.25,1,0.33,1)] duration-500',\n leaveFromClass: 'opacity-100 translate-y-0 scale-100',\n leaveToClass: 'opacity-0 translate-y-full scale-95',\n }\n }\n return {\n enterActiveClass: 'ease-[cubic-bezier(0.25,1,0.33,1)] duration-500',\n enterFromClass: 'opacity-0 scale-75',\n enterToClass: 'opacity-100 translate-y-0 scale-100',\n leaveActiveClass: 'ease-[cubic-bezier(0.25,1,0.33,1)] duration-500',\n leaveFromClass: 'opacity-100 translate-y-0 scale-100',\n leaveToClass: 'opacity-0 scale-75',\n }\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n inheritAttrs: false,\n}\n</script>\n\n<template>\n <Teleport v-if=\"isMounted\" :to=\"teleportTo\" :disabled=\"disableTeleport\">\n <div\n class=\"fixed inset-0 z-50\"\n aria-labelledby=\"modal-title\"\n role=\"dialog\"\n aria-modal=\"true\"\n :class=\"!vis ? 'pointer-events-none' : ''\"\n >\n <Transition\n enter-active-class=\"ease-out duration-300\"\n enter-from-class=\"opacity-0\"\n enter-to-class=\"opacity-100\"\n leave-active-class=\"ease-in duration-200\"\n leave-from-class=\"opacity-100\"\n leave-to-class=\"opacity-0\"\n >\n <div\n v-if=\"vis\"\n class=\"fixed inset-0 bg-theme-800/60 active:bg-theme-800/80 cursor-pointer dark:bg-theme-600/90 backdrop-blur-sm transition-opacity\"\n @click=\"close({ reason: 'escape' })\"\n />\n </Transition>\n <div\n class=\"fixed inset-0 z-40 overflow-y-auto\"\n @click=\"close({ reason: 'escape' })\"\n >\n <div class=\"flex h-full overflow-scroll no-scrollbar items-center justify-center text-center p-4 py-8\">\n <Transition v-bind=\"modalTransition\">\n <div\n v-if=\"vis\"\n :class=\"classes\"\n class=\"w-full\"\n @click.stop\n >\n <div\n v-if=\"hasClose || title || $slots.actions\"\n :class=\"!title && (hasClose || $slots.actions) ? 'absolute top-0 right-0 z-10' : 'flex justify-between items-center'\"\n >\n <h2 v-if=\"title\" class=\"text-base p-4 font-semibold\">\n {{ title }}\n </h2>\n <div v-if=\"hasClose || $slots.actions\" class=\"flex items-center gap-2 px-2\">\n <slot name=\"actions\" />\n <FClose\n v-if=\"hasClose\"\n class=\"relative\"\n data-test-id=\"close-modal\"\n @click.stop=\"close({ reason: 'escape' })\"\n />\n </div>\n </div>\n <slot />\n </div>\n </Transition>\n </div>\n </div>\n </div>\n </Teleport>\n</template>\n"],"names":["inView","ref","onMounted","_createElementBlock","_cache","$event","$emit","_createElementVNode","_hoisted_1","_normalizeClass","__default__","emit","__emit","isMounted","close","args","reason","__name","cls","__props","defaultStyleClass","classes","afterVisible","cleanups","unwatch","watch","vis","onUnmounted","c","modalTransition","computed","_createBlock","_Teleport","_createVNode","_Transition","$slots","_hoisted_2","_toDisplayString","_openBlock","_hoisted_3","_renderSlot","_ctx","FClose"],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import { Ref } from 'vue';
2
+ import { PageLinesSDK } from '../sdkClient';
3
+ import { AgentMode, ChatMessage, Agent, TextConnectionState, VoiceConnectionState } from './schema';
4
+ import { SettingsObject } from '../../../src/utils/base';
5
+ import { ClientAudio } from './ClientAudio';
6
+ interface AgentCallbacks {
7
+ onConnect?: () => void;
8
+ onDisconnect?: () => void;
9
+ onError?: (error: Error) => void;
10
+ onModeChange?: (mode: string) => void;
11
+ onMessage?: (message: unknown) => void;
12
+ onAudioLevel?: (levels: {
13
+ inputLevel: number;
14
+ outputLevel: number;
15
+ }) => void;
16
+ }
17
+ type AgentControllerSettings = {
18
+ sdk: PageLinesSDK;
19
+ agent: Agent;
20
+ context?: string;
21
+ firstMessage?: string;
22
+ };
23
+ export declare class AgentController extends SettingsObject<AgentControllerSettings> {
24
+ private conversation?;
25
+ private isTextMode;
26
+ private lastMessage;
27
+ private clientAudio;
28
+ private unwatchAudio?;
29
+ private isConnecting;
30
+ private conversationId?;
31
+ private sessionId?;
32
+ private conversationStartTime?;
33
+ private hostParticipantId?;
34
+ private visitorParticipantId?;
35
+ voiceState: Ref<VoiceConnectionState>;
36
+ textState: Ref<TextConnectionState>;
37
+ agentMode: Ref<AgentMode>;
38
+ sharedMessages: Ref<ChatMessage[]>;
39
+ constructor(settings: AgentControllerSettings);
40
+ get chatEnabled(): boolean;
41
+ get chatUnavailableReason(): string | undefined;
42
+ get audioLevels(): Ref<{
43
+ inputLevel: number;
44
+ outputLevel: number;
45
+ }, import('./schema').AudioLevel | {
46
+ inputLevel: number;
47
+ outputLevel: number;
48
+ }>;
49
+ getClientAudio(): ClientAudio;
50
+ getOutputFrequencyData(): Uint8Array | null;
51
+ getInputFrequencyData(): Uint8Array | null;
52
+ private mapChatError;
53
+ private isTransientError;
54
+ private isDuplicateMessage;
55
+ private addMessage;
56
+ getDynamicSettings(): {
57
+ context: string;
58
+ firstMessage: string;
59
+ };
60
+ private updateState;
61
+ private resetState;
62
+ private setupModeWatcher;
63
+ handleMessage(message: {
64
+ message: string;
65
+ source: string;
66
+ }, isVoice: boolean): void;
67
+ private handleError;
68
+ setMode(mode: AgentMode): Promise<void>;
69
+ startVoiceConversation(_callbacks?: AgentCallbacks): Promise<void>;
70
+ startTextConversation(callbacks?: AgentCallbacks): Promise<void>;
71
+ endConversation(): Promise<void>;
72
+ sendChatMessage(message: string): Promise<void>;
73
+ private buildHistory;
74
+ isConnected(): boolean;
75
+ isVoiceConnected(): boolean;
76
+ isTextConnected(): boolean;
77
+ destroy(): Promise<void>;
78
+ private endSession;
79
+ private resetSession;
80
+ }
81
+ export {};
@@ -0,0 +1,102 @@
1
+ import { AudioLevel } from './schema';
2
+ import { SettingsObject } from '../../../src/utils/base';
3
+ export type AudioPermissionOptions = {
4
+ noiseSuppression?: boolean;
5
+ echoCancellation?: boolean;
6
+ autoGainControl?: boolean;
7
+ voiceIsolation?: boolean;
8
+ };
9
+ type ClientAudioSettings = {
10
+ [key: string]: unknown;
11
+ };
12
+ export declare class ClientAudio extends SettingsObject<ClientAudioSettings> {
13
+ private audioContext?;
14
+ private analyser?;
15
+ private microphone?;
16
+ private audioLevelInterval?;
17
+ private stream?;
18
+ private visibilityChangeHandler?;
19
+ private vadTimeout?;
20
+ private lastSpeechTime;
21
+ private readonly VAD_SILENCE_THRESHOLD;
22
+ private readonly VAD_SILENCE_DURATION;
23
+ audioLevels: import('vue').Ref<{
24
+ inputLevel: number;
25
+ outputLevel: number;
26
+ }, AudioLevel | {
27
+ inputLevel: number;
28
+ outputLevel: number;
29
+ }>;
30
+ constructor(args: ClientAudioSettings);
31
+ /**
32
+ * Setup iOS-specific visibility change handler
33
+ */
34
+ private setupVisibilityHandler;
35
+ /**
36
+ * Handle app going to background (Privacy & Security Best Practice)
37
+ * CRITICAL: Must stop microphone tracks to remove indicator on mobile/browser
38
+ */
39
+ private handleAppBackground;
40
+ /**
41
+ * Handle app returning to foreground
42
+ * SECURITY: Do NOT auto-restart microphone - requires user gesture (browser security model)
43
+ */
44
+ private handleAppForeground;
45
+ /**
46
+ * Request microphone permission with voice isolation and setup audio analysis
47
+ * Returns the MediaStream for the bot to reuse (prevents dual stream conflicts)
48
+ */
49
+ requestMicrophonePermission(options?: AudioPermissionOptions): Promise<boolean>;
50
+ /**
51
+ * Get the microphone stream for the bot to reuse
52
+ * CRITICAL: This prevents dual stream conflicts that break the analyser
53
+ */
54
+ getMicrophoneStream(): MediaStream | undefined;
55
+ /**
56
+ * Setup audio analysis for level monitoring
57
+ */
58
+ private setupAudioAnalysis;
59
+ /**
60
+ * Detect voice activity (returns true if user is speaking)
61
+ * Used for client-side VAD to prevent background noise issues
62
+ */
63
+ private detectVoiceActivity;
64
+ /**
65
+ * Check if user has stopped speaking (silence detected)
66
+ * Returns true if VAD_SILENCE_DURATION has passed since last speech
67
+ */
68
+ hasUserStoppedSpeaking(): boolean;
69
+ /**
70
+ * Start monitoring audio levels with VAD detection
71
+ */
72
+ startAudioLevelMonitoring(isConnected?: () => boolean, onSilenceDetected?: () => void): void;
73
+ /**
74
+ * Stop monitoring audio levels
75
+ */
76
+ stopAudioLevelMonitoring(): void;
77
+ /**
78
+ * Reset audio levels to zero
79
+ */
80
+ resetAudioLevels(): void;
81
+ /**
82
+ * Check if audio context is available
83
+ */
84
+ isAudioContextAvailable(): boolean;
85
+ /**
86
+ * Get current audio context state
87
+ */
88
+ getAudioContextState(): AudioContextState | undefined;
89
+ /**
90
+ * Get shared analyser for AudioVisualizer (prevents duplicate audio contexts)
91
+ */
92
+ getSharedAnalyser(): AnalyserNode | undefined;
93
+ /**
94
+ * Stop microphone and cleanup audio stream
95
+ */
96
+ stopMicrophone(): Promise<void>;
97
+ /**
98
+ * Cleanup all audio resources (call on destroy)
99
+ */
100
+ cleanup(): Promise<void>;
101
+ }
102
+ export {};
@@ -0,0 +1,16 @@
1
+ export declare const AUDIO_FFT_SIZE = 256;
2
+ export declare const AUDIO_SMOOTHING = 0.8;
3
+ export declare const AUDIO_LEVEL_UPDATE_INTERVAL = 50;
4
+ export declare const VISUALIZER_CONFIG: {
5
+ bars: number;
6
+ barWidth: number;
7
+ barSpacing: number;
8
+ minHeight: number;
9
+ maxHeight: number;
10
+ STIFFNESS: number;
11
+ DAMPING: number;
12
+ PEAK_HOLD_TIME: number;
13
+ PEAK_DECAY_STIFFNESS: number;
14
+ PEAK_DECAY_DAMPING: number;
15
+ };
16
+ export declare const VOICE_FREQUENCIES: number[];
@@ -0,0 +1,10 @@
1
+ import { default as AgentChat } from './ui/AgentChat.vue';
2
+ import { default as AgentModal } from './ui/AgentModal.vue';
3
+ import { default as AgentProvider } from './ui/AgentProvider.vue';
4
+ import { default as AgentWidget } from './ui/AgentWidget.vue';
5
+ import { default as AgentWrap } from './ui/AgentWrap.vue';
6
+ export { ClientAudio } from './ClientAudio';
7
+ export * from './constants';
8
+ export * from './schema';
9
+ export { AgentChat, AgentModal, AgentProvider, AgentWidget, AgentWrap };
10
+ export * from './utils';
@@ -0,0 +1,46 @@
1
+ export type { Agent } from '@pagelines/types';
2
+ export interface ChatMessage {
3
+ id: string;
4
+ text: string;
5
+ sender: 'user' | 'agent' | 'system';
6
+ timestamp: Date;
7
+ }
8
+ export interface VoiceConnectionState {
9
+ isActive: boolean;
10
+ isConnected: boolean;
11
+ isSpeaking: boolean;
12
+ isListening: boolean;
13
+ isProcessing: boolean;
14
+ transcript?: string;
15
+ connectionStatus: 'connecting' | 'connected' | 'disconnected' | 'error';
16
+ error?: string;
17
+ }
18
+ export interface TextConnectionState {
19
+ isActive: boolean;
20
+ isConnected: boolean;
21
+ isThinking: boolean;
22
+ connectionStatus: 'connecting' | 'connected' | 'disconnected' | 'error';
23
+ error?: string;
24
+ }
25
+ export interface AudioLevel {
26
+ inputLevel: number;
27
+ outputLevel: number;
28
+ }
29
+ export declare const AGENT_MODES: readonly [{
30
+ readonly mode: "self";
31
+ readonly label: "Overview";
32
+ readonly icon: "i-tabler-user-square-rounded";
33
+ }, {
34
+ readonly mode: "talk";
35
+ readonly label: "Talk";
36
+ readonly icon: "i-tabler-phone";
37
+ }, {
38
+ readonly mode: "chat";
39
+ readonly label: "Chat";
40
+ readonly icon: "i-tabler-message-circle";
41
+ }, {
42
+ readonly mode: "info";
43
+ readonly label: "About";
44
+ readonly icon: "i-tabler-user-circle";
45
+ }];
46
+ export type AgentMode = (typeof AGENT_MODES)[number]['mode'];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,27 @@
1
+ import { Agent } from '@pagelines/types';
2
+ import { PageLinesSDK } from '../../sdkClient';
3
+ import { ButtonIconPreset } from '../../widget/PLWidget';
4
+ import { ColorName } from '../../../../src/utils/color';
5
+ type __VLS_Props = {
6
+ sdk: PageLinesSDK;
7
+ agent: Agent;
8
+ context?: string;
9
+ firstMessage?: string;
10
+ buttonText?: string;
11
+ buttonIcon?: ButtonIconPreset;
12
+ hasClose?: boolean;
13
+ isActive?: boolean;
14
+ loading?: boolean;
15
+ theme?: ColorName;
16
+ requireAuth?: boolean;
17
+ };
18
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
19
+ error: (message: string) => any;
20
+ close: (value: string) => any;
21
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
22
+ onError?: ((message: string) => any) | undefined;
23
+ onClose?: ((value: string) => any) | undefined;
24
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
25
+ rootElement: HTMLDivElement;
26
+ }, HTMLDivElement>;
27
+ export default _default;
@@ -0,0 +1,9 @@
1
+ type __VLS_Props = {
2
+ modelValue?: string;
3
+ };
4
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
5
+ "update:modelValue": (value: string) => any;
6
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
7
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
8
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLInputElement>;
9
+ export default _default;
@@ -0,0 +1,13 @@
1
+ type __VLS_Props = {
2
+ modelValue: string;
3
+ length: number;
4
+ focusFirst?: boolean;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
7
+ "update:modelValue": (value: string) => any;
8
+ autoSubmit: (value: string) => any;
9
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
10
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
11
+ onAutoSubmit?: ((value: string) => any) | undefined;
12
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
13
+ export default _default;
@@ -0,0 +1,16 @@
1
+ import { PageLinesSDK } from '../../sdkClient';
2
+ import { Agent } from '../schema';
3
+ type __VLS_Props = {
4
+ vis?: boolean;
5
+ sdk?: PageLinesSDK;
6
+ agent?: Agent;
7
+ handle?: string;
8
+ context?: string;
9
+ firstMessage?: string;
10
+ };
11
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
12
+ "update:vis": (value: boolean) => any;
13
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
14
+ "onUpdate:vis"?: ((value: boolean) => any) | undefined;
15
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
16
+ export default _default;
@@ -0,0 +1,22 @@
1
+ import { PageLinesSDK } from '../../sdkClient';
2
+ import { ButtonIconPreset } from '../../widget/PLWidget';
3
+ import { Agent } from '../schema';
4
+ type __VLS_Props = {
5
+ sdk?: PageLinesSDK;
6
+ agent?: Agent;
7
+ handle?: string;
8
+ context?: string;
9
+ firstMessage?: string;
10
+ buttonText?: string;
11
+ buttonIcon?: ButtonIconPreset;
12
+ hasClose?: boolean;
13
+ apiBase?: string;
14
+ };
15
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
16
+ error: (message: string) => any;
17
+ close: (value: string) => any;
18
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
19
+ onError?: ((message: string) => any) | undefined;
20
+ onClose?: ((value: string) => any) | undefined;
21
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
22
+ export default _default;
@@ -0,0 +1,6 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
2
+ click: (event: MouseEvent) => any;
3
+ }, string, import('vue').PublicProps, Readonly<{}> & Readonly<{
4
+ onClick?: ((event: MouseEvent) => any) | undefined;
5
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLAnchorElement>;
6
+ export default _default;
@@ -0,0 +1,17 @@
1
+ import { PageLinesSDK } from '../../sdkClient';
2
+ interface Props {
3
+ sdk?: PageLinesSDK;
4
+ handle: string;
5
+ context?: string;
6
+ firstMessage?: string;
7
+ position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
8
+ }
9
+ declare function toggle(): void;
10
+ declare function open(): void;
11
+ declare function close(): void;
12
+ declare const _default: import('vue').DefineComponent<Props, {
13
+ toggle: typeof toggle;
14
+ open: typeof open;
15
+ close: typeof close;
16
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
17
+ export default _default;