ruby_llm-agents 1.0.0.beta.1 → 1.1.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 (139) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/ruby_llm/agents/paginatable.rb +9 -3
  3. data/app/controllers/concerns/ruby_llm/agents/sortable.rb +58 -0
  4. data/app/controllers/ruby_llm/agents/agents_controller.rb +59 -16
  5. data/app/controllers/ruby_llm/agents/dashboard_controller.rb +144 -20
  6. data/app/controllers/ruby_llm/agents/executions_controller.rb +13 -16
  7. data/app/controllers/ruby_llm/agents/workflows_controller.rb +279 -90
  8. data/app/helpers/ruby_llm/agents/application_helper.rb +100 -0
  9. data/app/mailers/ruby_llm/agents/alert_mailer.rb +84 -0
  10. data/app/mailers/ruby_llm/agents/application_mailer.rb +28 -0
  11. data/app/models/ruby_llm/agents/execution/analytics.rb +170 -20
  12. data/app/models/ruby_llm/agents/execution/scopes.rb +0 -31
  13. data/app/models/ruby_llm/agents/execution/workflow.rb +0 -129
  14. data/app/models/ruby_llm/agents/execution.rb +50 -14
  15. data/app/services/ruby_llm/agents/agent_registry.rb +18 -12
  16. data/app/views/layouts/ruby_llm/agents/application.html.erb +72 -76
  17. data/app/views/ruby_llm/agents/agents/_agent.html.erb +0 -12
  18. data/app/views/ruby_llm/agents/agents/_sortable_header.html.erb +56 -0
  19. data/app/views/ruby_llm/agents/agents/_workflow.html.erb +5 -15
  20. data/app/views/ruby_llm/agents/agents/index.html.erb +271 -100
  21. data/app/views/ruby_llm/agents/agents/show.html.erb +1 -0
  22. data/app/views/ruby_llm/agents/alert_mailer/alert_notification.html.erb +107 -0
  23. data/app/views/ruby_llm/agents/alert_mailer/alert_notification.text.erb +18 -0
  24. data/app/views/ruby_llm/agents/api_configurations/show.html.erb +4 -1
  25. data/app/views/ruby_llm/agents/dashboard/_agent_comparison.html.erb +66 -359
  26. data/app/views/ruby_llm/agents/dashboard/_model_comparison.html.erb +56 -0
  27. data/app/views/ruby_llm/agents/dashboard/_model_cost_breakdown.html.erb +115 -0
  28. data/app/views/ruby_llm/agents/dashboard/_now_strip.html.erb +35 -60
  29. data/app/views/ruby_llm/agents/dashboard/_top_errors.html.erb +17 -6
  30. data/app/views/ruby_llm/agents/dashboard/index.html.erb +373 -72
  31. data/app/views/ruby_llm/agents/executions/_execution.html.erb +0 -1
  32. data/app/views/ruby_llm/agents/executions/_filters.html.erb +51 -39
  33. data/app/views/ruby_llm/agents/executions/_list.html.erb +53 -195
  34. data/app/views/ruby_llm/agents/executions/_workflow_summary.html.erb +5 -20
  35. data/app/views/ruby_llm/agents/executions/index.html.erb +7 -83
  36. data/app/views/ruby_llm/agents/executions/show.html.erb +10 -20
  37. data/app/views/ruby_llm/agents/shared/_agent_type_badge.html.erb +2 -1
  38. data/app/views/ruby_llm/agents/shared/_doc_link.html.erb +12 -0
  39. data/app/views/ruby_llm/agents/shared/_executions_table.html.erb +3 -15
  40. data/app/views/ruby_llm/agents/shared/_filter_dropdown.html.erb +1 -1
  41. data/app/views/ruby_llm/agents/shared/_select_dropdown.html.erb +1 -1
  42. data/app/views/ruby_llm/agents/shared/_sortable_header.html.erb +53 -0
  43. data/app/views/ruby_llm/agents/shared/_status_badge.html.erb +7 -0
  44. data/app/views/ruby_llm/agents/shared/_status_dot.html.erb +1 -1
  45. data/app/views/ruby_llm/agents/shared/_workflow_type_badge.html.erb +9 -35
  46. data/app/views/ruby_llm/agents/system_config/show.html.erb +4 -1
  47. data/app/views/ruby_llm/agents/tenants/index.html.erb +4 -1
  48. data/app/views/ruby_llm/agents/workflows/_step_performance.html.erb +7 -15
  49. data/app/views/ruby_llm/agents/workflows/_structure_dsl.html.erb +539 -0
  50. data/app/views/ruby_llm/agents/workflows/_workflow_diagram.html.erb +920 -0
  51. data/app/views/ruby_llm/agents/workflows/index.html.erb +179 -0
  52. data/app/views/ruby_llm/agents/workflows/show.html.erb +164 -139
  53. data/config/routes.rb +1 -1
  54. data/lib/generators/ruby_llm_agents/agent_generator.rb +6 -36
  55. data/lib/generators/ruby_llm_agents/background_remover_generator.rb +7 -37
  56. data/lib/generators/ruby_llm_agents/embedder_generator.rb +5 -38
  57. data/lib/generators/ruby_llm_agents/image_analyzer_generator.rb +7 -37
  58. data/lib/generators/ruby_llm_agents/image_editor_generator.rb +7 -37
  59. data/lib/generators/ruby_llm_agents/image_generator_generator.rb +8 -41
  60. data/lib/generators/ruby_llm_agents/image_pipeline_generator.rb +18 -46
  61. data/lib/generators/ruby_llm_agents/image_transformer_generator.rb +7 -37
  62. data/lib/generators/ruby_llm_agents/image_upscaler_generator.rb +7 -37
  63. data/lib/generators/ruby_llm_agents/image_variator_generator.rb +7 -37
  64. data/lib/generators/ruby_llm_agents/install_generator.rb +33 -56
  65. data/lib/generators/ruby_llm_agents/migrate_structure_generator.rb +480 -0
  66. data/lib/generators/ruby_llm_agents/restructure_generator.rb +2 -2
  67. data/lib/generators/ruby_llm_agents/speaker_generator.rb +8 -39
  68. data/lib/generators/ruby_llm_agents/templates/agent.rb.tt +5 -8
  69. data/lib/generators/ruby_llm_agents/templates/application_agent.rb.tt +40 -42
  70. data/lib/generators/ruby_llm_agents/templates/application_background_remover.rb.tt +20 -22
  71. data/lib/generators/ruby_llm_agents/templates/application_embedder.rb.tt +24 -26
  72. data/lib/generators/ruby_llm_agents/templates/application_image_analyzer.rb.tt +20 -22
  73. data/lib/generators/ruby_llm_agents/templates/application_image_editor.rb.tt +19 -17
  74. data/lib/generators/ruby_llm_agents/templates/application_image_generator.rb.tt +31 -33
  75. data/lib/generators/ruby_llm_agents/templates/application_image_pipeline.rb.tt +125 -127
  76. data/lib/generators/ruby_llm_agents/templates/application_image_transformer.rb.tt +20 -18
  77. data/lib/generators/ruby_llm_agents/templates/application_image_upscaler.rb.tt +19 -17
  78. data/lib/generators/ruby_llm_agents/templates/application_image_variator.rb.tt +19 -17
  79. data/lib/generators/ruby_llm_agents/templates/application_speaker.rb.tt +38 -40
  80. data/lib/generators/ruby_llm_agents/templates/application_transcriber.rb.tt +42 -44
  81. data/lib/generators/ruby_llm_agents/templates/application_workflow.rb.tt +48 -0
  82. data/lib/generators/ruby_llm_agents/templates/background_remover.rb.tt +19 -21
  83. data/lib/generators/ruby_llm_agents/templates/embedder.rb.tt +19 -21
  84. data/lib/generators/ruby_llm_agents/templates/image_analyzer.rb.tt +20 -22
  85. data/lib/generators/ruby_llm_agents/templates/image_editor.rb.tt +15 -17
  86. data/lib/generators/ruby_llm_agents/templates/image_generator.rb.tt +25 -27
  87. data/lib/generators/ruby_llm_agents/templates/image_pipeline.rb.tt +19 -21
  88. data/lib/generators/ruby_llm_agents/templates/image_transformer.rb.tt +20 -22
  89. data/lib/generators/ruby_llm_agents/templates/image_upscaler.rb.tt +17 -19
  90. data/lib/generators/ruby_llm_agents/templates/image_variator.rb.tt +15 -17
  91. data/lib/generators/ruby_llm_agents/templates/skills/AGENTS.md.tt +87 -24
  92. data/lib/generators/ruby_llm_agents/templates/skills/BACKGROUND_REMOVERS.md.tt +21 -27
  93. data/lib/generators/ruby_llm_agents/templates/skills/EMBEDDERS.md.tt +46 -54
  94. data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_ANALYZERS.md.tt +31 -39
  95. data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_EDITORS.md.tt +22 -28
  96. data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_GENERATORS.md.tt +53 -63
  97. data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_PIPELINES.md.tt +46 -56
  98. data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_TRANSFORMERS.md.tt +23 -31
  99. data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_UPSCALERS.md.tt +22 -30
  100. data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_VARIATORS.md.tt +23 -31
  101. data/lib/generators/ruby_llm_agents/templates/skills/SPEAKERS.md.tt +38 -46
  102. data/lib/generators/ruby_llm_agents/templates/skills/TOOLS.md.tt +7 -7
  103. data/lib/generators/ruby_llm_agents/templates/skills/TRANSCRIBERS.md.tt +59 -71
  104. data/lib/generators/ruby_llm_agents/templates/skills/WORKFLOWS.md.tt +274 -23
  105. data/lib/generators/ruby_llm_agents/templates/speaker.rb.tt +29 -31
  106. data/lib/generators/ruby_llm_agents/templates/transcriber.rb.tt +28 -30
  107. data/lib/generators/ruby_llm_agents/transcriber_generator.rb +10 -43
  108. data/lib/ruby_llm/agents/core/configuration.rb +55 -43
  109. data/lib/ruby_llm/agents/core/version.rb +1 -1
  110. data/lib/ruby_llm/agents/infrastructure/alert_manager.rb +26 -0
  111. data/lib/ruby_llm/agents/pipeline.rb +69 -0
  112. data/lib/ruby_llm/agents/workflow/approval.rb +205 -0
  113. data/lib/ruby_llm/agents/workflow/approval_store.rb +179 -0
  114. data/lib/ruby_llm/agents/workflow/dsl/executor.rb +467 -0
  115. data/lib/ruby_llm/agents/workflow/dsl/input_schema.rb +244 -0
  116. data/lib/ruby_llm/agents/workflow/dsl/iteration_executor.rb +289 -0
  117. data/lib/ruby_llm/agents/workflow/dsl/parallel_group.rb +107 -0
  118. data/lib/ruby_llm/agents/workflow/dsl/route_builder.rb +150 -0
  119. data/lib/ruby_llm/agents/workflow/dsl/schedule_helpers.rb +187 -0
  120. data/lib/ruby_llm/agents/workflow/dsl/step_config.rb +352 -0
  121. data/lib/ruby_llm/agents/workflow/dsl/step_executor.rb +415 -0
  122. data/lib/ruby_llm/agents/workflow/dsl/wait_config.rb +257 -0
  123. data/lib/ruby_llm/agents/workflow/dsl/wait_executor.rb +317 -0
  124. data/lib/ruby_llm/agents/workflow/dsl.rb +576 -0
  125. data/lib/ruby_llm/agents/workflow/instrumentation.rb +2 -7
  126. data/lib/ruby_llm/agents/workflow/notifiers/base.rb +117 -0
  127. data/lib/ruby_llm/agents/workflow/notifiers/email.rb +117 -0
  128. data/lib/ruby_llm/agents/workflow/notifiers/slack.rb +180 -0
  129. data/lib/ruby_llm/agents/workflow/notifiers/webhook.rb +121 -0
  130. data/lib/ruby_llm/agents/workflow/notifiers.rb +70 -0
  131. data/lib/ruby_llm/agents/workflow/orchestrator.rb +190 -23
  132. data/lib/ruby_llm/agents/workflow/result.rb +202 -0
  133. data/lib/ruby_llm/agents/workflow/throttle_manager.rb +206 -0
  134. data/lib/ruby_llm/agents/workflow/wait_result.rb +213 -0
  135. metadata +37 -6
  136. data/app/views/ruby_llm/agents/dashboard/_execution_item.html.erb +0 -66
  137. data/lib/ruby_llm/agents/workflow/parallel.rb +0 -299
  138. data/lib/ruby_llm/agents/workflow/pipeline.rb +0 -306
  139. data/lib/ruby_llm/agents/workflow/router.rb +0 -429
