agent-hustle-demo 1.0.1

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 (60) hide show
  1. package/README.md +429 -0
  2. package/dist/HustleChat-BC9wvWVA.d.ts +90 -0
  3. package/dist/HustleChat-BcrKkkyn.d.cts +90 -0
  4. package/dist/browser/hustle-react.js +14854 -0
  5. package/dist/browser/hustle-react.js.map +1 -0
  6. package/dist/components/index.cjs +3141 -0
  7. package/dist/components/index.cjs.map +1 -0
  8. package/dist/components/index.d.cts +20 -0
  9. package/dist/components/index.d.ts +20 -0
  10. package/dist/components/index.js +3112 -0
  11. package/dist/components/index.js.map +1 -0
  12. package/dist/hooks/index.cjs +845 -0
  13. package/dist/hooks/index.cjs.map +1 -0
  14. package/dist/hooks/index.d.cts +6 -0
  15. package/dist/hooks/index.d.ts +6 -0
  16. package/dist/hooks/index.js +838 -0
  17. package/dist/hooks/index.js.map +1 -0
  18. package/dist/hustle-Kj0X8qXC.d.cts +193 -0
  19. package/dist/hustle-Kj0X8qXC.d.ts +193 -0
  20. package/dist/index-ChUsRBwL.d.ts +152 -0
  21. package/dist/index-DE1N7C3W.d.cts +152 -0
  22. package/dist/index-DuPFrMZy.d.cts +214 -0
  23. package/dist/index-kFIdHjNw.d.ts +214 -0
  24. package/dist/index.cjs +3746 -0
  25. package/dist/index.cjs.map +1 -0
  26. package/dist/index.d.cts +271 -0
  27. package/dist/index.d.ts +271 -0
  28. package/dist/index.js +3697 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/providers/index.cjs +844 -0
  31. package/dist/providers/index.cjs.map +1 -0
  32. package/dist/providers/index.d.cts +5 -0
  33. package/dist/providers/index.d.ts +5 -0
  34. package/dist/providers/index.js +838 -0
  35. package/dist/providers/index.js.map +1 -0
  36. package/package.json +80 -0
  37. package/src/components/AuthStatus.tsx +352 -0
  38. package/src/components/ConnectButton.tsx +421 -0
  39. package/src/components/HustleChat.tsx +1273 -0
  40. package/src/components/MarkdownContent.tsx +431 -0
  41. package/src/components/index.ts +15 -0
  42. package/src/hooks/index.ts +40 -0
  43. package/src/hooks/useEmblemAuth.ts +27 -0
  44. package/src/hooks/useHustle.ts +36 -0
  45. package/src/hooks/usePlugins.ts +135 -0
  46. package/src/index.ts +142 -0
  47. package/src/plugins/index.ts +48 -0
  48. package/src/plugins/migrateFun.ts +211 -0
  49. package/src/plugins/predictionMarket.ts +411 -0
  50. package/src/providers/EmblemAuthProvider.tsx +319 -0
  51. package/src/providers/HustleProvider.tsx +540 -0
  52. package/src/providers/index.ts +6 -0
  53. package/src/styles/index.ts +2 -0
  54. package/src/styles/tokens.ts +447 -0
  55. package/src/types/auth.ts +85 -0
  56. package/src/types/hustle.ts +217 -0
  57. package/src/types/index.ts +49 -0
  58. package/src/types/plugin.ts +180 -0
  59. package/src/utils/index.ts +122 -0
  60. package/src/utils/pluginRegistry.ts +375 -0
