ruby_llm-agents 1.3.3 → 2.0.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.
- checksums.yaml +4 -4
- data/README.md +101 -334
- data/app/controllers/concerns/ruby_llm/agents/sortable.rb +0 -1
- data/app/controllers/ruby_llm/agents/agents_controller.rb +5 -56
- data/app/controllers/ruby_llm/agents/dashboard_controller.rb +22 -106
- data/app/controllers/ruby_llm/agents/executions_controller.rb +4 -114
- data/app/controllers/ruby_llm/agents/tenants_controller.rb +30 -2
- data/app/helpers/ruby_llm/agents/application_helper.rb +19 -53
- data/app/models/ruby_llm/agents/execution/analytics.rb +13 -54
- data/app/models/ruby_llm/agents/execution/scopes.rb +61 -14
- data/app/models/ruby_llm/agents/execution.rb +46 -10
- data/app/models/ruby_llm/agents/execution_detail.rb +18 -0
- data/app/models/ruby_llm/agents/tenant/budgetable.rb +132 -24
- data/app/models/ruby_llm/agents/tenant/incrementable.rb +117 -0
- data/app/models/ruby_llm/agents/tenant/resettable.rb +128 -0
- data/app/models/ruby_llm/agents/tenant/trackable.rb +46 -12
- data/app/models/ruby_llm/agents/tenant.rb +2 -3
- data/app/models/ruby_llm/agents/tenant_budget.rb +6 -3
- data/app/services/ruby_llm/agents/agent_registry.rb +6 -112
- data/app/views/layouts/ruby_llm/agents/application.html.erb +87 -252
- data/app/views/ruby_llm/agents/agents/_config_agent.html.erb +71 -218
- data/app/views/ruby_llm/agents/agents/_config_embedder.html.erb +20 -63
- data/app/views/ruby_llm/agents/agents/_config_image_generator.html.erb +44 -131
- data/app/views/ruby_llm/agents/agents/_config_moderator.html.erb +16 -57
- data/app/views/ruby_llm/agents/agents/_config_speaker.html.erb +39 -104
- data/app/views/ruby_llm/agents/agents/_config_transcriber.html.erb +29 -82
- data/app/views/ruby_llm/agents/agents/_empty_state.html.erb +4 -14
- data/app/views/ruby_llm/agents/agents/index.html.erb +105 -274
- data/app/views/ruby_llm/agents/agents/show.html.erb +248 -378
- data/app/views/ruby_llm/agents/dashboard/_action_center.html.erb +29 -52
- data/app/views/ruby_llm/agents/dashboard/_tenant_budget.html.erb +73 -99
- data/app/views/ruby_llm/agents/dashboard/index.html.erb +228 -433
- data/app/views/ruby_llm/agents/executions/_execution.html.erb +1 -1
- data/app/views/ruby_llm/agents/executions/_filters.html.erb +4 -25
- data/app/views/ruby_llm/agents/executions/_list.html.erb +111 -152
- data/app/views/ruby_llm/agents/executions/index.html.erb +5 -7
- data/app/views/ruby_llm/agents/executions/show.html.erb +528 -989
- data/app/views/ruby_llm/agents/shared/_agent_type_badge.html.erb +5 -21
- data/app/views/ruby_llm/agents/shared/_executions_table.html.erb +70 -191
- data/app/views/ruby_llm/agents/shared/_filter_dropdown.html.erb +16 -44
- data/app/views/ruby_llm/agents/shared/_select_dropdown.html.erb +12 -41
- data/app/views/ruby_llm/agents/shared/_status_badge.html.erb +11 -65
- data/app/views/ruby_llm/agents/shared/_tenant_filter.html.erb +6 -5
- data/app/views/ruby_llm/agents/system_config/show.html.erb +240 -351
- data/app/views/ruby_llm/agents/tenants/_form.html.erb +67 -77
- data/app/views/ruby_llm/agents/tenants/edit.html.erb +7 -9
- data/app/views/ruby_llm/agents/tenants/index.html.erb +100 -122
- data/app/views/ruby_llm/agents/tenants/show.html.erb +146 -336
- data/config/routes.rb +0 -13
- data/lib/generators/ruby_llm_agents/install_generator.rb +9 -14
- data/lib/generators/ruby_llm_agents/migrate_structure_generator.rb +2 -12
- data/lib/generators/ruby_llm_agents/restructure_generator.rb +0 -2
- data/lib/generators/ruby_llm_agents/templates/add_usage_counters_to_tenants_migration.rb.tt +37 -0
- data/lib/generators/ruby_llm_agents/templates/agent.rb.tt +1 -2
- data/lib/generators/ruby_llm_agents/templates/application_agent.rb.tt +1 -1
- data/lib/generators/ruby_llm_agents/templates/application_image_pipeline.rb.tt +0 -1
- data/lib/generators/ruby_llm_agents/templates/create_execution_details_migration.rb.tt +27 -0
- data/lib/generators/ruby_llm_agents/templates/create_tenants_migration.rb.tt +25 -0
- data/lib/generators/ruby_llm_agents/templates/image_pipeline.rb.tt +0 -1
- data/lib/generators/ruby_llm_agents/templates/initializer.rb.tt +9 -12
- data/lib/generators/ruby_llm_agents/templates/migration.rb.tt +40 -71
- data/lib/generators/ruby_llm_agents/templates/remove_agent_version_migration.rb.tt +13 -0
- data/lib/generators/ruby_llm_agents/templates/remove_workflow_columns_migration.rb.tt +19 -0
- data/lib/generators/ruby_llm_agents/templates/skills/AGENTS.md.tt +2 -4
- data/lib/generators/ruby_llm_agents/templates/skills/IMAGE_PIPELINES.md.tt +0 -1
- data/lib/generators/ruby_llm_agents/templates/split_execution_details_migration.rb.tt +232 -0
- data/lib/generators/ruby_llm_agents/upgrade_generator.rb +58 -262
- data/lib/ruby_llm/agents/audio/speaker.rb +0 -1
- data/lib/ruby_llm/agents/audio/transcriber.rb +0 -1
- data/lib/ruby_llm/agents/base_agent.rb +52 -6
- data/lib/ruby_llm/agents/core/base/callbacks.rb +142 -0
- data/lib/ruby_llm/agents/core/base.rb +23 -55
- data/lib/ruby_llm/agents/core/configuration.rb +58 -117
- data/lib/ruby_llm/agents/core/errors.rb +0 -58
- data/lib/ruby_llm/agents/core/instrumentation.rb +157 -110
- data/lib/ruby_llm/agents/core/llm_tenant.rb +8 -7
- data/lib/ruby_llm/agents/core/version.rb +1 -1
- data/lib/ruby_llm/agents/dsl/base.rb +157 -17
- data/lib/ruby_llm/agents/dsl/caching.rb +33 -2
- data/lib/ruby_llm/agents/dsl/reliability.rb +148 -0
- data/lib/ruby_llm/agents/dsl.rb +1 -2
- data/lib/ruby_llm/agents/image/analyzer/execution.rb +1 -2
- data/lib/ruby_llm/agents/image/background_remover/execution.rb +1 -2
- data/lib/ruby_llm/agents/image/concerns/image_operation_dsl.rb +1 -13
- data/lib/ruby_llm/agents/image/concerns/image_operation_execution.rb +2 -2
- data/lib/ruby_llm/agents/image/editor/dsl.rb +0 -14
- data/lib/ruby_llm/agents/image/editor/execution.rb +1 -10
- data/lib/ruby_llm/agents/image/editor.rb +0 -1
- data/lib/ruby_llm/agents/image/generator.rb +0 -21
- data/lib/ruby_llm/agents/image/pipeline/dsl.rb +0 -13
- data/lib/ruby_llm/agents/image/pipeline/execution.rb +0 -1
- data/lib/ruby_llm/agents/image/transformer/dsl.rb +0 -13
- data/lib/ruby_llm/agents/image/transformer/execution.rb +1 -10
- data/lib/ruby_llm/agents/image/transformer.rb +0 -1
- data/lib/ruby_llm/agents/image/upscaler/execution.rb +1 -2
- data/lib/ruby_llm/agents/image/variator/execution.rb +1 -2
- data/lib/ruby_llm/agents/infrastructure/alert_manager.rb +78 -173
- data/lib/ruby_llm/agents/infrastructure/attempt_tracker.rb +1 -0
- data/lib/ruby_llm/agents/infrastructure/budget/budget_query.rb +66 -2
- data/lib/ruby_llm/agents/infrastructure/budget/spend_recorder.rb +0 -12
- data/lib/ruby_llm/agents/infrastructure/circuit_breaker.rb +10 -13
- data/lib/ruby_llm/agents/infrastructure/reliability.rb +37 -2
- data/lib/ruby_llm/agents/pipeline/context.rb +0 -1
- data/lib/ruby_llm/agents/pipeline/middleware/budget.rb +28 -4
- data/lib/ruby_llm/agents/pipeline/middleware/cache.rb +3 -10
- data/lib/ruby_llm/agents/pipeline/middleware/instrumentation.rb +88 -55
- data/lib/ruby_llm/agents/pipeline/middleware/tenant.rb +5 -41
- data/lib/ruby_llm/agents/rails/engine.rb +6 -6
- data/lib/ruby_llm/agents/results/base.rb +1 -49
- data/lib/ruby_llm/agents/text/embedder.rb +0 -1
- data/lib/ruby_llm/agents.rb +1 -9
- data/lib/tasks/ruby_llm_agents.rake +34 -0
- metadata +12 -81
- data/app/controllers/ruby_llm/agents/api_configurations_controller.rb +0 -214
- data/app/controllers/ruby_llm/agents/workflows_controller.rb +0 -544
- data/app/mailers/ruby_llm/agents/alert_mailer.rb +0 -84
- data/app/mailers/ruby_llm/agents/application_mailer.rb +0 -28
- data/app/models/ruby_llm/agents/api_configuration.rb +0 -386
- data/app/models/ruby_llm/agents/execution/workflow.rb +0 -170
- data/app/models/ruby_llm/agents/tenant/configurable.rb +0 -135
- data/app/views/ruby_llm/agents/agents/_agent.html.erb +0 -98
- data/app/views/ruby_llm/agents/agents/_version_comparison.html.erb +0 -186
- data/app/views/ruby_llm/agents/agents/_workflow.html.erb +0 -126
- data/app/views/ruby_llm/agents/alert_mailer/alert_notification.html.erb +0 -107
- data/app/views/ruby_llm/agents/alert_mailer/alert_notification.text.erb +0 -18
- data/app/views/ruby_llm/agents/api_configurations/_api_key_field.html.erb +0 -34
- data/app/views/ruby_llm/agents/api_configurations/_form.html.erb +0 -288
- data/app/views/ruby_llm/agents/api_configurations/edit.html.erb +0 -95
- data/app/views/ruby_llm/agents/api_configurations/edit_tenant.html.erb +0 -97
- data/app/views/ruby_llm/agents/api_configurations/show.html.erb +0 -214
- data/app/views/ruby_llm/agents/api_configurations/tenant.html.erb +0 -179
- data/app/views/ruby_llm/agents/dashboard/_agent_comparison.html.erb +0 -73
- data/app/views/ruby_llm/agents/dashboard/_alerts_feed.html.erb +0 -62
- data/app/views/ruby_llm/agents/dashboard/_breaker_strip.html.erb +0 -47
- data/app/views/ruby_llm/agents/dashboard/_budgets_bar.html.erb +0 -75
- data/app/views/ruby_llm/agents/dashboard/_model_comparison.html.erb +0 -56
- data/app/views/ruby_llm/agents/dashboard/_model_cost_breakdown.html.erb +0 -115
- data/app/views/ruby_llm/agents/dashboard/_now_strip.html.erb +0 -59
- data/app/views/ruby_llm/agents/dashboard/_top_errors.html.erb +0 -60
- data/app/views/ruby_llm/agents/executions/_workflow_summary.html.erb +0 -86
- data/app/views/ruby_llm/agents/executions/dry_run.html.erb +0 -149
- data/app/views/ruby_llm/agents/shared/_breadcrumbs.html.erb +0 -48
- data/app/views/ruby_llm/agents/shared/_nav_link.html.erb +0 -27
- data/app/views/ruby_llm/agents/shared/_stat_card.html.erb +0 -14
- data/app/views/ruby_llm/agents/shared/_workflow_type_badge.html.erb +0 -35
- data/app/views/ruby_llm/agents/workflows/_empty_state.html.erb +0 -22
- data/app/views/ruby_llm/agents/workflows/_step_performance.html.erb +0 -228
- data/app/views/ruby_llm/agents/workflows/_structure_dsl.html.erb +0 -539
- data/app/views/ruby_llm/agents/workflows/_structure_parallel.html.erb +0 -76
- data/app/views/ruby_llm/agents/workflows/_structure_pipeline.html.erb +0 -74
- data/app/views/ruby_llm/agents/workflows/_structure_router.html.erb +0 -108
- data/app/views/ruby_llm/agents/workflows/_workflow_diagram.html.erb +0 -920
- data/app/views/ruby_llm/agents/workflows/index.html.erb +0 -179
- data/app/views/ruby_llm/agents/workflows/show.html.erb +0 -467
- data/lib/generators/ruby_llm_agents/api_configuration_generator.rb +0 -100
- data/lib/generators/ruby_llm_agents/templates/add_workflow_migration.rb.tt +0 -38
- data/lib/generators/ruby_llm_agents/templates/application_workflow.rb.tt +0 -48
- data/lib/generators/ruby_llm_agents/templates/create_api_configurations_migration.rb.tt +0 -90
- data/lib/generators/ruby_llm_agents/templates/skills/WORKFLOWS.md.tt +0 -551
- data/lib/ruby_llm/agents/core/base/moderation_dsl.rb +0 -181
- data/lib/ruby_llm/agents/core/base/moderation_execution.rb +0 -274
- data/lib/ruby_llm/agents/core/resolved_config.rb +0 -348
- data/lib/ruby_llm/agents/image/generator/content_policy.rb +0 -95
- data/lib/ruby_llm/agents/infrastructure/redactor.rb +0 -130
- data/lib/ruby_llm/agents/results/moderation_result.rb +0 -158
- data/lib/ruby_llm/agents/text/moderator.rb +0 -237
- data/lib/ruby_llm/agents/workflow/approval.rb +0 -205
- data/lib/ruby_llm/agents/workflow/approval_store.rb +0 -179
- data/lib/ruby_llm/agents/workflow/async.rb +0 -220
- data/lib/ruby_llm/agents/workflow/async_executor.rb +0 -156
- data/lib/ruby_llm/agents/workflow/dsl/executor.rb +0 -467
- data/lib/ruby_llm/agents/workflow/dsl/input_schema.rb +0 -244
- data/lib/ruby_llm/agents/workflow/dsl/iteration_executor.rb +0 -289
- data/lib/ruby_llm/agents/workflow/dsl/parallel_group.rb +0 -107
- data/lib/ruby_llm/agents/workflow/dsl/route_builder.rb +0 -150
- data/lib/ruby_llm/agents/workflow/dsl/schedule_helpers.rb +0 -187
- data/lib/ruby_llm/agents/workflow/dsl/step_config.rb +0 -352
- data/lib/ruby_llm/agents/workflow/dsl/step_executor.rb +0 -415
- data/lib/ruby_llm/agents/workflow/dsl/wait_config.rb +0 -257
- data/lib/ruby_llm/agents/workflow/dsl/wait_executor.rb +0 -317
- data/lib/ruby_llm/agents/workflow/dsl.rb +0 -576
- data/lib/ruby_llm/agents/workflow/instrumentation.rb +0 -249
- data/lib/ruby_llm/agents/workflow/notifiers/base.rb +0 -117
- data/lib/ruby_llm/agents/workflow/notifiers/email.rb +0 -117
- data/lib/ruby_llm/agents/workflow/notifiers/slack.rb +0 -180
- data/lib/ruby_llm/agents/workflow/notifiers/webhook.rb +0 -121
- data/lib/ruby_llm/agents/workflow/notifiers.rb +0 -70
- data/lib/ruby_llm/agents/workflow/orchestrator.rb +0 -416
- data/lib/ruby_llm/agents/workflow/result.rb +0 -592
- data/lib/ruby_llm/agents/workflow/thread_pool.rb +0 -185
- data/lib/ruby_llm/agents/workflow/throttle_manager.rb +0 -206
- data/lib/ruby_llm/agents/workflow/wait_result.rb +0 -213
|
@@ -1,372 +1,261 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
<%= render "ruby_llm/agents/shared/doc_link" %>
|
|
13
|
-
</div>
|
|
14
|
-
<p class="text-sm text-gray-500 dark:text-gray-400">Settings configured in <code class="bg-gray-100 dark:bg-gray-700 px-1 rounded">config/initializers/ruby_llm_agents.rb</code></p>
|
|
15
|
-
</div>
|
|
16
|
-
</div>
|
|
17
|
-
</div>
|
|
18
|
-
|
|
19
|
-
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
20
|
-
<!-- Model Defaults -->
|
|
21
|
-
<div class="bg-white dark:bg-gray-800 rounded-lg shadow p-6">
|
|
22
|
-
<h3 class="text-xs text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-4">Model Defaults</h3>
|
|
23
|
-
<div class="space-y-4">
|
|
24
|
-
<div class="flex justify-between items-center">
|
|
25
|
-
<div>
|
|
26
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">Default Model</p>
|
|
27
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">Used when agents don't specify a model</p>
|
|
28
|
-
</div>
|
|
29
|
-
<code class="bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 px-2 py-1 rounded text-sm"><%= @config.default_model %></code>
|
|
30
|
-
</div>
|
|
31
|
-
<div class="flex justify-between items-center">
|
|
32
|
-
<div>
|
|
33
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">Default Temperature</p>
|
|
34
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">0.0 = deterministic, 2.0 = creative</p>
|
|
35
|
-
</div>
|
|
36
|
-
<code class="bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 px-2 py-1 rounded text-sm"><%= @config.default_temperature %></code>
|
|
37
|
-
</div>
|
|
38
|
-
<div class="flex justify-between items-center">
|
|
39
|
-
<div>
|
|
40
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">Default Timeout</p>
|
|
41
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">Per-request timeout in seconds</p>
|
|
42
|
-
</div>
|
|
43
|
-
<code class="bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 px-2 py-1 rounded text-sm"><%= @config.default_timeout %>s</code>
|
|
44
|
-
</div>
|
|
45
|
-
</div>
|
|
46
|
-
</div>
|
|
1
|
+
<%
|
|
2
|
+
retries = @config.default_retries || {}
|
|
3
|
+
has_retries = (retries[:max] || 0) > 0
|
|
4
|
+
has_fallbacks = @config.default_fallback_models.present? && @config.default_fallback_models.any?
|
|
5
|
+
has_total_timeout = @config.default_total_timeout.present?
|
|
6
|
+
budgets = @config.budgets || {}
|
|
7
|
+
budgets_enabled = @config.budgets_enabled?
|
|
8
|
+
alerts_enabled = @config.on_alert.respond_to?(:call)
|
|
9
|
+
redaction = @config.redaction || {}
|
|
10
|
+
redaction_enabled = redaction.present?
|
|
11
|
+
%>
|
|
47
12
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
<div class="flex justify-between items-center">
|
|
60
|
-
<div>
|
|
61
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">Retention Period</p>
|
|
62
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">How long to keep execution records</p>
|
|
63
|
-
</div>
|
|
64
|
-
<code class="bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 px-2 py-1 rounded text-sm"><%= @config.retention_period.inspect %></code>
|
|
65
|
-
</div>
|
|
66
|
-
<div class="flex justify-between items-center">
|
|
67
|
-
<div>
|
|
68
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">Job Retry Attempts</p>
|
|
69
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">Retries for async logging job</p>
|
|
70
|
-
</div>
|
|
71
|
-
<code class="bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 px-2 py-1 rounded text-sm"><%= @config.job_retry_attempts %></code>
|
|
72
|
-
</div>
|
|
73
|
-
</div>
|
|
74
|
-
</div>
|
|
13
|
+
<!-- ── system config ──────────────── -->
|
|
14
|
+
<div class="flex items-center gap-3 mb-1.5">
|
|
15
|
+
<span class="text-[10px] font-medium text-gray-400 dark:text-gray-600 uppercase tracking-widest font-mono">system configuration</span>
|
|
16
|
+
<div class="font-mono text-xs text-gray-400 dark:text-gray-500 flex items-center gap-1.5">
|
|
17
|
+
<%= render "ruby_llm/agents/shared/doc_link" %>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="flex-1 border-t border-gray-200 dark:border-gray-800"></div>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="font-mono text-xs text-gray-400 dark:text-gray-600 mb-6">
|
|
22
|
+
configured in <span class="text-gray-500 dark:text-gray-400">config/initializers/ruby_llm_agents.rb</span>
|
|
23
|
+
</div>
|
|
75
24
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
25
|
+
<!-- ── model defaults ──────────────── -->
|
|
26
|
+
<div class="flex items-center gap-3 mt-6 mb-3">
|
|
27
|
+
<span class="text-[10px] font-medium text-gray-400 dark:text-gray-600 uppercase tracking-widest font-mono">model defaults</span>
|
|
28
|
+
<div class="flex-1 border-t border-gray-200 dark:border-gray-800"></div>
|
|
29
|
+
</div>
|
|
30
|
+
<div class="font-mono text-xs space-y-1.5">
|
|
31
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
32
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">default model</span>
|
|
33
|
+
<span class="text-gray-900 dark:text-gray-200"><%= @config.default_model %></span>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
36
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">temperature</span>
|
|
37
|
+
<span class="text-gray-900 dark:text-gray-200"><%= @config.default_temperature %></span>
|
|
38
|
+
</div>
|
|
39
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
40
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">timeout</span>
|
|
41
|
+
<span class="text-gray-900 dark:text-gray-200"><%= @config.default_timeout %>s</span>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
89
44
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
</div>
|
|
45
|
+
<!-- ── execution logging ──────────────── -->
|
|
46
|
+
<div class="flex items-center gap-3 mt-6 mb-3">
|
|
47
|
+
<span class="text-[10px] font-medium text-gray-400 dark:text-gray-600 uppercase tracking-widest font-mono">execution logging</span>
|
|
48
|
+
<div class="flex-1 border-t border-gray-200 dark:border-gray-800"></div>
|
|
49
|
+
</div>
|
|
50
|
+
<div class="font-mono text-xs space-y-1.5">
|
|
51
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
52
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">async logging</span>
|
|
53
|
+
<span class="badge badge-sm <%= @config.async_logging ? 'badge-success' : 'badge-timeout' %>"><%= @config.async_logging ? 'on' : 'off' %></span>
|
|
54
|
+
</div>
|
|
55
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
56
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">retention</span>
|
|
57
|
+
<span class="text-gray-900 dark:text-gray-200"><%= @config.retention_period.inspect %></span>
|
|
58
|
+
</div>
|
|
59
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
60
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">job retries</span>
|
|
61
|
+
<span class="text-gray-900 dark:text-gray-200"><%= @config.job_retry_attempts %></span>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
110
64
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
<div class="flex justify-between items-center">
|
|
123
|
-
<div>
|
|
124
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">Recent Executions Limit</p>
|
|
125
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">Shown on dashboard home</p>
|
|
126
|
-
</div>
|
|
127
|
-
<code class="bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 px-2 py-1 rounded text-sm"><%= @config.recent_executions_limit %></code>
|
|
128
|
-
</div>
|
|
129
|
-
<div class="flex justify-between items-center">
|
|
130
|
-
<div>
|
|
131
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">Parent Controller</p>
|
|
132
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">Dashboard inherits from this</p>
|
|
133
|
-
</div>
|
|
134
|
-
<code class="bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 px-2 py-1 rounded text-xs"><%= @config.dashboard_parent_controller %></code>
|
|
135
|
-
</div>
|
|
136
|
-
<div class="flex justify-between items-center">
|
|
137
|
-
<div>
|
|
138
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">HTTP Basic Auth</p>
|
|
139
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">Username/password protection</p>
|
|
140
|
-
</div>
|
|
141
|
-
<%= render_configured_badge(@config.basic_auth_username.present? && @config.basic_auth_password.present?) %>
|
|
142
|
-
</div>
|
|
143
|
-
<div class="flex justify-between items-center">
|
|
144
|
-
<div>
|
|
145
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">Custom Auth</p>
|
|
146
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">Lambda-based authentication</p>
|
|
147
|
-
</div>
|
|
148
|
-
<%= render_configured_badge(@config.dashboard_auth.present?) %>
|
|
149
|
-
</div>
|
|
150
|
-
</div>
|
|
151
|
-
</div>
|
|
65
|
+
<!-- ── caching ──────────────── -->
|
|
66
|
+
<div class="flex items-center gap-3 mt-6 mb-3">
|
|
67
|
+
<span class="text-[10px] font-medium text-gray-400 dark:text-gray-600 uppercase tracking-widest font-mono">caching</span>
|
|
68
|
+
<div class="flex-1 border-t border-gray-200 dark:border-gray-800"></div>
|
|
69
|
+
</div>
|
|
70
|
+
<div class="font-mono text-xs space-y-1.5">
|
|
71
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
72
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">cache store</span>
|
|
73
|
+
<span class="text-gray-900 dark:text-gray-200"><%= @config.cache_store.class.name %></span>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
152
76
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
77
|
+
<!-- ── anomaly detection ──────────────── -->
|
|
78
|
+
<div class="flex items-center gap-3 mt-6 mb-3">
|
|
79
|
+
<span class="text-[10px] font-medium text-gray-400 dark:text-gray-600 uppercase tracking-widest font-mono">anomaly detection</span>
|
|
80
|
+
<div class="flex-1 border-t border-gray-200 dark:border-gray-800"></div>
|
|
81
|
+
</div>
|
|
82
|
+
<div class="font-mono text-xs space-y-1.5">
|
|
83
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
84
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">cost threshold</span>
|
|
85
|
+
<span class="text-gray-900 dark:text-gray-200">$<%= @config.anomaly_cost_threshold %></span>
|
|
86
|
+
</div>
|
|
87
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
88
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">duration threshold</span>
|
|
89
|
+
<span class="text-gray-900 dark:text-gray-200"><%= number_with_delimiter(@config.anomaly_duration_threshold) %>ms</span>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
160
92
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
93
|
+
<!-- ── dashboard settings ──────────────── -->
|
|
94
|
+
<div class="flex items-center gap-3 mt-6 mb-3">
|
|
95
|
+
<span class="text-[10px] font-medium text-gray-400 dark:text-gray-600 uppercase tracking-widest font-mono">dashboard</span>
|
|
96
|
+
<div class="flex-1 border-t border-gray-200 dark:border-gray-800"></div>
|
|
97
|
+
</div>
|
|
98
|
+
<div class="font-mono text-xs space-y-1.5">
|
|
99
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
100
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">per page</span>
|
|
101
|
+
<span class="text-gray-900 dark:text-gray-200"><%= @config.per_page %></span>
|
|
102
|
+
</div>
|
|
103
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
104
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">recent limit</span>
|
|
105
|
+
<span class="text-gray-900 dark:text-gray-200"><%= @config.recent_executions_limit %></span>
|
|
106
|
+
</div>
|
|
107
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
108
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">parent controller</span>
|
|
109
|
+
<span class="text-gray-900 dark:text-gray-200"><%= @config.dashboard_parent_controller %></span>
|
|
110
|
+
</div>
|
|
111
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
112
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">basic auth</span>
|
|
113
|
+
<% if @config.basic_auth_username.present? && @config.basic_auth_password.present? %>
|
|
114
|
+
<span class="badge badge-sm badge-success">configured</span>
|
|
115
|
+
<% else %>
|
|
116
|
+
<span class="text-gray-300 dark:text-gray-700">—</span>
|
|
117
|
+
<% end %>
|
|
118
|
+
</div>
|
|
119
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
120
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">custom auth</span>
|
|
121
|
+
<% if @config.dashboard_auth.present? %>
|
|
122
|
+
<span class="badge badge-sm badge-success">configured</span>
|
|
123
|
+
<% else %>
|
|
124
|
+
<span class="text-gray-300 dark:text-gray-700">—</span>
|
|
125
|
+
<% end %>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
179
128
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
129
|
+
<!-- ── reliability ──────────────── -->
|
|
130
|
+
<div class="flex items-center gap-3 mt-6 mb-3">
|
|
131
|
+
<span class="text-[10px] font-medium text-gray-400 dark:text-gray-600 uppercase tracking-widest font-mono">reliability defaults</span>
|
|
132
|
+
<div class="flex-1 border-t border-gray-200 dark:border-gray-800"></div>
|
|
133
|
+
</div>
|
|
134
|
+
<div class="font-mono text-xs space-y-1.5">
|
|
135
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
136
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">retries</span>
|
|
137
|
+
<% if has_retries %>
|
|
138
|
+
<span class="text-gray-900 dark:text-gray-200"><%= retries[:max] %> max</span>
|
|
139
|
+
<span class="text-gray-300 dark:text-gray-700">·</span>
|
|
140
|
+
<span class="text-gray-400 dark:text-gray-600"><%= retries[:backoff] %> backoff</span>
|
|
141
|
+
<span class="text-gray-300 dark:text-gray-700">·</span>
|
|
142
|
+
<span class="text-gray-400 dark:text-gray-600"><%= retries[:base] %>s base</span>
|
|
143
|
+
<span class="text-gray-300 dark:text-gray-700">·</span>
|
|
144
|
+
<span class="text-gray-400 dark:text-gray-600"><%= retries[:max_delay] %>s max</span>
|
|
145
|
+
<% else %>
|
|
146
|
+
<span class="text-gray-300 dark:text-gray-700">—</span>
|
|
147
|
+
<% end %>
|
|
148
|
+
</div>
|
|
149
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
150
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">fallback models</span>
|
|
151
|
+
<% if has_fallbacks %>
|
|
152
|
+
<span class="text-gray-900 dark:text-gray-200"><%= @config.default_fallback_models.join(" → ") %></span>
|
|
153
|
+
<% else %>
|
|
154
|
+
<span class="text-gray-300 dark:text-gray-700">—</span>
|
|
155
|
+
<% end %>
|
|
156
|
+
</div>
|
|
157
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
158
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">total timeout</span>
|
|
159
|
+
<% if has_total_timeout %>
|
|
160
|
+
<span class="text-gray-900 dark:text-gray-200"><%= @config.default_total_timeout %>s</span>
|
|
161
|
+
<% else %>
|
|
162
|
+
<span class="text-gray-300 dark:text-gray-700">—</span>
|
|
163
|
+
<% end %>
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
194
166
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
167
|
+
<!-- ── governance ──────────────── -->
|
|
168
|
+
<div class="flex items-center gap-3 mt-6 mb-3">
|
|
169
|
+
<span class="text-[10px] font-medium text-gray-400 dark:text-gray-600 uppercase tracking-widest font-mono">governance</span>
|
|
170
|
+
<div class="flex-1 border-t border-gray-200 dark:border-gray-800"></div>
|
|
171
|
+
</div>
|
|
172
|
+
<div class="font-mono text-xs space-y-1.5">
|
|
173
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
174
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">budget enforcement</span>
|
|
175
|
+
<% if budgets_enabled %>
|
|
176
|
+
<%
|
|
177
|
+
enforcement_badge = @config.budget_enforcement == :hard ? "badge-error" : "badge-timeout"
|
|
178
|
+
%>
|
|
179
|
+
<span class="badge badge-sm <%= enforcement_badge %>"><%= @config.budget_enforcement %></span>
|
|
180
|
+
<% else %>
|
|
181
|
+
<span class="text-gray-300 dark:text-gray-700">—</span>
|
|
182
|
+
<% end %>
|
|
183
|
+
</div>
|
|
184
|
+
<% if budgets_enabled %>
|
|
185
|
+
<% if budgets[:global_daily] %>
|
|
186
|
+
<div class="flex items-center gap-3 py-0.5 pl-4">
|
|
187
|
+
<span class="w-32 flex-shrink-0 text-gray-400 dark:text-gray-600">global daily</span>
|
|
188
|
+
<span class="text-gray-900 dark:text-gray-200">$<%= budgets[:global_daily] %></span>
|
|
206
189
|
</div>
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
<div class="
|
|
216
|
-
<
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
<
|
|
190
|
+
<% end %>
|
|
191
|
+
<% if budgets[:global_monthly] %>
|
|
192
|
+
<div class="flex items-center gap-3 py-0.5 pl-4">
|
|
193
|
+
<span class="w-32 flex-shrink-0 text-gray-400 dark:text-gray-600">global monthly</span>
|
|
194
|
+
<span class="text-gray-900 dark:text-gray-200">$<%= budgets[:global_monthly] %></span>
|
|
195
|
+
</div>
|
|
196
|
+
<% end %>
|
|
197
|
+
<% if budgets[:per_agent_daily].present? %>
|
|
198
|
+
<div class="py-0.5 pl-4">
|
|
199
|
+
<span class="text-gray-400 dark:text-gray-600">per-agent daily:</span>
|
|
200
|
+
<% budgets[:per_agent_daily].each do |agent, limit| %>
|
|
201
|
+
<div class="flex items-center gap-2 pl-2 py-0.5">
|
|
202
|
+
<span class="text-gray-900 dark:text-gray-200"><%= agent %></span>
|
|
203
|
+
<span class="text-gray-400 dark:text-gray-600">$<%= limit %></span>
|
|
220
204
|
</div>
|
|
221
|
-
<% if budgets_enabled %>
|
|
222
|
-
<span class="inline-flex items-center px-2 py-1 rounded text-xs font-medium <%= @config.budget_enforcement == :hard ? 'bg-red-100 dark:bg-red-900/50 text-red-700 dark:text-red-300' : 'bg-yellow-100 dark:bg-yellow-900/50 text-yellow-700 dark:text-yellow-300' %>">
|
|
223
|
-
<%= @config.budget_enforcement.to_s.titleize %>
|
|
224
|
-
</span>
|
|
225
|
-
<% else %>
|
|
226
|
-
<span class="text-xs text-gray-400 dark:text-gray-500">Disabled</span>
|
|
227
|
-
<% end %>
|
|
228
|
-
</div>
|
|
229
|
-
|
|
230
|
-
<% if budgets_enabled %>
|
|
231
|
-
<% if budgets[:global_daily] %>
|
|
232
|
-
<div class="flex justify-between items-center ml-4">
|
|
233
|
-
<p class="text-sm text-gray-600 dark:text-gray-400">Global Daily Limit</p>
|
|
234
|
-
<code class="bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 px-2 py-1 rounded text-sm">$<%= budgets[:global_daily] %></code>
|
|
235
|
-
</div>
|
|
236
|
-
<% end %>
|
|
237
|
-
<% if budgets[:global_monthly] %>
|
|
238
|
-
<div class="flex justify-between items-center ml-4">
|
|
239
|
-
<p class="text-sm text-gray-600 dark:text-gray-400">Global Monthly Limit</p>
|
|
240
|
-
<code class="bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 px-2 py-1 rounded text-sm">$<%= budgets[:global_monthly] %></code>
|
|
241
|
-
</div>
|
|
242
|
-
<% end %>
|
|
243
|
-
<% if budgets[:per_agent_daily].present? %>
|
|
244
|
-
<div class="ml-4">
|
|
245
|
-
<p class="text-sm text-gray-600 dark:text-gray-400 mb-1">Per-Agent Daily Limits</p>
|
|
246
|
-
<% budgets[:per_agent_daily].each do |agent, limit| %>
|
|
247
|
-
<div class="flex justify-between items-center ml-4 text-xs">
|
|
248
|
-
<span class="text-gray-500 dark:text-gray-400"><%= agent %></span>
|
|
249
|
-
<code class="bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 px-1 rounded">$<%= limit %></code>
|
|
250
|
-
</div>
|
|
251
|
-
<% end %>
|
|
252
|
-
</div>
|
|
253
|
-
<% end %>
|
|
254
|
-
<% if budgets[:per_agent_monthly].present? %>
|
|
255
|
-
<div class="ml-4">
|
|
256
|
-
<p class="text-sm text-gray-600 dark:text-gray-400 mb-1">Per-Agent Monthly Limits</p>
|
|
257
|
-
<% budgets[:per_agent_monthly].each do |agent, limit| %>
|
|
258
|
-
<div class="flex justify-between items-center ml-4 text-xs">
|
|
259
|
-
<span class="text-gray-500 dark:text-gray-400"><%= agent %></span>
|
|
260
|
-
<code class="bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200 px-1 rounded">$<%= limit %></code>
|
|
261
|
-
</div>
|
|
262
|
-
<% end %>
|
|
263
|
-
</div>
|
|
264
|
-
<% end %>
|
|
265
205
|
<% end %>
|
|
266
206
|
</div>
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
<div class="space-y-4">
|
|
276
|
-
<div class="flex justify-between items-center">
|
|
277
|
-
<div>
|
|
278
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">Alerts</p>
|
|
279
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">Notifications for important events</p>
|
|
207
|
+
<% end %>
|
|
208
|
+
<% if budgets[:per_agent_monthly].present? %>
|
|
209
|
+
<div class="py-0.5 pl-4">
|
|
210
|
+
<span class="text-gray-400 dark:text-gray-600">per-agent monthly:</span>
|
|
211
|
+
<% budgets[:per_agent_monthly].each do |agent, limit| %>
|
|
212
|
+
<div class="flex items-center gap-2 pl-2 py-0.5">
|
|
213
|
+
<span class="text-gray-900 dark:text-gray-200"><%= agent %></span>
|
|
214
|
+
<span class="text-gray-400 dark:text-gray-600">$<%= limit %></span>
|
|
280
215
|
</div>
|
|
281
|
-
<%= render_enabled_badge(alerts_enabled) %>
|
|
282
|
-
</div>
|
|
283
|
-
|
|
284
|
-
<% if alerts_enabled %>
|
|
285
|
-
<div class="flex justify-between items-center ml-4">
|
|
286
|
-
<p class="text-sm text-gray-600 dark:text-gray-400">Slack Webhook</p>
|
|
287
|
-
<%= render_configured_badge(alerts[:slack_webhook_url].present?) %>
|
|
288
|
-
</div>
|
|
289
|
-
<div class="flex justify-between items-center ml-4">
|
|
290
|
-
<p class="text-sm text-gray-600 dark:text-gray-400">Generic Webhook</p>
|
|
291
|
-
<%= render_configured_badge(alerts[:webhook_url].present?) %>
|
|
292
|
-
</div>
|
|
293
|
-
<div class="flex justify-between items-center ml-4">
|
|
294
|
-
<p class="text-sm text-gray-600 dark:text-gray-400">Custom Handler</p>
|
|
295
|
-
<%= render_configured_badge(alerts[:custom].present?) %>
|
|
296
|
-
</div>
|
|
297
|
-
<% if @config.alert_events.any? %>
|
|
298
|
-
<div class="ml-4">
|
|
299
|
-
<p class="text-sm text-gray-600 dark:text-gray-400 mb-2">Events</p>
|
|
300
|
-
<div class="flex flex-wrap gap-1">
|
|
301
|
-
<% @config.alert_events.each do |event| %>
|
|
302
|
-
<span class="inline-flex items-center px-2 py-0.5 rounded text-xs bg-blue-100 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300">
|
|
303
|
-
<%= event %>
|
|
304
|
-
</span>
|
|
305
|
-
<% end %>
|
|
306
|
-
</div>
|
|
307
|
-
</div>
|
|
308
|
-
<% end %>
|
|
309
216
|
<% end %>
|
|
310
217
|
</div>
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
<!-- Data Handling -->
|
|
314
|
-
<div class="bg-white dark:bg-gray-800 rounded-lg shadow p-6">
|
|
315
|
-
<h3 class="text-xs text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-4">Data Handling</h3>
|
|
316
|
-
<div class="space-y-4">
|
|
317
|
-
<div class="flex justify-between items-center">
|
|
318
|
-
<div>
|
|
319
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">Persist Prompts</p>
|
|
320
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">Store system/user prompts in executions</p>
|
|
321
|
-
</div>
|
|
322
|
-
<%= render_enabled_badge(@config.persist_prompts) %>
|
|
323
|
-
</div>
|
|
324
|
-
<div class="flex justify-between items-center">
|
|
325
|
-
<div>
|
|
326
|
-
<p class="text-sm font-medium text-gray-900 dark:text-gray-100">Persist Responses</p>
|
|
327
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">Store LLM responses in executions</p>
|
|
328
|
-
</div>
|
|
329
|
-
<%= render_enabled_badge(@config.persist_responses) %>
|
|
330
|
-
</div>
|
|
218
|
+
<% end %>
|
|
219
|
+
<% end %>
|
|
331
220
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
</div>
|
|
340
|
-
<%= render_enabled_badge(redaction_enabled) %>
|
|
341
|
-
</div>
|
|
342
|
-
<% if redaction_enabled %>
|
|
343
|
-
<div class="mt-2 ml-4 text-xs text-gray-600 dark:text-gray-400 space-y-1">
|
|
344
|
-
<p>Fields: <%= @config.redaction_fields.count %> patterns</p>
|
|
345
|
-
<p>Regex patterns: <%= @config.redaction_patterns.count %></p>
|
|
346
|
-
<p>Placeholder: <code class="bg-gray-100 dark:bg-gray-700 px-1 rounded"><%= @config.redaction_placeholder %></code></p>
|
|
347
|
-
<% if @config.redaction_max_value_length %>
|
|
348
|
-
<p>Max value length: <%= number_with_delimiter(@config.redaction_max_value_length) %> chars</p>
|
|
349
|
-
<% end %>
|
|
350
|
-
</div>
|
|
351
|
-
<% end %>
|
|
352
|
-
</div>
|
|
353
|
-
</div>
|
|
354
|
-
</div>
|
|
221
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
222
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">alert handler</span>
|
|
223
|
+
<% if alerts_enabled %>
|
|
224
|
+
<span class="badge badge-sm badge-success">configured</span>
|
|
225
|
+
<% else %>
|
|
226
|
+
<span class="text-gray-300 dark:text-gray-700">—</span>
|
|
227
|
+
<% end %>
|
|
355
228
|
</div>
|
|
229
|
+
</div>
|
|
356
230
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
231
|
+
<!-- ── data handling ──────────────── -->
|
|
232
|
+
<div class="flex items-center gap-3 mt-6 mb-3">
|
|
233
|
+
<span class="text-[10px] font-medium text-gray-400 dark:text-gray-600 uppercase tracking-widest font-mono">data handling</span>
|
|
234
|
+
<div class="flex-1 border-t border-gray-200 dark:border-gray-800"></div>
|
|
235
|
+
</div>
|
|
236
|
+
<div class="font-mono text-xs space-y-1.5">
|
|
237
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
238
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">persist prompts</span>
|
|
239
|
+
<span class="badge badge-sm <%= @config.persist_prompts ? 'badge-success' : 'badge-timeout' %>"><%= @config.persist_prompts ? 'on' : 'off' %></span>
|
|
240
|
+
</div>
|
|
241
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
242
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">persist responses</span>
|
|
243
|
+
<span class="badge badge-sm <%= @config.persist_responses ? 'badge-success' : 'badge-timeout' %>"><%= @config.persist_responses ? 'on' : 'off' %></span>
|
|
244
|
+
</div>
|
|
245
|
+
<div class="flex items-center gap-3 py-0.5">
|
|
246
|
+
<span class="w-36 flex-shrink-0 text-gray-500 dark:text-gray-400">pii redaction</span>
|
|
247
|
+
<% if redaction_enabled %>
|
|
248
|
+
<span class="badge badge-sm badge-success">on</span>
|
|
249
|
+
<span class="text-gray-400 dark:text-gray-600"><%= @config.redaction_fields.count %> fields</span>
|
|
250
|
+
<span class="text-gray-300 dark:text-gray-700">·</span>
|
|
251
|
+
<span class="text-gray-400 dark:text-gray-600"><%= @config.redaction_patterns.count %> patterns</span>
|
|
252
|
+
<% else %>
|
|
253
|
+
<span class="text-gray-300 dark:text-gray-700">—</span>
|
|
254
|
+
<% end %>
|
|
370
255
|
</div>
|
|
371
256
|
</div>
|
|
372
257
|
|
|
258
|
+
<!-- Footer note -->
|
|
259
|
+
<div class="mt-8 font-mono text-[10px] text-gray-400 dark:text-gray-600">
|
|
260
|
+
these settings are read-only — edit <span class="text-gray-500 dark:text-gray-400">config/initializers/ruby_llm_agents.rb</span> and restart to change
|
|
261
|
+
</div>
|