@@ -0,0 +1,213 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyLLM
4
+ module Agents
5
+ class Workflow
6
+ # Result object for wait step execution
7
+ #
8
+ # Encapsulates the outcome of a wait operation including success/failure status,
9
+ # duration waited, and any metadata like approval details.
10
+ #
11
+ # @example Success result
12
+ # WaitResult.success(:delay, 5.0)
13
+ #
14
+ # @example Timeout result
15
+ # WaitResult.timeout(:until, 60.0, :fail)
16
+ #
17
+ # @example Approval result
18
+ # WaitResult.approved("approval-123", "user@example.com", 3600.0)
19
+ #
20
+ # @api private
21
+ class WaitResult
22
+ STATUSES = %i[success timeout approved rejected skipped].freeze
23
+
24
+ attr_reader :type, :status, :waited_duration, :metadata
25
+
26
+ # @param type [Symbol] Wait type (:delay, :until, :schedule, :approval)
27
+ # @param status [Symbol] Result status (:success, :timeout, :approved, :rejected, :skipped)
28
+ # @param waited_duration [Float, nil] Duration waited in seconds
29
+ # @param metadata [Hash] Additional result metadata
30
+ def initialize(type:, status:, waited_duration: nil, metadata: {})
31
+ @type = type
32
+ @status = status
33
+ @waited_duration = waited_duration
34
+ @metadata = metadata
35
+ end
36
+
37
+ # Creates a success result
38
+ #
39
+ # @param type [Symbol] Wait type
40
+ # @param waited_duration [Float] Duration waited
41
+ # @param metadata [Hash] Additional metadata
42
+ # @return [WaitResult]
43
+ def self.success(type, waited_duration, **metadata)
44
+ new(
45
+ type: type,
46
+ status: :success,
47
+ waited_duration: waited_duration,
48
+ metadata: metadata
49
+ )
50
+ end
51
+
52
+ # Creates a timeout result
53
+ #
54
+ # @param type [Symbol] Wait type
55
+ # @param waited_duration [Float] Duration waited before timeout
56
+ # @param action_taken [Symbol] Action taken on timeout (:fail, :continue, :skip_next)
57
+ # @param metadata [Hash] Additional metadata
58
+ # @return [WaitResult]
59
+ def self.timeout(type, waited_duration, action_taken, **metadata)
60
+ new(
61
+ type: type,
62
+ status: :timeout,
63
+ waited_duration: waited_duration,
64
+ metadata: metadata.merge(action_taken: action_taken)
65
+ )
66
+ end
67
+
68
+ # Creates a skipped result (when condition not met)
69
+ #
70
+ # @param type [Symbol] Wait type
71
+ # @param reason [String, nil] Reason for skipping
72
+ # @return [WaitResult]
73
+ def self.skipped(type, reason: nil)
74
+ new(
75
+ type: type,
76
+ status: :skipped,
77
+ waited_duration: 0,
78
+ metadata: { reason: reason }.compact
79
+ )
80
+ end
81
+
82
+ # Creates an approved result for approval waits
83
+ #
84
+ # @param approval_id [String] Approval identifier
85
+ # @param approved_by [String] User who approved
86
+ # @param waited_duration [Float] Duration waited for approval
87
+ # @param metadata [Hash] Additional metadata
88
+ # @return [WaitResult]
89
+ def self.approved(approval_id, approved_by, waited_duration, **metadata)
90
+ new(
91
+ type: :approval,
92
+ status: :approved,
93
+ waited_duration: waited_duration,
94
+ metadata: metadata.merge(
95
+ approval_id: approval_id,
96
+ approved_by: approved_by
97
+ )
98
+ )
99
+ end
100
+
101
+ # Creates a rejected result for approval waits
102
+ #
103
+ # @param approval_id [String] Approval identifier
104
+ # @param rejected_by [String] User who rejected
105
+ # @param waited_duration [Float] Duration waited before rejection
106
+ # @param reason [String, nil] Rejection reason
107
+ # @param metadata [Hash] Additional metadata
108
+ # @return [WaitResult]
109
+ def self.rejected(approval_id, rejected_by, waited_duration, reason: nil, **metadata)
110
+ new(
111
+ type: :approval,
112
+ status: :rejected,
113
+ waited_duration: waited_duration,
114
+ metadata: metadata.merge(
115
+ approval_id: approval_id,
116
+ rejected_by: rejected_by,
117
+ reason: reason
118
+ ).compact
119
+ )
120
+ end
121
+
122
+ # Returns whether the wait completed successfully
123
+ #
124
+ # @return [Boolean]
125
+ def success?
126
+ status == :success || status == :approved
127
+ end
128
+
129
+ # Returns whether the wait timed out
130
+ #
131
+ # @return [Boolean]
132
+ def timeout?
133
+ status == :timeout
134
+ end
135
+
136
+ # Returns whether the wait was skipped
137
+ #
138
+ # @return [Boolean]
139
+ def skipped?
140
+ status == :skipped
141
+ end
142
+
143
+ # Returns whether an approval was granted
144
+ #
145
+ # @return [Boolean]
146
+ def approved?
147
+ status == :approved
148
+ end
149
+
150
+ # Returns whether an approval was rejected
151
+ #
152
+ # @return [Boolean]
153
+ def rejected?
154
+ status == :rejected
155
+ end
156
+
157
+ # Returns whether the workflow should continue after this wait
158
+ #
159
+ # @return [Boolean]
160
+ def should_continue?
161
+ success? || skipped? || (timeout? && metadata[:action_taken] == :continue)
162
+ end
163
+
164
+ # Returns whether the next step should be skipped
165
+ #
166
+ # @return [Boolean]
167
+ def should_skip_next?
168
+ timeout? && metadata[:action_taken] == :skip_next
169
+ end
170
+
171
+ # Returns the action taken on timeout
172
+ #
173
+ # @return [Symbol, nil]
174
+ def timeout_action
175
+ metadata[:action_taken]
176
+ end
177
+
178
+ # Returns the approval ID for approval waits
179
+ #
180
+ # @return [String, nil]
181
+ def approval_id
182
+ metadata[:approval_id]
183
+ end
184
+
185
+ # Returns who approved/rejected for approval waits
186
+ #
187
+ # @return [String, nil]
188
+ def actor
189
+ metadata[:approved_by] || metadata[:rejected_by]
190
+ end
191
+
192
+ # Returns the rejection reason
193
+ #
194
+ # @return [String, nil]
195
+ def rejection_reason
196
+ metadata[:reason]
197
+ end
198
+
199
+ # Converts to hash for serialization
200
+ #
201
+ # @return [Hash]
202
+ def to_h
203
+ {
204
+ type: type,
205
+ status: status,
206
+ waited_duration: waited_duration,
207
+ metadata: metadata
208
+ }
209
+ end
210
+ end
211
+ end
212
+ end
213
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_llm-agents
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - adham90
@@ -78,6 +78,7 @@ files:
78
78
  - README.md
