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,549 @@
1
+ # English source strings for every framework page, helper and controller message.
2
+ # Add a locale by copying this file; missing keys fall back as Rails I18n configures.
3
+ en:
4
+ rails_ai_admin:
5
+ outcomes:
6
+ ok: Done.
7
+ validation_failed: Some values need attention.
8
+ conflict: The record changed after this page was opened.
9
+ restricted: The record is still in use and cannot be deleted.
10
+ not_found: The record is not available.
11
+ unauthenticated: Sign in to continue.
12
+ invalid_query: The list settings are not available.
13
+ approval_required: This change needs your explicit confirmation.
14
+ approval_expired: This form expired before it was submitted.
15
+ approval_invalidated: Your access or the operation changed after this form was opened.
16
+ idempotency_conflict: This form was already submitted with different values.
17
+ authorization_revoked: Your access changed before the work ran.
18
+ selection_invalidated: The selection no longer matches the records.
19
+ selection_expired: The selection expired.
20
+ timeout: The operation took too long and was stopped.
21
+ operation_failed: The operation failed.
22
+ post_commit_callback_failed: The change was saved, but a follow-up step failed.
23
+ outcome_unknown: The result could not be confirmed.
24
+ attempts_exhausted: The work failed after several attempts.
25
+ cancelled: The work was cancelled.
26
+ execution_expired: The work expired before it could run.
27
+ work_expired: The work expired before it could run.
28
+ handler_changed: The operation changed after the work was queued.
29
+ unavailable: This is not available right now.
30
+ fields:
31
+ errors:
32
+ blank: cannot be blank
33
+ control_characters: contains control characters
34
+ decimal_places:
35
+ one: must have at most %{count} decimal place
36
+ other: must have at most %{count} decimal places
37
+ invalid_datetime: is not a valid date and time
38
+ unavailable_choice: is not an available choice
39
+ not_text: must be text
40
+ too_long: is too long
41
+ invalid: is invalid
42
+ not_allowed: is not an allowed value
43
+ not_integer: must be an integer
44
+ out_of_range: is out of range
45
+ not_decimal: must be a decimal
46
+ not_finite: must be finite
47
+ not_boolean: must be a boolean
48
+ not_date: must be an ISO date
49
+ not_timestamp: must be an ISO timestamp
50
+ operation_rejected: operation was rejected
51
+ not_object: must be an object
52
+ undeclared_fields: contains undeclared fields
53
+ required: is required
54
+ not_email: must be an email address
55
+ not_url: must be an http or https address
56
+ not_time: must be a time of day (HH:MM)
57
+ not_json: must be valid JSON
58
+ file_unavailable: is not an available upload
59
+ file_too_large: is larger than %{size}
60
+ file_type: is not an accepted file type
61
+ not_list: must be a list of records
62
+ too_many: can name at most %{count} records
63
+ too_many_files: can hold at most %{count} files
64
+ 'yes': 'Yes'
65
+ 'no': 'No'
66
+ not_set: Not set
67
+ choose_value: Choose a value
68
+ none: None
69
+ choose_record: Choose a record
70
+ unavailable_value: Unavailable value — select a current option
71
+ keep_password: Leave blank to keep the current password.
72
+ files:
73
+ zero: No files
74
+ one: 1 file
75
+ other: "%{count} files"
76
+ resources:
77
+ index:
78
+ omitted_rows: Some records on this page are not available to you.
79
+ no_list_tab: Showing every record you can access, without a list tab.
80
+ filters: Filters
81
+ active_filters:
82
+ one: "%{count} active"
83
+ other: "%{count} active"
84
+ selection_help: Tick records below, then capture their current versions (up to 100). This does
85
+ not change anything.
86
+ search_label: Search %{label}
87
+ search: Search
88
+ scopes: "%{label} scopes"
89
+ apply_filters: Apply filters
90
+ clear_filters: Clear filters
91
+ reset: Reset list
92
+ count:
93
+ one: "%{number} matching record"
94
+ other: "%{number} matching records"
95
+ count_capped: More than %{number} matching records
96
+ capture_selection: Capture selection
97
+ records_region: Resource records
98
+ caption: "%{label}, page %{page}"
99
+ select: Select
100
+ select_all: Select all records on this page
101
+ actions: Actions
102
+ select_row: Select %{label}
103
+ view_row: View %{label}
104
+ empty: No records match this query.
105
+ pagination: Pagination
106
+ previous: Previous
107
+ next: Next
108
+ page_limit: Narrow your search to view more records within the page limit.
109
+ settings_restored: Some list settings are no longer available. The current list settings have
110
+ been restored.
111
+ page_empty: That list page is now empty. Showing an available page.
112
+ form:
113
+ required_note_html: Fields marked %{marker} are required.
114
+ asterisk: with an asterisk
115
+ sections: Form sections
116
+ inputs_unavailable: Some inputs are no longer available
117
+ edit: Edit
118
+ delete: Delete
119
+ new: New %{label}
120
+ edit_title: Edit %{label}
121
+ destroy:
122
+ title: Delete %{label}
123
+ question_html: Delete %{label}? This runs the model's destroy callbacks and cannot be undone here.
124
+ confirm: Confirm deletion
125
+ saved: Changes saved.
126
+ saved_with_warning: Changes saved, but a host callback failed. Review operation %{operation} before
127
+ continuing.
128
+ imports:
129
+ button: Import CSV
130
+ title: Import %{label}
131
+ intro: Each row becomes a new record through the ordinary create form rules. Check the file first; nothing is saved until you import.
132
+ columns: "Columns: %{fields}."
133
+ template: Download a template
134
+ file: CSV file
135
+ file_help: UTF-8 CSV with a header row, at most %{limit} rows and 2 MB.
136
+ check: Check file
137
+ import: Import
138
+ choose_file: Choose a CSV file.
139
+ too_large: The file is larger than 2 MB.
140
+ too_many: The file has more than %{limit} rows. Split it into smaller files.
141
+ empty: The file needs a header row and at least one data row.
142
+ no_columns: No column matches a field you can fill. Use the template's header row.
143
+ not_utf8: The file is not UTF-8 text.
144
+ unclosed_quote: A quoted cell is never closed.
145
+ check_title: Check results
146
+ result_title: Import results
147
+ ready:
148
+ one: "%{count} of %{total} rows can be imported."
149
+ other: "%{count} of %{total} rows can be imported."
150
+ created:
151
+ one: "Created %{count} of %{total} records."
152
+ other: "Created %{count} of %{total} records."
153
+ matched: "Matched columns: %{fields}."
154
+ ignored: "Ignored columns: %{columns}."
155
+ row: Row
156
+ exports:
157
+ button: Export CSV
158
+ too_many: This list has more than %{limit} records. Narrow it with search or filters, then export again.
159
+ files:
160
+ current: "Current file: %{file}"
161
+ limit: "Up to %{size}."
162
+ remove: Remove the current file
163
+ remove_named: Remove %{file}
164
+ list_limit: "Choose one or more files, up to %{size} each; at most %{count} in all."
165
+ audit:
166
+ title: Audit log
167
+ intro: Changes and exports made through the admin, newest first, for the resources you may audit.
168
+ resource: Resource
169
+ change: Change
170
+ outcome: Outcome
171
+ any: Any
172
+ saved: Saved
173
+ record: Record
174
+ empty: No events match.
175
+ only_actor: "Showing only changes by %{actor}."
176
+ mcp:
177
+ nav: MCP access
178
+ title: MCP access
179
+ intro: Connect an AI agent such as Claude Code or Cursor to this admin with a personal access token. The agent reads only what you may read on resources open to the assistant, and every change it proposes waits for you to confirm it here.
180
+ endpoint: "Server URL:"
181
+ name: Name
182
+ name_placeholder: For example, “Claude Code on my laptop”
183
+ lifetime: Expires after
184
+ days:
185
+ one: 1 day
186
+ other: "%{count} days"
187
+ create: Create token
188
+ created: Token “%{name}” created
189
+ copy_now: Copy it now. It is shown only once and cannot be recovered.
190
+ example: "For example, with Claude Code:"
191
+ caption: Your tokens
192
+ expires: Expires
193
+ last_used: Last used
194
+ status: Status
195
+ active: Active
196
+ revoke: Revoke
197
+ revoked: Token revoked.
198
+ revoked_mark: Revoked
199
+ expired: Expired
200
+ invalid: Give the token a name, choose an expiry, and keep at most 10 active tokens.
201
+ history:
202
+ link: History
203
+ title: History of %{record}
204
+ back: Back to %{record}
205
+ caption: Changes made through the admin, newest first.
206
+ empty: No changes have been recorded for this record yet.
207
+ when: When
208
+ change: Change
209
+ fields: Fields
210
+ by: By
211
+ you: (you)
212
+ older: Show older changes
213
+ not_saved: Not saved
214
+ other_fields:
215
+ one: 1 other field
216
+ other: "%{count} other fields"
217
+ operations:
218
+ create: Created
219
+ update: Updated
220
+ destroy: Deleted
221
+ export: Exported CSV
222
+ origins:
223
+ surface: From a review in Chat
224
+ assistant: Proposed in Chat
225
+ selections:
226
+ empty: Select at least one record.
227
+ title: Selected records
228
+ targets_note:
229
+ one: "%{count} fixed target. This selection does not approve or execute an operation."
230
+ other: "%{count} fixed targets. This selection does not approve or execute an operation."
231
+ expires_html: Expires %{time}.
232
+ caption: "%{label} — fixed selection"
233
+ id: ID
234
+ fixed_note: >-
235
+ Changes to a selected record require a fresh selection. Unselected and newly matching records
236
+ are never added automatically.
237
+ destroy:
238
+ link:
239
+ one: Delete the selected record
240
+ other: Delete the %{count} selected records
241
+ title: Delete selected records
242
+ question:
243
+ one: Delete this record? This cannot be undone.
244
+ other: Delete these %{count} records? This cannot be undone.
245
+ skipped:
246
+ one: 1 selected record cannot be deleted by you and will be kept.
247
+ other: "%{count} selected records cannot be deleted by you and will be kept."
248
+ each_note: Each record is deleted on its own and recorded in the audit; a record that cannot be deleted does not stop the others.
249
+ submit:
250
+ one: Delete 1 record
251
+ other: Delete %{count} records
252
+ deleting: Deleting…
253
+ done:
254
+ one: Deleted 1 record.
255
+ other: Deleted %{count} records.
256
+ result_title: Delete results
257
+ deleted:
258
+ one: Deleted 1 record.
259
+ other: Deleted %{count} records.
260
+ not_deleted: These records were not deleted
261
+ reason: Reason
262
+ collection_jobs:
263
+ waiting: Waiting for a worker. The oldest item has been queued for %{age}.
264
+ waiting_hint_html: >-
265
+ If this does not change, ask the host maintainer to check that a job worker processes the %{queue}
266
+ queue or that the collection scan is scheduled.
267
+ intro: Your latest accessible runs in the current tenant.
268
+ empty: No accessible collection runs.
269
+ status_html: 'Status: %{status}'
270
+ refresh: Refresh status
271
+ warning: The committed run has a host callback warning. Ask the host maintainer to review it.
272
+ cancel: Cancel remaining items
273
+ committed_note: >-
274
+ Each succeeded item is committed. Follow-up delivery is tracked separately and can remain pending
275
+ after business success.
276
+ items: Current visible item results
277
+ record: Record
278
+ business_status: Business status
279
+ reason: Reason
280
+ follow_up: Follow-up work
281
+ callback_warning: "(callback warning)"
282
+ hidden: Some items are not currently visible under your permissions.
283
+ busy: The run is busy. Reload and try again.
284
+ cancel_unknown: >-
285
+ Cancellation outcome is unknown. Refresh this existing run after recovery before taking further
286
+ action.
287
+ cancelled: Cancellation processed. Already committed records and their follow-up work are retained.
288
+ surfaces:
289
+ native:
290
+ create: Create %{label}
291
+ update: Update %{label}
292
+ destroy: Delete %{label}
293
+ destroy_note: Confirming deletes this record. This cannot be undone.
294
+ hidden_value: (set; not shown to you)
295
+ proposed_changes: Proposed visible changes
296
+ dismiss: Dismiss
297
+ dismissed: Dismissed. Nothing was changed.
298
+ title: Interactive review
299
+ saved_note: This review is saved. You can reload or return to it until it is confirmed or expires.
300
+ completed_html: Completed. Recorded as operation %{run}.
301
+ assistant_note: >-
302
+ An assistant proposed this. Nothing has been saved yet; only your confirmation applies this exact
303
+ target and input, once.
304
+ native_note: >-
305
+ Nothing has been saved yet. Confirming applies this exact target and input once, whether you confirm
306
+ here or on the original page.
307
+ expired: This review can no longer be confirmed. Start a new review from the record.
308
+ unavailable: This review is unavailable.
309
+ no_longer_available: This review is no longer available.
310
+ references:
311
+ more:
312
+ one: and 1 more
313
+ other: and %{count} more
314
+ key_placeholder: "%{target} ID"
315
+ current: 'Currently: %{label}'
316
+ find: Search %{target}
317
+ searching: Searching…
318
+ none: No matching records.
319
+ failed: Search is not available. Type the ID instead.
320
+ results:
321
+ one: "%{count} match. Choose one below."
322
+ other: "%{count} matches. Choose one below."
323
+ chosen: 'Chosen: %{label}'
324
+ not_available: "%{label} (not available)"
325
+ actions:
326
+ cancel: Cancel
327
+ save: Save
328
+ saving: Saving…
329
+ layout:
330
+ skip: Skip to content
331
+ overview: Overview
332
+ assistant: Assistant
333
+ collection_jobs: Collection jobs
334
+ audit_log: Audit log
335
+ resources_nav: Admin resources
336
+ return_state_discarded: Some list settings are no longer available. Return links use the current
337
+ permitted list.
338
+ administration: Administration
339
+ settings_unavailable: Some list settings are no longer available.
340
+ dashboard:
341
+ count:
342
+ one: 1 record
343
+ other: "%{number} records"
344
+ count_capped:
345
+ one: More than %{number} records
346
+ other: More than %{number} records
347
+ title: Overview
348
+ more_than: More than %{number}
349
+ trend_total:
350
+ one: "%{number} in the last %{days} days."
351
+ other: "%{number} in the last %{days} days."
352
+ trend_capped: Only the most recent 50,000 were counted.
353
+ show_data: Show the numbers
354
+ day: Day
355
+ records: Records
356
+ intro: Select a resource to manage. Available resources follow your current permissions.
357
+ empty: No resources are available for this session.
358
+ associations:
359
+ empty: No records.
360
+ view_all: View all in %{label}
361
+ first: Showing the first %{count}.
362
+ add: Add %{label}
363
+ errors:
364
+ title: Changes were not saved
365
+ needs_reload: This form cannot be submitted again. Open a fresh form to review the latest record
366
+ and permissions.
367
+ recovery:
368
+ notice: Your session needs attention. This tab is keeping your unsaved input in memory.
369
+ sign_in: Sign in in another tab
370
+ sign_in_elsewhere: Sign in through the host application in another tab, then return here.
371
+ resume: Resume after signing in
372
+ statuses:
373
+ sign_in: Sign in
374
+ authentication_required:
375
+ title: Authentication required
376
+ message: Sign in through the host application to continue.
377
+ forbidden:
378
+ title: Access unavailable
379
+ message: Your current permissions do not allow this page.
380
+ not_found:
381
+ title: Not found
382
+ message: This page or record is not available under your current access.
383
+ conflict:
384
+ title: The request has changed
385
+ message: Review the current records and permissions before preparing a fresh request.
386
+ invalid_query:
387
+ title: Invalid query
388
+ message: Open a fresh list and use the available search, sort and page settings.
389
+ invalid_request:
390
+ title: Invalid request
391
+ message: Your session or request could not be verified. Sign in and review a fresh form before
392
+ submitting.
393
+ unavailable:
394
+ title: Administration unavailable
395
+ message: Administration is not configured safely. Contact the host maintainer.
396
+ error:
397
+ title: The request needs review
398
+ message: >-
399
+ Check current records or existing operation results before retrying. A prior write may have
400
+ completed.
401
+ search:
402
+ title: Search
403
+ label: Search all records
404
+ placeholder: Search everything
405
+ none: Nothing matches “%{query}” in the records you can search.
406
+ view_all: View all matches in %{label}
407
+ open_list: Open in %{label}
408
+ prefix: Starts with…
409
+ contains: Contains…
410
+ exact: Exact match…
411
+ any: Search…
412
+ filters:
413
+ from: "%{label} from"
414
+ to: "%{label} to"
415
+ equals: "%{label} equals"
416
+ any: Any
417
+ states:
418
+ count: "%{state}: %{count}"
419
+ queued: Queued
420
+ running: Running
421
+ pending: Pending
422
+ succeeded: Succeeded
423
+ failed: Failed
424
+ cancelled: Cancelled
425
+ proposed: Proposed
426
+ admitted: Admitted
427
+ unknown: Unknown
428
+ reconciliation_required: Reconciliation required
429
+ operations:
430
+ confirm_title: Confirm %{description}
431
+ review_note: Review this exact target and input. Nothing has been saved yet. Changed input requires
432
+ a new review.
433
+ target: 'Target: %{label}'
434
+ target_html: 'Target: %{label}'
435
+ confirm: Confirm and execute
436
+ executing: Executing…
437
+ edit_input: Edit input
438
+ surface_offer: Prefer to finish later? Save this exact review as an interactive view you can reload
439
+ and confirm.
440
+ surface_continue: Continue in an interactive review
441
+ failure_title: Operation needs a new review
442
+ failure_note: Nothing was changed. Check the current record and your permissions, then start a new
443
+ review.
444
+ review_record: Review current record
445
+ review: Review operation
446
+ preparing: Preparing review…
447
+ completed: Operation completed.
448
+ completed_with_work: Operation completed. Follow-up work is pending or separately tracked.
449
+ collection_operations:
450
+ review_title: Review collection changes
451
+ targets_note:
452
+ one: "%{count} fixed target. Each target commits independently. Cancellation preserves committed
453
+ changes."
454
+ other: "%{count} fixed targets. Each target commits independently. Cancellation preserves committed
455
+ changes."
456
+ confirmed_input: Confirmed input
457
+ previews: Target previews
458
+ target_id: 'ID: %{id}'
459
+ no_differences: No readable field differences were supplied. Domain checks still run during execution.
460
+ confirm: Confirm and queue
461
+ edit_input: Edit inputs
462
+ failure_title: Collection operation needs review
463
+ uncertain: The admission outcome is unknown. Check the existing run and retry the same intent after
464
+ recovery.
465
+ check_run: Check existing run
466
+ failure_note: Nothing was queued. Check the current selection and your permissions, then start a
467
+ new review.
468
+ return: Return to resource
469
+ form_note:
470
+ one: "%{count} fixed target. Review before queueing changes."
471
+ other: "%{count} fixed targets. Review before queueing changes."
472
+ review: Review changes
473
+ admitted: Run admitted. Each record is executed separately; queued work is not a completed change.
474
+ assistant:
475
+ ask: Ask
476
+ ask_record: Ask the assistant about this record
477
+ ask_list: Ask the assistant about this list
478
+ ask_record_placeholder: For example, “Who changed this last?” or “Set the status to closed.”
479
+ ask_list_placeholder: For example, “How many of these were created this week?”
480
+ intro: >-
481
+ Ask about the records you can already see. The assistant reads through your current permissions
482
+ and cannot change data; any change it suggests opens a review that you confirm yourself.
483
+ new: New conversation
484
+ none: No conversations yet.
485
+ from: Conversation from %{time}
486
+ archived_mark: archived
487
+ closed_mark: closed
488
+ all: All conversations
489
+ conversation: Conversation
490
+ title: Assistant conversation
491
+ archived_note: This conversation is archived.
492
+ closed_note: This conversation is closed because your access changed. Start a new conversation.
493
+ message: Message
494
+ send: Send
495
+ sending: Sending…
496
+ compose_placeholder: Message the assistant…
497
+ shortcut: Enter to send · Shift+Enter for a new line
498
+ transcript: Conversation messages
499
+ latest: Jump to latest
500
+ archive: Archive conversation
501
+ archived: Conversation archived.
502
+ empty_title: How can I help?
503
+ empty: Ask about your records, or propose a change to review.
504
+ roles:
505
+ user: You
506
+ review: Review
507
+ assistant: Assistant
508
+ records: Records
509
+ working: The assistant is working…
510
+ waiting: Waiting for the assistant…
511
+ refresh: Refresh
512
+ stop: Stop
513
+ try_again: Try again
514
+ retrying: Retrying (%{attempt} of %{attempts})…
515
+ invalid_message: Write a message of up to %{count} characters.
516
+ rate_limited:
517
+ one: >-
518
+ You have sent %{count} message to the assistant in the last 24 hours, which is this administration's
519
+ limit. Your message was not sent; try again later.
520
+ other: >-
521
+ You have sent %{count} messages to the assistant in the last 24 hours, which is this administration's
522
+ limit. Your message was not sent; try again later.
523
+ failures:
524
+ ai_unavailable: The assistant is not available right now. The rest of the administration works
525
+ as usual.
526
+ ai_rejected: The AI provider rejected this request. Try a shorter or different message.
527
+ provider_unavailable: The AI provider did not respond. Your message is saved; try again.
528
+ assistant_failed: The assistant could not finish. Your message is saved; try again.
529
+ attempts_exhausted: The assistant stopped after several attempts. Your message is saved; try again.
530
+ step_limit: The assistant stopped before finishing this request. Try a narrower question.
531
+ authorization_revoked: Your access changed, so this request was not answered.
532
+ not_allowed: No resources are available to the assistant for your account.
533
+ cancelled: Stopped.
534
+ script:
535
+ leave_form: Leave this form? Unsaved changes will be lost.
536
+ session_attention: >-
537
+ Your session needs attention. Sign in in another tab, then resume here. Unsaved input stays only
538
+ in this open tab.
539
+ restored_partial: >-
540
+ Session restored. Some fields are no longer editable; their input was not restored. Review the
541
+ form, then save explicitly.
542
+ restored: >-
543
+ Session restored. Your input is ready for review. Nothing has been saved; submit explicitly when
544
+ ready.
545
+ return_changed: Some list settings changed; return links use the current permitted list.
546
+ recovery_failed: >-
547
+ Recovery was not completed. Sign in as the original user and tenant, then try again. Changed records,
548
+ permissions, schema, time zone, expired recovery windows or completed requests require a fresh
549
+ form. This tab still holds your input; nothing was submitted again.
data/config/routes.rb ADDED
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ RailsAiAdmin::Engine.routes.draw do
4
+ # HTML only: "/orders/1.5" is not record 1 in format "5" (RAA-022).
5
+ scope format: false do
6
+ root to: "dashboard#index"
7
+ # Drawn only for hosts that opt in and load rails_tool_views themselves.
8
+ if RailsAiAdmin.configuration.surfaces
9
+ get "assistant/surfaces/:surface_id", to: "surfaces#show", as: :admin_surface
10
+ post "assistant/surfaces/:surface_id/actions", to: "surfaces#act", as: :admin_surface_actions
11
+ post ":resource/:id/operations/:operation/surface", to: "surfaces#create", as: :operation_surface
12
+ end
13
+ # Drawn only for hosts that opt in and load ruby_llm themselves.
14
+ if RailsAiAdmin.configuration.assistant
15
+ get "assistant", to: "assistant#index", as: :assistant
16
+ post "assistant/conversations", to: "assistant#create", as: :assistant_conversations
17
+ get "assistant/conversations/:chat_ref", to: "assistant#show", as: :assistant_conversation
18
+ post "assistant/conversations/:chat_ref/messages", to: "assistant#message", as: :assistant_messages
19
+ post "assistant/conversations/:chat_ref/cancel", to: "assistant#cancel", as: :cancel_assistant_conversation
20
+ post "assistant/conversations/:chat_ref/retry", to: "assistant#retry_turn", as: :retry_assistant_conversation
21
+ post "assistant/conversations/:chat_ref/archive", to: "assistant#archive", as: :archive_assistant_conversation
22
+ end
23
+ # Drawn only for hosts that opt in; MCP builds on the assistant setup.
24
+ if RailsAiAdmin.configuration.mcp
25
+ post "mcp", to: "mcp#handle", as: :mcp
26
+ get "mcp", to: "mcp#unsupported"
27
+ delete "mcp", to: "mcp#unsupported"
28
+ get "mcp/tokens", to: "mcp_tokens#index", as: :mcp_tokens
29
+ post "mcp/tokens", to: "mcp_tokens#create"
30
+ post "mcp/tokens/:id/revoke", to: "mcp_tokens#revoke", as: :revoke_mcp_token
31
+ end
32
+ get "search", to: "search#index", as: :global_search
33
+ get "audit", to: "audit#index", as: :audit_log
34
+ get "jobs", to: "collection_jobs#index", as: :collection_jobs
35
+ get "jobs/:job_ref", to: "collection_jobs#show", as: :collection_job
36
+ post "jobs/:job_ref/cancel", to: "collection_jobs#cancel", as: :cancel_collection_job
37
+ get ":resource/operations/:operation", to: "collection_operations#new", as: :collection_operation_form
38
+ post ":resource/operations/:operation/preflight", to: "collection_operations#preflight", as: :collection_operation_preflight
39
+ post ":resource/operations/:operation/execute", to: "collection_operations#execute", as: :collection_operation_execute
40
+ post ":resource/selections", to: "selections#create", as: :capture_selection
41
+ post ":resource/exports", to: "exports#create", as: :resource_export
42
+ get ":resource/imports/new", to: "imports#new", as: :new_resource_import
43
+ get ":resource/imports/template", to: "imports#template", as: :resource_import_template
44
+ post ":resource/imports", to: "imports#create", as: :resource_imports
45
+ get "selections/:selection_ref", to: "selections#show", as: :selection
46
+ get "selections/:selection_ref/destroy", to: "selections#confirm_destroy", as: :confirm_destroy_selection
47
+ post "selections/:selection_ref/destroy", to: "selections#destroy", as: :destroy_selection
48
+ get ":resource/:id/operations/:operation", to: "operations#new", as: :operation_form
49
+ post ":resource/:id/operations/:operation/preflight", to: "operations#preflight", as: :operation_preflight
50
+ post ":resource/:id/operations/:operation/execute", to: "operations#execute", as: :operation_execute
51
+ get ":resource/forms/recover", to: "resources#recover_form", as: :recover_resource_form
52
+ get ":resource/references/search", to: "references#search", as: :reference_search
53
+ get ":resource/new", to: "resources#new", as: :new_resource
54
+ get ":resource/:id/edit", to: "resources#edit", as: :edit_resource
55
+ get ":resource/:id/confirm_destroy", to: "resources#confirm_destroy", as: :confirm_destroy_resource
56
+ get ":resource/:id/history", to: "resources#history", as: :resource_history
57
+ get ":resource/:id/files/:field", to: "files#show", as: :resource_file
58
+ get ":resource", to: "resources#index", as: :resources
59
+ post ":resource", to: "resources#create"
60
+ get ":resource/:id", to: "resources#show", as: :resource
61
+ patch ":resource/:id", to: "resources#update"
62
+ delete ":resource/:id", to: "resources#destroy"
63
+ end
64
+ end