meta_workflows 0.9.5 → 0.9.7
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.
- checksums.yaml +4 -4
- data/README.md +8 -1
- data/app/assets/images/lexi-expanded.png +0 -0
- data/app/assets/stylesheets/meta_workflows/application.css +304 -22
- data/app/controllers/meta_workflows/workflow_imports_controller.rb +8 -4
- data/app/views/layouts/meta_workflows/application.html.erb +1 -0
- data/app/views/meta_workflows/_lexi_chat_right_tray.html.erb +17 -26
- data/app/views/meta_workflows/_response_form_lexi.html.erb +16 -14
- data/app/views/meta_workflows/_response_lexi.html.erb +12 -12
- data/lib/meta_workflows/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f991d24a137d8a8b8f61723e714c5a2e08551d7e49d108a4bef7a434f4b122ad
|
4
|
+
data.tar.gz: 7832b5db6ac767be220115a98bbd423314416b93176a1a2147249c69735781f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f0102f3753d5570e5f4cc8009699d99ee52e0994842d129666c390cb1047415713b142663ace02396997ec5bb6c392323a24958407fdfb54fee840cab14ffb94
|
7
|
+
data.tar.gz: 4ea71acd1ea97348f0ea9a1713f6542a693662b42f44ffc01abc1813c688a2ae2f82a5e7c7d2597a9fde25aaff1ccbe8606472b481ef06622c7fc2f74044ac96
|
data/README.md
CHANGED
@@ -527,10 +527,12 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
527
527
|
|
528
528
|
To apply or customize the styles for the `meta_workflows` engine, follow these steps:
|
529
529
|
|
530
|
-
|
530
|
+
|
531
|
+
### 1. Where to Add Shareable (MetaWorkflow Specific) Styles
|
531
532
|
|
532
533
|
- All styles should be placed in this file:
|
533
534
|
`app/assets/stylesheets/meta_workflows/application.css`
|
535
|
+
- They will be shared with host application during the asset install.
|
534
536
|
|
535
537
|
### 2. How to Copy the Stylesheet
|
536
538
|
|
@@ -556,6 +558,11 @@ To apply or customize the styles for the `meta_workflows` engine, follow these s
|
|
556
558
|
- These properties **won’t be compiled** because the layout files are accessed directly from the engine.
|
557
559
|
- As a result, the host app doesn’t recognize that it needs to compile them, and the styles will not work as expected.
|
558
560
|
|
561
|
+
### 6. 🚨 Dummy App Styling
|
562
|
+
|
563
|
+
- The dummy app only styles are located in: `app/assets/stylesheets/application.css`
|
564
|
+
- Use this file for styles that only get used in dummy application, don't need to be reusable, and will not carry over into any host apps.
|
565
|
+
|
559
566
|
## Tray System (Sidebar, Bottom, and Main Content Trays)
|
560
567
|
|
561
568
|
MetaWorkflows provides a flexible tray system for building modern, multi-pane layouts. The tray system supports left (Beta), right (Gamma), and bottom (Delta) trays, as well as a main content area (Alpha). Each tray can be shown, hidden, or made collapsible on a per-controller or per-page basis.
|
Binary file
|
@@ -95,16 +95,16 @@
|
|
95
95
|
}
|
96
96
|
|
97
97
|
a {
|
98
|
-
color:
|
98
|
+
color: var(--blue-600);
|
99
99
|
text-decoration: underline;
|
100
100
|
|
101
101
|
&:hover {
|
102
|
-
color:
|
102
|
+
color: var(--blue-700);
|
103
103
|
}
|
104
104
|
}
|
105
105
|
|
106
106
|
pre {
|
107
|
-
background-color:
|
107
|
+
background-color: var(--gray-50);
|
108
108
|
padding: 1rem;
|
109
109
|
border-radius: 0.5rem;
|
110
110
|
overflow-x: auto;
|
@@ -112,7 +112,7 @@
|
|
112
112
|
}
|
113
113
|
|
114
114
|
code {
|
115
|
-
background-color:
|
115
|
+
background-color: var(--gray-50);
|
116
116
|
padding: 0.125rem 0.375rem;
|
117
117
|
border-radius: 0.25rem;
|
118
118
|
font-size: 0.875rem;
|
@@ -120,10 +120,10 @@
|
|
120
120
|
}
|
121
121
|
|
122
122
|
blockquote {
|
123
|
-
border-left: 4px solid
|
123
|
+
border-left: 4px solid var(--gray-200);
|
124
124
|
padding-left: 1rem;
|
125
125
|
font-style: italic;
|
126
|
-
color:
|
126
|
+
color: var(--gray-600);
|
127
127
|
margin: 1rem 0;
|
128
128
|
}
|
129
129
|
|
@@ -135,13 +135,13 @@
|
|
135
135
|
|
136
136
|
th,
|
137
137
|
td {
|
138
|
-
border: 1px solid
|
138
|
+
border: 1px solid var(--gray-200);
|
139
139
|
padding: 0.5rem;
|
140
140
|
text-align: left;
|
141
141
|
}
|
142
142
|
|
143
143
|
th {
|
144
|
-
background-color:
|
144
|
+
background-color: var(--gray-50);
|
145
145
|
font-weight: 600;
|
146
146
|
}
|
147
147
|
|
@@ -160,26 +160,312 @@
|
|
160
160
|
}
|
161
161
|
}
|
162
162
|
|
163
|
+
/* Lexi Chat Tray Styles */
|
164
|
+
.lexi-chat-tray {
|
165
|
+
display: flex;
|
166
|
+
flex-direction: column;
|
167
|
+
background-color: white;
|
168
|
+
padding: 0 1.5rem;
|
169
|
+
}
|
163
170
|
|
164
|
-
|
165
|
-
|
166
|
-
|
171
|
+
.lexi-chat-header {
|
172
|
+
flex-shrink: 0;
|
173
|
+
display: flex;
|
174
|
+
align-items: center;
|
175
|
+
justify-content: space-between;
|
176
|
+
padding: 0.5rem 0;
|
177
|
+
border-bottom: 1px solid var(--gray-200);
|
167
178
|
}
|
168
179
|
|
169
|
-
.lexi-chat-
|
170
|
-
|
180
|
+
.lexi-chat-header-left {
|
181
|
+
display: flex;
|
182
|
+
align-items: center;
|
183
|
+
gap: 0.5rem;
|
184
|
+
}
|
185
|
+
|
186
|
+
.lexi-chat-header-right {
|
187
|
+
display: flex;
|
188
|
+
align-items: center;
|
189
|
+
gap: 0.5rem;
|
190
|
+
}
|
191
|
+
|
192
|
+
.lexi-chat-logo {
|
193
|
+
height: 3.5rem;
|
194
|
+
width: auto;
|
195
|
+
}
|
196
|
+
|
197
|
+
.lexi-chat-button {
|
198
|
+
padding: 0.5rem;
|
199
|
+
border-radius: 0.75rem;
|
200
|
+
background: none;
|
201
|
+
border: none;
|
202
|
+
cursor: pointer;
|
203
|
+
transition: background-color 0.2s;
|
171
204
|
}
|
172
205
|
|
173
|
-
.lexi-
|
174
|
-
|
206
|
+
.lexi-chat-button:hover {
|
207
|
+
background-color: var(--gray-100);
|
175
208
|
}
|
176
209
|
|
177
|
-
.lexi-
|
178
|
-
|
210
|
+
.lexi-chat-button:disabled {
|
211
|
+
cursor: not-allowed;
|
212
|
+
opacity: 0.5;
|
213
|
+
}
|
214
|
+
|
215
|
+
.lexi-chat-messages {
|
216
|
+
flex: 1;
|
217
|
+
overflow-y: auto;
|
218
|
+
padding: 1rem 0;
|
219
|
+
display: flex;
|
220
|
+
flex-direction: column;
|
221
|
+
gap: 1rem;
|
222
|
+
}
|
223
|
+
|
224
|
+
.lexi-chat-bottom {
|
225
|
+
display: flex;
|
226
|
+
flex-direction: column;
|
227
|
+
align-items: center;
|
228
|
+
width: 100%;
|
229
|
+
flex-shrink: 0;
|
230
|
+
padding-bottom: 1rem;
|
231
|
+
}
|
232
|
+
|
233
|
+
.lexi-avatar {
|
234
|
+
height: 10.5rem;
|
235
|
+
width: auto;
|
236
|
+
pointer-events: none;
|
237
|
+
}
|
238
|
+
|
239
|
+
.lexi-input-wrapper {
|
240
|
+
width: 100%;
|
241
|
+
max-width: 32rem;
|
242
|
+
}
|
243
|
+
|
244
|
+
/* Response Form Styles */
|
245
|
+
.lexi-form-container {
|
246
|
+
display: flex;
|
247
|
+
flex-direction: column;
|
248
|
+
gap: 0.5rem;
|
179
249
|
}
|
180
250
|
|
181
251
|
.lexi-input-container {
|
182
|
-
|
252
|
+
display: flex;
|
253
|
+
flex-direction: column;
|
254
|
+
border: 1px solid var(--gray-300);
|
255
|
+
border-radius: 0.5rem;
|
256
|
+
background-color: rgba(255, 255, 255, 0.8);
|
257
|
+
padding: 0.5rem;
|
258
|
+
}
|
259
|
+
|
260
|
+
.lexi-textarea-wrapper {
|
261
|
+
flex: 1;
|
262
|
+
position: relative;
|
263
|
+
}
|
264
|
+
|
265
|
+
.lexi-textarea {
|
266
|
+
width: 100%;
|
267
|
+
min-height: 35px;
|
268
|
+
border: none;
|
269
|
+
resize: none;
|
270
|
+
outline: none;
|
271
|
+
background: transparent;
|
272
|
+
font-size: 1rem;
|
273
|
+
overflow-y: auto;
|
274
|
+
}
|
275
|
+
|
276
|
+
.lexi-textarea:focus {
|
277
|
+
outline: none;
|
278
|
+
box-shadow: none;
|
279
|
+
}
|
280
|
+
|
281
|
+
.lexi-input-controls {
|
282
|
+
display: flex;
|
283
|
+
justify-content: space-between;
|
284
|
+
align-items: flex-end;
|
285
|
+
}
|
286
|
+
|
287
|
+
.lexi-input-icons {
|
288
|
+
display: flex;
|
289
|
+
gap: 0.25rem;
|
290
|
+
align-items: flex-end;
|
291
|
+
}
|
292
|
+
|
293
|
+
.lexi-icon-button {
|
294
|
+
padding: 0.5rem;
|
295
|
+
border-radius: 0.75rem;
|
296
|
+
background: none;
|
297
|
+
border: none;
|
298
|
+
cursor: pointer;
|
299
|
+
transition: background-color 0.2s;
|
300
|
+
}
|
301
|
+
|
302
|
+
.lexi-icon-button:hover {
|
303
|
+
background-color: var(--gray-100);
|
304
|
+
}
|
305
|
+
|
306
|
+
.lexi-icon-button:disabled {
|
307
|
+
cursor: not-allowed;
|
308
|
+
opacity: 0.5;
|
309
|
+
}
|
310
|
+
|
311
|
+
.lexi-send-button {
|
312
|
+
width: 3rem;
|
313
|
+
height: 3rem;
|
314
|
+
border-radius: 50%;
|
315
|
+
display: flex;
|
316
|
+
align-items: center;
|
317
|
+
justify-content: center;
|
318
|
+
color: white;
|
319
|
+
transition: all 0.2s;
|
320
|
+
border: none;
|
321
|
+
cursor: pointer;
|
322
|
+
}
|
323
|
+
|
324
|
+
.lexi-send-button.responding {
|
325
|
+
background-color: var(--purple-600);
|
326
|
+
opacity: 0.5;
|
327
|
+
cursor: not-allowed;
|
328
|
+
}
|
329
|
+
|
330
|
+
.lexi-recording-notice {
|
331
|
+
text-align: left;
|
332
|
+
font-size: 0.875rem;
|
333
|
+
color: var(--purple-800);
|
334
|
+
}
|
335
|
+
|
336
|
+
.lexi-advance-button {
|
337
|
+
font-size: 0.75rem;
|
338
|
+
margin-bottom: 0.5rem;
|
339
|
+
background: none;
|
340
|
+
border: none;
|
341
|
+
cursor: pointer;
|
342
|
+
color: var(--gray-700);
|
343
|
+
}
|
344
|
+
|
345
|
+
.lexi-advance-button:disabled {
|
346
|
+
opacity: 0.5;
|
347
|
+
cursor: not-allowed;
|
348
|
+
}
|
349
|
+
|
350
|
+
/* Response Bubble Styles */
|
351
|
+
.lexi-response-container {
|
352
|
+
display: flex;
|
353
|
+
flex-direction: column;
|
354
|
+
gap: 1rem;
|
355
|
+
}
|
356
|
+
|
357
|
+
.lexi-message-user {
|
358
|
+
display: flex;
|
359
|
+
justify-content: flex-end;
|
360
|
+
}
|
361
|
+
|
362
|
+
.lexi-message-assistant {
|
363
|
+
display: flex;
|
364
|
+
justify-content: flex-start;
|
365
|
+
}
|
366
|
+
|
367
|
+
.lexi-message-bubble-user {
|
368
|
+
max-width: 80%;
|
369
|
+
background-color: var(--purple-300);
|
370
|
+
border-radius: 0.75rem;
|
371
|
+
padding: 1rem;
|
372
|
+
}
|
373
|
+
|
374
|
+
.lexi-message-bubble-assistant {
|
375
|
+
max-width: 80%;
|
376
|
+
background-color: white;
|
377
|
+
border-radius: 0.75rem;
|
378
|
+
padding: 1rem;
|
379
|
+
display: flex;
|
380
|
+
align-items: center;
|
381
|
+
}
|
382
|
+
|
383
|
+
.lexi-message-content-user {
|
384
|
+
font-size: 1rem;
|
385
|
+
color: var(--gray-800);
|
386
|
+
}
|
387
|
+
|
388
|
+
.lexi-message-content-assistant {
|
389
|
+
color: black;
|
390
|
+
font-size: 1rem;
|
391
|
+
line-height: 1.25;
|
392
|
+
max-width: none;
|
393
|
+
}
|
394
|
+
|
395
|
+
.lexi-message-content-assistant h1,
|
396
|
+
.lexi-message-content-assistant h2,
|
397
|
+
.lexi-message-content-assistant h3,
|
398
|
+
.lexi-message-content-assistant h4,
|
399
|
+
.lexi-message-content-assistant h5,
|
400
|
+
.lexi-message-content-assistant h6 {
|
401
|
+
color: black;
|
402
|
+
margin-top: 1rem;
|
403
|
+
margin-bottom: 0.5rem;
|
404
|
+
font-weight: 600;
|
405
|
+
}
|
406
|
+
|
407
|
+
.lexi-message-content-assistant h1 {
|
408
|
+
font-size: 1.5rem;
|
409
|
+
}
|
410
|
+
|
411
|
+
.lexi-message-content-assistant h2 {
|
412
|
+
font-size: 1.25rem;
|
413
|
+
}
|
414
|
+
|
415
|
+
.lexi-message-content-assistant h3 {
|
416
|
+
font-size: 1.125rem;
|
417
|
+
}
|
418
|
+
|
419
|
+
.lexi-message-content-assistant p {
|
420
|
+
margin-bottom: 1rem;
|
421
|
+
}
|
422
|
+
|
423
|
+
.lexi-message-content-assistant ul,
|
424
|
+
.lexi-message-content-assistant ol {
|
425
|
+
margin-bottom: 1rem;
|
426
|
+
padding-left: 1.5rem;
|
427
|
+
}
|
428
|
+
|
429
|
+
.lexi-message-content-assistant li {
|
430
|
+
margin-bottom: 0.5rem;
|
431
|
+
}
|
432
|
+
|
433
|
+
.lexi-message-content-assistant a {
|
434
|
+
color: var(--blue-600);
|
435
|
+
text-decoration: underline;
|
436
|
+
}
|
437
|
+
|
438
|
+
.lexi-message-content-assistant a:hover {
|
439
|
+
color: var(--blue-700);
|
440
|
+
}
|
441
|
+
|
442
|
+
.lexi-message-content-assistant code {
|
443
|
+
background-color: var(--gray-100);
|
444
|
+
padding: 0.125rem 0.25rem;
|
445
|
+
border-radius: 0.25rem;
|
446
|
+
font-family: ui-monospace, monospace;
|
447
|
+
font-size: 0.875rem;
|
448
|
+
}
|
449
|
+
|
450
|
+
.lexi-message-content-assistant pre {
|
451
|
+
background-color: var(--gray-100);
|
452
|
+
padding: 1rem;
|
453
|
+
border-radius: 0.5rem;
|
454
|
+
overflow-x: auto;
|
455
|
+
margin: 1rem 0;
|
456
|
+
}
|
457
|
+
|
458
|
+
.lexi-message-content-assistant blockquote {
|
459
|
+
border-left: 4px solid var(--gray-200);
|
460
|
+
padding-left: 1rem;
|
461
|
+
font-style: italic;
|
462
|
+
color: var(--gray-500);
|
463
|
+
margin: 1rem 0;
|
464
|
+
}
|
465
|
+
|
466
|
+
/* Lexi Chat Component Heights */
|
467
|
+
.lexi-chat-container-full {
|
468
|
+
height: 95vh;
|
183
469
|
}
|
184
470
|
|
185
471
|
/* Lexi Chat Component Constraints */
|
@@ -191,10 +477,6 @@
|
|
191
477
|
min-height: 35px;
|
192
478
|
}
|
193
479
|
|
194
|
-
.lexi-message-max-width {
|
195
|
-
max-width: 80%;
|
196
|
-
}
|
197
|
-
|
198
480
|
/* Tray Animations */
|
199
481
|
.tray-container {
|
200
482
|
transition: all 500ms ease-in-out;
|
@@ -69,7 +69,7 @@ module MetaWorkflows
|
|
69
69
|
def handle_import_result(result)
|
70
70
|
if result.success?
|
71
71
|
import_result = result.data
|
72
|
-
flash[:notice] =
|
72
|
+
flash[:notice] = format_success_message(import_result)
|
73
73
|
redirect_to workflows_path
|
74
74
|
else
|
75
75
|
flash[:alert] = result.error
|
@@ -77,9 +77,13 @@ module MetaWorkflows
|
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
-
def
|
81
|
-
|
82
|
-
|
80
|
+
def format_success_message(import_result)
|
81
|
+
if import_result[:message].present?
|
82
|
+
import_result[:message]
|
83
|
+
else
|
84
|
+
action = import_result[:action] == 'created' ? 'imported' : 'updated'
|
85
|
+
"Workflow '#{import_result[:workflow_name]}' #{action} successfully!"
|
86
|
+
end
|
83
87
|
end
|
84
88
|
end
|
85
89
|
end
|
@@ -1,40 +1,31 @@
|
|
1
1
|
<%# Lexi Chat Tray %>
|
2
|
-
<div class="
|
3
|
-
|
4
|
-
<div class="
|
5
|
-
<div class="
|
6
|
-
<%= image_tag("lexi_logo_color.png", alt: "Lexi Logo", class: "
|
2
|
+
<div class="lexi-chat-tray lexi-chat-container-full">
|
3
|
+
<!-- Header with Lexi logo and action icons -->
|
4
|
+
<div class="lexi-chat-header">
|
5
|
+
<div class="lexi-chat-header-left">
|
6
|
+
<%= image_tag("lexi_logo_color.png", alt: "Lexi Logo", class: "lexi-chat-logo") %>
|
7
7
|
</div>
|
8
|
-
<div class="
|
9
|
-
<button type="button" class="
|
8
|
+
<div class="lexi-chat-header-right">
|
9
|
+
<button type="button" class="lexi-chat-button" aria-label="New Chat" disabled>
|
10
10
|
<i class="fa-solid fa-plus text-xl"></i>
|
11
11
|
</button>
|
12
|
-
<button type="button" class="
|
12
|
+
<button type="button" class="lexi-chat-button" aria-label="Chat History" disabled>
|
13
13
|
<i class="fa-solid fa-clock-rotate-left text-xl"></i>
|
14
14
|
</button>
|
15
15
|
</div>
|
16
16
|
</div>
|
17
17
|
|
18
|
-
|
19
|
-
<div id="main-scroll-container" class="
|
18
|
+
<!-- Chat messages area -->
|
19
|
+
<div id="main-scroll-container" class="lexi-chat-messages">
|
20
20
|
<%= render partial: meta_loader, locals: {record: local_assigns[:record], step_progress: ["Generating draft course objectives...", "Talking to the LLM..."] } %>
|
21
21
|
</div>
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
<!-- Input area -->
|
31
|
-
<div class="w-full">
|
32
|
-
<% active_execution = local_assigns[:record]&.workflow_executions&.order(created_at: :desc)&.first %>
|
33
|
-
<%= render partial: meta_response_form, locals: {record: local_assigns[:record], response_enabled: true, workflow_execution_id: active_execution&.id, chat_id: active_execution&.workflow_steps&.last&.chat&.id, step_has_repetitions: true } %>
|
34
|
-
</div>
|
35
|
-
</div>
|
36
|
-
|
37
|
-
<!-- Lexi image positioned absolutely to the left -->
|
38
|
-
<%= image_tag("lexi-expanded.png", alt: "Lexi Avatar", class: "absolute bottom-10 left-0 lexi-avatar-medium w-auto pointer-events-none") %>
|
23
|
+
<!-- Avatar and input area pinned to bottom -->
|
24
|
+
<div class="lexi-chat-bottom">
|
25
|
+
<%= image_tag("lexi-expanded.png", alt: "Lexi Avatar", class: "lexi-avatar") %>
|
26
|
+
<div class="lexi-input-wrapper">
|
27
|
+
<% active_execution = local_assigns[:record]&.workflow_executions&.order(created_at: :desc)&.first %>
|
28
|
+
<%= render partial: meta_response_form, locals: {record: local_assigns[:record], response_enabled: true, workflow_execution_id: active_execution&.id, chat_id: active_execution&.workflow_steps&.last&.chat&.id, step_has_repetitions: true } %>
|
29
|
+
</div>
|
39
30
|
</div>
|
40
31
|
</div>
|
@@ -6,34 +6,34 @@
|
|
6
6
|
id: "#{target_frame_id(record, form: true)}_lexi" do |form| %>
|
7
7
|
<%= form.hidden_field :chat_id, value: chat_id %>
|
8
8
|
<fieldset>
|
9
|
-
<div class="
|
9
|
+
<div class="lexi-form-container">
|
10
10
|
<!-- Input Container -->
|
11
|
-
<div class="
|
11
|
+
<div class="lexi-input-container lexi-input-max-height">
|
12
12
|
<!-- Input area with icons -->
|
13
|
-
<div class="
|
14
|
-
<%= form.text_area :message, rows: 1, placeholder: random_chat_placeholder, disabled: local_assigns[:responding] || !local_assigns[:response_enabled], class: "
|
13
|
+
<div class="lexi-textarea-wrapper">
|
14
|
+
<%= form.text_area :message, rows: 1, placeholder: random_chat_placeholder, disabled: local_assigns[:responding] || !local_assigns[:response_enabled], class: "lexi-textarea lexi-textarea-min-height" %>
|
15
15
|
</div>
|
16
16
|
|
17
|
-
<div class="
|
18
|
-
<div class="
|
19
|
-
<button type="button" class="
|
17
|
+
<div class="lexi-input-controls">
|
18
|
+
<div class="lexi-input-icons">
|
19
|
+
<button type="button" class="lexi-icon-button" disabled>
|
20
20
|
<i class="fa-solid fa-microphone text-lg"></i>
|
21
21
|
</button>
|
22
|
-
<button type="button" class="
|
22
|
+
<button type="button" class="lexi-icon-button" disabled>
|
23
23
|
<i class="fa-solid fa-headphones text-lg"></i>
|
24
24
|
</button>
|
25
|
-
<button type="button" class="
|
25
|
+
<button type="button" class="lexi-icon-button" disabled>
|
26
26
|
<i class="fa-solid fa-waveform-lines text-lg"></i>
|
27
27
|
</button>
|
28
28
|
</div>
|
29
29
|
<div>
|
30
30
|
<!-- Send button -->
|
31
31
|
<% if local_assigns[:responding] %>
|
32
|
-
<button type="button" class="
|
32
|
+
<button type="button" class="lexi-send-button responding" disabled>
|
33
33
|
<i class="fa-solid fa-arrow-up text-lg"></i>
|
34
34
|
</button>
|
35
35
|
<% else %>
|
36
|
-
<%= form.button type: "submit", class: "
|
36
|
+
<%= form.button type: "submit", class: "lexi-send-button sm-btn sm-btn-primary" do %>
|
37
37
|
<i class="fa-solid fa-arrow-up text-lg"></i>
|
38
38
|
<% end %>
|
39
39
|
<% end %>
|
@@ -41,12 +41,14 @@
|
|
41
41
|
</div>
|
42
42
|
</div>
|
43
43
|
|
44
|
-
<
|
44
|
+
<p class="lexi-recording-notice">This chat is being recorded.</p>
|
45
|
+
|
46
|
+
<div>
|
45
47
|
<% if local_assigns[:step_has_repetitions] %>
|
46
48
|
<!-- Empty placeholder to prevent layout jank -->
|
47
|
-
<div
|
49
|
+
<div aria-hidden="true"></div>
|
48
50
|
<% else %>
|
49
|
-
<%= form.button type: "submit", name: "advance", value: "true", class: "
|
51
|
+
<%= form.button type: "submit", name: "advance", value: "true", class: "lexi-advance-button #{'opacity-50 cursor-not-allowed' if local_assigns[:responding]}", disabled: local_assigns[:responding] do %>
|
50
52
|
<i class="fa-light fa-arrow-right"></i> Next
|
51
53
|
<% end %>
|
52
54
|
<% end %>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<%= turbo_frame_tag target_frame_id(record) do %>
|
2
|
-
<div id="response-content-container" class="
|
2
|
+
<div id="response-content-container" class="lexi-response-container" data-controller="response-scroll">
|
3
3
|
<% if chat.present? && chat.messages.any? %>
|
4
4
|
|
5
5
|
<!-- Show all saved messages except the first user message -->
|
@@ -9,21 +9,21 @@
|
|
9
9
|
<% next if is_streaming && message.role == 'assistant' && message == last_message %>
|
10
10
|
|
11
11
|
<% if message.role == 'user' %>
|
12
|
-
<!-- User message bubble (right-aligned,
|
13
|
-
<div class="
|
14
|
-
<div class="lexi-message-
|
15
|
-
<div class="
|
12
|
+
<!-- User message bubble (right-aligned, purple background) -->
|
13
|
+
<div class="lexi-message-user">
|
14
|
+
<div class="lexi-message-bubble-user">
|
15
|
+
<div class="lexi-message-content-user">
|
16
16
|
<%= simple_format(message.content) %>
|
17
17
|
</div>
|
18
18
|
</div>
|
19
19
|
</div>
|
20
20
|
|
21
21
|
<% elsif message.role == 'assistant' %>
|
22
|
-
<!-- Lexi message bubble (left-aligned) -->
|
23
|
-
<div class="
|
22
|
+
<!-- Lexi message bubble (left-aligned, white background) -->
|
23
|
+
<div class="lexi-message-assistant">
|
24
24
|
<!-- Message Bubble -->
|
25
|
-
<div class="lexi-message-
|
26
|
-
<div class="
|
25
|
+
<div class="lexi-message-bubble-assistant">
|
26
|
+
<div class="lexi-message-content-assistant">
|
27
27
|
<%= markdown(message.content) %>
|
28
28
|
</div>
|
29
29
|
</div>
|
@@ -33,10 +33,10 @@
|
|
33
33
|
|
34
34
|
<!-- Show streaming response -->
|
35
35
|
<% if is_streaming %>
|
36
|
-
<div class="
|
36
|
+
<div class="lexi-message-assistant">
|
37
37
|
<!-- Streaming Message Bubble -->
|
38
|
-
<div class="lexi-message-
|
39
|
-
<div class="
|
38
|
+
<div class="lexi-message-bubble-assistant">
|
39
|
+
<div class="lexi-message-content-assistant">
|
40
40
|
<%= markdown(full_response) %>
|
41
41
|
</div>
|
42
42
|
</div>
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module MetaWorkflows
|
4
4
|
MAJOR = 0
|
5
5
|
MINOR = 9
|
6
|
-
PATCH =
|
6
|
+
PATCH = 7 # this is automatically incremented by the build process
|
7
7
|
|
8
8
|
VERSION = "#{MetaWorkflows::MAJOR}.#{MetaWorkflows::MINOR}.#{MetaWorkflows::PATCH}".freeze
|
9
9
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: meta_workflows
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leonid Medovyy
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2025-07-
|
12
|
+
date: 2025-07-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|