79
79
  - app/controllers/concerns/ruby_llm/agents/filterable.rb
80
80
  - app/controllers/concerns/ruby_llm/agents/paginatable.rb
81
+ - app/controllers/concerns/ruby_llm/agents/sortable.rb
81
82
  - app/controllers/ruby_llm/agents/agents_controller.rb
82
83
  - app/controllers/ruby_llm/agents/api_configurations_controller.rb
83
84
  - app/controllers/ruby_llm/agents/dashboard_controller.rb
@@ -86,6 +87,8 @@ files:
86
87
  - app/controllers/ruby_llm/agents/tenants_controller.rb
87
88
  - app/controllers/ruby_llm/agents/workflows_controller.rb
88
89
  - app/helpers/ruby_llm/agents/application_helper.rb
90
+ - app/mailers/ruby_llm/agents/alert_mailer.rb
91
+ - app/mailers/ruby_llm/agents/application_mailer.rb
89
92
  - app/models/ruby_llm/agents/api_configuration.rb
90
93
  - app/models/ruby_llm/agents/execution.rb
91
94
  - app/models/ruby_llm/agents/execution/analytics.rb
@@ -103,10 +106,13 @@ files:
103
106
  - app/views/ruby_llm/agents/agents/_config_speaker.html.erb
104
107
  - app/views/ruby_llm/agents/agents/_config_transcriber.html.erb
