@courseecho/ai-widget-react 1.0.2 → 1.0.4

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 CHANGED
@@ -270,12 +270,13 @@ MIT © 2026 CourseEcho
270
270
  - 📖 Docs: https://courseecho.com/docs
271
271
  - 🐛 Issues: [GitHub Issues](https://github.com/courseecho/ai-widget-sdk/issues)
272
272
  - 💬 Chat: [Discord](https://discord.gg/courseecho)
273
+ - 📚 Full Guide: [Multi-Framework Integration](https://github.com/courseecho/ai-widget-sdk/blob/main/MULTI_FRAMEWORK_INTEGRATION_GUIDE.md)
273
274
 
274
275
  ---
275
276
 
276
277
  **More integrations:**
277
- - [Vue 3](../ai-widget-vue)
278
- - [Angular 19+](../ai-widget-angular)
279
- - [jQuery](../ai-widget-jquery)
280
- - [Node.js](../ai-client-node)
281
- - [Core SDK](../ai-core-sdk)
278
+ - [Vue 3](https://www.npmjs.com/package/@courseecho/ai-widget-vue)
279
+ - [Angular 19+](https://www.npmjs.com/package/@courseecho/ai-widget-angular)
280
+ - [jQuery](https://cdn.courseecho.com/ai-widget-jquery.js)
281
+ - [Node.js](https://www.npmjs.com/package/@courseecho/ai-client-node)
282
+ - [Core SDK](https://www.npmjs.com/package/@courseecho/ai-core-sdk)
@@ -0,0 +1,21 @@
1
+ /**
2
+ * AI Widget React - Main Component
3
+ * Floating chat widget for React
4
+ */
5
+ import React from 'react';
6
+ import { AiContextConfig, AiMessage } from '@courseecho/ai-core-sdk';
7
+ import './ai-chat-widget.css';
8
+ export interface AiChatWidgetProps {
9
+ config: AiContextConfig;
10
+ jwtToken?: string;
11
+ onError?: (error: string) => void;
12
+ onMessageReceived?: (message: AiMessage) => void;
13
+ className?: string;
14
+ }
15
+ /**
16
+ * AiChatWidget Component
17
+ * Fully functional floating chat widget for React apps
18
+ */
19
+ export declare const AiChatWidget: React.FC<AiChatWidgetProps>;
20
+ export default AiChatWidget;
21
+ //# sourceMappingURL=components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../src/components.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,SAAS,EAAgB,MAAM,yBAAyB,CAAC;AAEnF,OAAO,sBAAsB,CAAC;AAE9B,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAsSpD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,116 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * AI Widget React - Main Component
4
+ * Floating chat widget for React
5
+ */
6
+ import { useRef, useEffect, useState } from 'react';
7
+ import { useAiWidget } from './hooks';
8
+ import './ai-chat-widget.css';
9
+ /**
10
+ * AiChatWidget Component
11
+ * Fully functional floating chat widget for React apps
12
+ */
13
+ export const AiChatWidget = ({ config, jwtToken, onError, onMessageReceived, className, }) => {
14
+ const { messages, isLoading, error, sendQuery, initialized, suggestions, filterSuggestions, } = useAiWidget(config, jwtToken);
15
+ const [isOpen, setIsOpen] = useState(false);
16
+ const [userInput, setUserInput] = useState('');
17
+ const [showSuggestions, setShowSuggestions] = useState(false);
18
+ const [filteredSuggestions, setFilteredSuggestions] = useState([]);
19
+ const messagesEndRef = useRef(null);
20
+ const inputRef = useRef(null);
21
+ const suggestionsRef = useRef(null);
22
+ // Scroll to bottom when messages change
23
+ useEffect(() => {
24
+ messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
25
+ }, [messages]);
26
+ // Notify on message received
27
+ useEffect(() => {
28
+ if (messages.length > 0 && onMessageReceived) {
29
+ const lastMessage = messages[messages.length - 1];
30
+ if (lastMessage.role === 'assistant') {
31
+ onMessageReceived(lastMessage);
32
+ }
33
+ }
34
+ }, [messages, onMessageReceived]);
35
+ // Notify on error
36
+ useEffect(() => {
37
+ if (error && onError) {
38
+ onError(error);
39
+ }
40
+ }, [error, onError]);
41
+ // Handle input change and filter suggestions
42
+ const handleInputChange = (e) => {
43
+ const value = e.target.value;
44
+ setUserInput(value);
45
+ if (value.trim() && filterSuggestions) {
46
+ const filtered = filterSuggestions(value);
47
+ setFilteredSuggestions(filtered || []);
48
+ setShowSuggestions(true);
49
+ }
50
+ else {
51
+ setShowSuggestions(false);
52
+ }
53
+ };
54
+ // Handle input focus
55
+ const handleInputFocus = () => {
56
+ if (suggestions && suggestions.length > 0 && config.suggestionConfig?.showOnFocus !== false) {
57
+ setFilteredSuggestions(suggestions.slice(0, config.suggestionConfig?.maxVisibleSuggestions || 5));
58
+ setShowSuggestions(true);
59
+ }
60
+ };
61
+ // Handle input click
62
+ const handleInputClick = () => {
63
+ if (suggestions && suggestions.length > 0 && config.suggestionConfig?.showOnClick !== false) {
64
+ setFilteredSuggestions(suggestions.slice(0, config.suggestionConfig?.maxVisibleSuggestions || 5));
65
+ setShowSuggestions(true);
66
+ }
67
+ };
68
+ // Handle suggestion click
69
+ const handleSuggestionClick = (suggestion) => {
70
+ setUserInput(suggestion.text);
71
+ setShowSuggestions(false);
72
+ inputRef.current?.focus();
73
+ };
74
+ // Close suggestions when clicking outside
75
+ useEffect(() => {
76
+ const handleClickOutside = (event) => {
77
+ if (suggestionsRef.current && !suggestionsRef.current.contains(event.target)) {
78
+ if (inputRef.current && !inputRef.current.contains(event.target)) {
79
+ setShowSuggestions(false);
80
+ }
81
+ }
82
+ };
83
+ document.addEventListener('mousedown', handleClickOutside);
84
+ return () => document.removeEventListener('mousedown', handleClickOutside);
85
+ }, []);
86
+ const handleSendMessage = async (e) => {
87
+ e.preventDefault();
88
+ if (!userInput.trim() || isLoading)
89
+ return;
90
+ try {
91
+ await sendQuery(userInput);
92
+ setUserInput('');
93
+ setShowSuggestions(false);
94
+ }
95
+ catch (err) {
96
+ console.error('Failed to send query:', err);
97
+ }
98
+ };
99
+ if (!initialized) {
100
+ return _jsx("div", { className: "ai-widget-loading", children: "Initializing AI Chat..." });
101
+ }
102
+ const positionClass = `ai-widget-${config.position || 'bottom-right'}`;
103
+ const themeClass = `ai-widget-${config.theme || 'light'}`;
104
+ const suggestionsEnabled = config.suggestionConfig?.enabled !== false;
105
+ return (_jsxs("div", { className: `ai-chat-widget-container ${positionClass} ${themeClass} ${className || ''}`, children: [!isOpen && (_jsx("button", { className: "ai-widget-toggle-button", onClick: () => setIsOpen(true), "aria-label": "Open AI Chat", title: "Chat with AI Assistant", children: _jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) }) })), isOpen && (_jsxs("div", { className: "ai-widget-window", children: [_jsxs("div", { className: "ai-widget-header", children: [_jsx("h3", { children: "AI Assistant" }), _jsx("button", { className: "ai-widget-close-button", onClick: () => setIsOpen(false), "aria-label": "Close chat", children: "\u00D7" })] }), _jsxs("div", { className: "ai-widget-messages", children: [messages.length === 0 && (_jsxs("div", { className: "ai-widget-welcome", children: [_jsx("p", { children: "\uD83D\uDC4B Hello! I'm your AI assistant." }), _jsx("p", { children: "How can I help you today?" })] })), messages.map((message) => (_jsxs("div", { className: `ai-widget-message ai-widget-message-${message.role}`, children: [_jsx("div", { className: "ai-widget-message-content", children: message.content }), _jsx("div", { className: "ai-widget-message-time", children: new Date(message.timestamp).toLocaleTimeString([], {
106
+ hour: '2-digit',
107
+ minute: '2-digit',
108
+ }) }), message.metadata?.charts &&
109
+ message.metadata.charts.length > 0 && (_jsx("div", { className: "ai-widget-charts", children: message.metadata.charts.map((chart, idx) => (_jsxs("div", { className: "ai-widget-chart-placeholder", children: [_jsxs("p", { children: ["\uD83D\uDCCA ", chart.title] }), _jsxs("small", { children: [chart.type, " chart"] })] }, idx))) }))] }, message.id))), isLoading && (_jsx("div", { className: "ai-widget-message ai-widget-message-assistant", children: _jsxs("div", { className: "ai-widget-typing-indicator", children: [_jsx("span", {}), _jsx("span", {}), _jsx("span", {})] }) })), error && (_jsx("div", { className: "ai-widget-error", children: _jsxs("p", { children: ["\u26A0\uFE0F ", error] }) })), _jsx("div", { ref: messagesEndRef })] }), _jsxs("form", { className: "ai-widget-form", onSubmit: handleSendMessage, children: [_jsxs("div", { className: "ai-widget-input-wrapper", children: [_jsx("input", { ref: inputRef, type: "text", className: "ai-widget-input", placeholder: "Type your message...", value: userInput, onChange: handleInputChange, onFocus: handleInputFocus, onClick: handleInputClick, disabled: isLoading, "aria-label": "Chat message input" }), suggestionsEnabled && showSuggestions && filteredSuggestions.length > 0 && (_jsx("div", { ref: suggestionsRef, className: "ai-widget-suggestions", children: filteredSuggestions.map((suggestion) => (_jsxs("div", { className: "ai-widget-suggestion-item", onClick: () => handleSuggestionClick(suggestion), role: "button", tabIndex: 0, onKeyDown: (e) => {
110
+ if (e.key === 'Enter') {
111
+ handleSuggestionClick(suggestion);
112
+ }
113
+ }, children: [suggestion.icon && (_jsx("span", { className: "ai-widget-suggestion-icon", children: suggestion.icon })), _jsxs("div", { className: "ai-widget-suggestion-content", children: [_jsx("div", { className: "ai-widget-suggestion-text", children: suggestion.text }), suggestion.description && (_jsx("div", { className: "ai-widget-suggestion-description", children: suggestion.description }))] }), suggestion.category && (_jsx("span", { className: "ai-widget-suggestion-category", children: suggestion.category }))] }, suggestion.id))) }))] }), _jsx("button", { type: "submit", className: "ai-widget-send-button", disabled: isLoading || !userInput.trim(), "aria-label": "Send message", children: isLoading ? '⏳' : '→' })] })] }))] }));
114
+ };
115
+ export default AiChatWidget;
116
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * AI Widget React - Custom Hooks
3
+ * useAiChat, useAiContext, useAiMessages
4
+ */
5
+ import { AiWidgetSDK, AiContextConfig, AiMessage, AiContext, AiSuggestion } from '@courseecho/ai-core-sdk';
6
+ /**
7
+ * Hook to initialize and use the AI SDK
8
+ * @param config Configuration for the SDK
9
+ * @param jwtToken Optional JWT token for authentication
10
+ * @returns SDK instance and utility functions
11
+ */
12
+ export declare function useAiChat(config: AiContextConfig, jwtToken?: string): {
13
+ sdk: AiWidgetSDK;
14
+ sendQuery: (query: string) => Promise<AiMessage>;
15
+ setJwt: (token: string) => void;
16
+ checkHealth: () => Promise<boolean>;
17
+ exportChats: (format?: "json" | "csv") => string;
18
+ initialized: boolean;
19
+ error: string | null;
20
+ };
21
+ /**
22
+ * Hook to subscribe to messages
23
+ */
24
+ export declare function useAiMessages(sdk: AiWidgetSDK): AiMessage[];
25
+ /**
26
+ * Hook to subscribe to loading state
27
+ */
28
+ export declare function useAiLoading(sdk: AiWidgetSDK): boolean;
29
+ /**
30
+ * Hook to subscribe to error state
31
+ */
32
+ export declare function useAiError(sdk: AiWidgetSDK): string | null;
33
+ /**
34
+ * Hook to manage context
35
+ */
36
+ export declare function useAiContext(sdk: AiWidgetSDK): {
37
+ context: AiContext;
38
+ updateContext: (newContext: Partial<AiContext>) => void;
39
+ updateContextProperty: (key: string, value: any) => void;
40
+ };
41
+ /**
42
+ * Hook to subscribe to suggestions
43
+ */
44
+ export declare function useAiSuggestions(sdk: AiWidgetSDK): {
45
+ suggestions: AiSuggestion[];
46
+ filterSuggestions: (query: string) => AiSuggestion[];
47
+ };
48
+ /**
49
+ * Combined hook for common use cases
50
+ */
51
+ export declare function useAiWidget(config: AiContextConfig, jwtToken?: string): {
52
+ sdk: AiWidgetSDK;
53
+ messages: AiMessage[];
54
+ isLoading: boolean;
55
+ error: string | null;
56
+ context: AiContext;
57
+ sendQuery: (query: string) => Promise<AiMessage>;
58
+ updateContext: (newContext: Partial<AiContext>) => void;
59
+ updateContextProperty: (key: string, value: any) => void;
60
+ initialized: boolean;
61
+ initError: string | null;
62
+ suggestions: AiSuggestion[];
63
+ filterSuggestions: (query: string) => AiSuggestion[];
64
+ };
65
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,WAAW,EACX,eAAe,EACf,SAAS,EACT,SAAS,EACT,YAAY,EACb,MAAM,yBAAyB,CAAC;AAEjC;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,MAAM;;uBAiClD,MAAM;oBAcZ,MAAM;;2BAaL,MAAM,GAAG,KAAK;;;EAgB1B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,eAY7C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,WAY5C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,iBAY1C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW;;gCAY5B,OAAO,CAAC,SAAS,CAAC;iCAOzB,MAAM,SAAS,GAAG;EAW3B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW;;+BAcrC,MAAM;EAOjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,MAAM;;;;;;uBAhKpD,MAAM;gCA+GP,OAAO,CAAC,SAAS,CAAC;iCAOzB,MAAM,SAAS,GAAG;;;;+BA8BhB,MAAM;EAsCjB"}
package/dist/hooks.js ADDED
@@ -0,0 +1,181 @@
1
+ /**
2
+ * AI Widget React - Custom Hooks
3
+ * useAiChat, useAiContext, useAiMessages
4
+ */
5
+ import { useEffect, useState, useRef, useCallback } from 'react';
6
+ import { AiWidgetSDK, } from '@courseecho/ai-core-sdk';
7
+ /**
8
+ * Hook to initialize and use the AI SDK
9
+ * @param config Configuration for the SDK
10
+ * @param jwtToken Optional JWT token for authentication
11
+ * @returns SDK instance and utility functions
12
+ */
13
+ export function useAiChat(config, jwtToken) {
14
+ const sdkRef = useRef(null);
15
+ const [initialized, setInitialized] = useState(false);
16
+ const [error, setError] = useState(null);
17
+ // Initialize SDK on mount
18
+ useEffect(() => {
19
+ try {
20
+ const sdk = new AiWidgetSDK(config);
21
+ if (jwtToken) {
22
+ sdk.setJwtToken(jwtToken);
23
+ }
24
+ sdkRef.current = sdk;
25
+ // Initialize auto-suggestions if enabled
26
+ if (config.suggestionConfig?.autoGenerate !== false) {
27
+ sdk.initializeAutoSuggestions().catch((err) => {
28
+ console.warn('Auto-suggestions initialization failed:', err);
29
+ });
30
+ }
31
+ setInitialized(true);
32
+ }
33
+ catch (err) {
34
+ setError(String(err));
35
+ }
36
+ }, [config, jwtToken]);
37
+ const sdk = sdkRef.current;
38
+ if (!sdk) {
39
+ throw new Error('useAiChat must be initialized first');
40
+ }
41
+ const sendQuery = useCallback(async (query) => {
42
+ if (!sdk)
43
+ throw new Error('SDK not initialized');
44
+ try {
45
+ setError(null);
46
+ return await sdk.sendQuery(query);
47
+ }
48
+ catch (err) {
49
+ setError(String(err));
50
+ throw err;
51
+ }
52
+ }, [sdk]);
53
+ const setJwt = useCallback((token) => {
54
+ if (!sdk)
55
+ throw new Error('SDK not initialized');
56
+ sdk.setJwtToken(token);
57
+ }, [sdk]);
58
+ const checkHealth = useCallback(async () => {
59
+ if (!sdk)
60
+ throw new Error('SDK not initialized');
61
+ return sdk.checkHealth();
62
+ }, [sdk]);
63
+ const exportChats = useCallback((format = 'json') => {
64
+ if (!sdk)
65
+ throw new Error('SDK not initialized');
66
+ return sdk.exportChats(format);
67
+ }, [sdk]);
68
+ return {
69
+ sdk,
70
+ sendQuery,
71
+ setJwt,
72
+ checkHealth,
73
+ exportChats,
74
+ initialized,
75
+ error,
76
+ };
77
+ }
78
+ /**
79
+ * Hook to subscribe to messages
80
+ */
81
+ export function useAiMessages(sdk) {
82
+ const [messages, setMessages] = useState(() => sdk.getMessages());
83
+ useEffect(() => {
84
+ const unsubscribe = sdk.onMessagesChange((msgs) => {
85
+ setMessages([...msgs]);
86
+ });
87
+ return unsubscribe;
88
+ }, [sdk]);
89
+ return messages;
90
+ }
91
+ /**
92
+ * Hook to subscribe to loading state
93
+ */
94
+ export function useAiLoading(sdk) {
95
+ const [isLoading, setIsLoading] = useState(() => sdk.isLoading());
96
+ useEffect(() => {
97
+ const unsubscribe = sdk.onLoadingChange((loading) => {
98
+ setIsLoading(loading);
99
+ });
100
+ return unsubscribe;
101
+ }, [sdk]);
102
+ return isLoading;
103
+ }
104
+ /**
105
+ * Hook to subscribe to error state
106
+ */
107
+ export function useAiError(sdk) {
108
+ const [error, setError] = useState(() => sdk.getError());
109
+ useEffect(() => {
110
+ const unsubscribe = sdk.onErrorChange((err) => {
111
+ setError(err);
112
+ });
113
+ return unsubscribe;
114
+ }, [sdk]);
115
+ return error;
116
+ }
117
+ /**
118
+ * Hook to manage context
119
+ */
120
+ export function useAiContext(sdk) {
121
+ const [context, setContext] = useState(() => sdk.getContext());
122
+ useEffect(() => {
123
+ const unsubscribe = sdk.onContextChange((ctx) => {
124
+ setContext({ ...ctx });
125
+ });
126
+ return unsubscribe;
127
+ }, [sdk]);
128
+ const updateContext = useCallback((newContext) => {
129
+ sdk.setContext(newContext);
130
+ }, [sdk]);
131
+ const updateContextProperty = useCallback((key, value) => {
132
+ sdk.updateContextProperty(key, value);
133
+ }, [sdk]);
134
+ return {
135
+ context,
136
+ updateContext,
137
+ updateContextProperty,
138
+ };
139
+ }
140
+ /**
141
+ * Hook to subscribe to suggestions
142
+ */
143
+ export function useAiSuggestions(sdk) {
144
+ const [suggestions, setSuggestions] = useState(() => sdk.getSuggestions());
145
+ useEffect(() => {
146
+ const unsubscribe = sdk.onSuggestionsChange((sugg) => {
147
+ setSuggestions([...sugg]);
148
+ });
149
+ return unsubscribe;
150
+ }, [sdk]);
151
+ const filterSuggestions = useCallback((query) => {
152
+ return sdk.filterSuggestions(query);
153
+ }, [sdk]);
154
+ return { suggestions, filterSuggestions };
155
+ }
156
+ /**
157
+ * Combined hook for common use cases
158
+ */
159
+ export function useAiWidget(config, jwtToken) {
160
+ const { sdk, sendQuery, initialized, error: initError } = useAiChat(config, jwtToken);
161
+ const messages = useAiMessages(sdk);
162
+ const isLoading = useAiLoading(sdk);
163
+ const error = useAiError(sdk);
164
+ const { context, updateContext, updateContextProperty } = useAiContext(sdk);
165
+ const { suggestions, filterSuggestions } = useAiSuggestions(sdk);
166
+ return {
167
+ sdk,
168
+ messages,
169
+ isLoading,
170
+ error,
171
+ context,
172
+ sendQuery,
173
+ updateContext,
174
+ updateContextProperty,
175
+ initialized,
176
+ initError,
177
+ suggestions,
178
+ filterSuggestions,
179
+ };
180
+ }
181
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * AI Widget React - Public API
3
+ */
4
+ export { AiChatWidget } from './components';
5
+ export type { AiChatWidgetProps } from './components';
6
+ export { useAiChat, useAiMessages, useAiLoading, useAiError, useAiContext, useAiWidget, } from './hooks';
7
+ export type { AiContextConfig, AiContext, AiMessage, AiChart, AiQueryResponse, } from '@courseecho/ai-core-sdk';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EACL,SAAS,EACT,aAAa,EACb,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,GACZ,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,eAAe,EACf,SAAS,EACT,SAAS,EACT,OAAO,EACP,eAAe,GAChB,MAAM,yBAAyB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * AI Widget React - Public API
3
+ */
4
+ export { AiChatWidget } from './components';
5
+ export { useAiChat, useAiMessages, useAiLoading, useAiError, useAiContext, useAiWidget, } from './hooks';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,OAAO,EACL,SAAS,EACT,aAAa,EACb,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,GACZ,MAAM,SAAS,CAAC"}
package/package.json CHANGED
@@ -1,49 +1,49 @@
1
1
  {
2
- "name": "@courseecho/ai-widget-react",
3
- "version": "1.0.2",
4
- "description": "React component for AI chat widget. Use the SDK in any React app.",
5
- "license": "MIT",
6
- "author": "CourseEcho",
7
- "main": "dist/index.cjs",
8
- "module": "dist/index.mjs",
9
- "types": "dist/index.d.ts",
10
- "exports": {
11
- ".": {
12
- "import": "./dist/index.mjs",
13
- "require": "./dist/index.cjs",
14
- "types": "./dist/index.d.ts"
15
- }
16
- },
17
- "files": [
18
- "dist"
19
- ],
20
- "scripts": {
21
- "build": "tsc",
22
- "dev": "tsc --watch",
23
- "test": "jest",
24
- "lint": "eslint src/**/*.ts*"
25
- },
26
- "peerDependencies": {
27
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
28
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
29
- "@courseecho/ai-core-sdk": "^1.0.0"
30
- },
31
- "devDependencies": {
32
- "react": "^18.2.0",
33
- "react-dom": "^18.2.0",
34
- "@courseecho/ai-core-sdk": "^1.0.0",
35
- "typescript": "^5.3.0",
36
- "@types/react": "^18.2.0",
37
- "@types/react-dom": "^18.2.0",
38
- "@types/node": "^20.0.0",
39
- "jest": "^29.0.0",
40
- "@types/jest": "^29.0.0",
41
- "ts-jest": "^29.0.0",
42
- "eslint": "^8.0.0",
43
- "@typescript-eslint/parser": "^6.0.0",
44
- "@typescript-eslint/eslint-plugin": "^6.0.0"
45
- },
46
- "dependencies": {
47
- "@courseecho/ai-core-sdk": "^1.0.0"
48
- }
2
+ "name": "@courseecho/ai-widget-react",
3
+ "version": "1.0.4",
4
+ "description": "React component for AI chat widget. Use the SDK in any React app.",
5
+ "license": "MIT",
6
+ "author": "CourseEcho",
7
+ "main": "dist/index.cjs",
8
+ "module": "dist/index.mjs",
9
+ "types": "dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.cjs",
14
+ "types": "./dist/index.d.ts"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc",
22
+ "dev": "tsc --watch",
23
+ "test": "jest",
24
+ "lint": "eslint src/**/*.ts*"
25
+ },
26
+ "peerDependencies": {
27
+ "@courseecho/ai-core-sdk": "file:../core",
28
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
29
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
30
+ },
31
+ "devDependencies": {
32
+ "@courseecho/ai-core-sdk": "file:../core",
33
+ "@types/jest": "^29.0.0",
34
+ "@types/node": "^20.0.0",
35
+ "@types/react": "^18.2.0",
36
+ "@types/react-dom": "^18.2.0",
37
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
38
+ "@typescript-eslint/parser": "^6.0.0",
39
+ "eslint": "^8.0.0",
40
+ "jest": "^29.0.0",
41
+ "react": "^18.2.0",
42
+ "react-dom": "^18.2.0",
43
+ "ts-jest": "^29.0.0",
44
+ "typescript": "^5.3.0"
45
+ },
46
+ "dependencies": {
47
+ "@courseecho/ai-core-sdk": "file:../core"
48
+ }
49
49
  }