@langgraph-js/ui 1.2.0 → 1.3.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 (46) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +6 -6
  3. package/cli.mjs +36 -36
  4. package/dist/assets/index-88Ds6iYK.js +214 -0
  5. package/dist/assets/index-_qsGvf6N.css +1 -0
  6. package/dist/index.html +14 -14
  7. package/index.html +22 -22
  8. package/package.json +10 -9
  9. package/src/chat/Chat.tsx +169 -164
  10. package/src/chat/FileUpload/index.ts +105 -105
  11. package/src/chat/chat.css +403 -403
  12. package/src/chat/components/FileList.css +128 -128
  13. package/src/chat/components/FileList.tsx +73 -73
  14. package/src/chat/components/HistoryList.tsx +192 -192
  15. package/src/chat/components/JsonEditorPopup.css +80 -80
  16. package/src/chat/components/JsonEditorPopup.tsx +56 -56
  17. package/src/chat/components/JsonToMessage/JsonToMessage.css +104 -0
  18. package/src/chat/components/JsonToMessage/JsonToMessage.tsx +114 -0
  19. package/src/chat/components/JsonToMessage/JsonToMessageButton.tsx +27 -0
  20. package/src/chat/components/JsonToMessage/index.tsx +5 -0
  21. package/src/chat/components/MessageAI.tsx +24 -24
  22. package/src/chat/components/MessageBox.tsx +39 -0
  23. package/src/chat/components/MessageHuman.tsx +55 -55
  24. package/src/chat/components/MessageTool.tsx +46 -46
  25. package/src/chat/components/UsageMetadata.tsx +40 -40
  26. package/src/chat/context/ChatContext.tsx +32 -29
  27. package/src/chat/context/ExtraParamsContext.tsx +41 -41
  28. package/src/chat/store/index.ts +38 -24
  29. package/src/chat/tools.ts +33 -33
  30. package/src/chat/types.ts +16 -16
  31. package/src/graph/GraphPanel.tsx +5 -0
  32. package/src/graph/flattenGraph.ts +45 -0
  33. package/src/graph/flow.css +176 -0
  34. package/src/graph/index.tsx +161 -0
  35. package/src/hooks/useLocalStorage.ts +27 -27
  36. package/src/index.ts +1 -1
  37. package/src/login/Login.css +93 -93
  38. package/src/login/Login.tsx +92 -92
  39. package/test/App.tsx +9 -9
  40. package/test/main.tsx +5 -5
  41. package/test/vite-env.d.ts +1 -1
  42. package/tsconfig.json +21 -21
  43. package/tsconfig.node.json +9 -9
  44. package/vite.config.ts +22 -17
  45. package/dist/assets/index-BHPbGlnP.js +0 -192
  46. package/dist/assets/index-Du4LMUX2.css +0 -1
package/src/chat/chat.css CHANGED
@@ -1,403 +1,403 @@
1
- @import url("https://unpkg.com/github-markdown-css/github-markdown.css");
2
-
3
- .chat-container {
4
- display: flex;
5
- height: 100vh;
6
- width: 100%;
7
- position: relative;
8
- }
9
-
10
- .chat-sidebar {
11
- background-color: #f5f5f5;
12
- border-right: 1px solid #e0e0e0;
13
- display: flex;
14
- flex-direction: column;
15
- }
16
-
17
- .history-header {
18
- padding: 16px;
19
- border-bottom: 1px solid #e0e0e0;
20
- display: flex;
21
- justify-content: space-between;
22
- align-items: center;
23
- }
24
-
25
- .history-header h3 {
26
- margin: 0;
27
- font-size: 16px;
28
- color: #333;
29
- }
30
-
31
- .close-button {
32
- background: none;
33
- border: none;
34
- font-size: 20px;
35
- cursor: pointer;
36
- color: #666;
37
- }
38
-
39
- .history-list {
40
- flex: none;
41
- width: 280px;
42
- overflow-y: auto;
43
- /* padding: 8px; */
44
- border-right: 1px solid #e0e0e0;
45
- }
46
-
47
- .history-item {
48
- padding: 12px;
49
- margin-bottom: 8px;
50
- background-color: white;
51
- cursor: pointer;
52
- transition: background-color 0.2s;
53
- }
54
-
55
- .history-item:hover {
56
- background-color: #e8e8e8;
57
- }
58
-
59
- .history-item.active {
60
- background-color: #e3f2fd;
61
- border-left: 3px solid #2196f3;
62
- }
63
-
64
- .history-title {
65
- font-size: 14px;
66
- color: #333;
67
- margin-bottom: 4px;
68
- }
69
-
70
- .history-time {
71
- font-size: 12px;
72
- color: #666;
73
- }
74
-
75
- .chat-main {
76
- overflow: hidden;
77
- flex: 1;
78
- display: flex;
79
- flex-direction: column;
80
- }
81
-
82
- .chat-header {
83
- padding: 16px;
84
- border-bottom: 1px solid #e0e0e0;
85
- display: flex;
86
- justify-content: flex-end;
87
- gap: 0.5rem;
88
- }
89
-
90
- .history-button {
91
- padding: 8px 16px;
92
- background-color: #f0f0f0;
93
- border: 1px solid #e0e0e0;
94
- border-radius: 4px;
95
- cursor: pointer;
96
- font-size: 14px;
97
- color: #333;
98
- }
99
-
100
- .history-button:hover {
101
- background-color: #e0e0e0;
102
- }
103
-
104
- .chat-messages {
105
- flex: 1;
106
- overflow-y: auto;
107
- padding: 1rem;
108
- display: flex;
109
- flex-direction: column;
110
- gap: 1rem;
111
- }
112
-
113
- .message {
114
- display: flex;
115
- max-width: 80%;
116
- }
117
-
118
- .message.human {
119
- margin-left: auto;
120
- }
121
-
122
- .message.ai {
123
- margin-right: auto;
124
- }
125
-
126
- .message-content {
127
- padding: 0.75rem 1rem;
128
- border-radius: 8px;
129
- border: 1px solid #e5e7eb;
130
- display: flex;
131
- flex-direction: column;
132
- gap: 0.5rem;
133
- max-width: 100%;
134
- }
135
-
136
- .message-text {
137
- word-break: break-word;
138
- line-height: 1.5;
139
- }
140
-
141
- .message-image {
142
- margin: 0.5rem 0;
143
- }
144
-
145
- .message-image img {
146
- max-width: 100%;
147
- border-radius: 4px;
148
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
149
- }
150
-
151
- .message-audio {
152
- margin: 0.5rem 0;
153
- }
154
-
155
- .message-audio audio {
156
- width: 100%;
157
- max-width: 300px;
158
- }
159
-
160
- .message-meta {
161
- display: flex;
162
- align-items: center;
163
- gap: 0.75rem;
164
- font-size: 0.75rem;
165
- color: #6b7280;
166
- margin-top: 0.25rem;
167
- }
168
-
169
- .message-time {
170
- font-family: monospace;
171
- }
172
-
173
- .token-info {
174
- display: flex;
175
- gap: 0.5rem;
176
- align-items: center;
177
- }
178
-
179
- .token-item {
180
- display: flex;
181
- align-items: center;
182
- gap: 0.25rem;
183
- background-color: #ffffff;
184
- padding: 0.125rem 0.375rem;
185
- border-radius: 4px;
186
- font-family: monospace;
187
- }
188
-
189
- .token-emoji {
190
- font-size: 0.875rem;
191
- }
192
-
193
- .message.human .message-content {
194
- background-color: #3b82f6;
195
- color: white;
196
- border-color: #3b82f6;
197
- }
198
-
199
- .message.human .message-meta {
200
- color: rgba(255, 255, 255, 0.8);
201
- }
202
-
203
- .message.ai .message-content {
204
- color: #1f2937;
205
- }
206
-
207
- .message.tool {
208
- width: 100%;
209
- max-width: 100%;
210
- }
211
-
212
- .tool-message {
213
- width: 100%;
214
- border: 1px solid #e5e7eb;
215
- border-radius: 8px;
216
- overflow: hidden;
217
- }
218
-
219
- .tool-header {
220
- display: flex;
221
- align-items: center;
222
- justify-content: space-between;
223
- padding: 0.5rem 1rem;
224
- background-color: #f9fafb;
225
- border-bottom: 1px solid #e5e7eb;
226
- cursor: pointer;
227
- }
228
-
229
- .tool-header:hover {
230
- background-color: #f3f4f6;
231
- }
232
-
233
- .tool-title {
234
- font-weight: 500;
235
- color: #374151;
236
- }
237
-
238
- .tool-content {
239
- padding: 1rem;
240
- }
241
-
242
- .tool-input {
243
- background-color: #f9fafb;
244
- padding: 0.75rem;
245
- border-radius: 4px;
246
- margin-bottom: 0.5rem;
247
- font-family: monospace;
248
- white-space: pre-wrap;
249
- word-break: break-all;
250
- }
251
-
252
- .tool-output {
253
- background-color: #ffffff;
254
- padding: 0.75rem;
255
- border-radius: 4px;
256
- font-family: monospace;
257
- border: 1px solid #e5e7eb;
258
- margin-bottom: 0.5rem;
259
- }
260
-
261
- .chat-input {
262
- border-top: 1px solid #e5e7eb;
263
- padding: 0.5rem 1rem 1rem 1rem;
264
- background-color: #ffffff;
265
- }
266
- .chat-input-header {
267
- display: flex;
268
- align-items: center;
269
- gap: 0.5rem;
270
- margin-bottom: 0.5rem;
271
- }
272
- .input-container {
273
- display: flex;
274
- gap: 0.5rem;
275
- }
276
-
277
- .input-textarea {
278
- flex: 1;
279
- padding: 0.75rem;
280
- border: 1px solid #e5e7eb;
281
- border-radius: 8px;
282
- resize: none;
283
- font-size: 0.875rem;
284
- line-height: 1.25rem;
285
- }
286
-
287
- .input-textarea:focus {
288
- outline: none;
289
- border-color: #3b82f6;
290
- }
291
-
292
- .send-button {
293
- padding: 0.5rem 1rem;
294
- background-color: #3b82f6;
295
- color: white;
296
- border: none;
297
- border-radius: 8px;
298
- cursor: pointer;
299
- font-weight: 500;
300
- transition: all 0.2s;
301
- }
302
-
303
- .send-button:hover {
304
- background-color: #2563eb;
305
- }
306
-
307
- .send-button:disabled {
308
- background-color: #93c5fd;
309
- cursor: not-allowed;
310
- }
311
-
312
- .send-button.interrupt {
313
- background-color: #ef4444;
314
- }
315
-
316
- .send-button.interrupt:hover {
317
- background-color: #dc2626;
318
- }
319
-
320
- .collapsed .tool-content {
321
- display: none;
322
- }
323
-
324
- .expand-icon {
325
- transition: transform 0.2s;
326
- }
327
-
328
- .collapsed .expand-icon {
329
- transform: rotate(-90deg);
330
- }
331
-
332
- .loading-indicator {
333
- padding: 12px 16px;
334
- margin: 8px 0;
335
- background-color: #f5f5f5;
336
- border-radius: 8px;
337
- color: #666;
338
- font-size: 14px;
339
- text-align: center;
340
- animation: pulse 1.5s infinite;
341
- display: flex;
342
- align-items: center;
343
- justify-content: center;
344
- gap: 12px;
345
- }
346
-
347
- .interrupt-button {
348
- padding: 4px 12px;
349
- background-color: #ef4444;
350
- color: white;
351
- border: none;
352
- border-radius: 4px;
353
- cursor: pointer;
354
- font-size: 12px;
355
- transition: background-color 0.2s;
356
- }
357
-
358
- .interrupt-button:hover {
359
- background-color: #dc2626;
360
- }
361
-
362
- @keyframes pulse {
363
- 0% {
364
- opacity: 0.6;
365
- }
366
- 50% {
367
- opacity: 1;
368
- }
369
- 100% {
370
- opacity: 0.6;
371
- }
372
- }
373
-
374
- .error-message {
375
- padding: 12px 16px;
376
- margin: 8px 0;
377
- background-color: #fee2e2;
378
- border: 1px solid #fecaca;
379
- border-radius: 8px;
380
- color: #dc2626;
381
- font-size: 14px;
382
- text-align: center;
383
- }
384
-
385
- .markdown-body p {
386
- text-align: left;
387
- }
388
-
389
- .edit-params-button {
390
- padding: 6px 12px;
391
- background-color: #f0f0f0;
392
- border: 1px solid #e0e0e0;
393
- border-radius: 4px;
394
- cursor: pointer;
395
- font-size: 0.8rem;
396
- color: #333;
397
- white-space: nowrap;
398
- }
399
-
400
- .edit-params-button:hover {
401
- background-color: #e0e0e0;
402
- }
403
-
1
+ @import url("https://unpkg.com/github-markdown-css/github-markdown.css");
2
+
3
+ .chat-container {
4
+ display: flex;
5
+ height: 100vh;
6
+ width: 100%;
7
+ position: relative;
8
+ }
9
+
10
+ .chat-sidebar {
11
+ background-color: #f5f5f5;
12
+ border-right: 1px solid #e0e0e0;
13
+ display: flex;
14
+ flex-direction: column;
15
+ }
16
+
17
+ .history-header {
18
+ padding: 16px;
19
+ border-bottom: 1px solid #e0e0e0;
20
+ display: flex;
21
+ justify-content: space-between;
22
+ align-items: center;
23
+ }
24
+
25
+ .history-header h3 {
26
+ margin: 0;
27
+ font-size: 16px;
28
+ color: #333;
29
+ }
30
+
31
+ .close-button {
32
+ background: none;
33
+ border: none;
34
+ font-size: 20px;
35
+ cursor: pointer;
36
+ color: #666;
37
+ }
38
+
39
+ .history-list {
40
+ flex: none;
41
+ width: 280px;
42
+ overflow-y: auto;
43
+ /* padding: 8px; */
44
+ border-right: 1px solid #e0e0e0;
45
+ }
46
+
47
+ .history-item {
48
+ padding: 12px;
49
+ margin-bottom: 8px;
50
+ background-color: white;
51
+ cursor: pointer;
52
+ transition: background-color 0.2s;
53
+ }
54
+
55
+ .history-item:hover {
56
+ background-color: #e8e8e8;
57
+ }
58
+
59
+ .history-item.active {
60
+ background-color: #e3f2fd;
61
+ border-left: 3px solid #2196f3;
62
+ }
63
+
64
+ .history-title {
65
+ font-size: 14px;
66
+ color: #333;
67
+ margin-bottom: 4px;
68
+ }
69
+
70
+ .history-time {
71
+ font-size: 12px;
72
+ color: #666;
73
+ }
74
+
75
+ .chat-main {
76
+ overflow: hidden;
77
+ flex: 1;
78
+ display: flex;
79
+ flex-direction: column;
80
+ border-right: 1px solid #e0e0e0;
81
+ }
82
+
83
+ .chat-header {
84
+ padding: 16px;
85
+ border-bottom: 1px solid #e0e0e0;
86
+ display: flex;
87
+ justify-content: flex-end;
88
+ gap: 0.5rem;
89
+ }
90
+
91
+ .history-button {
92
+ padding: 8px 16px;
93
+ background-color: #f0f0f0;
94
+ border: 1px solid #e0e0e0;
95
+ border-radius: 4px;
96
+ cursor: pointer;
97
+ font-size: 14px;
98
+ color: #333;
99
+ }
100
+
101
+ .history-button:hover {
102
+ background-color: #e0e0e0;
103
+ }
104
+
105
+ .chat-messages {
106
+ flex: 1;
107
+ overflow-y: auto;
108
+ padding: 1rem;
109
+ display: flex;
110
+ flex-direction: column;
111
+ gap: 1rem;
112
+ }
113
+
114
+ .message {
115
+ display: flex;
116
+ max-width: 80%;
117
+ }
118
+
119
+ .message.human {
120
+ margin-left: auto;
121
+ }
122
+
123
+ .message.ai {
124
+ margin-right: auto;
125
+ }
126
+
127
+ .message-content {
128
+ padding: 0.75rem 1rem;
129
+ border-radius: 8px;
130
+ border: 1px solid #e5e7eb;
131
+ display: flex;
132
+ flex-direction: column;
133
+ gap: 0.5rem;
134
+ max-width: 100%;
135
+ }
136
+
137
+ .message-text {
138
+ word-break: break-word;
139
+ line-height: 1.5;
140
+ }
141
+
142
+ .message-image {
143
+ margin: 0.5rem 0;
144
+ }
145
+
146
+ .message-image img {
147
+ max-width: 100%;
148
+ border-radius: 4px;
149
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
150
+ }
151
+
152
+ .message-audio {
153
+ margin: 0.5rem 0;
154
+ }
155
+
156
+ .message-audio audio {
157
+ width: 100%;
158
+ max-width: 300px;
159
+ }
160
+
161
+ .message-meta {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: 0.75rem;
165
+ font-size: 0.75rem;
166
+ color: #6b7280;
167
+ margin-top: 0.25rem;
168
+ }
169
+
170
+ .message-time {
171
+ font-family: monospace;
172
+ }
173
+
174
+ .token-info {
175
+ display: flex;
176
+ gap: 0.5rem;
177
+ align-items: center;
178
+ }
179
+
180
+ .token-item {
181
+ display: flex;
182
+ align-items: center;
183
+ gap: 0.25rem;
184
+ background-color: #ffffff;
185
+ padding: 0.125rem 0.375rem;
186
+ border-radius: 4px;
187
+ font-family: monospace;
188
+ }
189
+
190
+ .token-emoji {
191
+ font-size: 0.875rem;
192
+ }
193
+
194
+ .message.human .message-content {
195
+ background-color: #3b82f6;
196
+ color: white;
197
+ border-color: #3b82f6;
198
+ }
199
+
200
+ .message.human .message-meta {
201
+ color: rgba(255, 255, 255, 0.8);
202
+ }
203
+
204
+ .message.ai .message-content {
205
+ color: #1f2937;
206
+ }
207
+
208
+ .message.tool {
209
+ width: 100%;
210
+ max-width: 100%;
211
+ }
212
+
213
+ .tool-message {
214
+ width: 100%;
215
+ border: 1px solid #e5e7eb;
216
+ border-radius: 8px;
217
+ overflow: hidden;
218
+ }
219
+
220
+ .tool-header {
221
+ display: flex;
222
+ align-items: center;
223
+ justify-content: space-between;
224
+ padding: 0.5rem 1rem;
225
+ background-color: #f9fafb;
226
+ border-bottom: 1px solid #e5e7eb;
227
+ cursor: pointer;
228
+ }
229
+
230
+ .tool-header:hover {
231
+ background-color: #f3f4f6;
232
+ }
233
+
234
+ .tool-title {
235
+ font-weight: 500;
236
+ color: #374151;
237
+ }
238
+
239
+ .tool-content {
240
+ padding: 1rem;
241
+ }
242
+
243
+ .tool-input {
244
+ background-color: #f9fafb;
245
+ padding: 0.75rem;
246
+ border-radius: 4px;
247
+ margin-bottom: 0.5rem;
248
+ font-family: monospace;
249
+ white-space: pre-wrap;
250
+ word-break: break-all;
251
+ }
252
+
253
+ .tool-output {
254
+ background-color: #ffffff;
255
+ padding: 0.75rem;
256
+ border-radius: 4px;
257
+ font-family: monospace;
258
+ border: 1px solid #e5e7eb;
259
+ margin-bottom: 0.5rem;
260
+ }
261
+
262
+ .chat-input {
263
+ border-top: 1px solid #e5e7eb;
264
+ padding: 0.5rem 1rem 1rem 1rem;
265
+ background-color: #ffffff;
266
+ }
267
+ .chat-input-header {
268
+ display: flex;
269
+ align-items: center;
270
+ gap: 0.5rem;
271
+ margin-bottom: 0.5rem;
272
+ }
273
+ .input-container {
274
+ display: flex;
275
+ gap: 0.5rem;
276
+ }
277
+
278
+ .input-textarea {
279
+ flex: 1;
280
+ padding: 0.75rem;
281
+ border: 1px solid #e5e7eb;
282
+ border-radius: 8px;
283
+ resize: none;
284
+ font-size: 0.875rem;
285
+ line-height: 1.25rem;
286
+ }
287
+
288
+ .input-textarea:focus {
289
+ outline: none;
290
+ border-color: #3b82f6;
291
+ }
292
+
293
+ .send-button {
294
+ padding: 0.5rem 1rem;
295
+ background-color: #3b82f6;
296
+ color: white;
297
+ border: none;
298
+ border-radius: 8px;
299
+ cursor: pointer;
300
+ font-weight: 500;
301
+ transition: all 0.2s;
302
+ }
303
+
304
+ .send-button:hover {
305
+ background-color: #2563eb;
306
+ }
307
+
308
+ .send-button:disabled {
309
+ background-color: #93c5fd;
310
+ cursor: not-allowed;
311
+ }
312
+
313
+ .send-button.interrupt {
314
+ background-color: #ef4444;
315
+ }
316
+
317
+ .send-button.interrupt:hover {
318
+ background-color: #dc2626;
319
+ }
320
+
321
+ .collapsed .tool-content {
322
+ display: none;
323
+ }
324
+
325
+ .expand-icon {
326
+ transition: transform 0.2s;
327
+ }
328
+
329
+ .collapsed .expand-icon {
330
+ transform: rotate(-90deg);
331
+ }
332
+
333
+ .loading-indicator {
334
+ padding: 12px 16px;
335
+ margin: 8px 0;
336
+ background-color: #f5f5f5;
337
+ border-radius: 8px;
338
+ color: #666;
339
+ font-size: 14px;
340
+ text-align: center;
341
+ animation: pulse 1.5s infinite;
342
+ display: flex;
343
+ align-items: center;
344
+ justify-content: center;
345
+ gap: 12px;
346
+ }
347
+
348
+ .interrupt-button {
349
+ padding: 4px 12px;
350
+ background-color: #ef4444;
351
+ color: white;
352
+ border: none;
353
+ border-radius: 4px;
354
+ cursor: pointer;
355
+ font-size: 12px;
356
+ transition: background-color 0.2s;
357
+ }
358
+
359
+ .interrupt-button:hover {
360
+ background-color: #dc2626;
361
+ }
362
+
363
+ @keyframes pulse {
364
+ 0% {
365
+ opacity: 0.6;
366
+ }
367
+ 50% {
368
+ opacity: 1;
369
+ }
370
+ 100% {
371
+ opacity: 0.6;
372
+ }
373
+ }
374
+
375
+ .error-message {
376
+ padding: 12px 16px;
377
+ margin: 8px 0;
378
+ background-color: #fee2e2;
379
+ border: 1px solid #fecaca;
380
+ border-radius: 8px;
381
+ color: #dc2626;
382
+ font-size: 14px;
383
+ text-align: center;
384
+ }
385
+
386
+ .markdown-body p {
387
+ text-align: left;
388
+ }
389
+
390
+ .edit-params-button {
391
+ padding: 6px 12px;
392
+ background-color: #f0f0f0;
393
+ border: 1px solid #e0e0e0;
394
+ border-radius: 4px;
395
+ cursor: pointer;
396
+ font-size: 0.8rem;
397
+ color: #333;
398
+ white-space: nowrap;
399
+ }
400
+
401
+ .edit-params-button:hover {
402
+ background-color: #e0e0e0;
403
+ }