105
108
  - app/views/ruby_llm/agents/agents/_empty_state.html.erb
109
+ - app/views/ruby_llm/agents/agents/_sortable_header.html.erb
106
110
  - app/views/ruby_llm/agents/agents/_version_comparison.html.erb
107
111
  - app/views/ruby_llm/agents/agents/_workflow.html.erb
108
112
  - app/views/ruby_llm/agents/agents/index.html.erb
109
113
  - app/views/ruby_llm/agents/agents/show.html.erb
114
+ - app/views/ruby_llm/agents/alert_mailer/alert_notification.html.erb
115
+ - app/views/ruby_llm/agents/alert_mailer/alert_notification.text.erb
110
116
  - app/views/ruby_llm/agents/api_configurations/_api_key_field.html.erb
111
117
  - app/views/ruby_llm/agents/api_configurations/_form.html.erb
112
118
  - app/views/ruby_llm/agents/api_configurations/edit.html.erb
@@ -118,7 +124,8 @@ files:
118
124
  - app/views/ruby_llm/agents/dashboard/_alerts_feed.html.erb
119
125
  - app/views/ruby_llm/agents/dashboard/_breaker_strip.html.erb
120
126
  - app/views/ruby_llm/agents/dashboard/_budgets_bar.html.erb
121
- - app/views/ruby_llm/agents/dashboard/_execution_item.html.erb
127
+ - app/views/ruby_llm/agents/dashboard/_model_comparison.html.erb
128
+ - app/views/ruby_llm/agents/dashboard/_model_cost_breakdown.html.erb
122
129
  - app/views/ruby_llm/agents/dashboard/_now_strip.html.erb