package/README.md ADDED
@@ -0,0 +1,429 @@
1
+ # Emblem Auth + Hustle SDK React Integration
2
+
3
+ React hooks and components for integrating Emblem Auth and Hustle Incognito SDK into your React/Next.js application.
4
+
5
+ ## Documentation
6
+
7
+ - **[Design System & Theming](./docs/DESIGN_SYSTEM.md)** - CSS variables, tokens, and customization guide
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install emblem-auth-sdk hustle-incognito react react-dom
13
+ ```
14
+
15
+ Then copy the `src/` folder into your project, or install this package directly.
16
+
17
+ ## Quick Start
18
+
19
+ ### 1. Wrap your app with providers
20
+
21
+ ```tsx
22
+ // app/layout.tsx (Next.js) or App.tsx (React)
23
+ import { EmblemAuthProvider, HustleProvider } from './src';
24
+
25
+ export default function RootLayout({ children }) {
26
+ return (
27
+ <EmblemAuthProvider
28
+ appId="your-app-id"
29
+ apiUrl="https://dev-api.emblemvault.ai"
30
+ modalUrl="https://dev-auth.emblemvault.ai/connect"
31
+ >
32
+ <HustleProvider hustleApiUrl="https://dev.agenthustle.ai">
33
+ {children}
34
+ </HustleProvider>
35
+ </EmblemAuthProvider>
36
+ );
37
+ }
38
+ ```
39
+
40
+ ### 2. Add auth UI
41
+
42
+ ```tsx
43
+ import { ConnectButton, AuthStatus } from './src';
44
+
45
+ function Header() {
46
+ return (
47
+ <header>
48
+ <ConnectButton />
49
+ <AuthStatus showVaultInfo showLogout />
50
+ </header>
51
+ );
52
+ }
53
+ ```
54
+
55
+ ### 3. Add chat
56
+
57
+ ```tsx
58
+ import { HustleChat } from './src';
59
+
60
+ function ChatPage() {
61
+ return (
62
+ <HustleChat
63
+ showModelSelector
64
+ showSettings
65
+ placeholder="Ask me anything..."
66
+ />
67
+ );
68
+ }
69
+ ```
70
+
71
+ ## Hooks
72
+
73
+ ### useEmblemAuth
74
+
75
+ Access authentication state and actions.
76
+
77
+ ```tsx
78
+ import { useEmblemAuth } from './src';
79
+
80
+ function MyComponent() {
81
+ const {
82
+ // State
83
+ session, // Current auth session
84
+ isAuthenticated, // Boolean
85
+ isLoading, // Loading state
86
+ error, // Error object
87
+ vaultId, // User's vault ID
88
+ walletAddress, // Connected wallet address
89
+ vaultInfo, // Full vault details
90
+
91
+ // Actions
92
+ openAuthModal, // Open the auth modal
93
+ logout, // Log out
94
+ refreshSession, // Refresh the JWT
95
+
96
+ // Advanced
97
+ authSDK, // Raw SDK instance (for Hustle)
98
+ } = useEmblemAuth();
99
+
100
+ return (
101
+ <button onClick={openAuthModal}>
102
+ {isAuthenticated ? `Connected: ${walletAddress}` : 'Connect'}
103
+ </button>
104
+ );
105
+ }
106
+ ```
107
+
108
+ ### useHustle
109
+
110
+ Access chat functionality (requires authentication).
111
+
112
+ ```tsx
113
+ import { useHustle } from './src';
114
+
115
+ function ChatComponent() {
116
+ const {
117
+ // State
118
+ isReady, // SDK ready for use
119
+ isLoading, // Request in progress
120
+ error, // Error object
121
+ models, // Available AI models
122
+
123
+ // Chat
124
+ chat, // Send message (non-streaming)
125
+ chatStream, // Send message (streaming)
126
+ uploadFile, // Upload image attachment
127
+
128
+ // Settings
129
+ selectedModel, // Current model
130
+ setSelectedModel,
131
+ systemPrompt, // Custom system prompt
132
+ setSystemPrompt,
133
+ skipServerPrompt, // Skip server's default prompt
134
+ setSkipServerPrompt,
135
+ } = useHustle();
136
+
137
+ // Non-streaming chat
138
+ const response = await chat({
139
+ messages: [{ role: 'user', content: 'Hello!' }],
140
+ });
141
+
142
+ // Streaming chat
143
+ for await (const chunk of chatStream({ messages })) {
144
+ if (chunk.type === 'text') {
145
+ console.log(chunk.value); // Stream text
146
+ } else if (chunk.type === 'tool_call') {
147
+ console.log('Tool:', chunk.value.toolName);
148
+ }
149
+ }
150
+ }
151
+ ```
152
+
153
+ ## Components
154
+
155
+ ### ConnectButton
156
+
157
+ Authentication trigger button with vault info dropdown.
158
+
159
+ ```tsx
160
+ <ConnectButton
161
+ connectLabel="Sign In"
162
+ loadingLabel="Connecting..."
163
+ onConnect={() => console.log('Connected!')}
164
+ onDisconnect={() => console.log('Disconnected!')}
165
+ showVaultInfo={true} // Show vault dropdown on hover when connected
166
+ />
167
+ ```
168
+
169
+ When connected, displays:
170
+ - Green pill: "✓ Connected • 0x1234...5678 ▾"
171
+ - Separate power button for disconnect
172
+ - Vault info dropdown on hover (Vault ID + wallet address with copy buttons)
173
+
174
+ ### AuthStatus
175
+
176
+ Simple connection status indicator.
177
+
178
+ ```tsx
179
+ <AuthStatus
180
+ showVaultInfo={true} // Expandable vault details on hover
181
+ showLogout={true} // Show disconnect button
182
+ />
183
+ ```
184
+
185
+ ### HustleChat
186
+
187
+ Complete streaming chat interface.
188
+
189
+ ```tsx
190
+ <HustleChat
191
+ placeholder="Type a message..."
192
+ showSettings={true} // Settings modal (model selector, prompts)
193
+ showDebug={false} // Show tool call debug info
194
+ initialSystemPrompt="You are a helpful assistant."
195
+ onMessage={(msg) => console.log('Sent:', msg)}
196
+ onToolCall={(tool) => console.log('Tool:', tool)}
197
+ onResponse={(content) => console.log('Response:', content)}
198
+ />
199
+ ```
200
+
201
+ The settings modal includes:
202
+ - Model selector (grouped by provider)
203
+ - Model info (context length, pricing)
204
+ - Server system prompt toggle
205
+ - Custom system prompt textarea
206
+
207
+ ## Architecture
208
+
209
+ ```
210
+ EmblemAuthProvider (standalone - first class citizen)
211
+
212
+ └── HustleProvider (depends on auth)
213
+
214
+ └── Your components use hooks freely
215
+ ```
216
+
217
+ **Key principle:** Auth is independent. Hustle depends on Auth. Never the reverse.
218
+
219
+ ## The Correct Pattern
220
+
221
+ This SDK uses the modern JWT-based pattern where the Hustle client is initialized with the Auth SDK instance:
222
+
223
+ ```typescript
224
+ // ✅ CORRECT - What this SDK does
225
+ const hustleClient = new HustleIncognitoClient({
226
+ sdk: authSDK, // Pass the auth SDK instance
227
+ hustleApiUrl: 'https://dev.agenthustle.ai',
228
+ });
229
+
230
+ // ❌ DEPRECATED - Don't do this
231
+ const hustleClient = new HustleIncognitoClient({
232
+ apiKey: vaultApiKey, // Don't use API keys
233
+ hustleApiUrl: '...',
234
+ });
235
+ ```
236
+
237
+ The Auth SDK automatically handles:
238
+ - JWT token storage and persistence
239
+ - Token refresh before expiration
240
+ - Modal communication
241
+ - Session lifecycle
242
+
243
+ The Hustle SDK (when initialized with `sdk:`) automatically handles:
244
+ - JWT injection in API requests
245
+ - Token refresh coordination
246
+ - Streaming response parsing
247
+ - Tool call orchestration
248
+
249
+ ## Multiple Chat Instances
250
+
251
+ You can use multiple `HustleProvider` instances in the same app. Each instance has isolated settings and plugins.
252
+
253
+ ```tsx
254
+ <EmblemAuthProvider appId="your-app">
255
+ {/* Trading assistant */}
256
+ <HustleProvider instanceId="trading">
257
+ <TradingChat />
258
+ </HustleProvider>
259
+
260
+ {/* Support bot */}
261
+ <HustleProvider instanceId="support">
262
+ <SupportChat />
263
+ </HustleProvider>
264
+ </EmblemAuthProvider>
265
+ ```
266
+
267
+ **How it works:**
268
+ - Each provider stores settings separately (`hustle-settings-{instanceId}`)
269
+ - Plugins are installed globally (`hustle-plugins`) - install once, available everywhere
270
+ - Plugin enabled/disabled state is per-instance (`hustle-plugin-state-{instanceId}`)
271
+ - If `instanceId` is omitted, an auto-generated ID is used (`instance-1`, `instance-2`, etc.)
272
+ - Dev warning appears when multiple providers exist without explicit IDs
273
+
274
+ ## Plugin System
275
+
276
+ Extend the AI with custom client-side tools using plugins.
277
+
278
+ ### usePlugins Hook
279
+
280
+ ```tsx
281
+ import { usePlugins } from './src';
282
+
283
+ function PluginManager() {
284
+ const {
285
+ plugins, // All registered plugins
286
+ enabledPlugins, // Only enabled plugins (with executors)
287
+ registerPlugin, // Add a plugin
288
+ unregisterPlugin, // Remove a plugin
289
+ enablePlugin, // Enable a plugin
290
+ disablePlugin, // Disable a plugin
291
+ isRegistered, // Check if registered
292
+ isEnabled, // Check if enabled
293
+ } = usePlugins();
294
+
295
+ return (
296
+ <div>
297
+ {plugins.map(p => (
298
+ <div key={p.name}>
299
+ {p.name} - {p.enabled ? 'On' : 'Off'}
300
+ <button onClick={() => p.enabled ? disablePlugin(p.name) : enablePlugin(p.name)}>
301
+ Toggle
302
+ </button>
303
+ </div>
304
+ ))}
305
+ </div>
306
+ );
307
+ }
308
+ ```
309
+
310
+ ### Available Plugins
311
+
312
+ Two plugins are included:
313
+
314
+ **Prediction Market Alpha** (`prediction-market-alpha`)
315
+ - Search Polymarket and Kalshi markets
316
+ - Get market details, prices, and trades
317
+ - Tools: `get_supported_platforms`, `search_prediction_markets`, `get_market_details`, `get_market_prices`, `get_market_trades`
318
+
319
+ **Migrate.fun Knowledge Base** (`migrate-fun-kb`)
320
+ - Embedded Q&A about token migrations
321
+ - Tool: `search_migrate_fun_docs`
322
+
323
+ ### Creating Custom Plugins
324
+
325
+ ```tsx
326
+ import type { HustlePlugin } from './src';
327
+
328
+ const myPlugin: HustlePlugin = {
329
+ name: 'my-plugin',
330
+ version: '1.0.0',
331
+ description: 'My custom plugin',
332
+ tools: [
333
+ {
334
+ name: 'get_weather',
335
+ description: 'Get current weather for a city',
336
+ parameters: {
337
+ type: 'object',
338
+ properties: {
339
+ city: { type: 'string', description: 'City name' },
340
+ },
341
+ required: ['city'],
342
+ },
343
+ },
344
+ ],
345
+ executors: {
346
+ get_weather: async (args) => {
347
+ // Your implementation
348
+ return { temp: 72, conditions: 'sunny' };
349
+ },
350
+ },
351
+ hooks: {
352
+ onRegister: () => console.log('Plugin registered!'),
353
+ },
354
+ };
355
+
356
+ // Register it
357
+ const { registerPlugin } = usePlugins();
358
+ registerPlugin(myPlugin);
359
+ ```
360
+
361
+ ### Plugin Persistence
362
+
363
+ - Plugins are persisted in localStorage with serialized `executorCode`
364
+ - Executor functions are stored as strings and reconstituted via `eval()` on page refresh
365
+ - Enable/disable state is preserved per-instance
366
+ - Cross-tab sync via StorageEvent
367
+ - **Note:** Existing plugins from older versions need to be uninstalled and reinstalled to use the new serialization format
368
+
369
+ ## Configuration
370
+
371
+ ### Environment Variables
372
+
373
+ ```env
374
+ NEXT_PUBLIC_EMBLEM_APP_ID=your-app-id
375
+ NEXT_PUBLIC_EMBLEM_API_URL=https://dev-api.emblemvault.ai
376
+ NEXT_PUBLIC_EMBLEM_MODAL_URL=https://dev-auth.emblemvault.ai/connect
377
+ NEXT_PUBLIC_HUSTLE_API_URL=https://dev.agenthustle.ai
378
+ ```
379
+
380
+ ### Provider Props
381
+
382
+ **EmblemAuthProvider:**
383
+ | Prop | Type | Required | Description |
384
+ |------|------|----------|-------------|
385
+ | `appId` | string | Yes | Your application ID |
386
+ | `apiUrl` | string | No | Auth API endpoint |
387
+ | `modalUrl` | string | No | Auth modal URL |
388
+ | `debug` | boolean | No | Enable debug logging |
389
+
390
+ **HustleProvider:**
391
+ | Prop | Type | Required | Description |
392
+ |------|------|----------|-------------|
393
+ | `hustleApiUrl` | string | No | Hustle API endpoint |
394
+ | `debug` | boolean | No | Enable debug logging |
395
+ | `instanceId` | string | No | Unique ID for multi-instance scoping (auto-generated if not provided) |
396
+
397
+ ## Building
398
+
399
+ ```bash
400
+ npm install
401
+ npm run typecheck # Validate TypeScript
402
+ npm run build # Build to dist/
403
+ ```
404
+
405
+ ## File Structure
406
+
407
+ ```
408
+ src/
409
+ ├── index.ts # Main exports
410
+ ├── types/
411
+ │ ├── auth.ts # Auth types
412
+ │ └── hustle.ts # Hustle types
413
+ ├── providers/
414
+ │ ├── EmblemAuthProvider.tsx
415
+ │ └── HustleProvider.tsx
416
+ ├── hooks/
417
+ │ ├── useEmblemAuth.ts
418
+ │ └── useHustle.ts
419
+ ├── components/
420
+ │ ├── ConnectButton.tsx
421
+ │ ├── AuthStatus.tsx
422
+ │ └── HustleChat.tsx
423
+ └── utils/
424
+ └── index.ts # Helpers
425
+ ```
426
+
427
+ ## License
428
+
429
+ MIT
@@ -0,0 +1,90 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import { C as ChatMessage, T as ToolCall } from './hustle-Kj0X8qXC.js';
4
+
5
+ /**
6
+ * Props for ConnectButton component
7
+ */
8
+ interface ConnectButtonProps {
9
+ /** Additional CSS classes */
10
+ className?: string;
11
+ /** Additional inline styles */
12
+ style?: React.CSSProperties;
13
+ /** Custom content when disconnected */
14
+ connectLabel?: React.ReactNode;
15
+ /** Custom content while loading */
16
+ loadingLabel?: React.ReactNode;
17
+ /** Callback after successful connection */
18
+ onConnect?: () => void;
19
+ /** Callback after disconnection */
20
+ onDisconnect?: () => void;
21
+ /** Show vault info dropdown when connected */
22
+ showVaultInfo?: boolean;
23
+ /** Disable the button */
24
+ disabled?: boolean;
25
+ }
26
+ /**
27
+ * ConnectButton - A button to trigger Emblem Auth connection
28
+ * When connected, shows vault info dropdown and separate disconnect button
29
+ */
30
+ declare function ConnectButton({ className, style, connectLabel, loadingLabel, onConnect, onDisconnect, showVaultInfo, disabled, }: ConnectButtonProps): react_jsx_runtime.JSX.Element;
31
+
32
+ /**
33
+ * Props for AuthStatus component
34
+ */
35
+ interface AuthStatusProps {
36
+ /** Additional CSS classes */
37
+ className?: string;
38
+ /** Additional inline styles */
39
+ style?: React.CSSProperties;
40
+ /** Show expandable vault details */
41
+ showVaultInfo?: boolean;
42
+ /** Show logout button */
43
+ showLogout?: boolean;
44
+ }
45
+ /**
46
+ * AuthStatus - Displays current authentication status and vault info
47
+ */
48
+ declare function AuthStatus({ className, style, showVaultInfo, showLogout, }: AuthStatusProps): react_jsx_runtime.JSX.Element;
49
+
50
+ /**
51
+ * Props for HustleChat component
52
+ */
53
+ interface HustleChatProps {
54
+ /** Additional CSS classes */
55
+ className?: string;
56
+ /** Placeholder text for input */
57
+ placeholder?: string;
58
+ /** Show settings button (opens modal with model selector, prompts, etc.) */
59
+ showSettings?: boolean;
60
+ /** Show debug info */
61
+ showDebug?: boolean;
62
+ /** Initial system prompt */
63
+ initialSystemPrompt?: string;
64
+ /** Callback when message is sent */
65
+ onMessage?: (message: ChatMessage) => void;
66
+ /** Callback when tool is called */
67
+ onToolCall?: (toolCall: ToolCall) => void;
68
+ /** Callback when response is received */
69
+ onResponse?: (content: string) => void;
70
+ }
71
+ /**
72
+ * HustleChat - Complete streaming chat interface
73
+ *
74
+ * @example Basic usage
75
+ * ```tsx
76
+ * <HustleChat />
77
+ * ```
78
+ *
79
+ * @example With settings modal
80
+ * ```tsx
81
+ * <HustleChat
82
+ * showSettings
83
+ * placeholder="Ask me anything..."
84
+ * onMessage={(msg) => console.log('Sent:', msg)}
85
+ * />
86
+ * ```
87
+ */
88
+ declare function HustleChat({ className, placeholder, showSettings, showDebug, initialSystemPrompt, onMessage, onToolCall, onResponse, }: HustleChatProps): react_jsx_runtime.JSX.Element;
89
+
90
+ export { AuthStatus as A, ConnectButton as C, HustleChat as H, type ConnectButtonProps as a, type AuthStatusProps as b, type HustleChatProps as c };
@@ -0,0 +1,90 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import { C as ChatMessage, T as ToolCall } from './hustle-Kj0X8qXC.cjs';
4
+
5
+ /**
6
+ * Props for ConnectButton component
7
+ */
8
+ interface ConnectButtonProps {
9
+ /** Additional CSS classes */
10
+ className?: string;
11
+ /** Additional inline styles */
12
+ style?: React.CSSProperties;
13
+ /** Custom content when disconnected */
14
+ connectLabel?: React.ReactNode;
15
+ /** Custom content while loading */
16
+ loadingLabel?: React.ReactNode;
17
+ /** Callback after successful connection */
18
+ onConnect?: () => void;
19
+ /** Callback after disconnection */
20
+ onDisconnect?: () => void;
21
+ /** Show vault info dropdown when connected */
22
+ showVaultInfo?: boolean;
23
+ /** Disable the button */
24
+ disabled?: boolean;
25
+ }
26
+ /**
27
+ * ConnectButton - A button to trigger Emblem Auth connection
28
+ * When connected, shows vault info dropdown and separate disconnect button
29
+ */
30
+ declare function ConnectButton({ className, style, connectLabel, loadingLabel, onConnect, onDisconnect, showVaultInfo, disabled, }: ConnectButtonProps): react_jsx_runtime.JSX.Element;
31
+
32
+ /**
33
+ * Props for AuthStatus component
34
+ */
35
+ interface AuthStatusProps {
36
+ /** Additional CSS classes */
37
+ className?: string;
38
+ /** Additional inline styles */
39
+ style?: React.CSSProperties;
40
+ /** Show expandable vault details */
41
+ showVaultInfo?: boolean;
42
+ /** Show logout button */
43
+ showLogout?: boolean;
44
+ }
45
+ /**
46
+ * AuthStatus - Displays current authentication status and vault info
47
+ */
48
+ declare function AuthStatus({ className, style, showVaultInfo, showLogout, }: AuthStatusProps): react_jsx_runtime.JSX.Element;
49
+
50
+ /**
51
+ * Props for HustleChat component
52
+ */
53
+ interface HustleChatProps {
54
+ /** Additional CSS classes */
55
+ className?: string;
56
+ /** Placeholder text for input */
57
+ placeholder?: string;
58
+ /** Show settings button (opens modal with model selector, prompts, etc.) */
59
+ showSettings?: boolean;
60
+ /** Show debug info */
61
+ showDebug?: boolean;
62
+ /** Initial system prompt */
63
+ initialSystemPrompt?: string;
64
+ /** Callback when message is sent */
65
+ onMessage?: (message: ChatMessage) => void;
66
+ /** Callback when tool is called */
67
+ onToolCall?: (toolCall: ToolCall) => void;
68
+ /** Callback when response is received */
69
+ onResponse?: (content: string) => void;
70
+ }
71
+ /**
72
+ * HustleChat - Complete streaming chat interface
73
+ *
74
+ * @example Basic usage
75
+ * ```tsx
76
+ * <HustleChat />
77
+ * ```
78
+ *
79
+ * @example With settings modal
80
+ * ```tsx
81
+ * <HustleChat
82
+ * showSettings
83
+ * placeholder="Ask me anything..."
84
+ * onMessage={(msg) => console.log('Sent:', msg)}
85
+ * />
86
+ * ```
87
+ */
88
+ declare function HustleChat({ className, placeholder, showSettings, showDebug, initialSystemPrompt, onMessage, onToolCall, onResponse, }: HustleChatProps): react_jsx_runtime.JSX.Element;
89
+
90
+ export { AuthStatus as A, ConnectButton as C, HustleChat as H, type ConnectButtonProps as a, type AuthStatusProps as b, type HustleChatProps as c };