rails_ai_admin 0.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 (193) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +458 -0
  3. data/LICENSE +21 -0
  4. data/README.md +292 -0
  5. data/SECURITY.md +14 -0
  6. data/THIRD_PARTY_NOTICES.md +19 -0
  7. data/app/assets/builds/rails_ai_admin.LICENSE.txt +55 -0
  8. data/app/assets/builds/rails_ai_admin.css +345 -0
  9. data/app/assets/builds/rails_ai_admin.js +33 -0
  10. data/app/controllers/rails_ai_admin/application_controller.rb +255 -0
  11. data/app/controllers/rails_ai_admin/assistant_controller.rb +164 -0
  12. data/app/controllers/rails_ai_admin/audit_controller.rb +16 -0
  13. data/app/controllers/rails_ai_admin/collection_jobs_controller.rb +33 -0
  14. data/app/controllers/rails_ai_admin/collection_operations_controller.rb +79 -0
  15. data/app/controllers/rails_ai_admin/custom_controller.rb +26 -0
  16. data/app/controllers/rails_ai_admin/dashboard_controller.rb +17 -0
  17. data/app/controllers/rails_ai_admin/exports_controller.rb +31 -0
  18. data/app/controllers/rails_ai_admin/files_controller.rb +37 -0
  19. data/app/controllers/rails_ai_admin/imports_controller.rb +41 -0
  20. data/app/controllers/rails_ai_admin/mcp_controller.rb +81 -0
  21. data/app/controllers/rails_ai_admin/mcp_tokens_controller.rb +45 -0
  22. data/app/controllers/rails_ai_admin/operations_controller.rb +105 -0
  23. data/app/controllers/rails_ai_admin/references_controller.rb +16 -0
  24. data/app/controllers/rails_ai_admin/resources_controller.rb +290 -0
  25. data/app/controllers/rails_ai_admin/search_controller.rb +39 -0
  26. data/app/controllers/rails_ai_admin/selections_controller.rb +95 -0
  27. data/app/controllers/rails_ai_admin/surfaces_controller.rb +122 -0
  28. data/app/helpers/rails_ai_admin/dashboard_helper.rb +28 -0
  29. data/app/helpers/rails_ai_admin/fields_helper.rb +242 -0
  30. data/app/helpers/rails_ai_admin/filters_helper.rb +40 -0
  31. data/app/helpers/rails_ai_admin/history_helper.rb +36 -0
  32. data/app/helpers/rails_ai_admin/navigation_helper.rb +54 -0
  33. data/app/helpers/rails_ai_admin/tool_views_helper.rb +48 -0
  34. data/app/jobs/rails_ai_admin/assistant_turn_job.rb +15 -0
  35. data/app/jobs/rails_ai_admin/collections/execution_job.rb +12 -0
  36. data/app/jobs/rails_ai_admin/outbox/delivery_job.rb +13 -0
  37. data/app/models/rails_ai_admin/application_record.rb +8 -0
  38. data/app/models/rails_ai_admin/audit_event.rb +12 -0
  39. data/app/models/rails_ai_admin/batch_item.rb +8 -0
  40. data/app/models/rails_ai_admin/operation_run.rb +20 -0
  41. data/app/models/rails_ai_admin/selection.rb +9 -0
  42. data/app/models/rails_ai_admin/selection_item.rb +9 -0
  43. data/app/models/rails_ai_admin/work_item.rb +18 -0
  44. data/app/views/layouts/rails_ai_admin/application.html.erb +49 -0
  45. data/app/views/layouts/rails_ai_admin/frame.html.erb +5 -0
  46. data/app/views/layouts/rails_ai_admin/status.html.erb +13 -0
  47. data/app/views/rails_ai_admin/assistant/_ask.html.erb +16 -0
  48. data/app/views/rails_ai_admin/assistant/_transcript.html.erb +45 -0
  49. data/app/views/rails_ai_admin/assistant/frame.html.erb +1 -0
  50. data/app/views/rails_ai_admin/assistant/index.html.erb +14 -0
  51. data/app/views/rails_ai_admin/assistant/show.html.erb +44 -0
  52. data/app/views/rails_ai_admin/audit/index.html.erb +40 -0
  53. data/app/views/rails_ai_admin/collection_jobs/index.html.erb +5 -0
  54. data/app/views/rails_ai_admin/collection_jobs/show.html.erb +24 -0
  55. data/app/views/rails_ai_admin/collection_operations/confirmation.html.erb +25 -0
  56. data/app/views/rails_ai_admin/collection_operations/failure.html.erb +10 -0
  57. data/app/views/rails_ai_admin/collection_operations/new.html.erb +11 -0
  58. data/app/views/rails_ai_admin/dashboard/index.html.erb +33 -0
  59. data/app/views/rails_ai_admin/fields/_index.html.erb +1 -0
  60. data/app/views/rails_ai_admin/fields/_input.html.erb +21 -0
  61. data/app/views/rails_ai_admin/fields/_reference.html.erb +1 -0
  62. data/app/views/rails_ai_admin/fields/_reference_picker.html.erb +14 -0
  63. data/app/views/rails_ai_admin/fields/_row.html.erb +27 -0
  64. data/app/views/rails_ai_admin/fields/_show.html.erb +1 -0
  65. data/app/views/rails_ai_admin/imports/new.html.erb +34 -0
  66. data/app/views/rails_ai_admin/mcp_tokens/index.html.erb +33 -0
  67. data/app/views/rails_ai_admin/operations/confirmation.html.erb +32 -0
  68. data/app/views/rails_ai_admin/operations/failure.html.erb +5 -0
  69. data/app/views/rails_ai_admin/operations/form.html.erb +13 -0
  70. data/app/views/rails_ai_admin/resources/_associations.html.erb +12 -0
  71. data/app/views/rails_ai_admin/resources/_errors.html.erb +14 -0
  72. data/app/views/rails_ai_admin/resources/_recovery.html.erb +5 -0
  73. data/app/views/rails_ai_admin/resources/confirm_destroy.html.erb +11 -0
  74. data/app/views/rails_ai_admin/resources/edit.html.erb +1 -0
  75. data/app/views/rails_ai_admin/resources/form.html.erb +16 -0
  76. data/app/views/rails_ai_admin/resources/history.html.erb +27 -0
  77. data/app/views/rails_ai_admin/resources/index.html.erb +88 -0
  78. data/app/views/rails_ai_admin/resources/new.html.erb +1 -0
  79. data/app/views/rails_ai_admin/resources/show.html.erb +12 -0
  80. data/app/views/rails_ai_admin/search/index.html.erb +20 -0
  81. data/app/views/rails_ai_admin/selections/confirm_destroy.html.erb +13 -0
  82. data/app/views/rails_ai_admin/selections/destroyed.html.erb +15 -0
  83. data/app/views/rails_ai_admin/selections/show.html.erb +19 -0
  84. data/app/views/rails_ai_admin/shared/_input_fields.html.erb +23 -0
  85. data/app/views/rails_ai_admin/shared/_navigation.html.erb +8 -0
  86. data/app/views/rails_ai_admin/shared/_session.html.erb +5 -0
  87. data/app/views/rails_ai_admin/statuses/show.html.erb +4 -0
  88. data/app/views/rails_ai_admin/surfaces/_operation_review.html.erb +43 -0
  89. data/app/views/rails_ai_admin/surfaces/show.html.erb +4 -0
  90. data/config/locales/en.yml +549 -0
  91. data/config/routes.rb +64 -0
  92. data/db/assistant_migrate/20261103000001_create_rails_ai_admin_assistant.rb +138 -0
  93. data/db/assistant_migrate/20261112000001_upgrade_rails_ai_admin_assistant_to_ruby_llm_2_2.rb +102 -0
  94. data/db/assistant_migrate/20261114000001_add_streaming_and_access_tokens_to_rails_ai_admin_assistant.rb +29 -0
  95. data/db/migrate/20261029000001_create_rails_ai_admin_execution_tables.rb +35 -0
  96. data/db/migrate/20261029000002_add_callback_warning_to_rails_ai_admin_runs.rb +7 -0
  97. data/db/migrate/20261030000003_create_rails_ai_admin_work_items.rb +26 -0
  98. data/db/migrate/20261030000004_create_rails_ai_admin_selections.rb +28 -0
  99. data/db/migrate/20261030000005_create_rails_ai_admin_collection_runs.rb +41 -0
  100. data/db/migrate/20261113000001_add_record_index_to_rails_ai_admin_audit_events.rb +8 -0
  101. data/lib/generators/rails_ai_admin/assistant/assistant_generator.rb +25 -0
  102. data/lib/generators/rails_ai_admin/assistant/templates/admin_assistant.rb +18 -0
  103. data/lib/generators/rails_ai_admin/engine_migrations.rb +42 -0
  104. data/lib/generators/rails_ai_admin/install/engine_mounts.rb +19 -0
  105. data/lib/generators/rails_ai_admin/install/install_generator.rb +53 -0
  106. data/lib/generators/rails_ai_admin/install/templates/access_test.rb +17 -0
  107. data/lib/generators/rails_ai_admin/install/templates/admin_context.rb +25 -0
  108. data/lib/generators/rails_ai_admin/install/templates/admin_policy_adapter.rb +28 -0
  109. data/lib/generators/rails_ai_admin/install/templates/example_admin.rb +10 -0
  110. data/lib/generators/rails_ai_admin/install/templates/initializer.rb +7 -0
  111. data/lib/generators/rails_ai_admin/override/override_generator.rb +46 -0
  112. data/lib/generators/rails_ai_admin/resource/resource_generator.rb +88 -0
  113. data/lib/rails_ai_admin/assistant/continuation.rb +33 -0
  114. data/lib/rails_ai_admin/assistant/coordinator.rb +306 -0
  115. data/lib/rails_ai_admin/assistant/records.rb +71 -0
  116. data/lib/rails_ai_admin/assistant/runtime.rb +49 -0
  117. data/lib/rails_ai_admin/assistant/tools.rb +477 -0
  118. data/lib/rails_ai_admin/assistant/transcript.rb +140 -0
  119. data/lib/rails_ai_admin/assistant.rb +50 -0
  120. data/lib/rails_ai_admin/authorization/access.rb +296 -0
  121. data/lib/rails_ai_admin/authorization/adapter.rb +92 -0
  122. data/lib/rails_ai_admin/authorization/pundit_adapter.rb +195 -0
  123. data/lib/rails_ai_admin/collections/claim.rb +91 -0
  124. data/lib/rails_ai_admin/collections/contract.rb +113 -0
  125. data/lib/rails_ai_admin/collections/dispatcher.rb +126 -0
  126. data/lib/rails_ai_admin/collections/queries.rb +79 -0
  127. data/lib/rails_ai_admin/collections/result.rb +15 -0
  128. data/lib/rails_ai_admin/collections/runner.rb +208 -0
  129. data/lib/rails_ai_admin/configuration.rb +178 -0
  130. data/lib/rails_ai_admin/context.rb +29 -0
  131. data/lib/rails_ai_admin/doctor.rb +301 -0
  132. data/lib/rails_ai_admin/engine.rb +24 -0
  133. data/lib/rails_ai_admin/error.rb +16 -0
  134. data/lib/rails_ai_admin/field.rb +625 -0
  135. data/lib/rails_ai_admin/fields/association.rb +188 -0
  136. data/lib/rails_ai_admin/fields/computation.rb +43 -0
  137. data/lib/rails_ai_admin/fields/dependency_graph.rb +45 -0
  138. data/lib/rails_ai_admin/fields/file_value.rb +23 -0
  139. data/lib/rails_ai_admin/fields/hook_signatures.rb +18 -0
  140. data/lib/rails_ai_admin/fields/projection.rb +78 -0
  141. data/lib/rails_ai_admin/fields/registry.rb +48 -0
  142. data/lib/rails_ai_admin/fields/scalar_schema.rb +49 -0
  143. data/lib/rails_ai_admin/fields/type.rb +50 -0
  144. data/lib/rails_ai_admin/forms/plan.rb +90 -0
  145. data/lib/rails_ai_admin/input_schema.rb +76 -0
  146. data/lib/rails_ai_admin/integrations/propose_operation.rb +150 -0
  147. data/lib/rails_ai_admin/integrations/tool_views.rb +367 -0
  148. data/lib/rails_ai_admin/mcp.rb +130 -0
  149. data/lib/rails_ai_admin/navigation/list_state.rb +194 -0
  150. data/lib/rails_ai_admin/navigation/menu.rb +31 -0
  151. data/lib/rails_ai_admin/navigation/settings.rb +28 -0
  152. data/lib/rails_ai_admin/operation.rb +120 -0
  153. data/lib/rails_ai_admin/operations/default_handlers.rb +17 -0
  154. data/lib/rails_ai_admin/operations/execution_context.rb +38 -0
  155. data/lib/rails_ai_admin/operations/form_intent.rb +69 -0
  156. data/lib/rails_ai_admin/operations/registry.rb +80 -0
  157. data/lib/rails_ai_admin/operations/result.rb +21 -0
  158. data/lib/rails_ai_admin/operations/runner.rb +633 -0
  159. data/lib/rails_ai_admin/operations/runner_fingerprint.rb +12 -0
  160. data/lib/rails_ai_admin/outbox/delivery_context.rb +51 -0
  161. data/lib/rails_ai_admin/outbox/dispatcher.rb +189 -0
  162. data/lib/rails_ai_admin/outbox/registry.rb +36 -0
  163. data/lib/rails_ai_admin/outbox/request_digest.rb +42 -0
  164. data/lib/rails_ai_admin/outbox/writer.rb +43 -0
  165. data/lib/rails_ai_admin/presentation/association_panel.rb +90 -0
  166. data/lib/rails_ai_admin/presentation/audit_log.rb +63 -0
  167. data/lib/rails_ai_admin/presentation/csv_export.rb +85 -0
  168. data/lib/rails_ai_admin/presentation/csv_import.rb +142 -0
  169. data/lib/rails_ai_admin/presentation/dashboard.rb +122 -0
  170. data/lib/rails_ai_admin/presentation/history.rb +46 -0
  171. data/lib/rails_ai_admin/presentation/index_settings.rb +77 -0
  172. data/lib/rails_ai_admin/presentation/outcomes.rb +44 -0
  173. data/lib/rails_ai_admin/presentation/status.rb +40 -0
  174. data/lib/rails_ai_admin/prune.rb +61 -0
  175. data/lib/rails_ai_admin/queries/list.rb +162 -0
  176. data/lib/rails_ai_admin/queries/named_scope.rb +65 -0
  177. data/lib/rails_ai_admin/record_version.rb +40 -0
  178. data/lib/rails_ai_admin/registry.rb +45 -0
  179. data/lib/rails_ai_admin/request_log_filter.rb +24 -0
  180. data/lib/rails_ai_admin/resource.rb +249 -0
  181. data/lib/rails_ai_admin/resource_identity.rb +15 -0
  182. data/lib/rails_ai_admin/schema_suggestions.rb +105 -0
  183. data/lib/rails_ai_admin/selections/builder.rb +162 -0
  184. data/lib/rails_ai_admin/templates/catalog.rb +84 -0
  185. data/lib/rails_ai_admin/templates/inspector.rb +94 -0
  186. data/lib/rails_ai_admin/templates/metadata.rb +48 -0
  187. data/lib/rails_ai_admin/templates/safe_paths.rb +30 -0
  188. data/lib/rails_ai_admin/test_kit.rb +103 -0
  189. data/lib/rails_ai_admin/version.rb +5 -0
  190. data/lib/rails_ai_admin/work.rb +48 -0
  191. data/lib/rails_ai_admin.rb +112 -0
  192. data/lib/tasks/rails_ai_admin.rake +58 -0
  193. metadata +328 -0
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsAiAdmin
4
+ # Trusted post-commit delivery. One item permits one explicit external effect.
5
+ class Work < Operation
6
+ class << self
7
+ def perform_arity = 2
8
+
9
+ def idempotent(value = nil)
10
+ @idempotent = value unless value.nil?
11
+ @idempotent == true
12
+ end
13
+
14
+ def lease_duration(value = nil)
15
+ @lease_duration = value if value
16
+ @lease_duration || 60
17
+ end
18
+
19
+ def max_attempts(value = nil)
20
+ @max_attempts = value if value
21
+ @max_attempts || 3
22
+ end
23
+
24
+ def max_age(value = nil)
25
+ @max_age = value if value
26
+ @max_age || 1.day
27
+ end
28
+
29
+ def record_version_policy(value = nil)
30
+ @record_version_policy = value if value
31
+ @record_version_policy || :exact
32
+ end
33
+
34
+ def validate!
35
+ super
36
+ unless (5..3600).cover?(lease_duration) && max_attempts.is_a?(Integer) && (1..10).cover?(max_attempts) && (60..7.days).cover?(max_age) && %i[exact current].include?(record_version_policy)
37
+ raise ConfigurationError, "Invalid Work lease, retry, lifetime or record-version policy"
38
+ end
39
+ raise ConfigurationError, "Work must implement perform" if instance_method(:perform).owner == Work
40
+ self
41
+ end
42
+ end
43
+
44
+ def perform(_context, _input)
45
+ raise NotImplementedError
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails"
4
+ require "rails/engine"
5
+ require "active_record"
6
+ require "action_controller/railtie"
7
+ require "active_job/railtie"
8
+ require "turbo-rails"
9
+ require "active_support/core_ext"
10
+ require_relative "rails_ai_admin/version"
11
+ require_relative "rails_ai_admin/error"
12
+ require_relative "rails_ai_admin/presentation/status"
13
+ require_relative "rails_ai_admin/presentation/outcomes"
14
+ require_relative "rails_ai_admin/configuration"
15
+ require_relative "rails_ai_admin/context"
16
+ require_relative "rails_ai_admin/record_version"
17
+ require_relative "rails_ai_admin/field"
18
+ require_relative "rails_ai_admin/fields/hook_signatures"
19
+ require_relative "rails_ai_admin/fields/type"
20
+ require_relative "rails_ai_admin/fields/computation"
21
+ require_relative "rails_ai_admin/fields/dependency_graph"
22
+ require_relative "rails_ai_admin/fields/projection"
23
+ require_relative "rails_ai_admin/fields/file_value"
24
+ require_relative "rails_ai_admin/fields/registry"
25
+ require_relative "rails_ai_admin/fields/scalar_schema"
26
+ require_relative "rails_ai_admin/input_schema"
27
+ require_relative "rails_ai_admin/forms/plan"
28
+ require_relative "rails_ai_admin/operation"
29
+ require_relative "rails_ai_admin/work"
30
+ require_relative "rails_ai_admin/navigation/settings"
31
+ require_relative "rails_ai_admin/queries/named_scope"
32
+ require_relative "rails_ai_admin/presentation/index_settings"
33
+ require_relative "rails_ai_admin/presentation/association_panel"
34
+ require_relative "rails_ai_admin/presentation/history"
35
+ require_relative "rails_ai_admin/presentation/audit_log"
36
+ require_relative "rails_ai_admin/resource"
37
+ require_relative "rails_ai_admin/resource_identity"
38
+ require_relative "rails_ai_admin/registry"
39
+ require_relative "rails_ai_admin/operations/default_handlers"
40
+ require_relative "rails_ai_admin/operations/registry"
41
+ require_relative "rails_ai_admin/outbox/registry"
42
+ require_relative "rails_ai_admin/request_log_filter"
43
+ require_relative "rails_ai_admin/authorization/adapter"
44
+ require_relative "rails_ai_admin/authorization/pundit_adapter"
45
+ require_relative "rails_ai_admin/authorization/access"
46
+ require_relative "rails_ai_admin/fields/association"
47
+ require_relative "rails_ai_admin/navigation/list_state"
48
+ require_relative "rails_ai_admin/navigation/menu"
49
+
50
+ # Provides an isolated admin engine. The host supplies all authority.
51
+ module RailsAiAdmin
52
+ class << self
53
+ # Returns the process configuration, frozen after Rails initialization.
54
+ def configuration
55
+ @configuration ||= Configuration.new
56
+ end
57
+
58
+ # Yields configuration during host initialization.
59
+ def configure
60
+ yield configuration
61
+ end
62
+
63
+ # Returns the current registry, rebuilt on Rails reload.
64
+ def registry
65
+ @registry ||= Registry.new([])
66
+ end
67
+
68
+ def field_registry
69
+ return @field_registry if @field_registry&.matches?(configuration.field_types)
70
+ Fields::Registry.new(configuration.field_types)
71
+ end
72
+
73
+ def operation_registry
74
+ @operation_registry ||= Operations::Registry.new([])
75
+ end
76
+
77
+ def work_registry
78
+ @work_registry ||= Outbox::Registry.new({})
79
+ end
80
+
81
+ # Rebuilds the registry from reloadable host constant names.
82
+ def prepare!
83
+ fields = Fields::Registry.new(configuration.field_types).validate!
84
+ resources = Registry.new(configuration.resources)
85
+ operations = Operations::Registry.new(resources.resources)
86
+ work = Outbox::Registry.new(configuration.work_handlers)
87
+ @registry, @operation_registry, @work_registry, @field_registry = resources, operations, work, fields
88
+ end
89
+ end
90
+ end
91
+
92
+ require_relative "rails_ai_admin/queries/list"
93
+ require_relative "rails_ai_admin/presentation/csv_export"
94
+ require_relative "rails_ai_admin/presentation/csv_import"
95
+ require_relative "rails_ai_admin/presentation/dashboard"
96
+ require_relative "rails_ai_admin/operations/result"
97
+ require_relative "rails_ai_admin/outbox/writer"
98
+ require_relative "rails_ai_admin/operations/execution_context"
99
+ require_relative "rails_ai_admin/operations/runner_fingerprint"
100
+ require_relative "rails_ai_admin/operations/form_intent"
101
+ require_relative "rails_ai_admin/operations/runner"
102
+ require_relative "rails_ai_admin/selections/builder"
103
+ require_relative "rails_ai_admin/collections/result"
104
+ require_relative "rails_ai_admin/collections/contract"
105
+ require_relative "rails_ai_admin/collections/runner"
106
+ require_relative "rails_ai_admin/collections/claim"
107
+ require_relative "rails_ai_admin/collections/dispatcher"
108
+ require_relative "rails_ai_admin/collections/queries"
109
+ require_relative "rails_ai_admin/outbox/request_digest"
110
+ require_relative "rails_ai_admin/outbox/delivery_context"
111
+ require_relative "rails_ai_admin/outbox/dispatcher"
112
+ require_relative "rails_ai_admin/engine"
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :rails_ai_admin do
4
+ desc "Report fail-closed installation and supported runtime boundaries"
5
+ task doctor: :environment do
6
+ require "rails_ai_admin/doctor"
7
+ checks = RailsAiAdmin::Doctor.new.checks
8
+ checks.each { |check| puts "[#{check.status}] #{check.name}: #{check.message}" }
9
+ abort "Resolve errors before enabling writes." if checks.any? { |check| check.status == :error }
10
+ end
11
+
12
+ desc "Delete proposed intents and selections that expired more than DAYS (default 7) days ago"
13
+ task prune: :environment do
14
+ require "rails_ai_admin/prune"
15
+ days = ENV.fetch("DAYS", "7")
16
+ abort "DAYS must be a whole number of days" unless days.match?(/\A\d{1,4}\z/)
17
+ result = RailsAiAdmin::Prune.new(older_than: days.to_i.days).call
18
+ puts "Deleted #{result.intents} expired intents and #{result.selections} expired selections."
19
+ end
20
+
21
+ namespace :collections do
22
+ desc "Enqueue up to 100 due collection runs; schedule recurring scans in the host"
23
+ task scan: :environment do
24
+ puts "Scheduled #{RailsAiAdmin::Collections::Dispatcher.new.scan_pending!} collection runs."
25
+ end
26
+
27
+ desc "Visit up to 100 collection runs inline; each target commits separately"
28
+ task drain: :environment do
29
+ puts "Visited #{RailsAiAdmin::Collections::Dispatcher.new.scan_pending!(inline: true)} collection runs."
30
+ end
31
+ end
32
+
33
+ namespace :assistant do
34
+ desc "Enqueue up to 100 chats with due assistant turns; schedule recurring scans in the host"
35
+ task scan: :environment do
36
+ require "rails_ai_admin/assistant"
37
+ puts "Scheduled #{RailsAiAdmin::Assistant::Coordinator.new.scan_pending!} assistant chats."
38
+ end
39
+
40
+ desc "Run due assistant turns of up to 100 chats inline, outside web requests"
41
+ task drain: :environment do
42
+ require "rails_ai_admin/assistant"
43
+ puts "Visited #{RailsAiAdmin::Assistant::Coordinator.new.scan_pending!(inline: true)} assistant chats."
44
+ end
45
+ end
46
+
47
+ namespace :work do
48
+ desc "Enqueue up to 100 due outbox items; schedule recurring scans in the host"
49
+ task scan: :environment do
50
+ puts "Scheduled #{RailsAiAdmin::Outbox::Dispatcher.new.scan_pending!} outbox items."
51
+ end
52
+
53
+ desc "Deliver up to 100 due outbox items inline, outside domain transactions"
54
+ task drain: :environment do
55
+ puts "Visited #{RailsAiAdmin::Outbox::Dispatcher.new.scan_pending!(inline: true)} outbox items."
56
+ end
57
+ end
58
+ end
metadata ADDED
@@ -0,0 +1,328 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails_ai_admin
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Andy Wang
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 2026-11-13 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: base64
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '0.3'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '0.3'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rails
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 8.0.5.2
33
+ - - "<"
34
+ - !ruby/object:Gem::Version
35
+ version: '8.2'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 8.0.5.2
43
+ - - "<"
44
+ - !ruby/object:Gem::Version
45
+ version: '8.2'
46
+ - !ruby/object:Gem::Dependency
47
+ name: json_schemer
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '2.5'
53
+ type: :runtime
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '2.5'
60
+ - !ruby/object:Gem::Dependency
61
+ name: json
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '2.13'
67
+ type: :runtime
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '2.13'
74
+ - !ruby/object:Gem::Dependency
75
+ name: turbo-rails
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '2.0'
81
+ type: :runtime
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '2.0'
88
+ - !ruby/object:Gem::Dependency
89
+ name: stimulus-rails
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '1.3'
95
+ type: :runtime
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '1.3'
102
+ description: A self-hosted Rails admin with typed resources and a shared, audited
103
+ operation boundary.
104
+ email:
105
+ - wangyaodi@gmail.com
106
+ executables: []
107
+ extensions: []
108
+ extra_rdoc_files: []
109
+ files:
110
+ - CHANGELOG.md
111
+ - LICENSE
112
+ - README.md
113
+ - SECURITY.md
114
+ - THIRD_PARTY_NOTICES.md
115
+ - app/assets/builds/rails_ai_admin.LICENSE.txt
116
+ - app/assets/builds/rails_ai_admin.css
117
+ - app/assets/builds/rails_ai_admin.js
118
+ - app/controllers/rails_ai_admin/application_controller.rb
119
+ - app/controllers/rails_ai_admin/assistant_controller.rb
120
+ - app/controllers/rails_ai_admin/audit_controller.rb
121
+ - app/controllers/rails_ai_admin/collection_jobs_controller.rb
122
+ - app/controllers/rails_ai_admin/collection_operations_controller.rb
123
+ - app/controllers/rails_ai_admin/custom_controller.rb
124
+ - app/controllers/rails_ai_admin/dashboard_controller.rb
125
+ - app/controllers/rails_ai_admin/exports_controller.rb
126
+ - app/controllers/rails_ai_admin/files_controller.rb
127
+ - app/controllers/rails_ai_admin/imports_controller.rb
128
+ - app/controllers/rails_ai_admin/mcp_controller.rb
129
+ - app/controllers/rails_ai_admin/mcp_tokens_controller.rb
130
+ - app/controllers/rails_ai_admin/operations_controller.rb
131
+ - app/controllers/rails_ai_admin/references_controller.rb
132
+ - app/controllers/rails_ai_admin/resources_controller.rb
133
+ - app/controllers/rails_ai_admin/search_controller.rb
134
+ - app/controllers/rails_ai_admin/selections_controller.rb
135
+ - app/controllers/rails_ai_admin/surfaces_controller.rb
136
+ - app/helpers/rails_ai_admin/dashboard_helper.rb
137
+ - app/helpers/rails_ai_admin/fields_helper.rb
138
+ - app/helpers/rails_ai_admin/filters_helper.rb
139
+ - app/helpers/rails_ai_admin/history_helper.rb
140
+ - app/helpers/rails_ai_admin/navigation_helper.rb
141
+ - app/helpers/rails_ai_admin/tool_views_helper.rb
142
+ - app/jobs/rails_ai_admin/assistant_turn_job.rb
143
+ - app/jobs/rails_ai_admin/collections/execution_job.rb
144
+ - app/jobs/rails_ai_admin/outbox/delivery_job.rb
145
+ - app/models/rails_ai_admin/application_record.rb
146
+ - app/models/rails_ai_admin/audit_event.rb
147
+ - app/models/rails_ai_admin/batch_item.rb
148
+ - app/models/rails_ai_admin/operation_run.rb
149
+ - app/models/rails_ai_admin/selection.rb
150
+ - app/models/rails_ai_admin/selection_item.rb
151
+ - app/models/rails_ai_admin/work_item.rb
152
+ - app/views/layouts/rails_ai_admin/application.html.erb
153
+ - app/views/layouts/rails_ai_admin/frame.html.erb
154
+ - app/views/layouts/rails_ai_admin/status.html.erb
155
+ - app/views/rails_ai_admin/assistant/_ask.html.erb
156
+ - app/views/rails_ai_admin/assistant/_transcript.html.erb
157
+ - app/views/rails_ai_admin/assistant/frame.html.erb
158
+ - app/views/rails_ai_admin/assistant/index.html.erb
159
+ - app/views/rails_ai_admin/assistant/show.html.erb
160
+ - app/views/rails_ai_admin/audit/index.html.erb
161
+ - app/views/rails_ai_admin/collection_jobs/index.html.erb
162
+ - app/views/rails_ai_admin/collection_jobs/show.html.erb
163
+ - app/views/rails_ai_admin/collection_operations/confirmation.html.erb
164
+ - app/views/rails_ai_admin/collection_operations/failure.html.erb
165
+ - app/views/rails_ai_admin/collection_operations/new.html.erb
166
+ - app/views/rails_ai_admin/dashboard/index.html.erb
167
+ - app/views/rails_ai_admin/fields/_index.html.erb
168
+ - app/views/rails_ai_admin/fields/_input.html.erb
169
+ - app/views/rails_ai_admin/fields/_reference.html.erb
170
+ - app/views/rails_ai_admin/fields/_reference_picker.html.erb
171
+ - app/views/rails_ai_admin/fields/_row.html.erb
172
+ - app/views/rails_ai_admin/fields/_show.html.erb
173
+ - app/views/rails_ai_admin/imports/new.html.erb
174
+ - app/views/rails_ai_admin/mcp_tokens/index.html.erb
175
+ - app/views/rails_ai_admin/operations/confirmation.html.erb
176
+ - app/views/rails_ai_admin/operations/failure.html.erb
177
+ - app/views/rails_ai_admin/operations/form.html.erb
178
+ - app/views/rails_ai_admin/resources/_associations.html.erb
179
+ - app/views/rails_ai_admin/resources/_errors.html.erb
180
+ - app/views/rails_ai_admin/resources/_recovery.html.erb
181
+ - app/views/rails_ai_admin/resources/confirm_destroy.html.erb
182
+ - app/views/rails_ai_admin/resources/edit.html.erb
183
+ - app/views/rails_ai_admin/resources/form.html.erb
184
+ - app/views/rails_ai_admin/resources/history.html.erb
185
+ - app/views/rails_ai_admin/resources/index.html.erb
186
+ - app/views/rails_ai_admin/resources/new.html.erb
187
+ - app/views/rails_ai_admin/resources/show.html.erb
188
+ - app/views/rails_ai_admin/search/index.html.erb
189
+ - app/views/rails_ai_admin/selections/confirm_destroy.html.erb
190
+ - app/views/rails_ai_admin/selections/destroyed.html.erb
191
+ - app/views/rails_ai_admin/selections/show.html.erb
192
+ - app/views/rails_ai_admin/shared/_input_fields.html.erb
193
+ - app/views/rails_ai_admin/shared/_navigation.html.erb
194
+ - app/views/rails_ai_admin/shared/_session.html.erb
195
+ - app/views/rails_ai_admin/statuses/show.html.erb
196
+ - app/views/rails_ai_admin/surfaces/_operation_review.html.erb
197
+ - app/views/rails_ai_admin/surfaces/show.html.erb
198
+ - config/locales/en.yml
199
+ - config/routes.rb
200
+ - db/assistant_migrate/20261103000001_create_rails_ai_admin_assistant.rb
201
+ - db/assistant_migrate/20261112000001_upgrade_rails_ai_admin_assistant_to_ruby_llm_2_2.rb
202
+ - db/assistant_migrate/20261114000001_add_streaming_and_access_tokens_to_rails_ai_admin_assistant.rb
203
+ - db/migrate/20261029000001_create_rails_ai_admin_execution_tables.rb
204
+ - db/migrate/20261029000002_add_callback_warning_to_rails_ai_admin_runs.rb
205
+ - db/migrate/20261030000003_create_rails_ai_admin_work_items.rb
206
+ - db/migrate/20261030000004_create_rails_ai_admin_selections.rb
207
+ - db/migrate/20261030000005_create_rails_ai_admin_collection_runs.rb
208
+ - db/migrate/20261113000001_add_record_index_to_rails_ai_admin_audit_events.rb
209
+ - lib/generators/rails_ai_admin/assistant/assistant_generator.rb
210
+ - lib/generators/rails_ai_admin/assistant/templates/admin_assistant.rb
211
+ - lib/generators/rails_ai_admin/engine_migrations.rb
212
+ - lib/generators/rails_ai_admin/install/engine_mounts.rb
213
+ - lib/generators/rails_ai_admin/install/install_generator.rb
214
+ - lib/generators/rails_ai_admin/install/templates/access_test.rb
215
+ - lib/generators/rails_ai_admin/install/templates/admin_context.rb
216
+ - lib/generators/rails_ai_admin/install/templates/admin_policy_adapter.rb
217
+ - lib/generators/rails_ai_admin/install/templates/example_admin.rb
218
+ - lib/generators/rails_ai_admin/install/templates/initializer.rb
219
+ - lib/generators/rails_ai_admin/override/override_generator.rb
220
+ - lib/generators/rails_ai_admin/resource/resource_generator.rb
221
+ - lib/rails_ai_admin.rb
222
+ - lib/rails_ai_admin/assistant.rb
223
+ - lib/rails_ai_admin/assistant/continuation.rb
224
+ - lib/rails_ai_admin/assistant/coordinator.rb
225
+ - lib/rails_ai_admin/assistant/records.rb
226
+ - lib/rails_ai_admin/assistant/runtime.rb
227
+ - lib/rails_ai_admin/assistant/tools.rb
228
+ - lib/rails_ai_admin/assistant/transcript.rb
229
+ - lib/rails_ai_admin/authorization/access.rb
230
+ - lib/rails_ai_admin/authorization/adapter.rb
231
+ - lib/rails_ai_admin/authorization/pundit_adapter.rb
232
+ - lib/rails_ai_admin/collections/claim.rb
233
+ - lib/rails_ai_admin/collections/contract.rb
234
+ - lib/rails_ai_admin/collections/dispatcher.rb
235
+ - lib/rails_ai_admin/collections/queries.rb
236
+ - lib/rails_ai_admin/collections/result.rb
237
+ - lib/rails_ai_admin/collections/runner.rb
238
+ - lib/rails_ai_admin/configuration.rb
239
+ - lib/rails_ai_admin/context.rb
240
+ - lib/rails_ai_admin/doctor.rb
241
+ - lib/rails_ai_admin/engine.rb
242
+ - lib/rails_ai_admin/error.rb
243
+ - lib/rails_ai_admin/field.rb
244
+ - lib/rails_ai_admin/fields/association.rb
245
+ - lib/rails_ai_admin/fields/computation.rb
246
+ - lib/rails_ai_admin/fields/dependency_graph.rb
247
+ - lib/rails_ai_admin/fields/file_value.rb
248
+ - lib/rails_ai_admin/fields/hook_signatures.rb
249
+ - lib/rails_ai_admin/fields/projection.rb
250
+ - lib/rails_ai_admin/fields/registry.rb
251
+ - lib/rails_ai_admin/fields/scalar_schema.rb
252
+ - lib/rails_ai_admin/fields/type.rb
253
+ - lib/rails_ai_admin/forms/plan.rb
254
+ - lib/rails_ai_admin/input_schema.rb
255
+ - lib/rails_ai_admin/integrations/propose_operation.rb
256
+ - lib/rails_ai_admin/integrations/tool_views.rb
257
+ - lib/rails_ai_admin/mcp.rb
258
+ - lib/rails_ai_admin/navigation/list_state.rb
259
+ - lib/rails_ai_admin/navigation/menu.rb
260
+ - lib/rails_ai_admin/navigation/settings.rb
261
+ - lib/rails_ai_admin/operation.rb
262
+ - lib/rails_ai_admin/operations/default_handlers.rb
263
+ - lib/rails_ai_admin/operations/execution_context.rb
264
+ - lib/rails_ai_admin/operations/form_intent.rb
265
+ - lib/rails_ai_admin/operations/registry.rb
266
+ - lib/rails_ai_admin/operations/result.rb
267
+ - lib/rails_ai_admin/operations/runner.rb
268
+ - lib/rails_ai_admin/operations/runner_fingerprint.rb
269
+ - lib/rails_ai_admin/outbox/delivery_context.rb
270
+ - lib/rails_ai_admin/outbox/dispatcher.rb
271
+ - lib/rails_ai_admin/outbox/registry.rb
272
+ - lib/rails_ai_admin/outbox/request_digest.rb
273
+ - lib/rails_ai_admin/outbox/writer.rb
274
+ - lib/rails_ai_admin/presentation/association_panel.rb
275
+ - lib/rails_ai_admin/presentation/audit_log.rb
276
+ - lib/rails_ai_admin/presentation/csv_export.rb
277
+ - lib/rails_ai_admin/presentation/csv_import.rb
278
+ - lib/rails_ai_admin/presentation/dashboard.rb
279
+ - lib/rails_ai_admin/presentation/history.rb
280
+ - lib/rails_ai_admin/presentation/index_settings.rb
281
+ - lib/rails_ai_admin/presentation/outcomes.rb
282
+ - lib/rails_ai_admin/presentation/status.rb
283
+ - lib/rails_ai_admin/prune.rb
284
+ - lib/rails_ai_admin/queries/list.rb
285
+ - lib/rails_ai_admin/queries/named_scope.rb
286
+ - lib/rails_ai_admin/record_version.rb
287
+ - lib/rails_ai_admin/registry.rb
288
+ - lib/rails_ai_admin/request_log_filter.rb
289
+ - lib/rails_ai_admin/resource.rb
290
+ - lib/rails_ai_admin/resource_identity.rb
291
+ - lib/rails_ai_admin/schema_suggestions.rb
292
+ - lib/rails_ai_admin/selections/builder.rb
293
+ - lib/rails_ai_admin/templates/catalog.rb
294
+ - lib/rails_ai_admin/templates/inspector.rb
295
+ - lib/rails_ai_admin/templates/metadata.rb
296
+ - lib/rails_ai_admin/templates/safe_paths.rb
297
+ - lib/rails_ai_admin/test_kit.rb
298
+ - lib/rails_ai_admin/version.rb
299
+ - lib/rails_ai_admin/work.rb
300
+ - lib/tasks/rails_ai_admin.rake
301
+ homepage: https://github.com/yorzi/rails_ai_admin
302
+ licenses:
303
+ - MIT
304
+ metadata:
305
+ rubygems_mfa_required: 'true'
306
+ source_code_uri: https://github.com/yorzi/rails_ai_admin
307
+ changelog_uri: https://github.com/yorzi/rails_ai_admin/blob/main/CHANGELOG.md
308
+ bug_tracker_uri: https://github.com/yorzi/rails_ai_admin/issues
309
+ documentation_uri: https://rails-ai-admin.wangyaodi.com/
310
+ allowed_push_host: https://rubygems.org
311
+ rdoc_options: []
312
+ require_paths:
313
+ - lib
314
+ required_ruby_version: !ruby/object:Gem::Requirement
315
+ requirements:
316
+ - - ">="
317
+ - !ruby/object:Gem::Version
318
+ version: '3.3'
319
+ required_rubygems_version: !ruby/object:Gem::Requirement
320
+ requirements:
321
+ - - ">="
322
+ - !ruby/object:Gem::Version
323
+ version: '0'
324
+ requirements: []
325
+ rubygems_version: 4.0.20
326
+ specification_version: 4
327
+ summary: An explicit, authorized Rails admin engine
328
+ test_files: []