@langslide/sdk 0.1.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 +708 -0
- package/dist/api/auth.d.ts +18 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +43 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/integrations.d.ts +27 -0
- package/dist/api/integrations.d.ts.map +1 -0
- package/dist/api/integrations.js +64 -0
- package/dist/api/integrations.js.map +1 -0
- package/dist/api/mcp.d.ts +15 -0
- package/dist/api/mcp.d.ts.map +1 -0
- package/dist/api/mcp.js +24 -0
- package/dist/api/mcp.js.map +1 -0
- package/dist/api/recipes.d.ts +19 -0
- package/dist/api/recipes.d.ts.map +1 -0
- package/dist/api/recipes.js +37 -0
- package/dist/api/recipes.js.map +1 -0
- package/dist/api/users.d.ts +19 -0
- package/dist/api/users.d.ts.map +1 -0
- package/dist/api/users.js +32 -0
- package/dist/api/users.js.map +1 -0
- package/dist/api/workflows.d.ts +44 -0
- package/dist/api/workflows.d.ts.map +1 -0
- package/dist/api/workflows.js +95 -0
- package/dist/api/workflows.js.map +1 -0
- package/dist/browser.js +2 -0
- package/dist/browser.js.map +1 -0
- package/dist/client.d.ts +35 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +87 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +21 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +39 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +39 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +92 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/react/LangslideProvider.d.ts +12 -0
- package/dist/react/LangslideProvider.d.ts.map +1 -0
- package/dist/react/LangslideProvider.js +87 -0
- package/dist/react/LangslideProvider.js.map +1 -0
- package/dist/react/api/auth.d.ts +18 -0
- package/dist/react/api/auth.d.ts.map +1 -0
- package/dist/react/api/auth.js +43 -0
- package/dist/react/api/auth.js.map +1 -0
- package/dist/react/api/integrations.d.ts +27 -0
- package/dist/react/api/integrations.d.ts.map +1 -0
- package/dist/react/api/integrations.js +64 -0
- package/dist/react/api/integrations.js.map +1 -0
- package/dist/react/api/mcp.d.ts +15 -0
- package/dist/react/api/mcp.d.ts.map +1 -0
- package/dist/react/api/mcp.js +24 -0
- package/dist/react/api/mcp.js.map +1 -0
- package/dist/react/api/recipes.d.ts +19 -0
- package/dist/react/api/recipes.d.ts.map +1 -0
- package/dist/react/api/recipes.js +37 -0
- package/dist/react/api/recipes.js.map +1 -0
- package/dist/react/api/users.d.ts +19 -0
- package/dist/react/api/users.d.ts.map +1 -0
- package/dist/react/api/users.js +32 -0
- package/dist/react/api/users.js.map +1 -0
- package/dist/react/api/workflows.d.ts +44 -0
- package/dist/react/api/workflows.d.ts.map +1 -0
- package/dist/react/api/workflows.js +95 -0
- package/dist/react/api/workflows.js.map +1 -0
- package/dist/react/client.d.ts +35 -0
- package/dist/react/client.d.ts.map +1 -0
- package/dist/react/client.js +87 -0
- package/dist/react/client.js.map +1 -0
- package/dist/react/config.d.ts +21 -0
- package/dist/react/config.d.ts.map +1 -0
- package/dist/react/config.js +39 -0
- package/dist/react/config.js.map +1 -0
- package/dist/react/errors.d.ts +39 -0
- package/dist/react/errors.d.ts.map +1 -0
- package/dist/react/errors.js +92 -0
- package/dist/react/errors.js.map +1 -0
- package/dist/react/index.d.ts +10 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +18 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/react/LangslideProvider.d.ts +19 -0
- package/dist/react/react/LangslideProvider.d.ts.map +1 -0
- package/dist/react/react/LangslideProvider.js +87 -0
- package/dist/react/react/LangslideProvider.js.map +1 -0
- package/dist/react/react/index.d.ts +10 -0
- package/dist/react/react/index.d.ts.map +1 -0
- package/dist/react/react/index.js +18 -0
- package/dist/react/react/index.js.map +1 -0
- package/dist/react/react/useIntegrations.d.ts +13 -0
- package/dist/react/react/useIntegrations.d.ts.map +1 -0
- package/dist/react/react/useIntegrations.js +70 -0
- package/dist/react/react/useIntegrations.js.map +1 -0
- package/dist/react/react/useWorkflows.d.ts +14 -0
- package/dist/react/react/useWorkflows.d.ts.map +1 -0
- package/dist/react/react/useWorkflows.js +108 -0
- package/dist/react/react/useWorkflows.js.map +1 -0
- package/dist/react/types/common.d.ts +28 -0
- package/dist/react/types/common.d.ts.map +1 -0
- package/dist/react/types/common.js +6 -0
- package/dist/react/types/common.js.map +1 -0
- package/dist/react/types/index.d.ts +8 -0
- package/dist/react/types/index.d.ts.map +1 -0
- package/dist/react/types/index.js +25 -0
- package/dist/react/types/index.js.map +1 -0
- package/dist/react/types/integration.d.ts +23 -0
- package/dist/react/types/integration.d.ts.map +1 -0
- package/dist/react/types/integration.js +6 -0
- package/dist/react/types/integration.js.map +1 -0
- package/dist/react/types/permissions.d.ts +31 -0
- package/dist/react/types/permissions.d.ts.map +1 -0
- package/dist/react/types/permissions.js +33 -0
- package/dist/react/types/permissions.js.map +1 -0
- package/dist/react/types/workflow.d.ts +33 -0
- package/dist/react/types/workflow.d.ts.map +1 -0
- package/dist/react/types/workflow.js +6 -0
- package/dist/react/types/workflow.js.map +1 -0
- package/dist/react/useIntegrations.d.ts +13 -0
- package/dist/react/useIntegrations.d.ts.map +1 -0
- package/dist/react/useIntegrations.js +70 -0
- package/dist/react/useIntegrations.js.map +1 -0
- package/dist/react/useWorkflows.d.ts +14 -0
- package/dist/react/useWorkflows.d.ts.map +1 -0
- package/dist/react/useWorkflows.js +108 -0
- package/dist/react/useWorkflows.js.map +1 -0
- package/dist/react/utils/permission-guard.d.ts +13 -0
- package/dist/react/utils/permission-guard.d.ts.map +1 -0
- package/dist/react/utils/permission-guard.js +28 -0
- package/dist/react/utils/permission-guard.js.map +1 -0
- package/dist/react/utils/permissions.d.ts +20 -0
- package/dist/react/utils/permissions.d.ts.map +1 -0
- package/dist/react/utils/permissions.js +48 -0
- package/dist/react/utils/permissions.js.map +1 -0
- package/dist/react/utils/request.d.ts +7 -0
- package/dist/react/utils/request.d.ts.map +1 -0
- package/dist/react/utils/request.js +48 -0
- package/dist/react/utils/request.js.map +1 -0
- package/dist/types/auth.d.ts +5 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +7 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/common.d.ts +28 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +6 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +25 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/integration.d.ts +23 -0
- package/dist/types/integration.d.ts.map +1 -0
- package/dist/types/integration.js +6 -0
- package/dist/types/integration.js.map +1 -0
- package/dist/types/permissions.d.ts +31 -0
- package/dist/types/permissions.d.ts.map +1 -0
- package/dist/types/permissions.js +33 -0
- package/dist/types/permissions.js.map +1 -0
- package/dist/types/workflow.d.ts +33 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +6 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/utils/permission-guard.d.ts +13 -0
- package/dist/utils/permission-guard.d.ts.map +1 -0
- package/dist/utils/permission-guard.js +28 -0
- package/dist/utils/permission-guard.js.map +1 -0
- package/dist/utils/permissions.d.ts +20 -0
- package/dist/utils/permissions.d.ts.map +1 -0
- package/dist/utils/permissions.js +48 -0
- package/dist/utils/permissions.js.map +1 -0
- package/dist/utils/request.d.ts +7 -0
- package/dist/utils/request.d.ts.map +1 -0
- package/dist/utils/request.js +48 -0
- package/dist/utils/request.js.map +1 -0
- package/dist/utils/validation.d.ts +8 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +37 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +76 -0
package/README.md
ADDED
|
@@ -0,0 +1,708 @@
|
|
|
1
|
+
# Langslide SDK
|
|
2
|
+
|
|
3
|
+
Official TypeScript SDK for the Langslide API. Build powerful workflow automations and integrations with type-safe, developer-friendly APIs.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@langslide/sdk)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
|
|
8
|
+
## Features
|
|
9
|
+
|
|
10
|
+
- ✅ **Complete API Coverage** - Workflows, Integrations, Users, MCP, Recipes
|
|
11
|
+
- ✅ **Workflow Triggering** - Execute workflows programmatically
|
|
12
|
+
- ✅ **Permission-Based Access Control** - Granular permissions for API keys
|
|
13
|
+
- ✅ **React Hooks** - Ready-to-use React hooks and context provider
|
|
14
|
+
- ✅ **Browser Bundle** - UMD bundle for direct browser usage
|
|
15
|
+
- ✅ **Enhanced Search** - Advanced filtering and sorting
|
|
16
|
+
- ✅ **TypeScript** - Full type definitions included
|
|
17
|
+
- ✅ **Error Handling** - Comprehensive error classes
|
|
18
|
+
- ✅ **Retry Logic** - Automatic retries with configurable timeouts
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
|
|
22
|
+
### NPM
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install @langslide/sdk
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Yarn
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
yarn add @langslide/sdk
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### PNPM
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pnpm add @langslide/sdk
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Browser (CDN)
|
|
41
|
+
|
|
42
|
+
```html
|
|
43
|
+
<script src="https://cdn.jsdelivr.net/npm/@langslide/sdk@latest/dist/browser.js"></script>
|
|
44
|
+
<script>
|
|
45
|
+
const sdk = new LangslideSDK({
|
|
46
|
+
apiKey: 'your-api-key'
|
|
47
|
+
});
|
|
48
|
+
</script>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Quick Start
|
|
52
|
+
|
|
53
|
+
### Node.js / TypeScript
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import { LangslideSDK } from '@langslide/sdk';
|
|
57
|
+
|
|
58
|
+
// Initialize the SDK
|
|
59
|
+
const sdk = new LangslideSDK({
|
|
60
|
+
baseUrl: 'https://backend-api-306481332586.asia-southeast1.run.app',
|
|
61
|
+
apiKey: 'your-api-key' // Optional - for JWT auth, leave empty
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// Validate API key and fetch permissions
|
|
65
|
+
await sdk.setApiKey('your-api-key');
|
|
66
|
+
|
|
67
|
+
// List workflows
|
|
68
|
+
const workflows = await sdk.workflows.list();
|
|
69
|
+
|
|
70
|
+
// Trigger a workflow
|
|
71
|
+
await sdk.workflows.trigger('workflow-id', { body: { data: 'test' } });
|
|
72
|
+
|
|
73
|
+
// Get an integration
|
|
74
|
+
const integration = await sdk.integrations.get('slack');
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### React
|
|
78
|
+
|
|
79
|
+
```tsx
|
|
80
|
+
import { LangslideProvider, useWorkflows } from '@langslide/sdk/react';
|
|
81
|
+
|
|
82
|
+
function App() {
|
|
83
|
+
return (
|
|
84
|
+
<LangslideProvider
|
|
85
|
+
config={{
|
|
86
|
+
apiKey: process.env.REACT_APP_LANGSLIDE_API_KEY
|
|
87
|
+
}}
|
|
88
|
+
>
|
|
89
|
+
<WorkflowList />
|
|
90
|
+
</LangslideProvider>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function WorkflowList() {
|
|
95
|
+
const { workflows, loading, error, triggerWorkflow } = useWorkflows();
|
|
96
|
+
|
|
97
|
+
if (loading) return <div>Loading...</div>;
|
|
98
|
+
if (error) return <div>Error: {error}</div>;
|
|
99
|
+
|
|
100
|
+
return (
|
|
101
|
+
<div>
|
|
102
|
+
{workflows.map(workflow => (
|
|
103
|
+
<div key={workflow.id}>
|
|
104
|
+
<h3>{workflow.name}</h3>
|
|
105
|
+
<button onClick={() => triggerWorkflow(workflow.id)}>
|
|
106
|
+
Trigger Workflow
|
|
107
|
+
</button>
|
|
108
|
+
</div>
|
|
109
|
+
))}
|
|
110
|
+
</div>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Browser (Vanilla JavaScript)
|
|
116
|
+
|
|
117
|
+
```html
|
|
118
|
+
<!DOCTYPE html>
|
|
119
|
+
<html>
|
|
120
|
+
<head>
|
|
121
|
+
<script src="https://cdn.jsdelivr.net/npm/@langslide/sdk@latest/dist/browser.js"></script>
|
|
122
|
+
</head>
|
|
123
|
+
<body>
|
|
124
|
+
<div id="workflows"></div>
|
|
125
|
+
<script>
|
|
126
|
+
const sdk = new LangslideSDK({
|
|
127
|
+
apiKey: 'your-api-key'
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
async function loadWorkflows() {
|
|
131
|
+
await sdk.setApiKey('your-api-key');
|
|
132
|
+
const workflows = await sdk.workflows.list();
|
|
133
|
+
document.getElementById('workflows').innerHTML =
|
|
134
|
+
workflows.items.map(w => `<div>${w.name}</div>`).join('');
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
loadWorkflows();
|
|
138
|
+
</script>
|
|
139
|
+
</body>
|
|
140
|
+
</html>
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Configuration
|
|
144
|
+
|
|
145
|
+
### Constructor Options
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
const sdk = new LangslideSDK({
|
|
149
|
+
baseUrl?: string; // API base URL (default: https://backend-api-306481332586.asia-southeast1.run.app)
|
|
150
|
+
apiKey?: string; // API key for authentication (optional - for JWT, leave empty)
|
|
151
|
+
timeout?: number; // Request timeout in ms (default: 30000)
|
|
152
|
+
retries?: number; // Number of retries (default: 3)
|
|
153
|
+
enableLogging?: boolean; // Enable request/response logging (default: false)
|
|
154
|
+
});
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Environment Variables
|
|
158
|
+
|
|
159
|
+
You can configure the SDK using environment variables:
|
|
160
|
+
|
|
161
|
+
- `LANGSLIDE_API_URL` - Backend API URL
|
|
162
|
+
- `LANGSLIDE_API_KEY` - API key for authentication
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
// Uses environment variables automatically
|
|
166
|
+
const sdk = new LangslideSDK();
|
|
167
|
+
|
|
168
|
+
// Validate API key if provided
|
|
169
|
+
if (process.env.LANGSLIDE_API_KEY) {
|
|
170
|
+
await sdk.setApiKey(process.env.LANGSLIDE_API_KEY);
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## API Modules
|
|
175
|
+
|
|
176
|
+
### Workflows
|
|
177
|
+
|
|
178
|
+
Complete workflow management with CRUD operations and triggering.
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
// List workflows with enhanced search
|
|
182
|
+
const workflows = await sdk.workflows.list({
|
|
183
|
+
page: 1,
|
|
184
|
+
limit: 10,
|
|
185
|
+
status: 'active',
|
|
186
|
+
search: 'email automation',
|
|
187
|
+
sortBy: 'created_at',
|
|
188
|
+
sortOrder: 'desc',
|
|
189
|
+
createdAfter: '2024-01-01',
|
|
190
|
+
tags: ['email', 'automation']
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// Get a workflow
|
|
194
|
+
const workflow = await sdk.workflows.get('workflow-id');
|
|
195
|
+
|
|
196
|
+
// Create a workflow
|
|
197
|
+
const newWorkflow = await sdk.workflows.create({
|
|
198
|
+
name: 'My Workflow',
|
|
199
|
+
status: 'active'
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
// Update a workflow
|
|
203
|
+
await sdk.workflows.update('workflow-id', {
|
|
204
|
+
status: 'inactive',
|
|
205
|
+
name: 'Updated Name'
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
// Delete a workflow
|
|
209
|
+
await sdk.workflows.delete('workflow-id');
|
|
210
|
+
|
|
211
|
+
// Trigger a workflow (async, fire-and-forget)
|
|
212
|
+
await sdk.workflows.trigger('workflow-id', {
|
|
213
|
+
body: { data: 'payload' },
|
|
214
|
+
params: { param1: 'value1' },
|
|
215
|
+
queryParams: { query: 'value' }
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
// Get usage statistics
|
|
219
|
+
const usage = await sdk.workflows.getUsage();
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**Required Permissions**: `workflows:read` for read operations, `workflows:write` for write operations
|
|
223
|
+
|
|
224
|
+
### Integrations
|
|
225
|
+
|
|
226
|
+
Discover and manage integrations.
|
|
227
|
+
|
|
228
|
+
```typescript
|
|
229
|
+
// List integrations with enhanced search
|
|
230
|
+
const integrations = await sdk.integrations.list({
|
|
231
|
+
page: 1,
|
|
232
|
+
limit: 20,
|
|
233
|
+
type: 'action', // or 'trigger'
|
|
234
|
+
search: 'slack',
|
|
235
|
+
sortBy: 'name',
|
|
236
|
+
sortOrder: 'asc'
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
// Get an integration
|
|
240
|
+
const integration = await sdk.integrations.get('slack');
|
|
241
|
+
|
|
242
|
+
// Get connections for an integration (requires connector access)
|
|
243
|
+
const connections = await sdk.integrations.getConnections('slack');
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**Required Permissions**: `integrations:read`, and connector access for `getConnections()`
|
|
247
|
+
|
|
248
|
+
### Users
|
|
249
|
+
|
|
250
|
+
User management operations.
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
// Get current user
|
|
254
|
+
const user = await sdk.users.getCurrent();
|
|
255
|
+
|
|
256
|
+
// Update current user
|
|
257
|
+
await sdk.users.update({
|
|
258
|
+
name: 'New Name',
|
|
259
|
+
email: 'new@example.com'
|
|
260
|
+
});
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
**Required Permissions**: `users:read` for `getCurrent()`, `users:write` for `update()`
|
|
264
|
+
|
|
265
|
+
### MCP (Model Context Protocol)
|
|
266
|
+
|
|
267
|
+
Access MCP resources.
|
|
268
|
+
|
|
269
|
+
```typescript
|
|
270
|
+
// List MCP resources
|
|
271
|
+
const resources = await sdk.mcp.listResources();
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**Required Permissions**: `mcp:read`
|
|
275
|
+
|
|
276
|
+
### Recipes
|
|
277
|
+
|
|
278
|
+
Recipe management.
|
|
279
|
+
|
|
280
|
+
```typescript
|
|
281
|
+
// List recipes
|
|
282
|
+
const recipes = await sdk.recipes.list('filter', 'type');
|
|
283
|
+
|
|
284
|
+
// Get a recipe
|
|
285
|
+
const recipe = await sdk.recipes.get('recipe-id');
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**Required Permissions**: `recipes:read`
|
|
289
|
+
|
|
290
|
+
## React Hooks
|
|
291
|
+
|
|
292
|
+
The SDK provides React hooks for easy integration in React applications.
|
|
293
|
+
|
|
294
|
+
### Setup
|
|
295
|
+
|
|
296
|
+
```tsx
|
|
297
|
+
import { LangslideProvider } from '@langslide/sdk/react';
|
|
298
|
+
|
|
299
|
+
function App() {
|
|
300
|
+
return (
|
|
301
|
+
<LangslideProvider
|
|
302
|
+
config={{
|
|
303
|
+
apiKey: process.env.REACT_APP_LANGSLIDE_API_KEY
|
|
304
|
+
}}
|
|
305
|
+
>
|
|
306
|
+
<YourApp />
|
|
307
|
+
</LangslideProvider>
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### useLangslide
|
|
313
|
+
|
|
314
|
+
Get the SDK instance.
|
|
315
|
+
|
|
316
|
+
```tsx
|
|
317
|
+
import { useLangslide } from '@langslide/sdk/react';
|
|
318
|
+
|
|
319
|
+
function MyComponent() {
|
|
320
|
+
const sdk = useLangslide();
|
|
321
|
+
// Use sdk directly
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### useWorkflows
|
|
326
|
+
|
|
327
|
+
Manage workflows with automatic state management.
|
|
328
|
+
|
|
329
|
+
```tsx
|
|
330
|
+
import { useWorkflows } from '@langslide/sdk/react';
|
|
331
|
+
|
|
332
|
+
function WorkflowManager() {
|
|
333
|
+
const {
|
|
334
|
+
workflows,
|
|
335
|
+
loading,
|
|
336
|
+
error,
|
|
337
|
+
pagination,
|
|
338
|
+
createWorkflow,
|
|
339
|
+
updateWorkflow,
|
|
340
|
+
deleteWorkflow,
|
|
341
|
+
triggerWorkflow,
|
|
342
|
+
getWorkflow,
|
|
343
|
+
refresh
|
|
344
|
+
} = useWorkflows({
|
|
345
|
+
status: 'active',
|
|
346
|
+
limit: 20
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
return (
|
|
350
|
+
<div>
|
|
351
|
+
{workflows.map(w => (
|
|
352
|
+
<div key={w.id}>
|
|
353
|
+
<h3>{w.name}</h3>
|
|
354
|
+
<button onClick={() => triggerWorkflow(w.id)}>Trigger</button>
|
|
355
|
+
</div>
|
|
356
|
+
))}
|
|
357
|
+
</div>
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
### useIntegrations
|
|
363
|
+
|
|
364
|
+
Manage integrations.
|
|
365
|
+
|
|
366
|
+
```tsx
|
|
367
|
+
import { useIntegrations } from '@langslide/sdk/react';
|
|
368
|
+
|
|
369
|
+
function IntegrationList() {
|
|
370
|
+
const {
|
|
371
|
+
integrations,
|
|
372
|
+
loading,
|
|
373
|
+
error,
|
|
374
|
+
getIntegration,
|
|
375
|
+
getConnections,
|
|
376
|
+
refresh
|
|
377
|
+
} = useIntegrations({
|
|
378
|
+
type: 'action'
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
// Use integrations...
|
|
382
|
+
}
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
## Enhanced Search
|
|
386
|
+
|
|
387
|
+
All list methods support enhanced search and filtering:
|
|
388
|
+
|
|
389
|
+
```typescript
|
|
390
|
+
// Text search
|
|
391
|
+
const results = await sdk.workflows.list({
|
|
392
|
+
search: 'email automation'
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
// Sorting
|
|
396
|
+
const sorted = await sdk.workflows.list({
|
|
397
|
+
sortBy: 'created_at',
|
|
398
|
+
sortOrder: 'desc'
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
// Date filtering
|
|
402
|
+
const recent = await sdk.workflows.list({
|
|
403
|
+
createdAfter: '2024-01-01',
|
|
404
|
+
createdBefore: '2024-12-31'
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
// Tags filtering
|
|
408
|
+
const tagged = await sdk.workflows.list({
|
|
409
|
+
tags: ['email', 'automation']
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
// Combined
|
|
413
|
+
const advanced = await sdk.workflows.list({
|
|
414
|
+
search: 'slack',
|
|
415
|
+
sortBy: 'name',
|
|
416
|
+
sortOrder: 'asc',
|
|
417
|
+
createdAfter: '2024-01-01',
|
|
418
|
+
tags: ['integration']
|
|
419
|
+
});
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
## Permissions & Access Control
|
|
423
|
+
|
|
424
|
+
The SDK supports permission-based access control for API keys.
|
|
425
|
+
|
|
426
|
+
### Permission System
|
|
427
|
+
|
|
428
|
+
API keys can have different permission levels:
|
|
429
|
+
|
|
430
|
+
- **SDK Methods**: Control which API methods can be called
|
|
431
|
+
- `workflows:read` - Read workflows
|
|
432
|
+
- `workflows:write` - Create/update/delete workflows
|
|
433
|
+
- `integrations:read` - Read integrations
|
|
434
|
+
- `users:read` - Read user information
|
|
435
|
+
- `users:write` - Update user information
|
|
436
|
+
- `mcp:read` - Read MCP resources
|
|
437
|
+
- `recipes:read` - Read recipes
|
|
438
|
+
- `*` - All permissions
|
|
439
|
+
|
|
440
|
+
- **Connectors**: Control access to specific integrations
|
|
441
|
+
- `["gmail", "slack"]` - Access to specific connectors
|
|
442
|
+
- `["*"]` - Access to all connectors
|
|
443
|
+
|
|
444
|
+
### Using Permissions
|
|
445
|
+
|
|
446
|
+
```typescript
|
|
447
|
+
// Set API key (automatically validates and fetches permissions)
|
|
448
|
+
await sdk.setApiKey('your-api-key');
|
|
449
|
+
|
|
450
|
+
// Check permissions
|
|
451
|
+
const permissions = sdk.getPermissions();
|
|
452
|
+
console.log('SDK Methods:', permissions?.sdk_methods);
|
|
453
|
+
console.log('Connectors:', permissions?.connectors);
|
|
454
|
+
|
|
455
|
+
// Permission checks happen automatically
|
|
456
|
+
try {
|
|
457
|
+
await sdk.workflows.create({ name: 'New Workflow' });
|
|
458
|
+
} catch (error) {
|
|
459
|
+
if (error instanceof LangslidePermissionError) {
|
|
460
|
+
console.error('Permission denied:', error.message);
|
|
461
|
+
console.error('Required:', error.requiredPermission);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### Connector Access
|
|
467
|
+
|
|
468
|
+
Connector names are normalized to lowercase for consistent matching:
|
|
469
|
+
|
|
470
|
+
```typescript
|
|
471
|
+
// These all work the same way:
|
|
472
|
+
await sdk.integrations.getConnections('google_sheets');
|
|
473
|
+
await sdk.integrations.getConnections('Google_Sheets');
|
|
474
|
+
await sdk.integrations.getConnections('GOOGLE_SHEETS');
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
**Note**: JWT-authenticated users (no API key) have full access and bypass permission checks.
|
|
478
|
+
|
|
479
|
+
## Error Handling
|
|
480
|
+
|
|
481
|
+
The SDK provides structured error classes for better error handling:
|
|
482
|
+
|
|
483
|
+
```typescript
|
|
484
|
+
import {
|
|
485
|
+
LangslideError,
|
|
486
|
+
LangslideAPIError,
|
|
487
|
+
LangslideAuthError,
|
|
488
|
+
LangslideValidationError,
|
|
489
|
+
LangslidePermissionError
|
|
490
|
+
} from '@langslide/sdk';
|
|
491
|
+
|
|
492
|
+
try {
|
|
493
|
+
await sdk.workflows.get('invalid-id');
|
|
494
|
+
} catch (error) {
|
|
495
|
+
if (error instanceof LangslidePermissionError) {
|
|
496
|
+
console.error('Permission Error:', error.message);
|
|
497
|
+
console.error('Required:', error.requiredPermission);
|
|
498
|
+
} else if (error instanceof LangslideAPIError) {
|
|
499
|
+
console.error('API Error:', error.statusCode, error.message);
|
|
500
|
+
console.error('Response:', error.response);
|
|
501
|
+
} else if (error instanceof LangslideAuthError) {
|
|
502
|
+
console.error('Auth Error:', error.message);
|
|
503
|
+
} else if (error instanceof LangslideValidationError) {
|
|
504
|
+
console.error('Validation Error:', error.message);
|
|
505
|
+
console.error('Field:', error.field);
|
|
506
|
+
} else if (error instanceof LangslideError) {
|
|
507
|
+
console.error('SDK Error:', error.message);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
## TypeScript Support
|
|
513
|
+
|
|
514
|
+
The SDK is written in TypeScript and provides full type definitions:
|
|
515
|
+
|
|
516
|
+
```typescript
|
|
517
|
+
import {
|
|
518
|
+
LangslideSDK,
|
|
519
|
+
Workflow,
|
|
520
|
+
Integration,
|
|
521
|
+
Connection,
|
|
522
|
+
ListOptions,
|
|
523
|
+
PaginatedResponse
|
|
524
|
+
} from '@langslide/sdk';
|
|
525
|
+
|
|
526
|
+
const sdk = new LangslideSDK({ apiKey: 'key' });
|
|
527
|
+
|
|
528
|
+
const workflow: Workflow = await sdk.workflows.get('id');
|
|
529
|
+
const integration: Integration = await sdk.integrations.get('slack');
|
|
530
|
+
const workflows: PaginatedResponse<Workflow> = await sdk.workflows.list();
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
## Common Use Cases
|
|
534
|
+
|
|
535
|
+
### Workflow Automation
|
|
536
|
+
|
|
537
|
+
```typescript
|
|
538
|
+
async function automateWorkflow() {
|
|
539
|
+
// Create workflow
|
|
540
|
+
const workflow = await sdk.workflows.create({
|
|
541
|
+
name: 'Daily Report',
|
|
542
|
+
status: 'active'
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
// Trigger workflow with payload
|
|
546
|
+
await sdk.workflows.trigger(workflow.id, {
|
|
547
|
+
body: {
|
|
548
|
+
date: new Date().toISOString(),
|
|
549
|
+
reportType: 'daily'
|
|
550
|
+
}
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
// Monitor usage
|
|
554
|
+
const usage = await sdk.workflows.getUsage();
|
|
555
|
+
console.log('Total executions:', usage.total);
|
|
556
|
+
}
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
### Integration Management
|
|
560
|
+
|
|
561
|
+
```typescript
|
|
562
|
+
async function manageIntegrations() {
|
|
563
|
+
// Find Slack integration
|
|
564
|
+
const integrations = await sdk.integrations.list({
|
|
565
|
+
search: 'slack',
|
|
566
|
+
type: 'action'
|
|
567
|
+
});
|
|
568
|
+
|
|
569
|
+
const slack = integrations.items[0];
|
|
570
|
+
|
|
571
|
+
// Get connections
|
|
572
|
+
const connections = await sdk.integrations.getConnections('slack');
|
|
573
|
+
console.log('Slack connections:', connections);
|
|
574
|
+
}
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
### Advanced Search
|
|
578
|
+
|
|
579
|
+
```typescript
|
|
580
|
+
async function findWorkflows() {
|
|
581
|
+
// Find active workflows created this month
|
|
582
|
+
const workflows = await sdk.workflows.list({
|
|
583
|
+
status: 'active',
|
|
584
|
+
createdAfter: new Date(new Date().getFullYear(), new Date().getMonth(), 1).toISOString(),
|
|
585
|
+
sortBy: 'created_at',
|
|
586
|
+
sortOrder: 'desc',
|
|
587
|
+
limit: 50
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
return workflows.items;
|
|
591
|
+
}
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
## API Reference
|
|
595
|
+
|
|
596
|
+
### WorkflowsAPI
|
|
597
|
+
|
|
598
|
+
| Method | Description | Permission |
|
|
599
|
+
|--------|-------------|------------|
|
|
600
|
+
| `list(options?)` | List workflows with pagination and filters | `workflows:read` |
|
|
601
|
+
| `get(id)` | Get workflow by ID | `workflows:read` |
|
|
602
|
+
| `create(payload)` | Create new workflow | `workflows:write` |
|
|
603
|
+
| `update(id, payload)` | Update workflow | `workflows:write` |
|
|
604
|
+
| `delete(id)` | Delete workflow | `workflows:write` |
|
|
605
|
+
| `trigger(id, payload?)` | Trigger workflow execution | `workflows:write` |
|
|
606
|
+
| `getUsage()` | Get usage statistics | `workflows:read` |
|
|
607
|
+
|
|
608
|
+
### IntegrationsAPI
|
|
609
|
+
|
|
610
|
+
| Method | Description | Permission |
|
|
611
|
+
|--------|-------------|------------|
|
|
612
|
+
| `list(options?)` | List integrations | `integrations:read` |
|
|
613
|
+
| `get(name)` | Get integration by name | `integrations:read` |
|
|
614
|
+
| `getConnections(name)` | Get connections for integration | `integrations:read` + connector access |
|
|
615
|
+
|
|
616
|
+
### UsersAPI
|
|
617
|
+
|
|
618
|
+
| Method | Description | Permission |
|
|
619
|
+
|--------|-------------|------------|
|
|
620
|
+
| `getCurrent()` | Get current user | `users:read` |
|
|
621
|
+
| `update(payload)` | Update current user | `users:write` |
|
|
622
|
+
|
|
623
|
+
### MCPAPI
|
|
624
|
+
|
|
625
|
+
| Method | Description | Permission |
|
|
626
|
+
|--------|-------------|------------|
|
|
627
|
+
| `listResources()` | List MCP resources | `mcp:read` |
|
|
628
|
+
|
|
629
|
+
### RecipesAPI
|
|
630
|
+
|
|
631
|
+
| Method | Description | Permission |
|
|
632
|
+
|--------|-------------|------------|
|
|
633
|
+
| `list(filter?, type?)` | List recipes | `recipes:read` |
|
|
634
|
+
| `get(id)` | Get recipe by ID | `recipes:read` |
|
|
635
|
+
|
|
636
|
+
### AuthAPI
|
|
637
|
+
|
|
638
|
+
| Method | Description | Permission |
|
|
639
|
+
|--------|-------------|------------|
|
|
640
|
+
| `validateAPIKey(key)` | Validate API key and fetch permissions | None |
|
|
641
|
+
|
|
642
|
+
## Troubleshooting
|
|
643
|
+
|
|
644
|
+
### CORS Issues
|
|
645
|
+
|
|
646
|
+
If you encounter CORS issues, ensure your `baseUrl` is correctly set:
|
|
647
|
+
|
|
648
|
+
```typescript
|
|
649
|
+
const sdk = new LangslideSDK({
|
|
650
|
+
baseUrl: 'https://backend-api-306481332586.asia-southeast1.run.app'
|
|
651
|
+
});
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
### Authentication Errors
|
|
655
|
+
|
|
656
|
+
If you get 401 errors, verify your API key:
|
|
657
|
+
|
|
658
|
+
```typescript
|
|
659
|
+
// Re-validate API key
|
|
660
|
+
await sdk.setApiKey('your-api-key');
|
|
661
|
+
|
|
662
|
+
// Check permissions
|
|
663
|
+
const permissions = sdk.getPermissions();
|
|
664
|
+
if (!permissions) {
|
|
665
|
+
console.error('API key validation failed');
|
|
666
|
+
}
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
### Permission Errors
|
|
670
|
+
|
|
671
|
+
Check your API key's permissions:
|
|
672
|
+
|
|
673
|
+
```typescript
|
|
674
|
+
const permissions = sdk.getPermissions();
|
|
675
|
+
if (permissions) {
|
|
676
|
+
console.log('Available methods:', permissions.sdk_methods);
|
|
677
|
+
console.log('Available connectors:', permissions.connectors);
|
|
678
|
+
}
|
|
679
|
+
```
|
|
680
|
+
|
|
681
|
+
### Build Issues
|
|
682
|
+
|
|
683
|
+
If you encounter build issues:
|
|
684
|
+
|
|
685
|
+
```bash
|
|
686
|
+
# Clean and rebuild
|
|
687
|
+
rm -rf dist node_modules
|
|
688
|
+
npm install
|
|
689
|
+
npm run build:all
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
## Contributing
|
|
693
|
+
|
|
694
|
+
We welcome contributions! Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.
|
|
695
|
+
|
|
696
|
+
## License
|
|
697
|
+
|
|
698
|
+
MIT
|
|
699
|
+
|
|
700
|
+
## Support
|
|
701
|
+
|
|
702
|
+
- **GitHub Issues**: [https://github.com/langslide/sdk/issues](https://github.com/langslide/sdk/issues)
|
|
703
|
+
- **Documentation**: [https://docs.langslide.com/sdk](https://docs.langslide.com/sdk)
|
|
704
|
+
- **Email**: support@langslide.com
|
|
705
|
+
|
|
706
|
+
## Changelog
|
|
707
|
+
|
|
708
|
+
See [CHANGELOG.md](./CHANGELOG.md) for version history.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AxiosInstance } from 'axios';
|
|
2
|
+
import { LangslideSDKConfigResolved } from '../config';
|
|
3
|
+
import { IAPIKeyPermissions } from '../types/permissions';
|
|
4
|
+
/**
|
|
5
|
+
* Authentication API module
|
|
6
|
+
*/
|
|
7
|
+
export declare class AuthAPI {
|
|
8
|
+
private client;
|
|
9
|
+
private config;
|
|
10
|
+
constructor(client: AxiosInstance, config: LangslideSDKConfigResolved);
|
|
11
|
+
/**
|
|
12
|
+
* Validate API key and return permissions
|
|
13
|
+
* This method calls the backend to validate the API key and fetch permissions
|
|
14
|
+
* @throws {LangslideAuthError} If API key is invalid
|
|
15
|
+
*/
|
|
16
|
+
validateAPIKey(apiKey: string): Promise<IAPIKeyPermissions>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;GAEG;AACH,qBAAa,OAAO;IAEhB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;gBADN,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,0BAA0B;IAG5C;;;;OAIG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA6BlE"}
|