@things-factory/integration-label-studio 9.1.19

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 (152) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/EXTERNAL_DATA_SOURCING.md +484 -0
  3. package/IMPLEMENTATION_GUIDE.md +469 -0
  4. package/INTEGRATION.md +279 -0
  5. package/README.md +1014 -0
  6. package/SETUP_GUIDE.md +577 -0
  7. package/TEST_GUIDE.md +387 -0
  8. package/UI_CUSTOMIZATION.md +395 -0
  9. package/USER_SYNC_GUIDE.md +514 -0
  10. package/client/bootstrap.ts +1 -0
  11. package/client/index.ts +1 -0
  12. package/client/label-studio-label-page.ts +52 -0
  13. package/client/label-studio-project-create.ts +216 -0
  14. package/client/label-studio-project-list.ts +214 -0
  15. package/client/label-studio-wrapper.ts +294 -0
  16. package/client/route.ts +15 -0
  17. package/client/tsconfig.json +13 -0
  18. package/config/config.development.js +124 -0
  19. package/config/config.production.js +182 -0
  20. package/dist-client/bootstrap.d.ts +1 -0
  21. package/dist-client/bootstrap.js +2 -0
  22. package/dist-client/bootstrap.js.map +1 -0
  23. package/dist-client/index.d.ts +1 -0
  24. package/dist-client/index.js +2 -0
  25. package/dist-client/index.js.map +1 -0
  26. package/dist-client/label-studio-label-page.d.ts +8 -0
  27. package/dist-client/label-studio-label-page.js +54 -0
  28. package/dist-client/label-studio-label-page.js.map +1 -0
  29. package/dist-client/label-studio-project-create.d.ts +16 -0
  30. package/dist-client/label-studio-project-create.js +235 -0
  31. package/dist-client/label-studio-project-create.js.map +1 -0
  32. package/dist-client/label-studio-project-list.d.ts +16 -0
  33. package/dist-client/label-studio-project-list.js +222 -0
  34. package/dist-client/label-studio-project-list.js.map +1 -0
  35. package/dist-client/label-studio-wrapper.d.ts +57 -0
  36. package/dist-client/label-studio-wrapper.js +304 -0
  37. package/dist-client/label-studio-wrapper.js.map +1 -0
  38. package/dist-client/route.d.ts +1 -0
  39. package/dist-client/route.js +14 -0
  40. package/dist-client/route.js.map +1 -0
  41. package/dist-client/tsconfig.tsbuildinfo +1 -0
  42. package/dist-server/controller/label-studio-role-mapper.d.ts +35 -0
  43. package/dist-server/controller/label-studio-role-mapper.js +65 -0
  44. package/dist-server/controller/label-studio-role-mapper.js.map +1 -0
  45. package/dist-server/controller/user-provisioning-service.d.ts +66 -0
  46. package/dist-server/controller/user-provisioning-service.js +264 -0
  47. package/dist-server/controller/user-provisioning-service.js.map +1 -0
  48. package/dist-server/index.d.ts +7 -0
  49. package/dist-server/index.js +19 -0
  50. package/dist-server/index.js.map +1 -0
  51. package/dist-server/route/label-studio-sso.d.ts +2 -0
  52. package/dist-server/route/label-studio-sso.js +156 -0
  53. package/dist-server/route/label-studio-sso.js.map +1 -0
  54. package/dist-server/route/webhook.d.ts +65 -0
  55. package/dist-server/route/webhook.js +248 -0
  56. package/dist-server/route/webhook.js.map +1 -0
  57. package/dist-server/route.d.ts +1 -0
  58. package/dist-server/route.js +21 -0
  59. package/dist-server/route.js.map +1 -0
  60. package/dist-server/service/ai-prediction-service.d.ts +27 -0
  61. package/dist-server/service/ai-prediction-service.js +222 -0
  62. package/dist-server/service/ai-prediction-service.js.map +1 -0
  63. package/dist-server/service/dataset-labeling-integration.d.ts +44 -0
  64. package/dist-server/service/dataset-labeling-integration.js +512 -0
  65. package/dist-server/service/dataset-labeling-integration.js.map +1 -0
  66. package/dist-server/service/external-data-source-service.d.ts +78 -0
  67. package/dist-server/service/external-data-source-service.js +415 -0
  68. package/dist-server/service/external-data-source-service.js.map +1 -0
  69. package/dist-server/service/index.d.ts +12 -0
  70. package/dist-server/service/index.js +27 -0
  71. package/dist-server/service/index.js.map +1 -0
  72. package/dist-server/service/label-studio-sso-service.d.ts +38 -0
  73. package/dist-server/service/label-studio-sso-service.js +98 -0
  74. package/dist-server/service/label-studio-sso-service.js.map +1 -0
  75. package/dist-server/service/ml/ml-backend-service.d.ts +23 -0
  76. package/dist-server/service/ml/ml-backend-service.js +153 -0
  77. package/dist-server/service/ml/ml-backend-service.js.map +1 -0
  78. package/dist-server/service/prediction/prediction-management.d.ts +32 -0
  79. package/dist-server/service/prediction/prediction-management.js +299 -0
  80. package/dist-server/service/prediction/prediction-management.js.map +1 -0
  81. package/dist-server/service/project/project-management.d.ts +36 -0
  82. package/dist-server/service/project/project-management.js +309 -0
  83. package/dist-server/service/project/project-management.js.map +1 -0
  84. package/dist-server/service/task/task-management.d.ts +42 -0
  85. package/dist-server/service/task/task-management.js +372 -0
  86. package/dist-server/service/task/task-management.js.map +1 -0
  87. package/dist-server/service/user-provisioning/user-sync-mutation.d.ts +28 -0
  88. package/dist-server/service/user-provisioning/user-sync-mutation.js +111 -0
  89. package/dist-server/service/user-provisioning/user-sync-mutation.js.map +1 -0
  90. package/dist-server/service/webhook/webhook-management.d.ts +21 -0
  91. package/dist-server/service/webhook/webhook-management.js +134 -0
  92. package/dist-server/service/webhook/webhook-management.js.map +1 -0
  93. package/dist-server/tsconfig.tsbuildinfo +1 -0
  94. package/dist-server/types/dataset-labeling-types.d.ts +71 -0
  95. package/dist-server/types/dataset-labeling-types.js +259 -0
  96. package/dist-server/types/dataset-labeling-types.js.map +1 -0
  97. package/dist-server/types/label-studio-types.d.ts +128 -0
  98. package/dist-server/types/label-studio-types.js +494 -0
  99. package/dist-server/types/label-studio-types.js.map +1 -0
  100. package/dist-server/types/prediction-types.d.ts +39 -0
  101. package/dist-server/types/prediction-types.js +121 -0
  102. package/dist-server/types/prediction-types.js.map +1 -0
  103. package/dist-server/utils/annotation-exporter.d.ts +104 -0
  104. package/dist-server/utils/annotation-exporter.js +261 -0
  105. package/dist-server/utils/annotation-exporter.js.map +1 -0
  106. package/dist-server/utils/label-config-builder.d.ts +117 -0
  107. package/dist-server/utils/label-config-builder.js +286 -0
  108. package/dist-server/utils/label-config-builder.js.map +1 -0
  109. package/dist-server/utils/label-studio-api-client.d.ts +180 -0
  110. package/dist-server/utils/label-studio-api-client.js +401 -0
  111. package/dist-server/utils/label-studio-api-client.js.map +1 -0
  112. package/dist-server/utils/media-url-extractor.d.ts +45 -0
  113. package/dist-server/utils/media-url-extractor.js +152 -0
  114. package/dist-server/utils/media-url-extractor.js.map +1 -0
  115. package/dist-server/utils/task-transformer.d.ts +108 -0
  116. package/dist-server/utils/task-transformer.js +260 -0
  117. package/dist-server/utils/task-transformer.js.map +1 -0
  118. package/package.json +47 -0
  119. package/server/SERVER_STRUCTURE.md +351 -0
  120. package/server/controller/label-studio-role-mapper.ts +76 -0
  121. package/server/controller/user-provisioning-service.ts +340 -0
  122. package/server/index.ts +19 -0
  123. package/server/route/label-studio-sso.ts +194 -0
  124. package/server/route/webhook.ts +304 -0
  125. package/server/route.ts +35 -0
  126. package/server/service/ai-prediction-service.ts +239 -0
  127. package/server/service/dataset-labeling-integration.ts +590 -0
  128. package/server/service/external-data-source-service.ts +438 -0
  129. package/server/service/index.ts +24 -0
  130. package/server/service/label-studio-sso-service.ts +108 -0
  131. package/server/service/labeling-scenario-service.ts.deprecated +566 -0
  132. package/server/service/ml/ml-backend-service.ts +127 -0
  133. package/server/service/prediction/prediction-management.ts +281 -0
  134. package/server/service/project/project-management.ts +284 -0
  135. package/server/service/task/task-management.ts +363 -0
  136. package/server/service/user-provisioning/user-sync-mutation.ts +80 -0
  137. package/server/service/webhook/webhook-management.ts +109 -0
  138. package/server/tsconfig.json +11 -0
  139. package/server/types/dataset-labeling-types.ts +181 -0
  140. package/server/types/global.d.ts +23 -0
  141. package/server/types/label-studio-types.ts +346 -0
  142. package/server/types/prediction-types.ts +86 -0
  143. package/server/types/scenario-types.ts.deprecated +362 -0
  144. package/server/utils/annotation-exporter.ts +340 -0
  145. package/server/utils/label-config-builder.ts +340 -0
  146. package/server/utils/label-studio-api-client.ts +487 -0
  147. package/server/utils/media-url-extractor.ts +193 -0
  148. package/server/utils/task-transformer.ts +342 -0
  149. package/test-ai-prediction.js +268 -0
  150. package/test-dataset-integration.js +449 -0
  151. package/test-simple.js +89 -0
  152. package/things-factory.config.js +12 -0