123
130
  - app/views/ruby_llm/agents/dashboard/_tenant_budget.html.erb
124
131
  - app/views/ruby_llm/agents/dashboard/_top_errors.html.erb
@@ -132,10 +139,12 @@ files:
132
139
  - app/views/ruby_llm/agents/executions/show.html.erb
133
140
  - app/views/ruby_llm/agents/shared/_agent_type_badge.html.erb
134
141
  - app/views/ruby_llm/agents/shared/_breadcrumbs.html.erb
142
+ - app/views/ruby_llm/agents/shared/_doc_link.html.erb
135
143
  - app/views/ruby_llm/agents/shared/_executions_table.html.erb
136
144
  - app/views/ruby_llm/agents/shared/_filter_dropdown.html.erb
137
145
  - app/views/ruby_llm/agents/shared/_nav_link.html.erb
138
146
  - app/views/ruby_llm/agents/shared/_select_dropdown.html.erb
147
+ - app/views/ruby_llm/agents/shared/_sortable_header.html.erb
139
148
  - app/views/ruby_llm/agents/shared/_stat_card.html.erb
140
149
  - app/views/ruby_llm/agents/shared/_status_badge.html.erb
141
150
  - app/views/ruby_llm/agents/shared/_status_dot.html.erb
@@ -147,9 +156,12 @@ files:
147
156
  - app/views/ruby_llm/agents/tenants/index.html.erb
148
157
  - app/views/ruby_llm/agents/tenants/show.html.erb
149
158
  - app/views/ruby_llm/agents/workflows/_step_performance.html.erb
159
+ - app/views/ruby_llm/agents/workflows/_structure_dsl.html.erb
150
160
  - app/views/ruby_llm/agents/workflows/_structure_parallel.html.erb
151
161
  - app/views/ruby_llm/agents/workflows/_structure_pipeline.html.erb
152
162
  - app/views/ruby_llm/agents/workflows/_structure_router.html.erb
163
+ - app/views/ruby_llm/agents/workflows/_workflow_diagram.html.erb
164
+ - app/views/ruby_llm/agents/workflows/index.html.erb
153
165
  - app/views/ruby_llm/agents/workflows/show.html.erb
154
166
  - config/routes.rb
155
167
  - lib/generators/ruby_llm_agents/agent_generator.rb
@@ -164,6 +176,7 @@ files:
164
176
  - lib/generators/ruby_llm_agents/image_upscaler_generator.rb
165
177
  - lib/generators/ruby_llm_agents/image_variator_generator.rb
166
178
  - lib/generators/ruby_llm_agents/install_generator.rb
179
+ - lib/generators/ruby_llm_agents/migrate_structure_generator.rb
167
180
  - lib/generators/ruby_llm_agents/multi_tenancy_generator.rb
168
181
  - lib/generators/ruby_llm_agents/restructure_generator.rb
169
182
  - lib/generators/ruby_llm_agents/speaker_generator.rb
@@ -191,6 +204,7 @@ files:
191
204
  - lib/generators/ruby_llm_agents/templates/application_image_variator.rb.tt
192
205
  - lib/generators/ruby_llm_agents/templates/application_speaker.rb.tt
193
206
  - lib/generators/ruby_llm_agents/templates/application_transcriber.rb.tt
207
+ - lib/generators/ruby_llm_agents/templates/application_workflow.rb.tt
194
208
  - lib/generators/ruby_llm_agents/templates/background_remover.rb.tt
195
209
  - lib/generators/ruby_llm_agents/templates/create_api_configurations_migration.rb.tt
196
210
  - lib/generators/ruby_llm_agents/templates/create_tenant_budgets_migration.rb.tt
@@ -313,15 +327,32 @@ files:
313
327
  - lib/ruby_llm/agents/results/transcription_result.rb
314
328
  - lib/ruby_llm/agents/text/embedder.rb
315
329
  - lib/ruby_llm/agents/text/moderator.rb
330
+ - lib/ruby_llm/agents/workflow/approval.rb
331
+ - lib/ruby_llm/agents/workflow/approval_store.rb
316
332
  - lib/ruby_llm/agents/workflow/async.rb
317
333
  - lib/ruby_llm/agents/workflow/async_executor.rb
334
+ - lib/ruby_llm/agents/workflow/dsl.rb
335
+ - lib/ruby_llm/agents/workflow/dsl/executor.rb
336
+ - lib/ruby_llm/agents/workflow/dsl/input_schema.rb
337
+ - lib/ruby_llm/agents/workflow/dsl/iteration_executor.rb
338
+ - lib/ruby_llm/agents/workflow/dsl/parallel_group.rb
339
+ - lib/ruby_llm/agents/workflow/dsl/route_builder.rb
340
+ - lib/ruby_llm/agents/workflow/dsl/schedule_helpers.rb
341
+ - lib/ruby_llm/agents/workflow/dsl/step_config.rb
342
+ - lib/ruby_llm/agents/workflow/dsl/step_executor.rb
343
+ - lib/ruby_llm/agents/workflow/dsl/wait_config.rb
344
+ - lib/ruby_llm/agents/workflow/dsl/wait_executor.rb
318
345
  - lib/ruby_llm/agents/workflow/instrumentation.rb
346
+ - lib/ruby_llm/agents/workflow/notifiers.rb
347
+ - lib/ruby_llm/agents/workflow/notifiers/base.rb
348
+ - lib/ruby_llm/agents/workflow/notifiers/email.rb
349
+ - lib/ruby_llm/agents/workflow/notifiers/slack.rb
350
+ - lib/ruby_llm/agents/workflow/notifiers/webhook.rb
319
351
  - lib/ruby_llm/agents/workflow/orchestrator.rb
320
- - lib/ruby_llm/agents/workflow/parallel.rb
321
- - lib/ruby_llm/agents/workflow/pipeline.rb
322
352
  - lib/ruby_llm/agents/workflow/result.rb
323
- - lib/ruby_llm/agents/workflow/router.rb
324
353
  - lib/ruby_llm/agents/workflow/thread_pool.rb
354
+ - lib/ruby_llm/agents/workflow/throttle_manager.rb
355
+ - lib/ruby_llm/agents/workflow/wait_result.rb
325
356
  homepage: https://github.com/adham90/ruby_llm-agents
326
357
  licenses:
327
358
  - MIT
@@ -343,7 +374,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
343
374
  - !ruby/object:Gem::Version
344
375
  version: '0'
345
376
  requirements: []
346
- rubygems_version: 4.0.3
377
+ rubygems_version: 3.6.9
347
378
  specification_version: 4
