meta_workflows 0.9.10 → 0.9.12
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/app/assets/images/lexi-expanded2.png +0 -0
- data/app/assets/javascripts/meta_workflows/controllers/onboarding_controller.js +31 -0
- data/app/assets/stylesheets/meta_workflows/application.css +245 -5
- data/app/controllers/meta_workflows/humans_controller.rb +2 -2
- data/app/controllers/meta_workflows/meta_controller.rb +1 -2
- data/app/helpers/meta_workflows/meta_workflows_helper.rb +16 -4
- data/app/jobs/meta_workflows/human_input_job.rb +7 -0
- data/app/jobs/meta_workflows/meta_job.rb +11 -4
- data/app/views/meta_workflows/_error_message.html.erb +14 -0
- data/app/views/meta_workflows/_lexi_chat_alpha_tray.html.erb +32 -28
- data/app/views/meta_workflows/_lexi_chat_right_tray.html.erb +12 -2
- data/app/views/meta_workflows/_loader_message.html.erb +16 -0
- data/app/views/meta_workflows/_response_lexi.html.erb +12 -1
- data/lib/meta_workflows/version.rb +1 -1
- metadata +6 -3
- data/app/views/meta_workflows/_loader.html.erb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73fcb0be3ef0902a994689da96b1d7dbd8164fe4997f3d1ffb47bbde0608c163
|
4
|
+
data.tar.gz: 15adbe1b54336b7cbc301a16e38924279d5ff44748d4310bc3bf6f6f28dac583
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db5004eb9417c670f71fe1be96e4e25727dbaae9f592090469de5e4887f65017131aa46a8d127bcbd6077e62c144ba93dc04522988bcc77768095b88ca3eda05
|
7
|
+
data.tar.gz: 02f2c0a1ae62055685a369ff9ca08dd5b4793d4d902894a60eb3148a2857d8c3c2416316d60eadad31825015c5be801ba8f0fe108ae2b8acd0b9633fb3c6406b
|
Binary file
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import { Controller } from "@hotwired/stimulus"
|
2
|
+
|
3
|
+
export default class extends Controller {
|
4
|
+
static targets = ["welcome", "chat", "welcomeContent", "lexiIcon"]
|
5
|
+
|
6
|
+
connect() {
|
7
|
+
// Ensure initial state using CSS classes
|
8
|
+
this.welcomeTarget.classList.remove("fade-out")
|
9
|
+
this.chatTarget.classList.remove("expand-in")
|
10
|
+
}
|
11
|
+
|
12
|
+
startChat() {
|
13
|
+
// Start the grid stacking animation sequence
|
14
|
+
this.fadeOutWelcome()
|
15
|
+
|
16
|
+
// Chat expands in after welcome starts fading (grid stacking handles timing)
|
17
|
+
setTimeout(() => {
|
18
|
+
this.expandInChat()
|
19
|
+
}, 100) // Small delay to ensure welcome animation starts first
|
20
|
+
}
|
21
|
+
|
22
|
+
fadeOutWelcome() {
|
23
|
+
// Use CSS animation classes instead of display properties
|
24
|
+
this.welcomeTarget.classList.add("fade-out")
|
25
|
+
}
|
26
|
+
|
27
|
+
expandInChat() {
|
28
|
+
// Use CSS animation class - no display manipulation needed
|
29
|
+
this.chatTarget.classList.add("expand-in")
|
30
|
+
}
|
31
|
+
}
|
@@ -160,6 +160,96 @@
|
|
160
160
|
}
|
161
161
|
}
|
162
162
|
|
163
|
+
/* Loader Message Styles */
|
164
|
+
.lexi-loader-bubble {
|
165
|
+
padding: 0.25rem 0.5rem;
|
166
|
+
margin-bottom: 0.25rem;
|
167
|
+
border: none;
|
168
|
+
}
|
169
|
+
|
170
|
+
@keyframes gradient-shift {
|
171
|
+
0% {
|
172
|
+
background-position: 0% 50%;
|
173
|
+
}
|
174
|
+
50% {
|
175
|
+
background-position: 100% 50%;
|
176
|
+
}
|
177
|
+
100% {
|
178
|
+
background-position: 0% 50%;
|
179
|
+
}
|
180
|
+
}
|
181
|
+
|
182
|
+
@keyframes dot-bounce {
|
183
|
+
0%, 80%, 100% {
|
184
|
+
transform: translateY(0);
|
185
|
+
opacity: 0.7;
|
186
|
+
}
|
187
|
+
40% {
|
188
|
+
transform: translateY(-3px);
|
189
|
+
opacity: 1;
|
190
|
+
}
|
191
|
+
}
|
192
|
+
|
193
|
+
.lexi-loader-text {
|
194
|
+
font-size: 1.25rem;
|
195
|
+
background: linear-gradient(135deg, #7B5BA3 0%, #3A9999 50%, #7B5BA3 100%);
|
196
|
+
background-size: 200% 200%;
|
197
|
+
background-clip: text;
|
198
|
+
-webkit-background-clip: text;
|
199
|
+
-webkit-text-fill-color: transparent;
|
200
|
+
color: transparent;
|
201
|
+
font-style: italic;
|
202
|
+
animation: gradient-shift 2s ease-in-out infinite;
|
203
|
+
-webkit-text-stroke: 0.75px rgba(0, 0, 0, 0.15);
|
204
|
+
text-stroke: 0.75px rgba(0, 0, 0, 0.15);
|
205
|
+
}
|
206
|
+
|
207
|
+
.lexi-loader-ellipses {
|
208
|
+
display: inline-block;
|
209
|
+
}
|
210
|
+
|
211
|
+
.lexi-dot {
|
212
|
+
display: inline-block;
|
213
|
+
font-size: 1.25rem;
|
214
|
+
background: linear-gradient(135deg, #7B5BA3 0%, #3A9999 50%, #7B5BA3 100%);
|
215
|
+
background-size: 200% 200%;
|
216
|
+
background-clip: text;
|
217
|
+
-webkit-background-clip: text;
|
218
|
+
-webkit-text-fill-color: transparent;
|
219
|
+
color: transparent;
|
220
|
+
animation: gradient-shift 2s ease-in-out infinite, dot-bounce 1.4s ease-in-out infinite;
|
221
|
+
-webkit-text-stroke: 0.75px rgba(0, 0, 0, 0.15);
|
222
|
+
text-stroke: 0.75px rgba(0, 0, 0, 0.15);
|
223
|
+
margin-left: -0.125rem;
|
224
|
+
}
|
225
|
+
|
226
|
+
.lexi-dot-1 {
|
227
|
+
animation-delay: 0s, 0s;
|
228
|
+
}
|
229
|
+
|
230
|
+
.lexi-dot-2 {
|
231
|
+
animation-delay: 0s, 0.2s;
|
232
|
+
}
|
233
|
+
|
234
|
+
.lexi-dot-3 {
|
235
|
+
animation-delay: 0s, 0.4s;
|
236
|
+
}
|
237
|
+
|
238
|
+
.lexi-dot.lexi-dot-error {
|
239
|
+
background: linear-gradient(135deg, #dc2626 0%, #b91c1c 50%, #dc2626 100%);
|
240
|
+
background-size: 200% 200%;
|
241
|
+
background-clip: text;
|
242
|
+
-webkit-background-clip: text;
|
243
|
+
-webkit-text-fill-color: transparent;
|
244
|
+
color: transparent;
|
245
|
+
-webkit-text-stroke: 0.75px rgba(220, 38, 38, 0.15);
|
246
|
+
text-stroke: 0.75px rgba(220, 38, 38, 0.15);
|
247
|
+
}
|
248
|
+
|
249
|
+
.lexi-loader-container {
|
250
|
+
margin-top: -0.5rem;
|
251
|
+
}
|
252
|
+
|
163
253
|
/* Lexi Chat Tray Styles */
|
164
254
|
.lexi-chat-tray {
|
165
255
|
display: flex;
|
@@ -174,7 +264,6 @@
|
|
174
264
|
align-items: center;
|
175
265
|
justify-content: space-between;
|
176
266
|
padding: 0.5rem 0;
|
177
|
-
border-bottom: 1px solid var(--gray-200);
|
178
267
|
}
|
179
268
|
|
180
269
|
.lexi-chat-header-left {
|
@@ -381,13 +470,13 @@
|
|
381
470
|
}
|
382
471
|
|
383
472
|
.lexi-message-content-user {
|
384
|
-
font-size:
|
473
|
+
font-size: 1.25rem;
|
385
474
|
color: var(--gray-800);
|
386
475
|
}
|
387
476
|
|
388
477
|
.lexi-message-content-assistant {
|
389
478
|
color: black;
|
390
|
-
font-size:
|
479
|
+
font-size: 1.25rem;
|
391
480
|
line-height: 1.25;
|
392
481
|
max-width: none;
|
393
482
|
}
|
@@ -564,7 +653,7 @@
|
|
564
653
|
|
565
654
|
/* Show floating Lexi avatar button when collapsed - with delay to avoid overlap */
|
566
655
|
.gamma-tray.lexi-tray.collapsed .lexi-floating-avatar {
|
567
|
-
display: block
|
656
|
+
display: block;
|
568
657
|
opacity: 0;
|
569
658
|
animation: lexi-avatar-appear 200ms ease-in-out 400ms forwards;
|
570
659
|
}
|
@@ -582,5 +671,156 @@
|
|
582
671
|
|
583
672
|
/* Hide floating avatar when tray is expanded */
|
584
673
|
.gamma-tray.lexi-tray:not(.collapsed) .lexi-floating-avatar {
|
585
|
-
display: none
|
674
|
+
display: none;
|
675
|
+
}
|
676
|
+
|
677
|
+
/* Onboarding Screen Grid Stacking Animations */
|
678
|
+
.onboarding-container {
|
679
|
+
display: grid;
|
680
|
+
grid-template-columns: 1fr;
|
681
|
+
grid-template-rows: 1fr;
|
682
|
+
width: 100%;
|
683
|
+
height: 100vh;
|
684
|
+
}
|
685
|
+
|
686
|
+
.welcome-screen, .chat-screen {
|
687
|
+
grid-column: 1;
|
688
|
+
grid-row: 1;
|
689
|
+
}
|
690
|
+
|
691
|
+
/* Welcome screen - starts normal, fades out */
|
692
|
+
.welcome-screen {
|
693
|
+
opacity: 1;
|
694
|
+
transition: opacity 0.6s ease-in-out;
|
695
|
+
z-index: 10;
|
696
|
+
}
|
697
|
+
|
698
|
+
.welcome-screen.fade-out {
|
699
|
+
opacity: 0;
|
700
|
+
}
|
701
|
+
|
702
|
+
/* Chat screen - starts hidden, fades in */
|
703
|
+
.chat-screen {
|
704
|
+
opacity: 0;
|
705
|
+
pointer-events: none; /* Don't block clicks when hidden */
|
706
|
+
transition: opacity 0.8s ease-in-out 0.3s; /* 0.3s delay after welcome starts fading */
|
707
|
+
z-index: 15; /* Higher than welcome screen */
|
708
|
+
}
|
709
|
+
|
710
|
+
.chat-screen.expand-in {
|
711
|
+
opacity: 1;
|
712
|
+
pointer-events: auto; /* Re-enable clicks when visible */
|
713
|
+
}
|
714
|
+
|
715
|
+
/* Legacy animation states for backwards compatibility */
|
716
|
+
.welcome-content.fade-out {
|
717
|
+
opacity: 0;
|
718
|
+
transition: opacity 0.5s ease-in-out;
|
719
|
+
}
|
720
|
+
|
721
|
+
.lexi-icon-container.fade-out {
|
722
|
+
opacity: 0;
|
723
|
+
transition: opacity 0.5s ease-in-out;
|
724
|
+
}
|
725
|
+
|
726
|
+
/* Alpha Tray Lexi Avatar Size */
|
727
|
+
.lexi-avatar-large {
|
728
|
+
height: 35rem;
|
729
|
+
width: auto;
|
730
|
+
}
|
731
|
+
|
732
|
+
/* Alpha Tray Specific Styles */
|
733
|
+
.lexi-chat-alpha-tray {
|
734
|
+
position: relative;
|
735
|
+
display: flex;
|
736
|
+
flex-direction: column;
|
737
|
+
background-color: white;
|
738
|
+
padding: 1rem 1rem 0 1rem;
|
739
|
+
height: 100%;
|
740
|
+
}
|
741
|
+
|
742
|
+
.lexi-chat-alpha-header {
|
743
|
+
display: flex;
|
744
|
+
align-items: center;
|
745
|
+
justify-content: space-between;
|
746
|
+
padding-bottom: 1rem;
|
747
|
+
}
|
748
|
+
|
749
|
+
.lexi-chat-alpha-header-left {
|
750
|
+
display: flex;
|
751
|
+
align-items: center;
|
752
|
+
}
|
753
|
+
|
754
|
+
.lexi-chat-alpha-header-right {
|
755
|
+
display: flex;
|
756
|
+
align-items: center;
|
757
|
+
}
|
758
|
+
|
759
|
+
.lexi-chat-alpha-logo {
|
760
|
+
height: 80px;
|
761
|
+
width: auto;
|
762
|
+
}
|
763
|
+
|
764
|
+
.lexi-chat-alpha-close-button {
|
765
|
+
padding: 0.5rem;
|
766
|
+
border-radius: 0.75rem;
|
767
|
+
background: none;
|
768
|
+
border: none;
|
769
|
+
cursor: pointer;
|
770
|
+
transition: background-color 0.2s;
|
771
|
+
}
|
772
|
+
|
773
|
+
.lexi-chat-alpha-close-button:hover {
|
774
|
+
background-color: #f3f4f6;
|
775
|
+
}
|
776
|
+
|
777
|
+
.lexi-chat-alpha-content {
|
778
|
+
flex: 1;
|
779
|
+
display: flex;
|
780
|
+
gap: 1rem;
|
781
|
+
min-height: 0;
|
782
|
+
}
|
783
|
+
|
784
|
+
.lexi-chat-alpha-left-column {
|
785
|
+
display: flex;
|
786
|
+
flex-direction: column;
|
787
|
+
justify-content: flex-end;
|
788
|
+
flex-shrink: 0;
|
789
|
+
}
|
790
|
+
|
791
|
+
.lexi-chat-alpha-right-column {
|
792
|
+
flex: 1;
|
793
|
+
display: flex;
|
794
|
+
flex-direction: column;
|
795
|
+
min-height: 0;
|
796
|
+
}
|
797
|
+
|
798
|
+
.lexi-chat-alpha-messages {
|
799
|
+
flex: 1;
|
800
|
+
overflow-y: auto;
|
801
|
+
min-height: 0;
|
802
|
+
padding-bottom: 1rem;
|
803
|
+
}
|
804
|
+
|
805
|
+
.lexi-chat-alpha-messages > * + * {
|
806
|
+
margin-top: 1rem;
|
807
|
+
}
|
808
|
+
|
809
|
+
.lexi-chat-alpha-input-area {
|
810
|
+
flex-shrink: 0;
|
811
|
+
}
|
812
|
+
|
813
|
+
.lexi-chat-alpha-input-container {
|
814
|
+
width: 100%;
|
815
|
+
}
|
816
|
+
|
817
|
+
.lexi-error-content {
|
818
|
+
display: flex;
|
819
|
+
align-items: baseline;
|
820
|
+
gap: 0.5rem;
|
821
|
+
color: var(--red-700);
|
822
|
+
}
|
823
|
+
|
824
|
+
.lexi-error-content .lexi-loader-ellipses {
|
825
|
+
margin-left: 0.375rem;
|
586
826
|
}
|
@@ -45,8 +45,8 @@ module MetaWorkflows
|
|
45
45
|
format.turbo_stream do
|
46
46
|
render turbo_stream: [
|
47
47
|
turbo_stream.replace(
|
48
|
-
target_frame_id(@record),
|
49
|
-
partial:
|
48
|
+
target_frame_id(@record, loader: true),
|
49
|
+
partial: meta_loader_message,
|
50
50
|
locals: {
|
51
51
|
record: @record,
|
52
52
|
step_progress: fetch_step_progress
|
@@ -15,8 +15,7 @@ module MetaWorkflows
|
|
15
15
|
protected
|
16
16
|
|
17
17
|
def fetch_step_progress
|
18
|
-
@workflow_execution.step_progress(@workflow_execution.current_step) ||
|
19
|
-
'Talking to the LLM...']
|
18
|
+
@workflow_execution.step_progress(@workflow_execution.current_step) || default_step_progress
|
20
19
|
end
|
21
20
|
|
22
21
|
def current_step_repetitions
|
@@ -2,17 +2,25 @@
|
|
2
2
|
|
3
3
|
module MetaWorkflows
|
4
4
|
module MetaWorkflowsHelper
|
5
|
-
def target_frame_id(record, form: nil)
|
5
|
+
def target_frame_id(record, form: nil, loader: nil)
|
6
6
|
base_id = "#{record.class.name.downcase}_#{record.id}"
|
7
|
-
|
7
|
+
|
8
|
+
return "#{base_id}_loader" if loader
|
9
|
+
return "#{base_id}_form" if form
|
10
|
+
|
11
|
+
base_id
|
8
12
|
end
|
9
13
|
|
10
14
|
def turbo_stream_name(record)
|
11
15
|
[record.class.name.downcase, record.id]
|
12
16
|
end
|
13
17
|
|
14
|
-
def
|
15
|
-
'meta_workflows/
|
18
|
+
def meta_loader_message
|
19
|
+
'meta_workflows/loader_message'
|
20
|
+
end
|
21
|
+
|
22
|
+
def meta_error_message
|
23
|
+
'meta_workflows/error_message'
|
16
24
|
end
|
17
25
|
|
18
26
|
def meta_response_form
|
@@ -67,5 +75,9 @@ module MetaWorkflows
|
|
67
75
|
def current_step_has_repetitions?(workflow_execution)
|
68
76
|
workflow_execution.step_repetitions(workflow_execution.current_step).present?
|
69
77
|
end
|
78
|
+
|
79
|
+
def default_step_progress
|
80
|
+
['Thinking']
|
81
|
+
end
|
70
82
|
end
|
71
83
|
end
|
@@ -20,6 +20,13 @@ module MetaWorkflows
|
|
20
20
|
last_message = messages.last
|
21
21
|
is_streaming = full_response.present?
|
22
22
|
|
23
|
+
# Remove loader message
|
24
|
+
Turbo::StreamsChannel.broadcast_remove_to(
|
25
|
+
turbo_stream_name(record),
|
26
|
+
target: target_frame_id(record, loader: true)
|
27
|
+
)
|
28
|
+
|
29
|
+
# Update main chat content
|
23
30
|
Turbo::StreamsChannel.broadcast_replace_to(turbo_stream_name(record),
|
24
31
|
target: target_frame_id(record),
|
25
32
|
locals: {
|
@@ -73,7 +73,7 @@ module MetaWorkflows
|
|
73
73
|
def handle_llm_error(error, workflow_step, conversation)
|
74
74
|
log_error(error)
|
75
75
|
store_error_in_workflow_step(error, workflow_step, conversation)
|
76
|
-
broadcast_error_response
|
76
|
+
broadcast_error_response
|
77
77
|
end
|
78
78
|
|
79
79
|
def log_error(error)
|
@@ -97,9 +97,16 @@ module MetaWorkflows
|
|
97
97
|
workflow_execution.workflow_steps.find_by(step: workflow_execution.current_step)
|
98
98
|
end
|
99
99
|
|
100
|
-
def broadcast_error_response
|
101
|
-
|
102
|
-
|
100
|
+
def broadcast_error_response
|
101
|
+
# Replace loader with error message
|
102
|
+
Turbo::StreamsChannel.broadcast_replace_to(
|
103
|
+
turbo_stream_name(record),
|
104
|
+
target: target_frame_id(record, loader: true),
|
105
|
+
partial: 'meta_workflows/error_message',
|
106
|
+
locals: {
|
107
|
+
record: record
|
108
|
+
}
|
109
|
+
)
|
103
110
|
end
|
104
111
|
|
105
112
|
def broadcast_form(chat)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<div class="lexi-message-assistant">
|
2
|
+
<div class="lexi-message-bubble-assistant">
|
3
|
+
<div class="lexi-message-content-assistant">
|
4
|
+
<div class="lexi-error-content">
|
5
|
+
<i class="fa-solid fa-exclamation-triangle"></i>
|
6
|
+
<span>Uh oh! Lexi needs a quick break. One moment<span class="lexi-loader-ellipses">
|
7
|
+
<span class="lexi-dot lexi-dot-error lexi-dot-1">.</span>
|
8
|
+
<span class="lexi-dot lexi-dot-error lexi-dot-2">.</span>
|
9
|
+
<span class="lexi-dot lexi-dot-error lexi-dot-3">.</span>
|
10
|
+
</span></span>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
</div>
|
@@ -1,42 +1,46 @@
|
|
1
1
|
<%# Lexi Chat Alpha Tray (Center Display) %>
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
<% active_execution = local_assigns[:record]&.workflow_executions&.order(created_at: :desc)&.first %>
|
3
|
+
<% active_chat = active_execution&.workflow_steps&.last&.chat %>
|
4
|
+
|
5
|
+
<div class="lexi-chat-alpha-tray lexi-chat-container">
|
6
|
+
<%# Header with Lexi logo left and close button right %>
|
7
|
+
<div class="lexi-chat-alpha-header">
|
8
|
+
<div class="lexi-chat-alpha-header-left">
|
9
|
+
<%= image_tag("lexi_logo_color.png", alt: "Lexi Logo", class: "lexi-chat-alpha-logo") %>
|
7
10
|
</div>
|
8
|
-
<div class="
|
9
|
-
<button type="button" class="
|
10
|
-
<i class="fa-solid fa-
|
11
|
-
</button>
|
12
|
-
<button type="button" class="p-2 rounded-xl hover:bg-gray-100" aria-label="Chat History" disabled>
|
13
|
-
<i class="fa-solid fa-clock-rotate-left text-xl"></i>
|
11
|
+
<div class="lexi-chat-alpha-header-right">
|
12
|
+
<button type="button" class="lexi-chat-alpha-close-button" aria-label="Close" disabled>
|
13
|
+
<i class="fa-solid fa-times text-xl"></i>
|
14
14
|
</button>
|
15
15
|
</div>
|
16
16
|
</div>
|
17
17
|
|
18
|
-
|
19
|
-
<div class="
|
20
|
-
|
21
|
-
<div class="
|
22
|
-
<%= image_tag("lexi-
|
18
|
+
<%# Main content: Left column (Lexi image) and Right column (Chat + Input) %>
|
19
|
+
<div class="lexi-chat-alpha-content">
|
20
|
+
<%# Left column - Lexi image %>
|
21
|
+
<div class="lexi-chat-alpha-left-column">
|
22
|
+
<%= image_tag("lexi-expanded2.png", alt: "Lexi Avatar", class: "lexi-avatar-large") %>
|
23
23
|
</div>
|
24
24
|
|
25
25
|
<!-- Main content area (chat + input) -->
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
<%# Right column - Chat and Input %>
|
27
|
+
<div class="lexi-chat-alpha-right-column">
|
28
|
+
<%# Scrollable chat messages area %>
|
29
|
+
<div id="main-scroll-container" class="lexi-chat-alpha-messages">
|
30
|
+
<%= render partial: meta_response, locals: {
|
31
|
+
record: local_assigns[:record],
|
32
|
+
chat: active_chat,
|
33
|
+
messages: active_chat&.messages&.order(:created_at) || [],
|
34
|
+
user_messages: active_chat&.messages&.where(role: 'user')&.order(:created_at) || [],
|
35
|
+
last_message: active_chat&.messages&.last,
|
36
|
+
full_response: nil,
|
37
|
+
is_streaming: false
|
38
|
+
} %>
|
30
39
|
</div>
|
31
40
|
|
32
|
-
<%# Input area %>
|
33
|
-
<div class="
|
34
|
-
|
35
|
-
<p class="text-left text-xs text-purple-800 mb-2">This chat is being recorded.</p>
|
36
|
-
|
37
|
-
<!-- Input form -->
|
38
|
-
<div class="w-full">
|
39
|
-
<% active_execution = local_assigns[:record]&.workflow_executions&.order(created_at: :desc)&.first %>
|
41
|
+
<%# Input area (fixed at bottom) %>
|
42
|
+
<div class="lexi-chat-alpha-input-area">
|
43
|
+
<div class="lexi-chat-alpha-input-container">
|
40
44
|
<%= 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 } %>
|
41
45
|
</div>
|
42
46
|
</div>
|
@@ -1,4 +1,7 @@
|
|
1
1
|
<%# Lexi Chat Tray %>
|
2
|
+
<% active_execution = local_assigns[:record]&.workflow_executions&.order(created_at: :desc)&.first %>
|
3
|
+
<% active_chat = active_execution&.workflow_steps&.last&.chat %>
|
4
|
+
|
2
5
|
<div class="lexi-chat-tray lexi-chat-container-full">
|
3
6
|
<!-- Header with Lexi logo and action icons -->
|
4
7
|
<div class="lexi-chat-header">
|
@@ -17,14 +20,21 @@
|
|
17
20
|
|
18
21
|
<!-- Chat messages area -->
|
19
22
|
<div id="main-scroll-container" class="lexi-chat-messages">
|
20
|
-
<%= render partial:
|
23
|
+
<%= render partial: meta_response, locals: {
|
24
|
+
record: local_assigns[:record],
|
25
|
+
chat: active_chat,
|
26
|
+
messages: active_chat&.messages&.order(:created_at) || [],
|
27
|
+
user_messages: active_chat&.messages&.where(role: 'user')&.order(:created_at) || [],
|
28
|
+
last_message: active_chat&.messages&.last,
|
29
|
+
full_response: nil,
|
30
|
+
is_streaming: false
|
31
|
+
} %>
|
21
32
|
</div>
|
22
33
|
|
23
34
|
<!-- Avatar and input area pinned to bottom -->
|
24
35
|
<div class="lexi-chat-bottom">
|
25
36
|
<%= image_tag("lexi-expanded.png", alt: "Lexi Avatar", class: "lexi-avatar") %>
|
26
37
|
<div class="lexi-input-wrapper">
|
27
|
-
<% active_execution = local_assigns[:record]&.workflow_executions&.order(created_at: :desc)&.first %>
|
28
38
|
<%= 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
39
|
</div>
|
30
40
|
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div class="lexi-message-assistant">
|
2
|
+
<div class="lexi-loader-bubble">
|
3
|
+
<div class="lexi-message-content-assistant"
|
4
|
+
data-controller="loading-phrases"
|
5
|
+
data-loading-phrases-phrases-value="<%= (local_assigns[:step_progress] || default_step_progress).to_json %>">
|
6
|
+
<span data-loading-phrases-target="message" class="lexi-loader-text">
|
7
|
+
<%= default_step_progress.first %>
|
8
|
+
</span>
|
9
|
+
<span class="lexi-loader-ellipses">
|
10
|
+
<span class="lexi-dot lexi-dot-1">.</span>
|
11
|
+
<span class="lexi-dot lexi-dot-2">.</span>
|
12
|
+
<span class="lexi-dot lexi-dot-3">.</span>
|
13
|
+
</span>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</div>
|
@@ -44,4 +44,15 @@
|
|
44
44
|
<% end %>
|
45
45
|
<% end %>
|
46
46
|
</div>
|
47
|
-
<% end %>
|
47
|
+
<% end %>
|
48
|
+
|
49
|
+
<div class="lexi-loader-container">
|
50
|
+
<%= turbo_frame_tag target_frame_id(record, loader: true) do %>
|
51
|
+
<% if chat.blank? || chat.messages.empty? %>
|
52
|
+
<%= render partial: meta_loader_message, locals: {
|
53
|
+
record: local_assigns[:record],
|
54
|
+
step_progress: default_step_progress
|
55
|
+
} %>
|
56
|
+
<% end %>
|
57
|
+
<% end %>
|
58
|
+
</div>
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module MetaWorkflows
|
4
4
|
MAJOR = 0
|
5
5
|
MINOR = 9
|
6
|
-
PATCH =
|
6
|
+
PATCH = 12 # 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.12
|
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-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -117,10 +117,12 @@ files:
|
|
117
117
|
- app/assets/images/lexi-chaticon.png
|
118
118
|
- app/assets/images/lexi-collapsed.png
|
119
119
|
- app/assets/images/lexi-expanded.png
|
120
|
+
- app/assets/images/lexi-expanded2.png
|
120
121
|
- app/assets/images/lexi_logo_color.png
|
121
122
|
- app/assets/javascripts/meta_workflows/controllers/lexi_form_submit_controller.js
|
122
123
|
- app/assets/javascripts/meta_workflows/controllers/loading_phrases_controller.js
|
123
124
|
- app/assets/javascripts/meta_workflows/controllers/meta_flash_controller.js
|
125
|
+
- app/assets/javascripts/meta_workflows/controllers/onboarding_controller.js
|
124
126
|
- app/assets/javascripts/meta_workflows/controllers/redirect_controller.js
|
125
127
|
- app/assets/javascripts/meta_workflows/controllers/response_scroll_controller.js
|
126
128
|
- app/assets/javascripts/meta_workflows/controllers/tray_controller.js
|
@@ -158,9 +160,10 @@ files:
|
|
158
160
|
- app/services/meta_workflows/workflow_import_service.rb
|
159
161
|
- app/sidekiq/meta_workflows/tools/meta_workflow_tool.rb
|
160
162
|
- app/views/layouts/meta_workflows/application.html.erb
|
163
|
+
- app/views/meta_workflows/_error_message.html.erb
|
161
164
|
- app/views/meta_workflows/_lexi_chat_alpha_tray.html.erb
|
162
165
|
- app/views/meta_workflows/_lexi_chat_right_tray.html.erb
|
163
|
-
- app/views/meta_workflows/
|
166
|
+
- app/views/meta_workflows/_loader_message.html.erb
|
164
167
|
- app/views/meta_workflows/_redirect.html.erb
|
165
168
|
- app/views/meta_workflows/_response_form_lexi.html.erb
|
166
169
|
- app/views/meta_workflows/_response_lexi.html.erb
|
@@ -1,17 +0,0 @@
|
|
1
|
-
<%= turbo_frame_tag target_frame_id(record) do %>
|
2
|
-
<div class="flex flex-col items-center justify-center gap-2"
|
3
|
-
data-controller="loading-phrases"
|
4
|
-
data-loading-phrases-phrases-value="<%= (local_assigns[:step_progress] || ["Processing your request...", "Talking to the LLM..."]).to_json %>">
|
5
|
-
<h2
|
6
|
-
class="text-center font-semibold"
|
7
|
-
data-loading-phrases-target="message"
|
8
|
-
>
|
9
|
-
Processing your request...
|
10
|
-
</h2>
|
11
|
-
<div class="sm-sprite loader">
|
12
|
-
<span class="image-container">
|
13
|
-
<img class="" src="https://cdn.strongmind.com/backpack-ui/latest/assets/images/png/loaders/CB_loader.png" alt="loaders/CB_loader.png">
|
14
|
-
</span>
|
15
|
-
</div>
|
16
|
-
</div>
|
17
|
-
<% end %>
|