@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.
Files changed (81) hide show
  1. package/README.md +18 -4
  2. package/dist/react/components/SmoothChat.d.ts +35 -0
  3. package/dist/react/components/SmoothChat.d.ts.map +1 -0
  4. package/dist/react/components/SmoothChat.js +26 -0
  5. package/dist/react/components/SmoothChat.js.map +1 -0
  6. package/dist/react/components/parts.d.ts +30 -0
  7. package/dist/react/components/parts.d.ts.map +1 -0
  8. package/dist/react/components/parts.js +67 -0
  9. package/dist/react/components/parts.js.map +1 -0
  10. package/dist/react/index.d.ts +27 -0
  11. package/dist/react/index.d.ts.map +1 -0
  12. package/dist/react/index.js +26 -0
  13. package/dist/react/index.js.map +1 -0
  14. package/dist/react/provider.d.ts +27 -0
  15. package/dist/react/provider.d.ts.map +1 -0
  16. package/dist/react/provider.js +25 -0
  17. package/dist/react/provider.js.map +1 -0
  18. package/dist/react/response.d.ts +19 -0
  19. package/dist/react/response.d.ts.map +1 -0
  20. package/dist/react/response.js +53 -0
  21. package/dist/react/response.js.map +1 -0
  22. package/dist/react/theme.d.ts +64 -0
  23. package/dist/react/theme.d.ts.map +1 -0
  24. package/dist/react/theme.js +38 -0
  25. package/dist/react/theme.js.map +1 -0
  26. package/dist/react/types.d.ts +24 -0
  27. package/dist/react/types.d.ts.map +1 -0
  28. package/dist/react/types.js +2 -0
  29. package/dist/react/types.js.map +1 -0
  30. package/dist/react/use-conversation.d.ts +59 -0
  31. package/dist/react/use-conversation.d.ts.map +1 -0
  32. package/dist/react/use-conversation.js +154 -0
  33. package/dist/react/use-conversation.js.map +1 -0
  34. package/dist/widget/chat-widget.iife.js +1301 -0
  35. package/dist/widget/chat-widget.iife.js.map +1 -0
  36. package/dist/widget/config.d.ts +73 -0
  37. package/dist/widget/config.d.ts.map +1 -0
  38. package/dist/widget/config.js +30 -0
  39. package/dist/widget/config.js.map +1 -0
  40. package/dist/widget/conversation.d.ts +50 -0
  41. package/dist/widget/conversation.d.ts.map +1 -0
  42. package/dist/widget/conversation.js +173 -0
  43. package/dist/widget/conversation.js.map +1 -0
  44. package/dist/widget/element.d.ts +94 -0
  45. package/dist/widget/element.d.ts.map +1 -0
  46. package/dist/widget/element.js +377 -0
  47. package/dist/widget/element.js.map +1 -0
  48. package/dist/widget/index.d.ts +25 -0
  49. package/dist/widget/index.d.ts.map +1 -0
  50. package/dist/widget/index.js +24 -0
  51. package/dist/widget/index.js.map +1 -0
  52. package/dist/widget/logo.d.ts +9 -0
  53. package/dist/widget/logo.d.ts.map +1 -0
  54. package/dist/widget/logo.js +10 -0
  55. package/dist/widget/logo.js.map +1 -0
  56. package/dist/widget/standalone.d.ts +25 -0
  57. package/dist/widget/standalone.d.ts.map +1 -0
  58. package/dist/widget/standalone.js +15 -0
  59. package/dist/widget/standalone.js.map +1 -0
  60. package/dist/widget/styles.d.ts +12 -0
  61. package/dist/widget/styles.d.ts.map +1 -0
  62. package/dist/widget/styles.js +262 -0
  63. package/dist/widget/styles.js.map +1 -0
  64. package/package.json +44 -6
  65. package/src/react/components/SmoothChat.tsx +57 -0
  66. package/src/react/components/parts.tsx +141 -0
  67. package/src/react/index.ts +30 -0
  68. package/src/react/provider.tsx +40 -0
  69. package/src/react/response.ts +57 -0
  70. package/src/react/styles.css +231 -0
  71. package/src/react/theme.ts +92 -0
  72. package/src/react/types.ts +27 -0
  73. package/src/react/use-conversation.ts +203 -0
  74. package/src/widget/config.ts +102 -0
  75. package/src/widget/conversation.ts +212 -0
  76. package/src/widget/element.ts +420 -0
  77. package/src/widget/index.ts +37 -0
  78. package/src/widget/logo.ts +9 -0
  79. package/src/widget/smooth-logo.svg +32 -0
  80. package/src/widget/standalone.ts +33 -0
  81. 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 '&amp;';
332
+ case '<':
333
+ return '&lt;';
334
+ case '>':
335
+ return '&gt;';
336
+ case '"':
337
+ return '&quot;';
338
+ default:
339
+ return '&#39;';
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"}