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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c3a448e6c2f705bada39a716fcca196e8af05426c958bfc3618b810ae5e0305
4
- data.tar.gz: afb9a87720c7edcca9d333993de3fce7dc146fa40c151e2893b2514d11815ff4
3
+ metadata.gz: f991d24a137d8a8b8f61723e714c5a2e08551d7e49d108a4bef7a434f4b122ad
4
+ data.tar.gz: 7832b5db6ac767be220115a98bbd423314416b93176a1a2147249c69735781f8
5
5
  SHA512:
6
- metadata.gz: fa39226f6dfc489f83a297e84d6aa53ec6b7dd1839676ad969344f688ab2c04c7a7e8b06806e575a5035e9c2c93d6ccb9c8a0d57fe846da19c575b6f3205e48a
7
- data.tar.gz: 8a887f14b18e7af835c5c32d46eeabacdaf11f89332b9f4381882cf178e7298eb294f061f9408b15a5a5439846a98aacf3e420c50ea31026b02e21179170b541
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
- ### 1. Where to Add Your Styles
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: #2563eb;
98
+ color: var(--blue-600);
99
99
  text-decoration: underline;
100
100
 
101
101
  &:hover {
102
- color: #1d4ed8;
102
+ color: var(--blue-700);
103
103
  }
104
104
  }
105
105
 
106
106
  pre {
107
- background-color: #f9fafb;
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: #f9fafb;
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 #e5e7eb;
123
+ border-left: 4px solid var(--gray-200);
124
124
  padding-left: 1rem;
125
125
  font-style: italic;
126
- color: #374151;
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 #e5e7eb;
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: #f9fafb;
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
- /* Lexi Chat Component Heights */
165
- .lexi-chat-container {
166
- height: 95vh;
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-container-full {
170
- height: 100vh;
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-avatar-large {
174
- height: 375px;
206
+ .lexi-chat-button:hover {
207
+ background-color: var(--gray-100);
175
208
  }
176
209
 
177
- .lexi-avatar-medium {
178
- height: 300px;
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
- height: 335px;
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] = success_message(import_result)
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 success_message(import_result)
81
- action = import_result[:action] == 'created' ? 'imported' : 'updated'
82
- "Workflow '#{import_result[:workflow_name]}' #{action} successfully!"
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,3 +1,4 @@
1
+ <!-- This file is used to render the layout for the MetaWorkflows debug tool. -->
1
2
  <!DOCTYPE html>
2
3
  <html>
3
4
  <head>
@@ -1,40 +1,31 @@
1
1
  <%# Lexi Chat Tray %>
2
- <div class="relative flex flex-col lexi-chat-container-full bg-white px-4">
3
- <%# Header with Lexi logo and action icons %>
4
- <div class="flex-shrink-0 flex items-center justify-between pb-2 border-b border-gray-200">
5
- <div class="flex items-center space-x-2">
6
- <%= image_tag("lexi_logo_color.png", alt: "Lexi Logo", class: "h-14 w-auto") %>
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="flex items-center gap-2">
9
- <button type="button" class="p-2 rounded-xl hover:bg-gray-100" aria-label="New Chat" disabled>
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="p-2 rounded-xl hover:bg-gray-100" aria-label="Chat History" disabled>
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
- <%# Chat messages area %>
19
- <div id="main-scroll-container" class="flex-1 overflow-y-auto py-4 space-y-4">
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
- <%# Lexi avatar and input area pinned to bottom %>
24
- <div class="relative bg-white lexi-input-container">
25
- <!-- Bottom section with recording notice and input area -->
26
- <div class="absolute bottom-15 left-0 right-0 flex flex-col space-y-2 z-10">
27
- <!-- Recording notice -->
28
- <p class="text-right text-xs text-purple-800 pr-4">This chat is being recorded.</p>
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="flex flex-col gap-1">
9
+ <div class="lexi-form-container">
10
10
  <!-- Input Container -->
11
- <div class="flex flex-col lexi-input-max-height border border-gray-300 rounded-lg bg-white/80 p-2">
11
+ <div class="lexi-input-container lexi-input-max-height">
12
12
  <!-- Input area with icons -->
13
- <div class="flex-1 relative">
14
- <%= form.text_area :message, rows: 1, placeholder: random_chat_placeholder, disabled: local_assigns[:responding] || !local_assigns[:response_enabled], class: "w-full lexi-textarea-min-height border-0 resize-none focus:outline-none focus:ring-0 bg-transparent text-base overflow-y-auto" %>
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="flex justify-between">
18
- <div class="flex gap-1 items-end justify-end">
19
- <button type="button" class="p-2 rounded-xl hover:bg-gray-100" disabled>
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="p-2 rounded-xl hover:bg-gray-100" disabled>
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="p-2 rounded-xl hover:bg-gray-100" disabled>
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="w-12 h-12 rounded-full flex items-center justify-center text-white transition-colors bg-purple-600 opacity-50 cursor-not-allowed" disabled>
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: "w-12 h-12 rounded-full flex items-center justify-center sm-btn sm-btn-primary" do %>
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
- <div class="flex justify-end">
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 class="text-xs mb-2 h-4" aria-hidden="true"></div>
49
+ <div aria-hidden="true"></div>
48
50
  <% else %>
49
- <%= form.button type: "submit", name: "advance", value: "true", class: "text-xs mb-2 #{local_assigns[:responding] ? 'opacity-50 cursor-not-allowed' : ''}", disabled: local_assigns[:responding] do %>
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="space-y-4" data-controller="response-scroll">
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, amber background) -->
13
- <div class="flex justify-end">
14
- <div class="lexi-message-max-width bg-amber-100 rounded-xl px-6 py-3">
15
- <div class="text-sm">
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="flex justify-start">
22
+ <!-- Lexi message bubble (left-aligned, white background) -->
23
+ <div class="lexi-message-assistant">
24
24
  <!-- Message Bubble -->
25
- <div class="lexi-message-max-width bg-slate-100 rounded-xl px-6 py-3">
26
- <div class="prose prose-sm max-w-none">
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="flex justify-start">
36
+ <div class="lexi-message-assistant">
37
37
  <!-- Streaming Message Bubble -->
38
- <div class="lexi-message-max-width bg-slate-100 rounded-xl px-6 py-3">
39
- <div class="prose prose-sm max-w-none">
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 = 5 # this is automatically incremented by the build process
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.5
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-02 00:00:00.000000000 Z
12
+ date: 2025-07-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails