@smooai/smooth-operator 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -4
- package/dist/react/components/SmoothChat.d.ts +35 -0
- package/dist/react/components/SmoothChat.d.ts.map +1 -0
- package/dist/react/components/SmoothChat.js +26 -0
- package/dist/react/components/SmoothChat.js.map +1 -0
- package/dist/react/components/parts.d.ts +30 -0
- package/dist/react/components/parts.d.ts.map +1 -0
- package/dist/react/components/parts.js +67 -0
- package/dist/react/components/parts.js.map +1 -0
- package/dist/react/index.d.ts +27 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +26 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/provider.d.ts +27 -0
- package/dist/react/provider.d.ts.map +1 -0
- package/dist/react/provider.js +25 -0
- package/dist/react/provider.js.map +1 -0
- package/dist/react/response.d.ts +19 -0
- package/dist/react/response.d.ts.map +1 -0
- package/dist/react/response.js +53 -0
- package/dist/react/response.js.map +1 -0
- package/dist/react/theme.d.ts +64 -0
- package/dist/react/theme.d.ts.map +1 -0
- package/dist/react/theme.js +38 -0
- package/dist/react/theme.js.map +1 -0
- package/dist/react/types.d.ts +24 -0
- package/dist/react/types.d.ts.map +1 -0
- package/dist/react/types.js +2 -0
- package/dist/react/types.js.map +1 -0
- package/dist/react/use-conversation.d.ts +59 -0
- package/dist/react/use-conversation.d.ts.map +1 -0
- package/dist/react/use-conversation.js +154 -0
- package/dist/react/use-conversation.js.map +1 -0
- package/dist/widget/chat-widget.iife.js +1301 -0
- package/dist/widget/chat-widget.iife.js.map +1 -0
- package/dist/widget/config.d.ts +73 -0
- package/dist/widget/config.d.ts.map +1 -0
- package/dist/widget/config.js +30 -0
- package/dist/widget/config.js.map +1 -0
- package/dist/widget/conversation.d.ts +50 -0
- package/dist/widget/conversation.d.ts.map +1 -0
- package/dist/widget/conversation.js +173 -0
- package/dist/widget/conversation.js.map +1 -0
- package/dist/widget/element.d.ts +94 -0
- package/dist/widget/element.d.ts.map +1 -0
- package/dist/widget/element.js +377 -0
- package/dist/widget/element.js.map +1 -0
- package/dist/widget/index.d.ts +25 -0
- package/dist/widget/index.d.ts.map +1 -0
- package/dist/widget/index.js +24 -0
- package/dist/widget/index.js.map +1 -0
- package/dist/widget/logo.d.ts +9 -0
- package/dist/widget/logo.d.ts.map +1 -0
- package/dist/widget/logo.js +10 -0
- package/dist/widget/logo.js.map +1 -0
- package/dist/widget/standalone.d.ts +25 -0
- package/dist/widget/standalone.d.ts.map +1 -0
- package/dist/widget/standalone.js +15 -0
- package/dist/widget/standalone.js.map +1 -0
- package/dist/widget/styles.d.ts +12 -0
- package/dist/widget/styles.d.ts.map +1 -0
- package/dist/widget/styles.js +262 -0
- package/dist/widget/styles.js.map +1 -0
- package/package.json +44 -6
- package/src/react/components/SmoothChat.tsx +57 -0
- package/src/react/components/parts.tsx +141 -0
- package/src/react/index.ts +30 -0
- package/src/react/provider.tsx +40 -0
- package/src/react/response.ts +57 -0
- package/src/react/styles.css +231 -0
- package/src/react/theme.ts +92 -0
- package/src/react/types.ts +27 -0
- package/src/react/use-conversation.ts +203 -0
- package/src/widget/config.ts +102 -0
- package/src/widget/conversation.ts +212 -0
- package/src/widget/element.ts +420 -0
- package/src/widget/index.ts +37 -0
- package/src/widget/logo.ts +9 -0
- package/src/widget/smooth-logo.svg +32 -0
- package/src/widget/standalone.ts +33 -0
- package/src/widget/styles.ts +265 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<smooth-agent-chat>` — a framework-light embeddable chat web component.
|
|
3
|
+
*
|
|
4
|
+
* Ported (and simplified) from smooai's `@smooai/ui-chat-widget`. The original is a
|
|
5
|
+
* React custom element that mounts the heavyweight `@smooai/ui` ChatWidget and
|
|
6
|
+
* pulls in the whole monorepo (Tailwind, shadcn, react-phone-number-input, MSW,
|
|
7
|
+
* Supabase auth …). This is a clean, dependency-light rewrite that preserves the
|
|
8
|
+
* embedding model — a custom element with a launcher + popover panel, declarative
|
|
9
|
+
* HTML attributes, and a programmatic API — while talking to the
|
|
10
|
+
* `@smooai/smooth-operator` protocol client instead of `@smooai/realtime`.
|
|
11
|
+
*
|
|
12
|
+
* Embedding model:
|
|
13
|
+
* <smooth-agent-chat endpoint="ws://localhost:8787/ws" agent-id="…"></smooth-agent-chat>
|
|
14
|
+
* or programmatically via {@link mountChatWidget}.
|
|
15
|
+
*/
|
|
16
|
+
import type { ChatWidgetConfig } from './config.js';
|
|
17
|
+
export declare const ELEMENT_TAG = "smooth-agent-chat";
|
|
18
|
+
/**
|
|
19
|
+
* Return `url` only if it is a valid absolute `http(s)` URL, else `null`.
|
|
20
|
+
*
|
|
21
|
+
* SECURITY: citation URLs originate from indexed content (web / GitHub
|
|
22
|
+
* connectors), which can be attacker-influenceable. Assigning an arbitrary
|
|
23
|
+
* string to `<a>.href` allows `javascript:`/`data:`/`vbscript:` URLs that
|
|
24
|
+
* execute on click — a stored-XSS vector. Only http(s) links are rendered as
|
|
25
|
+
* anchors; anything else falls back to plain text.
|
|
26
|
+
*/
|
|
27
|
+
export declare function safeHttpUrl(url: string | undefined | null): string | null;
|
|
28
|
+
export declare class SmoothAgentChatElement extends HTMLElement {
|
|
29
|
+
static get observedAttributes(): readonly string[];
|
|
30
|
+
private readonly root;
|
|
31
|
+
private controller;
|
|
32
|
+
private overrides;
|
|
33
|
+
private open;
|
|
34
|
+
private messages;
|
|
35
|
+
private status;
|
|
36
|
+
private mounted;
|
|
37
|
+
private panelEl;
|
|
38
|
+
private launcherEl;
|
|
39
|
+
private messagesEl;
|
|
40
|
+
private statusEl;
|
|
41
|
+
private inputEl;
|
|
42
|
+
private sendBtn;
|
|
43
|
+
constructor();
|
|
44
|
+
connectedCallback(): void;
|
|
45
|
+
disconnectedCallback(): void;
|
|
46
|
+
attributeChangedCallback(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Programmatically merge config overrides (endpoint, agentId, theme, …). Values
|
|
49
|
+
* set here take precedence over HTML attributes. Re-renders the widget.
|
|
50
|
+
*/
|
|
51
|
+
configure(config: Partial<ChatWidgetConfig>): void;
|
|
52
|
+
/** Open the chat panel. */
|
|
53
|
+
openChat(): void;
|
|
54
|
+
/** Collapse the chat panel back to the launcher. */
|
|
55
|
+
closeChat(): void;
|
|
56
|
+
private readConfig;
|
|
57
|
+
private render;
|
|
58
|
+
private syncOpenState;
|
|
59
|
+
private renderMessages;
|
|
60
|
+
/**
|
|
61
|
+
* Build the collapsible "Sources (N)" block for an assistant message's
|
|
62
|
+
* citations. Each source renders its `title` (linked to `citation.url` when
|
|
63
|
+
* present — `target=_blank rel=noopener` — plain text otherwise) plus the
|
|
64
|
+
* grounding `snippet`. Built with DOM APIs (not innerHTML) so citation text
|
|
65
|
+
* can't inject markup.
|
|
66
|
+
*/
|
|
67
|
+
private renderSources;
|
|
68
|
+
private renderStatus;
|
|
69
|
+
private renderComposerState;
|
|
70
|
+
private submit;
|
|
71
|
+
}
|
|
72
|
+
/** Register the custom element once. Safe to call multiple times. */
|
|
73
|
+
export declare function defineChatWidget(): void;
|
|
74
|
+
/**
|
|
75
|
+
* Programmatically create, configure, and append a widget to the page.
|
|
76
|
+
* Returns the element so the host can drive `openChat()` / `closeChat()`.
|
|
77
|
+
*/
|
|
78
|
+
export declare function mountChatWidget(config: ChatWidgetConfig, target?: HTMLElement): SmoothAgentChatElement;
|
|
79
|
+
/**
|
|
80
|
+
* Ergonomic helper for the full-page layout: mounts a `<smooth-agent-chat>` in
|
|
81
|
+
* `mode: "fullpage"` (no launcher — the chat fills its container/viewport with a
|
|
82
|
+
* Smooth-branded header, a scrollable message list, and an input bar) and
|
|
83
|
+
* returns the element.
|
|
84
|
+
*
|
|
85
|
+
* `target` defaults to `document.body`; pass a sized container to embed the
|
|
86
|
+
* full-page chat inside a layout region (e.g. a `/chat` route shell or an
|
|
87
|
+
* iframe). The `mode` is forced to `"fullpage"` regardless of the passed config.
|
|
88
|
+
*
|
|
89
|
+
* ```ts
|
|
90
|
+
* mountFullPageChat({ endpoint: 'wss://…/ws', agentId: '…', agentName: 'Support' });
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export declare function mountFullPageChat(config: Omit<ChatWidgetConfig, 'mode'>, target?: HTMLElement): SmoothAgentChatElement;
|
|
94
|
+
//# sourceMappingURL=element.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../src/widget/element.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAmC,MAAM,aAAa,CAAC;AAMrF,eAAO,MAAM,WAAW,sBAAsB,CAAC;AAI/C;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAQzE;AAED,qBAAa,sBAAuB,SAAQ,WAAW;IACnD,MAAM,KAAK,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAEjD;IAED,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,OAAO,CAAkC;;IAOjD,iBAAiB,IAAI,IAAI;IAKzB,oBAAoB,IAAI,IAAI;IAM5B,wBAAwB,IAAI,IAAI;IAIhC;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAQlD,2BAA2B;IAC3B,QAAQ,IAAI,IAAI;IAMhB,oDAAoD;IACpD,SAAS,IAAI,IAAI;IAOjB,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,MAAM;IAqGd,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,cAAc;IAkCtB;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAkDrB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,MAAM;CAOjB;AAmBD,qEAAqE;AACrE,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAE,WAA2B,GAAG,sBAAsB,CAMrH;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAE,WAA2B,GAAG,sBAAsB,CAErI"}
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import { resolveConfig } from './config.js';
|
|
2
|
+
import { ConversationController } from './conversation.js';
|
|
3
|
+
import { SMOOTH_LOGO_SVG } from './logo.js';
|
|
4
|
+
import { buildStyles } from './styles.js';
|
|
5
|
+
export const ELEMENT_TAG = 'smooth-agent-chat';
|
|
6
|
+
const OBSERVED = ['endpoint', 'agent-id', 'agent-name', 'placeholder', 'greeting', 'start-open', 'mode'];
|
|
7
|
+
/**
|
|
8
|
+
* Return `url` only if it is a valid absolute `http(s)` URL, else `null`.
|
|
9
|
+
*
|
|
10
|
+
* SECURITY: citation URLs originate from indexed content (web / GitHub
|
|
11
|
+
* connectors), which can be attacker-influenceable. Assigning an arbitrary
|
|
12
|
+
* string to `<a>.href` allows `javascript:`/`data:`/`vbscript:` URLs that
|
|
13
|
+
* execute on click — a stored-XSS vector. Only http(s) links are rendered as
|
|
14
|
+
* anchors; anything else falls back to plain text.
|
|
15
|
+
*/
|
|
16
|
+
export function safeHttpUrl(url) {
|
|
17
|
+
if (!url)
|
|
18
|
+
return null;
|
|
19
|
+
try {
|
|
20
|
+
const parsed = new URL(url);
|
|
21
|
+
return parsed.protocol === 'http:' || parsed.protocol === 'https:' ? parsed.href : null;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export class SmoothAgentChatElement extends HTMLElement {
|
|
28
|
+
static get observedAttributes() {
|
|
29
|
+
return OBSERVED;
|
|
30
|
+
}
|
|
31
|
+
root;
|
|
32
|
+
controller = null;
|
|
33
|
+
overrides = {};
|
|
34
|
+
open = false;
|
|
35
|
+
messages = [];
|
|
36
|
+
status = 'idle';
|
|
37
|
+
mounted = false;
|
|
38
|
+
// Cached DOM refs (populated in render()).
|
|
39
|
+
panelEl = null;
|
|
40
|
+
launcherEl = null;
|
|
41
|
+
messagesEl = null;
|
|
42
|
+
statusEl = null;
|
|
43
|
+
inputEl = null;
|
|
44
|
+
sendBtn = null;
|
|
45
|
+
constructor() {
|
|
46
|
+
super();
|
|
47
|
+
this.root = this.attachShadow({ mode: 'open' });
|
|
48
|
+
}
|
|
49
|
+
connectedCallback() {
|
|
50
|
+
this.mounted = true;
|
|
51
|
+
this.render();
|
|
52
|
+
}
|
|
53
|
+
disconnectedCallback() {
|
|
54
|
+
this.mounted = false;
|
|
55
|
+
this.controller?.disconnect();
|
|
56
|
+
this.controller = null;
|
|
57
|
+
}
|
|
58
|
+
attributeChangedCallback() {
|
|
59
|
+
if (this.mounted)
|
|
60
|
+
this.render();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Programmatically merge config overrides (endpoint, agentId, theme, …). Values
|
|
64
|
+
* set here take precedence over HTML attributes. Re-renders the widget.
|
|
65
|
+
*/
|
|
66
|
+
configure(config) {
|
|
67
|
+
this.overrides = { ...this.overrides, ...config };
|
|
68
|
+
if (config.theme) {
|
|
69
|
+
this.overrides.theme = { ...(this.overrides.theme ?? {}), ...config.theme };
|
|
70
|
+
}
|
|
71
|
+
if (this.mounted)
|
|
72
|
+
this.render();
|
|
73
|
+
}
|
|
74
|
+
/** Open the chat panel. */
|
|
75
|
+
openChat() {
|
|
76
|
+
this.open = true;
|
|
77
|
+
this.syncOpenState();
|
|
78
|
+
void this.controller?.connect().catch(() => { });
|
|
79
|
+
}
|
|
80
|
+
/** Collapse the chat panel back to the launcher. */
|
|
81
|
+
closeChat() {
|
|
82
|
+
this.open = false;
|
|
83
|
+
this.syncOpenState();
|
|
84
|
+
}
|
|
85
|
+
// ─────────────────────────── Config resolution ─────────────────────────────
|
|
86
|
+
readConfig() {
|
|
87
|
+
const endpoint = this.overrides.endpoint ?? this.getAttribute('endpoint') ?? '';
|
|
88
|
+
const agentId = this.overrides.agentId ?? this.getAttribute('agent-id') ?? '';
|
|
89
|
+
if (!endpoint || !agentId)
|
|
90
|
+
return null;
|
|
91
|
+
const theme = this.overrides.theme;
|
|
92
|
+
const modeAttr = this.getAttribute('mode');
|
|
93
|
+
const mode = this.overrides.mode ?? (modeAttr === 'fullpage' ? 'fullpage' : modeAttr === 'popover' ? 'popover' : undefined) ?? 'popover';
|
|
94
|
+
return {
|
|
95
|
+
endpoint,
|
|
96
|
+
mode,
|
|
97
|
+
agentId,
|
|
98
|
+
agentName: this.overrides.agentName ?? this.getAttribute('agent-name') ?? undefined,
|
|
99
|
+
userName: this.overrides.userName,
|
|
100
|
+
userEmail: this.overrides.userEmail,
|
|
101
|
+
placeholder: this.overrides.placeholder ?? this.getAttribute('placeholder') ?? undefined,
|
|
102
|
+
greeting: this.overrides.greeting ?? this.getAttribute('greeting') ?? undefined,
|
|
103
|
+
connectionErrorMessage: this.overrides.connectionErrorMessage,
|
|
104
|
+
startOpen: this.overrides.startOpen ?? this.hasAttribute('start-open'),
|
|
105
|
+
theme,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
// ───────────────────────────────── Render ──────────────────────────────────
|
|
109
|
+
render() {
|
|
110
|
+
const config = this.readConfig();
|
|
111
|
+
if (!config) {
|
|
112
|
+
this.root.innerHTML = '';
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const resolved = resolveConfig(config);
|
|
116
|
+
// (Re)create the controller only when there isn't one yet. Attribute churn
|
|
117
|
+
// (e.g. theme tweaks) re-renders the view without dropping the session.
|
|
118
|
+
if (!this.controller) {
|
|
119
|
+
this.controller = new ConversationController(config, {
|
|
120
|
+
onMessages: (messages) => {
|
|
121
|
+
this.messages = messages;
|
|
122
|
+
this.renderMessages(resolved.greeting);
|
|
123
|
+
},
|
|
124
|
+
onStatus: (status) => {
|
|
125
|
+
this.status = status;
|
|
126
|
+
this.renderStatus();
|
|
127
|
+
this.renderComposerState();
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
if (resolved.startOpen)
|
|
131
|
+
this.open = true;
|
|
132
|
+
}
|
|
133
|
+
const fullpage = resolved.mode === 'fullpage';
|
|
134
|
+
// Full-page mode is always "open" — it fills its container and has no
|
|
135
|
+
// launcher to toggle.
|
|
136
|
+
if (fullpage)
|
|
137
|
+
this.open = true;
|
|
138
|
+
const style = document.createElement('style');
|
|
139
|
+
style.textContent = buildStyles(resolved.theme, resolved.mode);
|
|
140
|
+
// Header: in full-page mode lead with the Smooth logo (falls back to the
|
|
141
|
+
// agent name) + a subtle "powered by smooth-operator"; in popover mode the
|
|
142
|
+
// compact agent-name title we've always shown. The close button only
|
|
143
|
+
// exists in popover mode (full-page has nothing to collapse to).
|
|
144
|
+
const headerBrand = fullpage
|
|
145
|
+
? `<div class="brand">
|
|
146
|
+
<span class="logo-wrap">${SMOOTH_LOGO_SVG}</span>
|
|
147
|
+
<div>
|
|
148
|
+
<div class="title">${escapeHtml(resolved.agentName)}</div>
|
|
149
|
+
<div class="status"></div>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
<div class="powered">powered by smooth-operator</div>`
|
|
153
|
+
: `<div class="brand">
|
|
154
|
+
<div>
|
|
155
|
+
<div class="title">${escapeHtml(resolved.agentName)}</div>
|
|
156
|
+
<div class="status"></div>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
<button class="close" aria-label="Close chat">×</button>`;
|
|
160
|
+
const container = document.createElement('div');
|
|
161
|
+
container.innerHTML = `
|
|
162
|
+
${fullpage ? '' : '<button class="launcher" part="launcher" aria-label="Open chat">💬</button>'}
|
|
163
|
+
<div class="panel${fullpage ? ' fullpage' : ' hidden'}" part="panel" role="${fullpage ? 'region' : 'dialog'}" aria-label="${escapeHtml(resolved.agentName)} chat">
|
|
164
|
+
<div class="header">
|
|
165
|
+
${headerBrand}
|
|
166
|
+
</div>
|
|
167
|
+
<div class="messages"></div>
|
|
168
|
+
<div class="composer">
|
|
169
|
+
<textarea rows="1" placeholder="${escapeHtml(resolved.placeholder)}"></textarea>
|
|
170
|
+
<button class="send" type="button">Send</button>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
`;
|
|
174
|
+
// Tag the logo <svg> so styles can size it (the inlined SVG has its own id).
|
|
175
|
+
const logoSvg = container.querySelector('.logo-wrap svg');
|
|
176
|
+
if (logoSvg)
|
|
177
|
+
logoSvg.setAttribute('class', 'logo');
|
|
178
|
+
this.root.replaceChildren(style, container);
|
|
179
|
+
this.launcherEl = container.querySelector('.launcher');
|
|
180
|
+
this.panelEl = container.querySelector('.panel');
|
|
181
|
+
this.messagesEl = container.querySelector('.messages');
|
|
182
|
+
this.statusEl = container.querySelector('.status');
|
|
183
|
+
this.inputEl = container.querySelector('textarea');
|
|
184
|
+
this.sendBtn = container.querySelector('.send');
|
|
185
|
+
this.launcherEl?.addEventListener('click', () => this.openChat());
|
|
186
|
+
container.querySelector('.close')?.addEventListener('click', () => this.closeChat());
|
|
187
|
+
this.sendBtn?.addEventListener('click', () => this.submit());
|
|
188
|
+
this.inputEl?.addEventListener('keydown', (ev) => {
|
|
189
|
+
if (ev.key === 'Enter' && !ev.shiftKey) {
|
|
190
|
+
ev.preventDefault();
|
|
191
|
+
this.submit();
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
// Full-page mode connects eagerly (there's no launcher click to trigger it).
|
|
195
|
+
if (fullpage)
|
|
196
|
+
void this.controller?.connect().catch(() => { });
|
|
197
|
+
this.syncOpenState();
|
|
198
|
+
this.renderMessages(resolved.greeting);
|
|
199
|
+
this.renderStatus();
|
|
200
|
+
this.renderComposerState();
|
|
201
|
+
}
|
|
202
|
+
syncOpenState() {
|
|
203
|
+
// In full-page mode the panel always fills the host; nothing to toggle.
|
|
204
|
+
if (this.panelEl?.classList.contains('fullpage')) {
|
|
205
|
+
this.inputEl?.focus();
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
this.panelEl?.classList.toggle('hidden', !this.open);
|
|
209
|
+
this.launcherEl?.classList.toggle('hidden', this.open);
|
|
210
|
+
if (this.open)
|
|
211
|
+
this.inputEl?.focus();
|
|
212
|
+
}
|
|
213
|
+
renderMessages(greeting) {
|
|
214
|
+
if (!this.messagesEl)
|
|
215
|
+
return;
|
|
216
|
+
this.messagesEl.replaceChildren();
|
|
217
|
+
if (this.messages.length === 0 && greeting) {
|
|
218
|
+
const g = document.createElement('div');
|
|
219
|
+
g.className = 'bubble assistant greeting';
|
|
220
|
+
g.textContent = greeting;
|
|
221
|
+
this.messagesEl.appendChild(g);
|
|
222
|
+
}
|
|
223
|
+
for (const msg of this.messages) {
|
|
224
|
+
const el = document.createElement('div');
|
|
225
|
+
el.className = `bubble ${msg.role}`;
|
|
226
|
+
if (msg.streaming && !msg.text) {
|
|
227
|
+
el.classList.add('cursor');
|
|
228
|
+
}
|
|
229
|
+
else if (msg.streaming) {
|
|
230
|
+
el.classList.add('cursor');
|
|
231
|
+
el.textContent = msg.text;
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
el.textContent = msg.text;
|
|
235
|
+
}
|
|
236
|
+
this.messagesEl.appendChild(el);
|
|
237
|
+
// Render a "Sources (N)" section under any assistant message whose
|
|
238
|
+
// terminal eventual_response carried citations. Back-compatible: most
|
|
239
|
+
// turns have none, so this is skipped.
|
|
240
|
+
if (msg.role === 'assistant' && !msg.streaming && msg.citations && msg.citations.length > 0) {
|
|
241
|
+
this.messagesEl.appendChild(this.renderSources(msg.citations));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
this.messagesEl.scrollTop = this.messagesEl.scrollHeight;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Build the collapsible "Sources (N)" block for an assistant message's
|
|
248
|
+
* citations. Each source renders its `title` (linked to `citation.url` when
|
|
249
|
+
* present — `target=_blank rel=noopener` — plain text otherwise) plus the
|
|
250
|
+
* grounding `snippet`. Built with DOM APIs (not innerHTML) so citation text
|
|
251
|
+
* can't inject markup.
|
|
252
|
+
*/
|
|
253
|
+
renderSources(citations) {
|
|
254
|
+
const wrap = document.createElement('div');
|
|
255
|
+
wrap.className = 'sources';
|
|
256
|
+
wrap.setAttribute('part', 'sources');
|
|
257
|
+
const details = document.createElement('details');
|
|
258
|
+
details.open = true;
|
|
259
|
+
const summary = document.createElement('summary');
|
|
260
|
+
summary.textContent = `Sources (${citations.length})`;
|
|
261
|
+
details.appendChild(summary);
|
|
262
|
+
const list = document.createElement('ol');
|
|
263
|
+
for (const c of citations) {
|
|
264
|
+
const li = document.createElement('li');
|
|
265
|
+
let titleEl;
|
|
266
|
+
// SECURITY: only absolute http(s) URLs may become a link href. A
|
|
267
|
+
// citation URL comes from indexed content (web/GitHub connectors), so
|
|
268
|
+
// an attacker-influenceable doc could carry `javascript:`/`data:`/
|
|
269
|
+
// `vbscript:` — assigning those to `a.href` is a one-click XSS. Anything
|
|
270
|
+
// that isn't a valid absolute http(s) URL renders as plain text.
|
|
271
|
+
const safeUrl = safeHttpUrl(c.url);
|
|
272
|
+
if (safeUrl) {
|
|
273
|
+
const a = document.createElement('a');
|
|
274
|
+
a.className = 'src-title';
|
|
275
|
+
a.href = safeUrl;
|
|
276
|
+
a.target = '_blank';
|
|
277
|
+
a.rel = 'noopener noreferrer';
|
|
278
|
+
titleEl = a;
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
titleEl = document.createElement('span');
|
|
282
|
+
titleEl.className = 'src-title';
|
|
283
|
+
}
|
|
284
|
+
titleEl.textContent = c.title || c.id || 'Source';
|
|
285
|
+
li.appendChild(titleEl);
|
|
286
|
+
if (c.snippet) {
|
|
287
|
+
const snip = document.createElement('span');
|
|
288
|
+
snip.className = 'src-snippet';
|
|
289
|
+
snip.textContent = c.snippet;
|
|
290
|
+
li.appendChild(snip);
|
|
291
|
+
}
|
|
292
|
+
list.appendChild(li);
|
|
293
|
+
}
|
|
294
|
+
details.appendChild(list);
|
|
295
|
+
wrap.appendChild(details);
|
|
296
|
+
return wrap;
|
|
297
|
+
}
|
|
298
|
+
renderStatus() {
|
|
299
|
+
if (!this.statusEl)
|
|
300
|
+
return;
|
|
301
|
+
const label = {
|
|
302
|
+
idle: '',
|
|
303
|
+
connecting: 'Connecting…',
|
|
304
|
+
ready: 'Online',
|
|
305
|
+
error: 'Connection issue',
|
|
306
|
+
closed: 'Disconnected',
|
|
307
|
+
};
|
|
308
|
+
this.statusEl.textContent = label[this.status];
|
|
309
|
+
}
|
|
310
|
+
renderComposerState() {
|
|
311
|
+
const busy = this.status === 'connecting';
|
|
312
|
+
if (this.sendBtn)
|
|
313
|
+
this.sendBtn.disabled = busy;
|
|
314
|
+
if (this.inputEl)
|
|
315
|
+
this.inputEl.disabled = busy;
|
|
316
|
+
}
|
|
317
|
+
submit() {
|
|
318
|
+
if (!this.inputEl || !this.controller)
|
|
319
|
+
return;
|
|
320
|
+
const text = this.inputEl.value;
|
|
321
|
+
if (!text.trim())
|
|
322
|
+
return;
|
|
323
|
+
this.inputEl.value = '';
|
|
324
|
+
void this.controller.send(text);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
function escapeHtml(value) {
|
|
328
|
+
return value.replace(/[&<>"']/g, (c) => {
|
|
329
|
+
switch (c) {
|
|
330
|
+
case '&':
|
|
331
|
+
return '&';
|
|
332
|
+
case '<':
|
|
333
|
+
return '<';
|
|
334
|
+
case '>':
|
|
335
|
+
return '>';
|
|
336
|
+
case '"':
|
|
337
|
+
return '"';
|
|
338
|
+
default:
|
|
339
|
+
return ''';
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
/** Register the custom element once. Safe to call multiple times. */
|
|
344
|
+
export function defineChatWidget() {
|
|
345
|
+
if (typeof customElements !== 'undefined' && !customElements.get(ELEMENT_TAG)) {
|
|
346
|
+
customElements.define(ELEMENT_TAG, SmoothAgentChatElement);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Programmatically create, configure, and append a widget to the page.
|
|
351
|
+
* Returns the element so the host can drive `openChat()` / `closeChat()`.
|
|
352
|
+
*/
|
|
353
|
+
export function mountChatWidget(config, target = document.body) {
|
|
354
|
+
defineChatWidget();
|
|
355
|
+
const el = document.createElement(ELEMENT_TAG);
|
|
356
|
+
el.configure(config);
|
|
357
|
+
target.appendChild(el);
|
|
358
|
+
return el;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Ergonomic helper for the full-page layout: mounts a `<smooth-agent-chat>` in
|
|
362
|
+
* `mode: "fullpage"` (no launcher — the chat fills its container/viewport with a
|
|
363
|
+
* Smooth-branded header, a scrollable message list, and an input bar) and
|
|
364
|
+
* returns the element.
|
|
365
|
+
*
|
|
366
|
+
* `target` defaults to `document.body`; pass a sized container to embed the
|
|
367
|
+
* full-page chat inside a layout region (e.g. a `/chat` route shell or an
|
|
368
|
+
* iframe). The `mode` is forced to `"fullpage"` regardless of the passed config.
|
|
369
|
+
*
|
|
370
|
+
* ```ts
|
|
371
|
+
* mountFullPageChat({ endpoint: 'wss://…/ws', agentId: '…', agentName: 'Support' });
|
|
372
|
+
* ```
|
|
373
|
+
*/
|
|
374
|
+
export function mountFullPageChat(config, target = document.body) {
|
|
375
|
+
return mountChatWidget({ ...config, mode: 'fullpage' }, target);
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element.js","sourceRoot":"","sources":["../../src/widget/element.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @smooai/chat-widget — an embeddable chat widget for the smooth-operator
|
|
3
|
+
* protocol. Framework-light web component that speaks the schema-driven WebSocket
|
|
4
|
+
* protocol via `@smooai/smooth-operator`.
|
|
5
|
+
*
|
|
6
|
+
* ESM library entry. For bundler-based hosts:
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { defineChatWidget, mountChatWidget } from '@smooai/chat-widget';
|
|
10
|
+
*
|
|
11
|
+
* // Declarative: register the element, then drop <smooth-agent-chat …> in markup.
|
|
12
|
+
* defineChatWidget();
|
|
13
|
+
*
|
|
14
|
+
* // Or programmatic:
|
|
15
|
+
* const widget = mountChatWidget({ endpoint: 'wss://…/ws', agentId: '…' });
|
|
16
|
+
* widget.openChat();
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* For a plain `<script>` embed, use the standalone IIFE bundle
|
|
20
|
+
* (`dist/chat-widget.global.js`), which auto-registers the element on load.
|
|
21
|
+
*/
|
|
22
|
+
export { SmoothAgentChatElement, ELEMENT_TAG, defineChatWidget, mountChatWidget, mountFullPageChat, } from './element.js';
|
|
23
|
+
export type { ChatWidgetConfig, ChatWidgetMode, ChatWidgetTheme } from './config.js';
|
|
24
|
+
export { ConversationController, type ChatMessage, type Citation, type ConnectionStatus, type ConversationEvents, type Role, } from './conversation.js';
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/widget/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EACH,sBAAsB,EACtB,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GACpB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EACH,sBAAsB,EACtB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,IAAI,GACZ,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @smooai/chat-widget — an embeddable chat widget for the smooth-operator
|
|
3
|
+
* protocol. Framework-light web component that speaks the schema-driven WebSocket
|
|
4
|
+
* protocol via `@smooai/smooth-operator`.
|
|
5
|
+
*
|
|
6
|
+
* ESM library entry. For bundler-based hosts:
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { defineChatWidget, mountChatWidget } from '@smooai/chat-widget';
|
|
10
|
+
*
|
|
11
|
+
* // Declarative: register the element, then drop <smooth-agent-chat …> in markup.
|
|
12
|
+
* defineChatWidget();
|
|
13
|
+
*
|
|
14
|
+
* // Or programmatic:
|
|
15
|
+
* const widget = mountChatWidget({ endpoint: 'wss://…/ws', agentId: '…' });
|
|
16
|
+
* widget.openChat();
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* For a plain `<script>` embed, use the standalone IIFE bundle
|
|
20
|
+
* (`dist/chat-widget.global.js`), which auto-registers the element on load.
|
|
21
|
+
*/
|
|
22
|
+
export { SmoothAgentChatElement, ELEMENT_TAG, defineChatWidget, mountChatWidget, mountFullPageChat, } from './element.js';
|
|
23
|
+
export { ConversationController, } from './conversation.js';
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/widget/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EACH,sBAAsB,EACtB,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACH,sBAAsB,GAMzB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Smooth logo, inlined as an SVG string so the full-page header can render
|
|
3
|
+
* it without a separate network fetch (the IIFE bundle is self-contained).
|
|
4
|
+
*
|
|
5
|
+
* GENERATED from `assets/smooth-logo.svg` — do not edit by hand. Regenerate with:
|
|
6
|
+
* node -e ... (see the commit that added this file)
|
|
7
|
+
*/
|
|
8
|
+
export declare const SMOOTH_LOGO_SVG = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg id=\"Layer_1\" data-name=\"Layer 1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 550 135\">\n <defs>\n <style>\n .cls-1 {\n fill: url(#linear-gradient-3);\n }\n\n .cls-2 {\n fill: url(#linear-gradient-2);\n }\n\n .cls-3 {\n fill: url(#linear-gradient);\n fill-rule: evenodd;\n }\n </style>\n <linearGradient id=\"linear-gradient\" x1=\"115.59\" y1=\"112.81\" x2=\"25.08\" y2=\"22.3\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\".3\" stop-color=\"#f49f0a\"/>\n <stop offset=\".79\" stop-color=\"#fb7a4d\"/>\n <stop offset=\"1\" stop-color=\"#ff6b6c\"/>\n </linearGradient>\n <linearGradient id=\"linear-gradient-2\" x1=\"360.91\" y1=\"152.01\" x2=\"202.32\" y2=\"-6.59\" xlink:href=\"#linear-gradient\"/>\n <linearGradient id=\"linear-gradient-3\" x1=\"443.91\" y1=\"30.15\" x2=\"531.36\" y2=\"117.59\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\".43\" stop-color=\"#00a6a6\"/>\n <stop offset=\"1\" stop-color=\"#1238dd\"/>\n </linearGradient>\n </defs>\n <path class=\"cls-3\" d=\"M48.28,14.96c-12.39,5.21-22.54,14.64-28.65,26.61-6.12,11.97-7.8,25.72-4.77,38.81,3.04,13.09,10.6,24.69,21.36,32.75,10.76,8.06,24.02,12.05,37.44,11.28,13.42-.77,26.13-6.26,35.9-15.5,9.76-9.24,15.95-21.63,17.46-34.99,1.51-13.36-1.74-26.82-9.19-38.01-1.07-1.61-.64-3.78.97-4.85,1.61-1.07,3.78-.64,4.85.97,8.36,12.56,12.02,27.68,10.32,42.67-1.7,15-8.64,28.91-19.61,39.28-10.96,10.37-25.24,16.54-40.31,17.4-15.07.87-29.96-3.62-42.04-12.66-12.08-9.05-20.58-22.07-23.99-36.77-3.41-14.7-1.51-30.14,5.35-43.58,6.87-13.44,18.26-24.02,32.17-29.87,13.91-5.85,29.44-6.6,43.85-2.11,1.85.57,2.88,2.54,2.3,4.38-.57,1.85-2.54,2.88-4.38,2.3-12.83-4-26.67-3.33-39.06,1.88ZM111.39,19.75c0,2.07-1.68,3.75-3.75,3.75s-3.75-1.68-3.75-3.75,1.68-3.75,3.75-3.75,3.75,1.68,3.75,3.75ZM64.64,59.93c0,1.91,2.39,2.56,7.69,3.88,3.89.97,6.6,2.18,8.15,3.63,1.53,1.45,2.29,3.53,2.29,6.25,0,3.57-1.03,6.26-3.11,8.08-2.07,1.82-5.09,2.73-9.09,2.73h-9.6c-1.97,0-3.57-1.6-3.59-3.57-.01-1.99,1.6-3.61,3.59-3.61h9.41c3.15-.12,4.79-.95,4.91-2.47,0-1.3-1.03-2.21-3.07-2.73-6.91-1.72-11.11-3.44-12.6-5.15-1.48-1.71-2.23-3.77-2.23-6.19,0-6.59,3.2-9.85,9.59-9.8h10.77c1.99,0,3.6,1.61,3.6,3.59s-1.61,3.59-3.6,3.59h-9.69c-1.83,0-3.43.06-3.43,1.77Z\"/>\n <path class=\"cls-2\" d=\"M205.52,48.44h-8.86c-.44-3.75-2.23-6.65-5.38-8.72-3.16-2.07-7.03-3.1-11.6-3.1h0c-3.35,0-6.27.54-8.78,1.62-2.49,1.09-4.44,2.59-5.84,4.48-1.39,1.89-2.08,4.05-2.08,6.46h0c0,2.01.49,3.75,1.46,5.2.97,1.44,2.22,2.63,3.74,3.58,1.53.95,3.13,1.72,4.8,2.32,1.68.6,3.22,1.09,4.62,1.46h0l7.68,2.06c1.97.52,4.17,1.23,6.6,2.14,2.43.92,4.75,2.16,6.98,3.72,2.23,1.56,4.07,3.56,5.52,6,1.45,2.44,2.18,5.43,2.18,8.98h0c0,4.08-1.07,7.77-3.2,11.08-2.12,3.29-5.22,5.91-9.3,7.86-4.08,1.95-9.02,2.92-14.82,2.92h0c-5.43,0-10.11-.87-14.06-2.62-3.95-1.75-7.05-4.19-9.3-7.32-2.25-3.12-3.53-6.75-3.84-10.88h9.46c.25,2.85,1.22,5.21,2.9,7.06,1.69,1.87,3.83,3.25,6.42,4.14,2.6.89,5.41,1.34,8.42,1.34h0c3.49,0,6.63-.57,9.4-1.72,2.79-1.13,4.99-2.73,6.62-4.8,1.63-2.05,2.44-4.46,2.44-7.22h0c0-2.51-.7-4.55-2.1-6.12-1.41-1.57-3.26-2.85-5.54-3.84-2.29-.99-4.77-1.85-7.44-2.58h0l-9.3-2.66c-5.91-1.71-10.59-4.13-14.04-7.28-3.44-3.16-5.16-7.29-5.16-12.38h0c0-4.23,1.15-7.93,3.46-11.1,2.29-3.16,5.39-5.62,9.3-7.38,3.91-1.76,8.27-2.64,13.08-2.64h0c4.88,0,9.21.87,13,2.6,3.8,1.73,6.81,4.11,9.04,7.12,2.23,3,3.4,6.41,3.52,10.22h0ZM229.16,105.18h-8.72v-56.74h8.42v8.86h.74c1.19-3.03,3.1-5.38,5.74-7.06,2.63-1.69,5.79-2.54,9.48-2.54h0c3.75,0,6.87.85,9.36,2.54,2.51,1.68,4.46,4.03,5.86,7.06h.58c1.45-2.92,3.63-5.25,6.54-7,2.91-1.73,6.39-2.6,10.46-2.6h0c5.07,0,9.21,1.58,12.44,4.74,3.23,3.17,4.84,8.09,4.84,14.76h0v37.98h-8.72v-37.98c0-4.19-1.14-7.18-3.42-8.98-2.29-1.79-4.99-2.68-8.1-2.68h0c-3.99,0-7.07,1.2-9.26,3.6-2.2,2.4-3.3,5.43-3.3,9.1h0v36.94h-8.86v-38.86c0-3.23-1.05-5.83-3.14-7.82-2.09-1.97-4.79-2.96-8.08-2.96h0c-2.27,0-4.38.6-6.34,1.8-1.96,1.21-3.53,2.88-4.72,5-1.2,2.13-1.8,4.59-1.8,7.38h0v35.46ZM333.9,106.36h0c-5.12,0-9.61-1.22-13.46-3.66-3.85-2.44-6.86-5.85-9.02-10.24-2.15-4.37-3.22-9.49-3.22-15.36h0c0-5.91,1.07-11.07,3.22-15.48,2.16-4.4,5.17-7.82,9.02-10.26,3.85-2.44,8.34-3.66,13.46-3.66h0c5.12,0,9.61,1.22,13.46,3.66,3.85,2.44,6.86,5.86,9.02,10.26,2.15,4.41,3.22,9.57,3.22,15.48h0c0,5.87-1.07,10.99-3.22,15.36-2.16,4.39-5.17,7.8-9.02,10.24-3.85,2.44-8.34,3.66-13.46,3.66ZM333.9,98.52h0c3.89,0,7.09-.99,9.6-2.98,2.52-2,4.38-4.63,5.58-7.88,1.21-3.25,1.82-6.77,1.82-10.56h0c0-3.79-.61-7.32-1.82-10.6-1.2-3.27-3.06-5.91-5.58-7.94-2.51-2.01-5.71-3.02-9.6-3.02h0c-3.89,0-7.09,1.01-9.6,3.02-2.51,2.03-4.37,4.67-5.58,7.94-1.2,3.28-1.8,6.81-1.8,10.6h0c0,3.79.6,7.31,1.8,10.56,1.21,3.25,3.07,5.88,5.58,7.88,2.51,1.99,5.71,2.98,9.6,2.98ZM395.94,106.36h0c-5.12,0-9.61-1.22-13.46-3.66-3.85-2.44-6.85-5.85-9-10.24-2.16-4.37-3.24-9.49-3.24-15.36h0c0-5.91,1.08-11.07,3.24-15.48,2.15-4.4,5.15-7.82,9-10.26,3.85-2.44,8.34-3.66,13.46-3.66h0c5.12,0,9.61,1.22,13.46,3.66,3.85,2.44,6.86,5.86,9.02,10.26,2.16,4.41,3.24,9.57,3.24,15.48h0c0,5.87-1.08,10.99-3.24,15.36-2.16,4.39-5.17,7.8-9.02,10.24-3.85,2.44-8.34,3.66-13.46,3.66ZM395.94,98.52h0c3.89,0,7.09-.99,9.6-2.98,2.52-2,4.38-4.63,5.58-7.88,1.21-3.25,1.82-6.77,1.82-10.56h0c0-3.79-.61-7.32-1.82-10.6-1.2-3.27-3.06-5.91-5.58-7.94-2.51-2.01-5.71-3.02-9.6-3.02h0c-3.88,0-7.08,1.01-9.6,3.02-2.51,2.03-4.37,4.67-5.58,7.94-1.2,3.28-1.8,6.81-1.8,10.6h0c0,3.79.6,7.31,1.8,10.56,1.21,3.25,3.07,5.88,5.58,7.88,2.52,1.99,5.72,2.98,9.6,2.98Z\"/>\n <path class=\"cls-1\" d=\"M467.88,48.02v13.28h-35.79v-13.28h35.79ZM439.68,34.38h17.89v53.42c0,1.5.36,2.62,1.08,3.36.72.74,1.88,1.1,3.49,1.1.62,0,1.48-.07,2.59-.21,1.11-.14,1.91-.27,2.38-.41l2.31,13.02c-2.02.58-3.97.97-5.84,1.18-1.88.21-3.66.31-5.33.31-6.08,0-10.7-1.43-13.84-4.28-3.15-2.85-4.72-7.01-4.72-12.48v-55.01ZM506.59,72.63v32.71h-17.89V28.95h17.53v33.53h-1.13c1.4-4.55,3.6-8.21,6.59-11,2.99-2.79,7.01-4.18,12.07-4.18,4,0,7.48.89,10.46,2.67,2.97,1.78,5.28,4.29,6.92,7.54,1.64,3.25,2.46,7.02,2.46,11.33v36.5h-17.89v-33.02c0-3.21-.82-5.73-2.46-7.56-1.64-1.83-3.93-2.74-6.87-2.74-1.92,0-3.62.42-5.1,1.26-1.49.84-2.64,2.04-3.46,3.61-.82,1.57-1.23,3.49-1.23,5.74Z\"/>\n</svg>";
|
|
9
|
+
//# sourceMappingURL=logo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logo.d.ts","sourceRoot":"","sources":["../../src/widget/logo.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,eAAe,knMAAknM,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Smooth logo, inlined as an SVG string so the full-page header can render
|
|
3
|
+
* it without a separate network fetch (the IIFE bundle is self-contained).
|
|
4
|
+
*
|
|
5
|
+
* GENERATED from `assets/smooth-logo.svg` — do not edit by hand. Regenerate with:
|
|
6
|
+
* node -e ... (see the commit that added this file)
|
|
7
|
+
*/
|
|
8
|
+
/* eslint-disable */
|
|
9
|
+
export const SMOOTH_LOGO_SVG = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg id=\"Layer_1\" data-name=\"Layer 1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 550 135\">\n <defs>\n <style>\n .cls-1 {\n fill: url(#linear-gradient-3);\n }\n\n .cls-2 {\n fill: url(#linear-gradient-2);\n }\n\n .cls-3 {\n fill: url(#linear-gradient);\n fill-rule: evenodd;\n }\n </style>\n <linearGradient id=\"linear-gradient\" x1=\"115.59\" y1=\"112.81\" x2=\"25.08\" y2=\"22.3\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\".3\" stop-color=\"#f49f0a\"/>\n <stop offset=\".79\" stop-color=\"#fb7a4d\"/>\n <stop offset=\"1\" stop-color=\"#ff6b6c\"/>\n </linearGradient>\n <linearGradient id=\"linear-gradient-2\" x1=\"360.91\" y1=\"152.01\" x2=\"202.32\" y2=\"-6.59\" xlink:href=\"#linear-gradient\"/>\n <linearGradient id=\"linear-gradient-3\" x1=\"443.91\" y1=\"30.15\" x2=\"531.36\" y2=\"117.59\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\".43\" stop-color=\"#00a6a6\"/>\n <stop offset=\"1\" stop-color=\"#1238dd\"/>\n </linearGradient>\n </defs>\n <path class=\"cls-3\" d=\"M48.28,14.96c-12.39,5.21-22.54,14.64-28.65,26.61-6.12,11.97-7.8,25.72-4.77,38.81,3.04,13.09,10.6,24.69,21.36,32.75,10.76,8.06,24.02,12.05,37.44,11.28,13.42-.77,26.13-6.26,35.9-15.5,9.76-9.24,15.95-21.63,17.46-34.99,1.51-13.36-1.74-26.82-9.19-38.01-1.07-1.61-.64-3.78.97-4.85,1.61-1.07,3.78-.64,4.85.97,8.36,12.56,12.02,27.68,10.32,42.67-1.7,15-8.64,28.91-19.61,39.28-10.96,10.37-25.24,16.54-40.31,17.4-15.07.87-29.96-3.62-42.04-12.66-12.08-9.05-20.58-22.07-23.99-36.77-3.41-14.7-1.51-30.14,5.35-43.58,6.87-13.44,18.26-24.02,32.17-29.87,13.91-5.85,29.44-6.6,43.85-2.11,1.85.57,2.88,2.54,2.3,4.38-.57,1.85-2.54,2.88-4.38,2.3-12.83-4-26.67-3.33-39.06,1.88ZM111.39,19.75c0,2.07-1.68,3.75-3.75,3.75s-3.75-1.68-3.75-3.75,1.68-3.75,3.75-3.75,3.75,1.68,3.75,3.75ZM64.64,59.93c0,1.91,2.39,2.56,7.69,3.88,3.89.97,6.6,2.18,8.15,3.63,1.53,1.45,2.29,3.53,2.29,6.25,0,3.57-1.03,6.26-3.11,8.08-2.07,1.82-5.09,2.73-9.09,2.73h-9.6c-1.97,0-3.57-1.6-3.59-3.57-.01-1.99,1.6-3.61,3.59-3.61h9.41c3.15-.12,4.79-.95,4.91-2.47,0-1.3-1.03-2.21-3.07-2.73-6.91-1.72-11.11-3.44-12.6-5.15-1.48-1.71-2.23-3.77-2.23-6.19,0-6.59,3.2-9.85,9.59-9.8h10.77c1.99,0,3.6,1.61,3.6,3.59s-1.61,3.59-3.6,3.59h-9.69c-1.83,0-3.43.06-3.43,1.77Z\"/>\n <path class=\"cls-2\" d=\"M205.52,48.44h-8.86c-.44-3.75-2.23-6.65-5.38-8.72-3.16-2.07-7.03-3.1-11.6-3.1h0c-3.35,0-6.27.54-8.78,1.62-2.49,1.09-4.44,2.59-5.84,4.48-1.39,1.89-2.08,4.05-2.08,6.46h0c0,2.01.49,3.75,1.46,5.2.97,1.44,2.22,2.63,3.74,3.58,1.53.95,3.13,1.72,4.8,2.32,1.68.6,3.22,1.09,4.62,1.46h0l7.68,2.06c1.97.52,4.17,1.23,6.6,2.14,2.43.92,4.75,2.16,6.98,3.72,2.23,1.56,4.07,3.56,5.52,6,1.45,2.44,2.18,5.43,2.18,8.98h0c0,4.08-1.07,7.77-3.2,11.08-2.12,3.29-5.22,5.91-9.3,7.86-4.08,1.95-9.02,2.92-14.82,2.92h0c-5.43,0-10.11-.87-14.06-2.62-3.95-1.75-7.05-4.19-9.3-7.32-2.25-3.12-3.53-6.75-3.84-10.88h9.46c.25,2.85,1.22,5.21,2.9,7.06,1.69,1.87,3.83,3.25,6.42,4.14,2.6.89,5.41,1.34,8.42,1.34h0c3.49,0,6.63-.57,9.4-1.72,2.79-1.13,4.99-2.73,6.62-4.8,1.63-2.05,2.44-4.46,2.44-7.22h0c0-2.51-.7-4.55-2.1-6.12-1.41-1.57-3.26-2.85-5.54-3.84-2.29-.99-4.77-1.85-7.44-2.58h0l-9.3-2.66c-5.91-1.71-10.59-4.13-14.04-7.28-3.44-3.16-5.16-7.29-5.16-12.38h0c0-4.23,1.15-7.93,3.46-11.1,2.29-3.16,5.39-5.62,9.3-7.38,3.91-1.76,8.27-2.64,13.08-2.64h0c4.88,0,9.21.87,13,2.6,3.8,1.73,6.81,4.11,9.04,7.12,2.23,3,3.4,6.41,3.52,10.22h0ZM229.16,105.18h-8.72v-56.74h8.42v8.86h.74c1.19-3.03,3.1-5.38,5.74-7.06,2.63-1.69,5.79-2.54,9.48-2.54h0c3.75,0,6.87.85,9.36,2.54,2.51,1.68,4.46,4.03,5.86,7.06h.58c1.45-2.92,3.63-5.25,6.54-7,2.91-1.73,6.39-2.6,10.46-2.6h0c5.07,0,9.21,1.58,12.44,4.74,3.23,3.17,4.84,8.09,4.84,14.76h0v37.98h-8.72v-37.98c0-4.19-1.14-7.18-3.42-8.98-2.29-1.79-4.99-2.68-8.1-2.68h0c-3.99,0-7.07,1.2-9.26,3.6-2.2,2.4-3.3,5.43-3.3,9.1h0v36.94h-8.86v-38.86c0-3.23-1.05-5.83-3.14-7.82-2.09-1.97-4.79-2.96-8.08-2.96h0c-2.27,0-4.38.6-6.34,1.8-1.96,1.21-3.53,2.88-4.72,5-1.2,2.13-1.8,4.59-1.8,7.38h0v35.46ZM333.9,106.36h0c-5.12,0-9.61-1.22-13.46-3.66-3.85-2.44-6.86-5.85-9.02-10.24-2.15-4.37-3.22-9.49-3.22-15.36h0c0-5.91,1.07-11.07,3.22-15.48,2.16-4.4,5.17-7.82,9.02-10.26,3.85-2.44,8.34-3.66,13.46-3.66h0c5.12,0,9.61,1.22,13.46,3.66,3.85,2.44,6.86,5.86,9.02,10.26,2.15,4.41,3.22,9.57,3.22,15.48h0c0,5.87-1.07,10.99-3.22,15.36-2.16,4.39-5.17,7.8-9.02,10.24-3.85,2.44-8.34,3.66-13.46,3.66ZM333.9,98.52h0c3.89,0,7.09-.99,9.6-2.98,2.52-2,4.38-4.63,5.58-7.88,1.21-3.25,1.82-6.77,1.82-10.56h0c0-3.79-.61-7.32-1.82-10.6-1.2-3.27-3.06-5.91-5.58-7.94-2.51-2.01-5.71-3.02-9.6-3.02h0c-3.89,0-7.09,1.01-9.6,3.02-2.51,2.03-4.37,4.67-5.58,7.94-1.2,3.28-1.8,6.81-1.8,10.6h0c0,3.79.6,7.31,1.8,10.56,1.21,3.25,3.07,5.88,5.58,7.88,2.51,1.99,5.71,2.98,9.6,2.98ZM395.94,106.36h0c-5.12,0-9.61-1.22-13.46-3.66-3.85-2.44-6.85-5.85-9-10.24-2.16-4.37-3.24-9.49-3.24-15.36h0c0-5.91,1.08-11.07,3.24-15.48,2.15-4.4,5.15-7.82,9-10.26,3.85-2.44,8.34-3.66,13.46-3.66h0c5.12,0,9.61,1.22,13.46,3.66,3.85,2.44,6.86,5.86,9.02,10.26,2.16,4.41,3.24,9.57,3.24,15.48h0c0,5.87-1.08,10.99-3.24,15.36-2.16,4.39-5.17,7.8-9.02,10.24-3.85,2.44-8.34,3.66-13.46,3.66ZM395.94,98.52h0c3.89,0,7.09-.99,9.6-2.98,2.52-2,4.38-4.63,5.58-7.88,1.21-3.25,1.82-6.77,1.82-10.56h0c0-3.79-.61-7.32-1.82-10.6-1.2-3.27-3.06-5.91-5.58-7.94-2.51-2.01-5.71-3.02-9.6-3.02h0c-3.88,0-7.08,1.01-9.6,3.02-2.51,2.03-4.37,4.67-5.58,7.94-1.2,3.28-1.8,6.81-1.8,10.6h0c0,3.79.6,7.31,1.8,10.56,1.21,3.25,3.07,5.88,5.58,7.88,2.52,1.99,5.72,2.98,9.6,2.98Z\"/>\n <path class=\"cls-1\" d=\"M467.88,48.02v13.28h-35.79v-13.28h35.79ZM439.68,34.38h17.89v53.42c0,1.5.36,2.62,1.08,3.36.72.74,1.88,1.1,3.49,1.1.62,0,1.48-.07,2.59-.21,1.11-.14,1.91-.27,2.38-.41l2.31,13.02c-2.02.58-3.97.97-5.84,1.18-1.88.21-3.66.31-5.33.31-6.08,0-10.7-1.43-13.84-4.28-3.15-2.85-4.72-7.01-4.72-12.48v-55.01ZM506.59,72.63v32.71h-17.89V28.95h17.53v33.53h-1.13c1.4-4.55,3.6-8.21,6.59-11,2.99-2.79,7.01-4.18,12.07-4.18,4,0,7.48.89,10.46,2.67,2.97,1.78,5.28,4.29,6.92,7.54,1.64,3.25,2.46,7.02,2.46,11.33v36.5h-17.89v-33.02c0-3.21-.82-5.73-2.46-7.56-1.64-1.83-3.93-2.74-6.87-2.74-1.92,0-3.62.42-5.1,1.26-1.49.84-2.64,2.04-3.46,3.61-.82,1.57-1.23,3.49-1.23,5.74Z\"/>\n</svg>";
|
|
10
|
+
//# sourceMappingURL=logo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logo.js","sourceRoot":"","sources":["../../src/widget/logo.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,oBAAoB;AACpB,MAAM,CAAC,MAAM,eAAe,GAAG,+mMAA+mM,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone IIFE entry. Bundled (with the protocol client inlined) into
|
|
3
|
+
* `dist/chat-widget.global.js` for a plain `<script src="…">` embed.
|
|
4
|
+
*
|
|
5
|
+
* On load it:
|
|
6
|
+
* - registers the `<smooth-agent-chat>` custom element, and
|
|
7
|
+
* - exposes the programmatic API on the IIFE global `SmoothAgentChat`
|
|
8
|
+
* (`window.SmoothAgentChat.mount({ endpoint, agentId })`).
|
|
9
|
+
*
|
|
10
|
+
* A host page can then either drop the element in markup:
|
|
11
|
+
* <smooth-agent-chat endpoint="wss://…/ws" agent-id="…"></smooth-agent-chat>
|
|
12
|
+
* or mount it programmatically:
|
|
13
|
+
* SmoothAgentChat.mount({ endpoint: 'wss://…/ws', agentId: '…' });
|
|
14
|
+
*/
|
|
15
|
+
import type { ChatWidgetConfig } from './config.js';
|
|
16
|
+
import { defineChatWidget, mountChatWidget, mountFullPageChat, SmoothAgentChatElement } from './element.js';
|
|
17
|
+
export { defineChatWidget, mountChatWidget, mountFullPageChat, SmoothAgentChatElement };
|
|
18
|
+
/** Convenience alias matching the global API surface (`SmoothAgentChat.mount`). */
|
|
19
|
+
export declare function mount(config: ChatWidgetConfig, target?: HTMLElement): SmoothAgentChatElement;
|
|
20
|
+
/**
|
|
21
|
+
* Full-page convenience alias (`SmoothAgentChat.mountFullPage`): mounts the chat
|
|
22
|
+
* in `mode: "fullpage"` so it fills its container/viewport with no launcher.
|
|
23
|
+
*/
|
|
24
|
+
export declare function mountFullPage(config: Omit<ChatWidgetConfig, 'mode'>, target?: HTMLElement): SmoothAgentChatElement;
|
|
25
|
+
//# sourceMappingURL=standalone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../../src/widget/standalone.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAI5G,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,CAAC;AAExF,mFAAmF;AACnF,wBAAgB,KAAK,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,sBAAsB,CAE5F;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,sBAAsB,CAElH"}
|