ghonchu_rag 1.0.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 ADDED
@@ -0,0 +1,66 @@
1
+ # Ghonchu_RAG
2
+
3
+ A themeable chatbot widget for frontend integration.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install ghonchu_rag
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### React
14
+
15
+ ```tsx
16
+ import { GhonchuRAG } from 'ghonchu_rag';
17
+ import 'ghonchu_rag/dist/styles.css';
18
+
19
+ function App() {
20
+ return (
21
+ <GhonchuRAG
22
+ id="123"
23
+ config={{
24
+ backendUrl: process.env.REACT_APP_BACKEND_URL || 'https://api.yoursite.com',
25
+ theme: 'default'
26
+ }}
27
+ />
28
+ );
29
+ }
30
+ ```
31
+
32
+ ### Vanilla JavaScript
33
+
34
+ ```javascript
35
+ import { GhonchuWidget } from 'ghonchu_rag';
36
+
37
+ new GhonchuWidget('your-user-id', {
38
+ backendUrl: 'https://api.yoursite.com',
39
+ theme: 'cyberpunk'
40
+ });
41
+ ```
42
+
43
+ ## Configuration
44
+
45
+ | Option | Type | Default | Description |
46
+ |--------|------|---------|-------------|
47
+ | `backendUrl` | string | `http://localhost:3001` | Backend API endpoint |
48
+ | `theme` | `'default' \| 'cyberpunk' \| 'professional'` | `'default'` | Widget theme |
49
+
50
+ ## Themes
51
+
52
+ - **Default**: Amber/Orange Glassmorphism
53
+ - **Cyberpunk**: Neon Blue/Pink
54
+ - **Professional**: Minimalist Blue/Grey
55
+
56
+ ## Development
57
+
58
+ Create a `.env` file:
59
+ ```env
60
+ BACKEND_URL=http://localhost:3001
61
+ ```
62
+
63
+ Then build:
64
+ ```bash
65
+ npm run build
66
+ ```
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { WidgetConfig } from './types.js';
3
+ interface Props {
4
+ id: string;
5
+ config?: Partial<WidgetConfig>;
6
+ }
7
+ declare const GhonchuRAG: React.FC<Props>;
8
+ export default GhonchuRAG;
9
+ //# sourceMappingURL=GhonchuRAG.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GhonchuRAG.d.ts","sourceRoot":"","sources":["../src/GhonchuRAG.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,UAAU,KAAK;IACX,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CAClC;AAED,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAe/B,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { useEffect } from 'react';
2
+ import { GhonchuWidget } from './widget.js';
3
+ const GhonchuRAG = ({ id, config }) => {
4
+ useEffect(() => {
5
+ // Initialize the widget
6
+ const widget = new GhonchuWidget(id, config);
7
+ // Cleanup when component unmounts
8
+ return () => {
9
+ const existing = document.getElementById('ghonchu-widget-root');
10
+ if (existing) {
11
+ existing.remove();
12
+ }
13
+ };
14
+ }, [id, config]);
15
+ return null; // The widget injects itself into the DOM outside the React tree
16
+ };
17
+ export default GhonchuRAG;
18
+ //# sourceMappingURL=GhonchuRAG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GhonchuRAG.js","sourceRoot":"","sources":["../src/GhonchuRAG.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ5C,MAAM,UAAU,GAAoB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IACnD,SAAS,CAAC,GAAG,EAAE;QACX,wBAAwB;QACxB,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAE7C,kCAAkC;QAClC,OAAO,GAAG,EAAE;YACR,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;YAChE,IAAI,QAAQ,EAAE,CAAC;gBACX,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtB,CAAC;QACL,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAEjB,OAAO,IAAI,CAAC,CAAC,gEAAgE;AACjF,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './types.js';
2
+ export * from './widget.js';
3
+ export { default as GhonchuRAG } from './GhonchuRAG.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from './types.js';
2
+ export * from './widget.js';
3
+ export { default as GhonchuRAG } from './GhonchuRAG.js';
4
+ import { GhonchuWidget } from './widget.js';
5
+ window.GhonchuWidget = GhonchuWidget;
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3C,MAAc,CAAC,aAAa,GAAG,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface WidgetConfig {
2
+ theme: 'default' | 'cyberpunk' | 'professional';
3
+ backendUrl: string;
4
+ }
5
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,cAAc,CAAC;IAChD,UAAU,EAAE,MAAM,CAAC;CACtB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import { WidgetConfig } from './types.js';
2
+ declare global {
3
+ interface Window {
4
+ marked: {
5
+ parse: (text: string) => string;
6
+ };
7
+ DOMPurify: {
8
+ sanitize: (html: string) => string;
9
+ };
10
+ GhonchuWidget: any;
11
+ }
12
+ }
13
+ export declare class GhonchuWidget {
14
+ private container;
15
+ private config;
16
+ private userId;
17
+ private roomId;
18
+ private typingEl;
19
+ constructor(userId?: string, options?: Partial<WidgetConfig>);
20
+ private generateUUID;
21
+ private init;
22
+ private fetchConfig;
23
+ private createSession;
24
+ private loadHistory;
25
+ private deleteSession;
26
+ private renderHistoryList;
27
+ private fetchSessions;
28
+ private render;
29
+ private setupListeners;
30
+ private addMessage;
31
+ private showTyping;
32
+ private hideTyping;
33
+ private scrollToBottom;
34
+ }
35
+ //# sourceMappingURL=widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA8B1C,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,MAAM,EAAE;YACJ,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;SACnC,CAAC;QACF,SAAS,EAAE;YACP,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;SACtC,CAAC;QACF,aAAa,EAAE,GAAG,CAAC;KACtB;CACJ;AAKD,qBAAa,aAAa;IACtB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAA4B;gBAEhC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM;IAmBhE,OAAO,CAAC,YAAY;YAON,IAAI;YAaJ,WAAW;YAYX,aAAa;YAoBb,WAAW;YAsBX,aAAa;YAyBb,iBAAiB;YA+CjB,aAAa;IAU3B,OAAO,CAAC,MAAM;IAwCd,OAAO,CAAC,cAAc;IAmFtB,OAAO,CAAC,UAAU;IAqDlB,OAAO,CAAC,UAAU;IAmBlB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,cAAc;CAIzB"}
package/dist/widget.js ADDED
@@ -0,0 +1,378 @@
1
+ /* ===============================
2
+ AUTO LOAD MARKDOWN + SANITIZER
3
+ =============================== */
4
+ function loadScriptOnce(src, globalName) {
5
+ return new Promise((resolve) => {
6
+ if (globalName && window[globalName] !== undefined) {
7
+ return resolve();
8
+ }
9
+ const s = document.createElement("script");
10
+ s.src = src;
11
+ s.onload = () => resolve();
12
+ document.head.appendChild(s);
13
+ });
14
+ }
15
+ async function ensureMarkdownReady() {
16
+ await loadScriptOnce("https://cdn.jsdelivr.net/npm/marked/marked.min.js", "marked");
17
+ await loadScriptOnce("https://cdn.jsdelivr.net/npm/dompurify@3.0.6/dist/purify.min.js", "DOMPurify");
18
+ }
19
+ /* ===============================
20
+ WIDGET
21
+ =============================== */
22
+ export class GhonchuWidget {
23
+ container;
24
+ config;
25
+ userId;
26
+ roomId = null;
27
+ typingEl = null;
28
+ constructor(userId, options = {}) {
29
+ // 1. Resolve User ID (Priority: Constructor -> LocalStorage -> Generate)
30
+ this.userId = userId || localStorage.getItem('ghonchu_userId') || this.generateUUID();
31
+ localStorage.setItem('ghonchu_userId', this.userId);
32
+ // 2. Resolve Last Room ID
33
+ this.roomId = localStorage.getItem('ghonchu_lastRoomId');
34
+ this.config = {
35
+ theme: 'default',
36
+ backendUrl: import.meta.env?.BACKEND_URL || 'https://backend-test-ghonchurag.onrender.com',
37
+ ...options,
38
+ };
39
+ this.container = document.createElement('div');
40
+ this.container.id = 'ghonchu-widget-root';
41
+ document.body.appendChild(this.container);
42
+ this.init();
43
+ }
44
+ generateUUID() {
45
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
46
+ var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
47
+ return v.toString(16);
48
+ });
49
+ }
50
+ async init() {
51
+ await ensureMarkdownReady();
52
+ await this.fetchConfig();
53
+ this.render();
54
+ // Auto-load history or create new session
55
+ if (this.roomId) {
56
+ await this.loadHistory(this.roomId);
57
+ }
58
+ else {
59
+ await this.createSession();
60
+ }
61
+ }
62
+ async fetchConfig() {
63
+ try {
64
+ const response = await fetch(`${this.config.backendUrl}/config/${this.userId}`);
65
+ if (response.ok) {
66
+ const data = await response.json();
67
+ this.config.theme = data.theme || this.config.theme;
68
+ }
69
+ }
70
+ catch (error) {
71
+ console.error('Failed to fetch widget config:', error);
72
+ }
73
+ }
74
+ async createSession() {
75
+ try {
76
+ const response = await fetch(`${this.config.backendUrl}/session`, {
77
+ method: 'POST',
78
+ headers: { 'Content-Type': 'application/json' },
79
+ body: JSON.stringify({ userId: this.userId })
80
+ });
81
+ const data = await response.json();
82
+ this.roomId = data.roomId;
83
+ localStorage.setItem('ghonchu_lastRoomId', this.roomId);
84
+ // Clear UI for new chat
85
+ const messagesDiv = this.container.querySelector('.ghonchu-messages');
86
+ if (messagesDiv)
87
+ messagesDiv.innerHTML = '';
88
+ this.addMessage('bot', 'Hello! How can I help you today?');
89
+ }
90
+ catch (error) {
91
+ console.error('Failed to create session:', error);
92
+ }
93
+ }
94
+ async loadHistory(roomId) {
95
+ try {
96
+ const response = await fetch(`${this.config.backendUrl}/session/${roomId}`);
97
+ const messages = await response.json();
98
+ const messagesDiv = this.container.querySelector('.ghonchu-messages');
99
+ if (messagesDiv)
100
+ messagesDiv.innerHTML = ''; // Clear current view
101
+ if (messages.length === 0) {
102
+ this.addMessage('bot', 'Hello! How can I help you today?');
103
+ }
104
+ else {
105
+ messages.forEach((msg) => {
106
+ this.addMessage(msg.sender, msg.message);
107
+ });
108
+ }
109
+ }
110
+ catch (error) {
111
+ console.error('Failed to load history:', error);
112
+ // Fallback if room not found?
113
+ this.createSession();
114
+ }
115
+ }
116
+ async deleteSession(roomId, event) {
117
+ event.stopPropagation(); // Prevent opening the chat
118
+ if (!confirm('Are you sure you want to delete this chat?'))
119
+ return;
120
+ try {
121
+ await fetch(`${this.config.backendUrl}/session/${roomId}`, {
122
+ method: 'DELETE'
123
+ });
124
+ // Refresh list
125
+ const historyView = this.container.querySelector('.ghonchu-history-view');
126
+ if (historyView.style.display === 'block') {
127
+ await this.renderHistoryList();
128
+ }
129
+ // If deleted current session, reset
130
+ if (this.roomId === roomId) {
131
+ this.createSession();
132
+ // Close history view if open? No, keep it open to show updated list
133
+ }
134
+ }
135
+ catch (error) {
136
+ console.error('Failed to delete session:', error);
137
+ }
138
+ }
139
+ async renderHistoryList() {
140
+ const sessionList = this.container.querySelector('.ghonchu-session-list');
141
+ if (!sessionList)
142
+ return;
143
+ sessionList.innerHTML = 'Loading...';
144
+ const sessions = await this.fetchSessions();
145
+ sessionList.innerHTML = '';
146
+ if (sessions.length === 0) {
147
+ sessionList.innerHTML = '<div style="opacity:0.7; font-style:italic;">No past conversations.</div>';
148
+ return;
149
+ }
150
+ sessions.forEach((s) => {
151
+ const el = document.createElement('div');
152
+ el.className = 'ghonchu-session-item';
153
+ el.style.cssText = "padding:10px; background:rgba(255,255,255,0.1); border-radius:8px; cursor:pointer; border:1px solid transparent; display:flex; justify-content:space-between; align-items:center;";
154
+ const date = new Date(s.createdAt).toLocaleDateString();
155
+ const info = document.createElement('div');
156
+ info.innerHTML = `<div style="font-weight:bold;">${s.title}</div><div style="font-size:0.8em; opacity:0.7;">${date}</div>`;
157
+ const delBtn = document.createElement('button');
158
+ delBtn.innerHTML = '🗑️';
159
+ delBtn.title = 'Delete Chat';
160
+ delBtn.style.cssText = 'background:none; border:none; cursor:pointer; font-size:1.1em; opacity:0.6; padding:4px;';
161
+ delBtn.onmouseenter = () => delBtn.style.opacity = '1';
162
+ delBtn.onmouseleave = () => delBtn.style.opacity = '0.6';
163
+ delBtn.onclick = (e) => this.deleteSession(s._id, e);
164
+ el.appendChild(info);
165
+ el.appendChild(delBtn);
166
+ if (s._id === this.roomId)
167
+ el.style.borderColor = 'var(--ghonchu-amber-400)';
168
+ el.onclick = () => {
169
+ this.roomId = s._id;
170
+ localStorage.setItem('ghonchu_lastRoomId', this.roomId);
171
+ this.loadHistory(this.roomId);
172
+ const historyView = this.container.querySelector('.ghonchu-history-view');
173
+ historyView.style.display = 'none';
174
+ };
175
+ sessionList.appendChild(el);
176
+ });
177
+ }
178
+ async fetchSessions() {
179
+ try {
180
+ const response = await fetch(`${this.config.backendUrl}/sessions/${this.userId}`);
181
+ return await response.json();
182
+ }
183
+ catch (error) {
184
+ console.error('Failed to fetch sessions:', error);
185
+ return [];
186
+ }
187
+ }
188
+ render() {
189
+ this.container.className = `ghonchu-theme-${this.config.theme}`;
190
+ this.container.innerHTML = `
191
+ <div class="ghonchu-launcher">
192
+ <span>🐕</span>
193
+ </div>
194
+ <div class="ghonchu-chat-window" style="display: none;">
195
+ <div class="ghonchu-header">
196
+ <div style="flex: 1;">
197
+ <div class="ghonchu-title">Ghonchu GPT</div>
198
+ <div class="ghonchu-status">🐕 Your Golden AI Companion</div>
199
+ </div>
200
+ <div class="ghonchu-controls" style="display: flex; gap: 8px;">
201
+ <button class="ghonchu-btn-history" title="History" style="background:none; border:none; cursor:pointer; font-size: 1.2rem;">🕒</button>
202
+ <button class="ghonchu-btn-new" title="New Chat" style="background:none; border:none; cursor:pointer; font-size: 1.2rem;">➕</button>
203
+ </div>
204
+ </div>
205
+
206
+ <!-- HISTORY OVERLAY -->
207
+ <div class="ghonchu-history-view" style="display:none; position:absolute; top:60px; left:0; right:0; bottom:0; background:rgba(0,0,0,0.85); backdrop-filter:blur(5px); z-index:10; padding:20px; color:white; overflow-y:auto;">
208
+ <h3 style="margin-top:0;">Past Conversations</h3>
209
+ <div class="ghonchu-session-list" style="display:flex; flex-direction:column; gap:10px; margin-top:15px;"></div>
210
+ <button class="ghonchu-btn-close-history" style="margin-top:20px; padding:8px 16px; background:var(--ghonchu-amber-600); border:none; border-radius:6px; color:white; cursor:pointer;">Close</button>
211
+ </div>
212
+
213
+ <div class="ghonchu-messages"></div>
214
+ <div class="ghonchu-input-area">
215
+ <input type="text" placeholder="Type your message to Ghonchu..." />
216
+ <button class="ghonchu-send">
217
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
218
+ <path d="M22 2L11 13M22 2L15 22L11 13M11 13L2 9L22 2" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
219
+ </svg>
220
+ </button>
221
+ </div>
222
+ </div>
223
+ `;
224
+ this.setupListeners();
225
+ }
226
+ setupListeners() {
227
+ const launcher = this.container.querySelector('.ghonchu-launcher');
228
+ const chatWindow = this.container.querySelector('.ghonchu-chat-window');
229
+ const input = this.container.querySelector('input');
230
+ const sendBtn = this.container.querySelector('.ghonchu-send');
231
+ const historyBtn = this.container.querySelector('.ghonchu-btn-history');
232
+ const newChatBtn = this.container.querySelector('.ghonchu-btn-new');
233
+ const historyView = this.container.querySelector('.ghonchu-history-view');
234
+ const closeHistoryBtn = this.container.querySelector('.ghonchu-btn-close-history');
235
+ const sessionList = this.container.querySelector('.ghonchu-session-list');
236
+ // Toggle Widget
237
+ launcher?.addEventListener('click', () => {
238
+ if (chatWindow.style.display === "none") {
239
+ chatWindow.style.display = "flex";
240
+ setTimeout(() => input?.focus(), 50);
241
+ }
242
+ else {
243
+ chatWindow.classList.add("closing");
244
+ setTimeout(() => {
245
+ chatWindow.style.display = "none";
246
+ chatWindow.classList.remove("closing");
247
+ }, 200);
248
+ }
249
+ });
250
+ // New Chat
251
+ newChatBtn?.addEventListener('click', () => {
252
+ this.createSession();
253
+ historyView.style.display = 'none';
254
+ });
255
+ // Toggle History
256
+ historyBtn?.addEventListener('click', async () => {
257
+ historyView.style.display = 'block';
258
+ this.renderHistoryList();
259
+ });
260
+ closeHistoryBtn?.addEventListener('click', () => {
261
+ historyView.style.display = 'none';
262
+ });
263
+ const sendMessage = async () => {
264
+ const message = input?.value?.trim();
265
+ if (!message)
266
+ return;
267
+ if (!this.roomId)
268
+ await this.createSession(); // Safety check
269
+ this.addMessage('user', message);
270
+ input.value = '';
271
+ this.showTyping();
272
+ try {
273
+ const response = await fetch(`${this.config.backendUrl}/chat`, {
274
+ method: 'POST',
275
+ headers: { 'Content-Type': 'application/json' },
276
+ body: JSON.stringify({
277
+ userId: this.userId,
278
+ roomId: this.roomId,
279
+ message: message
280
+ })
281
+ });
282
+ const data = await response.json();
283
+ this.hideTyping();
284
+ this.addMessage('bot', data.reply || "");
285
+ }
286
+ catch (error) {
287
+ this.hideTyping();
288
+ this.addMessage('bot', '❌ Error connecting to service.');
289
+ }
290
+ };
291
+ sendBtn?.addEventListener('click', sendMessage);
292
+ input?.addEventListener('keypress', (e) => {
293
+ if (e.key === 'Enter')
294
+ sendMessage();
295
+ });
296
+ }
297
+ /* ===============================
298
+ MESSAGE HANDLING
299
+ =============================== */
300
+ addMessage(sender, text) {
301
+ const messagesDiv = this.container.querySelector('.ghonchu-messages');
302
+ if (!messagesDiv)
303
+ return;
304
+ // Create message wrapper
305
+ const wrapper = document.createElement('div');
306
+ wrapper.className = `ghonchu-message-wrapper msg-${sender}-wrapper`;
307
+ // Create avatar
308
+ const avatar = document.createElement('div');
309
+ avatar.className = `ghonchu-avatar avatar-${sender}`;
310
+ if (sender === 'bot') {
311
+ avatar.innerHTML = `
312
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"/></svg>
313
+ `;
314
+ }
315
+ else {
316
+ avatar.innerHTML = `
317
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
318
+ `;
319
+ }
320
+ // Create message bubble
321
+ const msgEl = document.createElement('div');
322
+ msgEl.className = `ghonchu-message msg-${sender}`;
323
+ if (sender === 'bot' && typeof window.marked !== 'undefined') {
324
+ // Basic Markdown + Sanitize
325
+ const html = window.marked.parse(text || "");
326
+ msgEl.innerHTML = window.DOMPurify
327
+ ? window.DOMPurify.sanitize(html)
328
+ : html;
329
+ }
330
+ else {
331
+ msgEl.textContent = text || "";
332
+ }
333
+ // Assemble message
334
+ if (sender === 'bot') {
335
+ wrapper.appendChild(avatar);
336
+ wrapper.appendChild(msgEl);
337
+ }
338
+ else {
339
+ wrapper.appendChild(msgEl);
340
+ wrapper.appendChild(avatar);
341
+ }
342
+ messagesDiv.appendChild(wrapper);
343
+ this.scrollToBottom();
344
+ }
345
+ /* ===============================
346
+ TYPING INDICATOR
347
+ =============================== */
348
+ showTyping() {
349
+ if (this.typingEl)
350
+ return;
351
+ const messagesDiv = this.container.querySelector(".ghonchu-messages");
352
+ if (!messagesDiv)
353
+ return;
354
+ this.typingEl = document.createElement("div");
355
+ this.typingEl.className = "ghonchu-message-wrapper msg-bot-wrapper";
356
+ this.typingEl.innerHTML = `
357
+ <div class="msg-bot ghonchu-typing">
358
+ <span></span><span></span><span></span>
359
+ </div>
360
+ `;
361
+ messagesDiv.appendChild(this.typingEl);
362
+ this.scrollToBottom();
363
+ }
364
+ hideTyping() {
365
+ if (this.typingEl) {
366
+ this.typingEl.remove();
367
+ this.typingEl = null;
368
+ }
369
+ }
370
+ scrollToBottom() {
371
+ const messagesDiv = this.container.querySelector(".ghonchu-messages");
372
+ if (messagesDiv)
373
+ messagesDiv.scrollTop = messagesDiv.scrollHeight;
374
+ }
375
+ }
376
+ // Expose to window for global access if needed
377
+ window.GhonchuWidget = GhonchuWidget;
378
+ //# sourceMappingURL=widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget.js","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "ghonchu_rag",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "A themeable chatbot widget for frontend integration.",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "test": "echo \"Error: no test specified\" && exit 1"
14
+ },
15
+ "keywords": [
16
+ "chatbot",
17
+ "widget",
18
+ "rag",
19
+ "frontend"
20
+ ],
21
+ "author": "",
22
+ "license": "ISC",
23
+ "devDependencies": {
24
+ "@types/react": "^19.2.10",
25
+ "@types/react-dom": "^19.2.3",
26
+ "react": "^19.2.4",
27
+ "react-dom": "^19.2.4",
28
+ "typescript": "^5.9.3"
29
+ },
30
+ "peerDependencies": {
31
+ "react": ">=16.8.0",
32
+ "react-dom": ">=16.8.0"
33
+ }
34
+ }