package/INTEGRATION.md ADDED
@@ -0,0 +1,279 @@
1
+ # Label Studio Integration Guide
2
+
3
+ This document explains how to integrate Label Studio with Things Factory using subdomain-based cookie sharing for SSO authentication.
4
+
5
+ ## Architecture Overview
6
+
7
+ The integration uses **subdomain cookie sharing** instead of proxying, which simplifies deployment and improves performance.
8
+
9
+ ### Flow Diagram
10
+
11
+ ```
12
+ ┌─────────────────────────────────────────────────────────────────┐
13
+ │ 1. Frontend calls SSO setup endpoint │
14
+ │ GET /label-studio/sso/setup │
15
+ │ Credentials: include │
16
+ └────────────────────┬────────────────────────────────────────────┘
17
+
18
+
19
+ ┌─────────────────────────────────────────────────────────────────┐
20
+ │ 2. Backend requests JWT from Label Studio │
21
+ │ POST http://label.example.com:8080/api/sso/token │
22
+ │ Authorization: Token {apiToken} │
23
+ │ Body: { email: "user@example.com" } │
24
+ └────────────────────┬────────────────────────────────────────────┘
25
+
26
+
27
+ ┌─────────────────────────────────────────────────────────────────┐
28
+ │ 3. Backend sets cookie with shared domain │
29
+ │ Set-Cookie: ls_auth_token={jwt} │
30
+ │ Domain: .example.com ← Shared across all *.example.com │
31
+ │ Path: / │
32
+ │ SameSite: Lax │
33
+ └────────────────────┬────────────────────────────────────────────┘
34
+
35
+
36
+ ┌─────────────────────────────────────────────────────────────────┐
37
+ │ 4. Frontend loads Label Studio in iframe │
38
+ │ <iframe src="http://label.example.com:8080/projects/1"> │
39
+ │ Cookie is automatically sent with request │
40
+ └─────────────────────────────────────────────────────────────────┘
41
+ ```
42
+
43
+ ## Configuration
44
+
45
+ ### 1. Domain Setup
46
+
47
+ Both Things Factory and Label Studio must be accessible via subdomain pattern:
48
+
49
+ **Development (localhost):**
50
+ ```
51
+ Things Factory: http://app.dataset.localhost:3000
52
+ Label Studio: http://label.dataset.localhost:8080
53
+ ```
54
+
55
+ **Production:**
56
+ ```
57
+ Things Factory: https://app.example.com
58
+ Label Studio: https://label.example.com
59
+ ```
60
+
61
+ **Important:** Modern browsers automatically resolve `*.localhost` to `127.0.0.1`, so no `/etc/hosts` modification is needed for development.
62
+
63
+ ### 2. Label Studio Configuration
64
+
65
+ Create or update `.env` file in Label Studio installation:
66
+
67
+ ```bash
68
+ # JWT SSO Settings
69
+ JWT_SSO_SECRET=your-secret-key-here
70
+ JWT_SSO_ALGORITHM=HS256
71
+ JWT_SSO_TOKEN_PARAM=token
72
+ JWT_SSO_EMAIL_CLAIM=email
73
+ JWT_SSO_USERNAME_CLAIM=username
74
+ JWT_SSO_FIRST_NAME_CLAIM=first_name
75
+ JWT_SSO_LAST_NAME_CLAIM=last_name
76
+ JWT_SSO_AUTO_CREATE_USERS=true
77
+ JWT_SSO_COOKIE_NAME=ls_auth_token
78
+
79
+ # CORS and CSRF Settings
80
+ CSRF_TRUSTED_ORIGINS=http://app.dataset.localhost:3000,http://label.dataset.localhost:8080
81
+ ALLOWED_HOSTS=localhost,label.dataset.localhost,*.dataset.localhost
82
+
83
+ # CSP Settings - Allow iframe embedding
84
+ ENABLE_CSP=False
85
+
86
+ # Session Settings
87
+ SESSION_COOKIE_SAMESITE=Lax
88
+ SESSION_COOKIE_SECURE=0 # Set to 1 for HTTPS
89
+ SESSION_COOKIE_HTTPONLY=0
90
+ SESSION_COOKIE_PATH=/
91
+ ```
92
+
93
+ ### 3. Things Factory Configuration
94
+
95
+ Add Label Studio configuration to your Things Factory config file:
96
+
97
+ **config/default.json:**
98
+ ```json
99
+ {
100
+ "labelStudio": {
101
+ "serverUrl": "http://label.dataset.localhost:8080",
102
+ "apiToken": "your-label-studio-api-token",
103
+ "cookieDomain": ".dataset.localhost"
104
+ }
105
+ }
106
+ ```
107
+
108
+ **config/production.json:**
109
+ ```json
110
+ {
111
+ "labelStudio": {
112
+ "serverUrl": "https://label.example.com",
113
+ "apiToken": "your-label-studio-api-token",
114
+ "cookieDomain": ".example.com"
115
+ }
116
+ }
117
+ ```
118
+
119
+ ### 4. Get Label Studio API Token
120
+
121
+ 1. Start Label Studio and login as admin
122
+ 2. Navigate to **Account & Settings** → **Access Token**
123
+ 3. Click **Create new token**
124
+ 4. Copy the token and add it to Things Factory configuration
125
+
126
+ ## Usage
127
+
128
+ ### Embedding Label Studio
129
+
130
+ Use the `<label-studio-wrapper>` component to embed Label Studio:
131
+
132
+ ```typescript
133
+ import '@things-factory/integration-label-studio/client'
134
+
135
+ // In your component
136
+ render() {
137
+ const projectId = 123
138
+ const path = `/projects/${projectId}`
139
+
140
+ return html`
141
+ <label-studio-wrapper .path=${path}></label-studio-wrapper>
142
+ `
143
+ }
144
+ ```
145
+
146
+ ### API Endpoints
147
+
148
+ The integration provides the following endpoints:
149
+
150
+ **SSO Setup:**
151
+ ```
152
+ GET /label-studio/sso/setup
153
+ ```
154
+ Sets up SSO authentication by acquiring JWT token and setting cookie.
155
+
156
+ **Health Check:**
157
+ ```
158
+ GET /label-studio/sso/health
159
+ ```
160
+ Returns Label Studio integration status.
161
+
162
+ **Configuration:**
163
+ ```
164
+ GET /label-studio/sso/config
165
+ ```
166
+ Returns current Label Studio configuration.
167
+
168
+ ## Development Setup
169
+
170
+ ### 1. Start Label Studio
171
+
172
+ ```bash
173
+ cd /path/to/label-studio
174
+ label-studio start --host label.dataset.localhost --port 8080
175
+ ```
176
+
177
+ ### 2. Start Things Factory
178
+
179
+ ```bash
180
+ cd /path/to/things-factory
181
+ DEBUG=things-factory:* yarn workspace @things-factory/your-app run serve:dev
182
+ ```
183
+
184
+ ### 3. Access Application
185
+
186
+ Open browser to:
187
+ ```
188
+ http://app.dataset.localhost:3000
189
+ ```
190
+
191
+ ## Troubleshooting
192
+
193
+ ### Cookie Not Set
194
+
195
+ **Symptom:** SSO setup succeeds but cookie doesn't appear in browser
196
+
197
+ **Solutions:**
198
+ 1. Verify `cookieDomain` in Things Factory config matches your domain pattern
199
+ 2. Check Label Studio `ALLOWED_HOSTS` includes your subdomain
200
+ 3. Ensure both services use same root domain (e.g., both use `*.dataset.localhost`)
201
+
202
+ ### CORS Errors
203
+
204
+ **Symptom:** Browser blocks requests with CORS errors
205
+
206
+ **Solutions:**
207
+ 1. Add Things Factory domain to Label Studio's `CSRF_TRUSTED_ORIGINS`
208
+ 2. Verify `ALLOWED_HOSTS` includes all subdomain patterns
209
+ 3. Check `ENABLE_CSP=False` in Label Studio configuration
210
+
211
+ ### Authentication Loop
212
+
213
+ **Symptom:** Label Studio keeps showing login page
214
+
215
+ **Solutions:**
216
+ 1. Verify JWT SSO settings in Label Studio `.env`
217
+ 2. Check cookie is being sent with iframe requests (browser DevTools → Network)
218
+ 3. Ensure `JWT_SSO_COOKIE_NAME=ls_auth_token` matches implementation
219
+
220
+ ### Token Expiration
221
+
222
+ **Symptom:** Users get logged out after 10 minutes
223
+
224
+ **Solution:**
225
+ Label Studio JWT tokens expire after 600 seconds (10 minutes) by default. The integration automatically handles re-authentication on page refresh.
226
+
227
+ ## Security Considerations
228
+
229
+ ### Production Checklist
230
+
231
+ - ✅ Use HTTPS for all services
232
+ - ✅ Set `SESSION_COOKIE_SECURE=1` in Label Studio
233
+ - ✅ Set `httpOnly: true` in SSO route cookie options
234
+ - ✅ Use strong `JWT_SSO_SECRET`
235
+ - ✅ Limit `ALLOWED_HOSTS` to specific domains
236
+ - ✅ Enable CSRF protection
237
+ - ✅ Use firewall rules to restrict Label Studio access
238
+
239
+ ### Cookie Domain Best Practices
240
+
241
+ **Do:**
242
+ - Use `.example.com` for sharing across all subdomains
243
+ - Use specific subdomain pattern for restricted access
244
+
245
+ **Don't:**
246
+ - Use `.localhost` (it's a Public Suffix, browsers block it)
247
+ - Use broad TLDs like `.com` (browsers will reject it)
248
+
249
+ ## Migration from Proxy Approach
250
+
251
+ If you're migrating from the previous proxy-based integration:
252
+
253
+ ### Changes Required
254
+
255
+ 1. **Configuration:**
256
+ - Add `cookieDomain` to Label Studio config
257
+ - Update Label Studio `.env` with CORS settings
258
+
259
+ 2. **Frontend:**
260
+ - No changes needed - component interface remains the same
261
+ - Iframe URLs now point directly to Label Studio (not proxied)
262
+
263
+ 3. **Nginx/Proxy:**
264
+ - Remove proxy rules for `/label-studio/*` paths
265
+ - Label Studio should be directly accessible on its subdomain
266
+
267
+ ### Benefits of Subdomain Approach
268
+
269
+ - ✅ **Simpler deployment** - No complex proxy configuration
270
+ - ✅ **Better performance** - No proxy overhead
271
+ - ✅ **Easier debugging** - Direct access to Label Studio
272
+ - ✅ **Standard approach** - Follows common SSO patterns
273
+ - ✅ **Better caching** - Browser can cache Label Studio assets
274
+
275
+ ## References
276
+
277
+ - [Label Studio SSO Documentation](https://labelstud.io/guide/auth_setup.html#JWT-SSO)
278
+ - [Cookie Domain Specification](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#define_where_cookies_are_sent)
279
+ - [Public Suffix List](https://publicsuffix.org/)