@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.
Files changed (184) hide show
  1. package/README.md +708 -0
  2. package/dist/api/auth.d.ts +18 -0
  3. package/dist/api/auth.d.ts.map +1 -0
  4. package/dist/api/auth.js +43 -0
  5. package/dist/api/auth.js.map +1 -0
  6. package/dist/api/integrations.d.ts +27 -0
  7. package/dist/api/integrations.d.ts.map +1 -0
  8. package/dist/api/integrations.js +64 -0
  9. package/dist/api/integrations.js.map +1 -0
  10. package/dist/api/mcp.d.ts +15 -0
  11. package/dist/api/mcp.d.ts.map +1 -0
  12. package/dist/api/mcp.js +24 -0
  13. package/dist/api/mcp.js.map +1 -0
  14. package/dist/api/recipes.d.ts +19 -0
  15. package/dist/api/recipes.d.ts.map +1 -0
  16. package/dist/api/recipes.js +37 -0
  17. package/dist/api/recipes.js.map +1 -0
  18. package/dist/api/users.d.ts +19 -0
  19. package/dist/api/users.d.ts.map +1 -0
  20. package/dist/api/users.js +32 -0
  21. package/dist/api/users.js.map +1 -0
  22. package/dist/api/workflows.d.ts +44 -0
  23. package/dist/api/workflows.d.ts.map +1 -0
  24. package/dist/api/workflows.js +95 -0
  25. package/dist/api/workflows.js.map +1 -0
  26. package/dist/browser.js +2 -0
  27. package/dist/browser.js.map +1 -0
  28. package/dist/client.d.ts +35 -0
  29. package/dist/client.d.ts.map +1 -0
  30. package/dist/client.js +87 -0
  31. package/dist/client.js.map +1 -0
  32. package/dist/config.d.ts +21 -0
  33. package/dist/config.d.ts.map +1 -0
  34. package/dist/config.js +39 -0
  35. package/dist/config.js.map +1 -0
  36. package/dist/errors.d.ts +39 -0
  37. package/dist/errors.d.ts.map +1 -0
  38. package/dist/errors.js +92 -0
  39. package/dist/errors.js.map +1 -0
  40. package/dist/index.d.ts +9 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +36 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/react/LangslideProvider.d.ts +12 -0
  45. package/dist/react/LangslideProvider.d.ts.map +1 -0
  46. package/dist/react/LangslideProvider.js +87 -0
  47. package/dist/react/LangslideProvider.js.map +1 -0
  48. package/dist/react/api/auth.d.ts +18 -0
  49. package/dist/react/api/auth.d.ts.map +1 -0
  50. package/dist/react/api/auth.js +43 -0
  51. package/dist/react/api/auth.js.map +1 -0
  52. package/dist/react/api/integrations.d.ts +27 -0
  53. package/dist/react/api/integrations.d.ts.map +1 -0
  54. package/dist/react/api/integrations.js +64 -0
  55. package/dist/react/api/integrations.js.map +1 -0
  56. package/dist/react/api/mcp.d.ts +15 -0
  57. package/dist/react/api/mcp.d.ts.map +1 -0
  58. package/dist/react/api/mcp.js +24 -0
  59. package/dist/react/api/mcp.js.map +1 -0
  60. package/dist/react/api/recipes.d.ts +19 -0
  61. package/dist/react/api/recipes.d.ts.map +1 -0
  62. package/dist/react/api/recipes.js +37 -0
  63. package/dist/react/api/recipes.js.map +1 -0
  64. package/dist/react/api/users.d.ts +19 -0
  65. package/dist/react/api/users.d.ts.map +1 -0
  66. package/dist/react/api/users.js +32 -0
  67. package/dist/react/api/users.js.map +1 -0
  68. package/dist/react/api/workflows.d.ts +44 -0
  69. package/dist/react/api/workflows.d.ts.map +1 -0
  70. package/dist/react/api/workflows.js +95 -0
  71. package/dist/react/api/workflows.js.map +1 -0
  72. package/dist/react/client.d.ts +35 -0
  73. package/dist/react/client.d.ts.map +1 -0
  74. package/dist/react/client.js +87 -0
  75. package/dist/react/client.js.map +1 -0
  76. package/dist/react/config.d.ts +21 -0
  77. package/dist/react/config.d.ts.map +1 -0
  78. package/dist/react/config.js +39 -0
  79. package/dist/react/config.js.map +1 -0
  80. package/dist/react/errors.d.ts +39 -0
  81. package/dist/react/errors.d.ts.map +1 -0
  82. package/dist/react/errors.js +92 -0
  83. package/dist/react/errors.js.map +1 -0
  84. package/dist/react/index.d.ts +10 -0
  85. package/dist/react/index.d.ts.map +1 -0
  86. package/dist/react/index.js +18 -0
  87. package/dist/react/index.js.map +1 -0
  88. package/dist/react/react/LangslideProvider.d.ts +19 -0
  89. package/dist/react/react/LangslideProvider.d.ts.map +1 -0
  90. package/dist/react/react/LangslideProvider.js +87 -0
  91. package/dist/react/react/LangslideProvider.js.map +1 -0
  92. package/dist/react/react/index.d.ts +10 -0
  93. package/dist/react/react/index.d.ts.map +1 -0
  94. package/dist/react/react/index.js +18 -0
  95. package/dist/react/react/index.js.map +1 -0
  96. package/dist/react/react/useIntegrations.d.ts +13 -0
  97. package/dist/react/react/useIntegrations.d.ts.map +1 -0
  98. package/dist/react/react/useIntegrations.js +70 -0
  99. package/dist/react/react/useIntegrations.js.map +1 -0
  100. package/dist/react/react/useWorkflows.d.ts +14 -0
  101. package/dist/react/react/useWorkflows.d.ts.map +1 -0
  102. package/dist/react/react/useWorkflows.js +108 -0
  103. package/dist/react/react/useWorkflows.js.map +1 -0
  104. package/dist/react/types/common.d.ts +28 -0
  105. package/dist/react/types/common.d.ts.map +1 -0
  106. package/dist/react/types/common.js +6 -0
  107. package/dist/react/types/common.js.map +1 -0
  108. package/dist/react/types/index.d.ts +8 -0
  109. package/dist/react/types/index.d.ts.map +1 -0
  110. package/dist/react/types/index.js +25 -0
  111. package/dist/react/types/index.js.map +1 -0
  112. package/dist/react/types/integration.d.ts +23 -0
  113. package/dist/react/types/integration.d.ts.map +1 -0
  114. package/dist/react/types/integration.js +6 -0
  115. package/dist/react/types/integration.js.map +1 -0
  116. package/dist/react/types/permissions.d.ts +31 -0
  117. package/dist/react/types/permissions.d.ts.map +1 -0
  118. package/dist/react/types/permissions.js +33 -0
  119. package/dist/react/types/permissions.js.map +1 -0
  120. package/dist/react/types/workflow.d.ts +33 -0
  121. package/dist/react/types/workflow.d.ts.map +1 -0
  122. package/dist/react/types/workflow.js +6 -0
  123. package/dist/react/types/workflow.js.map +1 -0
  124. package/dist/react/useIntegrations.d.ts +13 -0
  125. package/dist/react/useIntegrations.d.ts.map +1 -0
  126. package/dist/react/useIntegrations.js +70 -0
  127. package/dist/react/useIntegrations.js.map +1 -0
  128. package/dist/react/useWorkflows.d.ts +14 -0
  129. package/dist/react/useWorkflows.d.ts.map +1 -0
  130. package/dist/react/useWorkflows.js +108 -0
  131. package/dist/react/useWorkflows.js.map +1 -0
  132. package/dist/react/utils/permission-guard.d.ts +13 -0
  133. package/dist/react/utils/permission-guard.d.ts.map +1 -0
  134. package/dist/react/utils/permission-guard.js +28 -0
  135. package/dist/react/utils/permission-guard.js.map +1 -0
  136. package/dist/react/utils/permissions.d.ts +20 -0
  137. package/dist/react/utils/permissions.d.ts.map +1 -0
  138. package/dist/react/utils/permissions.js +48 -0
  139. package/dist/react/utils/permissions.js.map +1 -0
  140. package/dist/react/utils/request.d.ts +7 -0
  141. package/dist/react/utils/request.d.ts.map +1 -0
  142. package/dist/react/utils/request.js +48 -0
  143. package/dist/react/utils/request.js.map +1 -0
  144. package/dist/types/auth.d.ts +5 -0
  145. package/dist/types/auth.d.ts.map +1 -0
  146. package/dist/types/auth.js +7 -0
  147. package/dist/types/auth.js.map +1 -0
  148. package/dist/types/common.d.ts +28 -0
  149. package/dist/types/common.d.ts.map +1 -0
  150. package/dist/types/common.js +6 -0
  151. package/dist/types/common.js.map +1 -0
  152. package/dist/types/index.d.ts +8 -0
  153. package/dist/types/index.d.ts.map +1 -0
  154. package/dist/types/index.js +25 -0
  155. package/dist/types/index.js.map +1 -0
  156. package/dist/types/integration.d.ts +23 -0
  157. package/dist/types/integration.d.ts.map +1 -0
  158. package/dist/types/integration.js +6 -0
  159. package/dist/types/integration.js.map +1 -0
  160. package/dist/types/permissions.d.ts +31 -0
  161. package/dist/types/permissions.d.ts.map +1 -0
  162. package/dist/types/permissions.js +33 -0
  163. package/dist/types/permissions.js.map +1 -0
  164. package/dist/types/workflow.d.ts +33 -0
  165. package/dist/types/workflow.d.ts.map +1 -0
  166. package/dist/types/workflow.js +6 -0
  167. package/dist/types/workflow.js.map +1 -0
  168. package/dist/utils/permission-guard.d.ts +13 -0
  169. package/dist/utils/permission-guard.d.ts.map +1 -0
  170. package/dist/utils/permission-guard.js +28 -0
  171. package/dist/utils/permission-guard.js.map +1 -0
  172. package/dist/utils/permissions.d.ts +20 -0
  173. package/dist/utils/permissions.d.ts.map +1 -0
  174. package/dist/utils/permissions.js +48 -0
  175. package/dist/utils/permissions.js.map +1 -0
  176. package/dist/utils/request.d.ts +7 -0
  177. package/dist/utils/request.d.ts.map +1 -0
  178. package/dist/utils/request.js +48 -0
  179. package/dist/utils/request.js.map +1 -0
  180. package/dist/utils/validation.d.ts +8 -0
  181. package/dist/utils/validation.d.ts.map +1 -0
  182. package/dist/utils/validation.js +37 -0
  183. package/dist/utils/validation.js.map +1 -0
  184. 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
+ [![npm version](https://img.shields.io/npm/v/@langslide/sdk.svg)](https://www.npmjs.com/package/@langslide/sdk)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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"}