348
379
  summary: Agent framework for building LLM-powered agents with RubyLLM
349
380
  test_files: []
@@ -1,66 +0,0 @@
1
- <div id="execution-<%= execution.id %>" class="py-2.5 hover:bg-gray-50 dark:hover:bg-gray-700/50 -mx-2 px-2 rounded-lg transition-colors">
2
- <%= link_to ruby_llm_agents.execution_path(execution), class: "block" do %>
3
- <!-- Row 1: Status dot + Agent + Badges + Timestamp -->
4
- <div class="flex items-center justify-between gap-2">
5
- <div class="flex items-center gap-2 min-w-0">
6
- <%= render "ruby_llm/agents/shared/status_dot", status: execution.status %>
7
- <% if execution.respond_to?(:workflow_type) && execution.workflow_type.present? %>
8
- <%= render "ruby_llm/agents/shared/workflow_type_badge", workflow_type: execution.workflow_type, size: :xs, show_label: false %>
9
- <% end %>
10
- <span class="font-medium text-sm text-gray-900 dark:text-gray-100 truncate">
11
- <%= execution.agent_type.gsub(/Agent$|Workflow$|Pipeline$|Parallel$|Router$/, '') %>
12
- </span>
13
- <span class="hidden sm:inline text-xs text-gray-400 dark:text-gray-500">v<%= execution.agent_version %></span>
14
- <% unless execution.status_running? %>
15
- <div class="hidden sm:flex items-center gap-1">
16
- <% if execution.streaming? %>
17
- <span class="badge badge-cyan text-[10px] px-1.5 py-0.5">Stream</span>
18
- <% end %>
19
- <% if execution.cache_hit? %>
20
- <span class="badge badge-purple text-[10px] px-1.5 py-0.5">Cached</span>
21
- <% end %>
22
- <% if execution.rate_limited? %>
23
- <span class="badge badge-orange text-[10px] px-1.5 py-0.5">Limited</span>
24
- <% end %>
25
- </div>
26
- <% end %>
27
- </div>
28
- <span class="text-xs text-gray-400 dark:text-gray-500 whitespace-nowrap flex-shrink-0">
29
- <%= time_ago_in_words(execution.created_at) %> ago
30
- </span>
31
- </div>
32
-
33
- <!-- Row 2: Model + Metrics -->
34
- <div class="mt-1 text-xs text-gray-500 dark:text-gray-400">
35
- <% if execution.status_running? %>
36
- <span class="text-blue-500 dark:text-blue-400 animate-pulse">Processing...</span>
37
- <% else %>
38
- <!-- Mobile: compact -->
39
- <span class="sm:hidden">
40
- <%= number_to_human_short(execution.total_tokens || 0) %> tokens · $<%= number_with_precision(execution.total_cost || 0, precision: 2) %>
41
- </span>
42
- <!-- Desktop: full -->
43
- <span class="hidden sm:inline">
44
- <span class="font-mono text-gray-400 dark:text-gray-500"><%= execution.model_id %></span>
45
- <span class="mx-1.5 text-gray-300 dark:text-gray-600">·</span>
46
- <%= number_to_human_short(execution.total_tokens || 0) %> tokens
47
- <span class="mx-1.5 text-gray-300 dark:text-gray-600">·</span>
48
- $<%= number_with_precision(execution.total_cost || 0, precision: 4) %>
49
- <span class="mx-1.5 text-gray-300 dark:text-gray-600">·</span>
50
- <%= number_to_human_short(execution.duration_ms || 0) %>ms
51
- <% if execution.respond_to?(:attempts_count) && execution.attempts_count && execution.attempts_count > 1 %>
52
- <span class="mx-1.5 text-gray-300 dark:text-gray-600">·</span>
53
- <span class="text-amber-600 dark:text-amber-400"><%= execution.attempts_count %> retries</span>
54
- <% end %>
55
- </span>
56
- <% end %>
57
- </div>
58
-
59
- <!-- Error display -->
60
- <% if execution.status_error? && execution.error_message.present? %>
61
- <p class="mt-1.5 text-xs text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/30 rounded px-2 py-1">
62
- <%= execution.error_class %>: <%= truncate(execution.error_message, length: 80) %>
63
- </p>
64
- <% end %>
65
- <% end %>
66
- </div>