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.
- package/README.md +429 -0
- package/dist/HustleChat-BC9wvWVA.d.ts +90 -0
- package/dist/HustleChat-BcrKkkyn.d.cts +90 -0
- package/dist/browser/hustle-react.js +14854 -0
- package/dist/browser/hustle-react.js.map +1 -0
- package/dist/components/index.cjs +3141 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +20 -0
- package/dist/components/index.d.ts +20 -0
- package/dist/components/index.js +3112 -0
- package/dist/components/index.js.map +1 -0
- package/dist/hooks/index.cjs +845 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.cts +6 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.js +838 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hustle-Kj0X8qXC.d.cts +193 -0
- package/dist/hustle-Kj0X8qXC.d.ts +193 -0
- package/dist/index-ChUsRBwL.d.ts +152 -0
- package/dist/index-DE1N7C3W.d.cts +152 -0
- package/dist/index-DuPFrMZy.d.cts +214 -0
- package/dist/index-kFIdHjNw.d.ts +214 -0
- package/dist/index.cjs +3746 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +271 -0
- package/dist/index.d.ts +271 -0
- package/dist/index.js +3697 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/index.cjs +844 -0
- package/dist/providers/index.cjs.map +1 -0
- package/dist/providers/index.d.cts +5 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.js +838 -0
- package/dist/providers/index.js.map +1 -0
- package/package.json +80 -0
- package/src/components/AuthStatus.tsx +352 -0
- package/src/components/ConnectButton.tsx +421 -0
- package/src/components/HustleChat.tsx +1273 -0
- package/src/components/MarkdownContent.tsx +431 -0
- package/src/components/index.ts +15 -0
- package/src/hooks/index.ts +40 -0
- package/src/hooks/useEmblemAuth.ts +27 -0
- package/src/hooks/useHustle.ts +36 -0
- package/src/hooks/usePlugins.ts +135 -0
- package/src/index.ts +142 -0
- package/src/plugins/index.ts +48 -0
- package/src/plugins/migrateFun.ts +211 -0
- package/src/plugins/predictionMarket.ts +411 -0
- package/src/providers/EmblemAuthProvider.tsx +319 -0
- package/src/providers/HustleProvider.tsx +540 -0
- package/src/providers/index.ts +6 -0
- package/src/styles/index.ts +2 -0
- package/src/styles/tokens.ts +447 -0
- package/src/types/auth.ts +85 -0
- package/src/types/hustle.ts +217 -0
- package/src/types/index.ts +49 -0
- package/src/types/plugin.ts +180 -0
- package/src/utils/index.ts +122 -0
- 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 };
|