feat(parity): align Chatwoot 4.15.1 contracts

This commit is contained in:
2026-07-14 12:11:52 +08:00
parent d16bb55d91
commit c3806b701a
84 changed files with 4013 additions and 575 deletions
+394 -383
View File
@@ -1,6 +1,6 @@
# Chatwoot Route Source Declarations
Source: `reference/chatwoot/config/routes.rb`
Source: `docs/chatwoot/config/routes.rb`
Ruby is unavailable in the current workspace, so this file records static route DSL declarations with source lines. It is a repeatable fallback until `bin/rails routes` can run.
@@ -37,390 +37,401 @@ Ruby is unavailable in the current workspace, so this file records static route
| 54 | `namespace :actions do` |
| 55 | `resource :contact_merge, only: [:create]` |
| 57 | `resource :bulk_actions, only: [:create]` |
| 58 | `resource :onboarding, only: [:update]` |
| 59 | `resources :agents, only: [:index, :create, :update, :destroy] do` |
| 60 | `post :bulk_create, on: :collection` |
| 62 | `namespace :captain do` |
| 63 | `resource :preferences, only: [:show, :update]` |
| 64 | `resources :assistants do` |
| 66 | `post :playground` |
| 69 | `get :tools` |
| 71 | `resources :inboxes, only: [:index, :create, :destroy], param: :inbox_id` |
| 72 | `resources :scenarios` |
| 74 | `resources :assistant_responses` |
| 75 | `resources :bulk_actions, only: [:create]` |
| 76 | `resources :copilot_threads, only: [:index, :create] do` |
| 77 | `resources :copilot_messages, only: [:index, :create]` |
| 79 | `resources :custom_tools do` |
| 80 | `post :test, on: :collection` |
| 82 | `resources :documents, only: [:index, :show, :create, :destroy] do` |
| 83 | `post :sync, on: :member` |
| 85 | `resource :tasks, only: [], controller: 'tasks' do` |
| 86 | `post :rewrite` |
| 87 | `post :summarize` |
| 88 | `post :reply_suggestion` |
| 89 | `post :label_suggestion` |
| 90 | `post :follow_up` |
| 93 | `resource :saml_settings, only: [:show, :create, :update, :destroy]` |
| 94 | `resources :agent_bots, only: [:index, :create, :show, :update, :destroy] do` |
| 95 | `delete :avatar, on: :member` |
| 96 | `post :reset_access_token, on: :member` |
| 97 | `post :reset_secret, on: :member` |
| 99 | `resources :contact_inboxes, only: [] do` |
| 101 | `post :filter` |
| 104 | `resources :assignable_agents, only: [:index]` |
| 105 | `resource :audit_logs, only: [:show]` |
| 106 | `resources :callbacks, only: [] do` |
| 108 | `post :register_facebook_page` |
| 109 | `get :register_facebook_page` |
| 110 | `post :facebook_pages` |
| 111 | `post :reauthorize_page` |
| 114 | `resources :canned_responses, only: [:index, :create, :update, :destroy]` |
| 115 | `resources :automation_rules, only: [:index, :create, :show, :update, :destroy] do` |
| 116 | `post :clone` |
| 118 | `resources :macros, only: [:index, :create, :show, :update, :destroy] do` |
| 119 | `post :execute, on: :member` |
| 121 | `resources :sla_policies, only: [:index, :create, :show, :update, :destroy]` |
| 122 | `resources :custom_roles, only: [:index, :create, :show, :update, :destroy]` |
| 123 | `resources :agent_capacity_policies, only: [:index, :create, :show, :update, :destroy] do` |
| 124 | `scope module: :agent_capacity_policies do` |
| 125 | `resources :users, only: [:index, :create, :destroy]` |
| 126 | `resources :inbox_limits, only: [:create, :update, :destroy]` |
| 129 | `resources :campaigns, only: [:index, :create, :show, :update, :destroy]` |
| 130 | `resources :dashboard_apps, only: [:index, :show, :create, :update, :destroy]` |
| 131 | `namespace :channels do` |
| 132 | `resource :twilio_channel, only: [:create]` |
| 134 | `resources :conversations, only: [:index, :create, :show, :update, :destroy] do` |
| 136 | `get :meta` |
| 137 | `get :search` |
| 138 | `get :unread_counts, to: 'conversations/unread_counts#index'` |
| 139 | `post :filter` |
| 141 | `scope module: :conversations do` |
| 142 | `resources :messages, only: [:index, :create, :destroy, :update] do` |
| 144 | `post :translate` |
| 145 | `post :retry` |
| 148 | `resources :assignments, only: [:create]` |
| 149 | `resources :labels, only: [:create, :index]` |
| 150 | `resource :participants, only: [:show, :create, :update, :destroy]` |
| 151 | `resource :direct_uploads, only: [:create]` |
| 152 | `resource :draft_messages, only: [:show, :update, :destroy]` |
| 155 | `post :mute` |
| 156 | `post :unmute` |
| 157 | `post :transcript` |
| 158 | `post :toggle_status` |
| 159 | `post :toggle_priority` |
| 160 | `post :toggle_typing_status` |
| 161 | `post :update_last_seen` |
| 162 | `post :unread` |
| 163 | `post :custom_attributes` |
| 164 | `get :attachments` |
| 165 | `get :inbox_assistant` |
| 166 | `get :reporting_events if ChatwootApp.enterprise?` |
| 170 | `resources :search, only: [:index] do` |
| 172 | `get :conversations` |
| 173 | `get :messages` |
| 174 | `get :contacts` |
| 175 | `get :articles` |
| 179 | `resources :companies, only: [:index, :show, :create, :update, :destroy] do` |
| 181 | `get :search` |
| 184 | `post :destroy_custom_attributes` |
| 185 | `delete :avatar` |
| 187 | `scope module: :companies do` |
| 188 | `resources :contacts, only: [:index, :create, :destroy] do` |
| 190 | `get :search` |
| 193 | `resources :conversations, only: [:index]` |
| 194 | `resources :notes, only: [:index]` |
| 197 | `resources :contacts, only: [:index, :show, :update, :create, :destroy] do` |
| 199 | `get :active` |
| 200 | `get :search` |
| 201 | `post :filter` |
| 202 | `post :import` |
| 203 | `post :export` |
| 206 | `get :contactable_inboxes` |
| 207 | `post :destroy_custom_attributes` |
| 208 | `delete :avatar` |
| 210 | `scope module: :contacts do` |
| 211 | `resources :conversations, only: [:index]` |
| 212 | `resources :contact_inboxes, only: [:create]` |
| 213 | `resources :labels, only: [:create, :index]` |
| 214 | `resources :notes` |
| 215 | `get :attachments, to: 'attachments#index'` |
| 216 | `post :call, on: :member, to: 'calls#create' if ChatwootApp.enterprise?` |
| 219 | `resources :csat_survey_responses, only: [:index] do` |
| 221 | `get :metrics` |
| 222 | `get :download` |
| 225 | `patch :update if ChatwootApp.enterprise?` |
| 228 | `resources :applied_slas, only: [:index] do` |
| 230 | `get :metrics` |
| 231 | `get :download` |
| 234 | `resources :reporting_events, only: [:index] if ChatwootApp.enterprise?` |
| 237 | `resources :whatsapp_calls, only: [:show] do` |
| 239 | `post :accept` |
| 240 | `post :reject` |
| 241 | `post :terminate` |
| 242 | `post :upload_recording` |
| 245 | `post :initiate` |
| 250 | `resources :custom_attribute_definitions, only: [:index, :show, :create, :update, :destroy]` |
| 251 | `resources :custom_filters, only: [:index, :show, :create, :update, :destroy]` |
| 252 | `resources :inboxes, only: [:index, :show, :create, :update, :destroy] do` |
| 253 | `get :assignable_agents, on: :member` |
| 254 | `get :campaigns, on: :member` |
| 255 | `get :agent_bot, on: :member` |
| 256 | `post :set_agent_bot, on: :member` |
| 257 | `delete :avatar, on: :member` |
| 258 | `post :sync_templates, on: :member` |
| 259 | `get :health, on: :member` |
| 260 | `post :register_webhook, on: :member` |
| 261 | `post :reset_secret, on: :member` |
| 263 | `resource :conference, only: %i[create destroy], controller: 'conference' do` |
| 264 | `get :token, on: :member` |
| 266 | `post :enable_whatsapp_calling, on: :member` |
| 267 | `post :disable_whatsapp_calling, on: :member` |
| 270 | `resource :csat_template, only: [:show, :create], controller: 'inbox_csat_templates' do` |
| 271 | `post :analyze, on: :collection` |
| 275 | `resources :inbox_members, only: [:create, :show], param: :inbox_id do` |
| 277 | `delete :destroy` |
| 278 | `patch :update` |
| 281 | `resources :labels, only: [:index, :show, :create, :update, :destroy]` |
| 283 | `resources :notifications, only: [:index, :update, :destroy] do` |
| 285 | `post :read_all` |
| 286 | `get :unread_count` |
| 287 | `post :destroy_all` |
| 290 | `post :snooze` |
| 291 | `post :unread` |
| 294 | `resource :notification_settings, only: [:show, :update]` |
| 296 | `resources :teams do` |
| 297 | `resources :team_members, only: [:index, :create] do` |
| 299 | `delete :destroy` |
| 300 | `patch :update` |
| 306 | `resources :assignment_policies do` |
| 307 | `resources :inboxes, only: [:index, :create, :destroy], module: :assignment_policies` |
| 310 | `resources :inboxes, only: [] do` |
| 311 | `resource :assignment_policy, only: [:show, :create, :destroy], module: :inboxes` |
| 314 | `namespace :twitter do` |
| 315 | `resource :authorization, only: [:create]` |
| 318 | `namespace :microsoft do` |
| 319 | `resource :authorization, only: [:create]` |
| 322 | `namespace :google do` |
| 58 | `resource :onboarding, only: [:update] do` |
| 59 | `get :help_center_generation` |
| 61 | `resources :agents, only: [:index, :create, :update, :destroy] do` |
| 62 | `post :bulk_create, on: :collection` |
| 64 | `namespace :captain do` |
| 65 | `resource :preferences, only: [:show, :update]` |
| 66 | `resources :assistants do` |
| 68 | `post :playground` |
| 69 | `get :stats` |
| 70 | `get :summary` |
| 71 | `get :drilldown` |
| 74 | `get :tools` |
| 76 | `resources :inboxes, only: [:index, :create, :destroy], param: :inbox_id` |
| 77 | `resources :scenarios` |
| 79 | `resources :assistant_responses` |
| 80 | `resources :message_reports, only: [:create]` |
| 81 | `resources :bulk_actions, only: [:create]` |
| 82 | `resources :copilot_threads, only: [:index, :create] do` |
| 83 | `resources :copilot_messages, only: [:index, :create]` |
| 85 | `resources :custom_tools do` |
| 86 | `post :test, on: :collection` |
| 88 | `resources :documents, only: [:index, :show, :create, :destroy] do` |
| 89 | `post :sync, on: :member` |
| 91 | `resource :tasks, only: [], controller: 'tasks' do` |
| 92 | `post :rewrite` |
| 93 | `post :summarize` |
| 94 | `post :reply_suggestion` |
| 95 | `post :label_suggestion` |
| 96 | `post :follow_up` |
| 99 | `resource :saml_settings, only: [:show, :create, :update, :destroy]` |
| 100 | `resources :agent_bots, only: [:index, :create, :show, :update, :destroy] do` |
| 101 | `delete :avatar, on: :member` |
| 102 | `post :reset_access_token, on: :member` |
| 103 | `post :reset_secret, on: :member` |
| 105 | `resources :contact_inboxes, only: [] do` |
| 107 | `post :filter` |
| 110 | `resources :assignable_agents, only: [:index]` |
| 111 | `resource :audit_logs, only: [:show]` |
| 112 | `resources :callbacks, only: [] do` |
| 114 | `post :register_facebook_page` |
| 115 | `get :register_facebook_page` |
| 116 | `post :facebook_pages` |
| 117 | `post :reauthorize_page` |
| 120 | `resources :canned_responses, only: [:index, :create, :update, :destroy]` |
| 121 | `resources :automation_rules, only: [:index, :create, :show, :update, :destroy] do` |
| 122 | `post :clone` |
| 124 | `resources :macros, only: [:index, :create, :show, :update, :destroy] do` |
| 125 | `post :execute, on: :member` |
| 127 | `resources :sla_policies, only: [:index, :create, :show, :update, :destroy]` |
| 128 | `resources :custom_roles, only: [:index, :create, :show, :update, :destroy]` |
| 129 | `resources :agent_capacity_policies, only: [:index, :create, :show, :update, :destroy] do` |
| 130 | `scope module: :agent_capacity_policies do` |
| 131 | `resources :users, only: [:index, :create, :destroy]` |
| 132 | `resources :inbox_limits, only: [:create, :update, :destroy]` |
| 135 | `resources :campaigns, only: [:index, :create, :show, :update, :destroy]` |
| 136 | `resources :dashboard_apps, only: [:index, :show, :create, :update, :destroy]` |
| 137 | `namespace :channels do` |
| 138 | `resource :twilio_channel, only: [:create]` |
| 140 | `resources :conversations, only: [:index, :create, :show, :update, :destroy] do` |
| 142 | `get :meta` |
| 143 | `get :search` |
| 144 | `get :unread_counts, to: 'conversations/unread_counts#index'` |
| 145 | `post :filter` |
| 147 | `scope module: :conversations do` |
| 148 | `resources :messages, only: [:index, :create, :destroy, :update] do` |
| 150 | `post :translate` |
| 151 | `post :retry` |
| 154 | `resources :assignments, only: [:create]` |
| 155 | `resources :labels, only: [:create, :index]` |
| 156 | `resource :participants, only: [:show, :create, :update, :destroy]` |
| 157 | `resource :direct_uploads, only: [:create]` |
| 158 | `resource :draft_messages, only: [:show, :update, :destroy]` |
| 161 | `post :mute` |
| 162 | `post :unmute` |
| 163 | `post :transcript` |
| 164 | `post :toggle_status` |
| 165 | `post :toggle_priority` |
| 166 | `post :toggle_typing_status` |
| 167 | `post :update_last_seen` |
| 168 | `post :unread` |
| 169 | `post :custom_attributes` |
| 170 | `get :attachments` |
| 171 | `get :inbox_assistant` |
| 172 | `get :reporting_events if ChatwootApp.enterprise?` |
| 176 | `resources :search, only: [:index] do` |
| 178 | `get :conversations` |
| 179 | `get :messages` |
| 180 | `get :contacts` |
| 181 | `get :articles` |
| 185 | `resources :companies, only: [:index, :show, :create, :update, :destroy] do` |
| 187 | `get :search` |
| 190 | `post :destroy_custom_attributes` |
| 191 | `delete :avatar` |
| 193 | `scope module: :companies do` |
| 194 | `resources :contacts, only: [:index, :create, :destroy] do` |
| 196 | `get :search` |
| 199 | `resources :conversations, only: [:index]` |
| 200 | `resources :notes, only: [:index]` |
| 203 | `resources :contacts, only: [:index, :show, :update, :create, :destroy] do` |
| 205 | `get :active` |
| 206 | `get :search` |
| 207 | `post :filter` |
| 208 | `post :import` |
| 209 | `post :export` |
| 212 | `get :contactable_inboxes` |
| 213 | `post :destroy_custom_attributes` |
| 214 | `delete :avatar` |
| 216 | `scope module: :contacts do` |
| 217 | `resources :conversations, only: [:index]` |
| 218 | `resources :contact_inboxes, only: [:create]` |
| 219 | `resources :labels, only: [:create, :index]` |
| 220 | `resources :notes` |
| 221 | `get :attachments, to: 'attachments#index'` |
| 222 | `post :call, on: :member, to: 'calls#create' if ChatwootApp.enterprise?` |
| 225 | `resources :csat_survey_responses, only: [:index] do` |
| 227 | `get :metrics` |
| 228 | `get :download` |
| 231 | `patch :update if ChatwootApp.enterprise?` |
| 234 | `resources :applied_slas, only: [:index] do` |
| 236 | `get :metrics` |
| 237 | `get :download` |
| 240 | `resources :reporting_events, only: [:index] if ChatwootApp.enterprise?` |
| 243 | `resources :calls, only: [:index]` |
| 244 | `resources :whatsapp_calls, only: [:show] do` |
| 246 | `post :accept` |
| 247 | `post :reject` |
| 248 | `post :terminate` |
| 249 | `post :upload_recording` |
| 252 | `post :initiate` |
| 257 | `resources :custom_attribute_definitions, only: [:index, :show, :create, :update, :destroy]` |
| 258 | `resources :custom_filters, only: [:index, :show, :create, :update, :destroy]` |
| 259 | `resources :inboxes, only: [:index, :show, :create, :update, :destroy] do` |
| 260 | `get :assignable_agents, on: :member` |
| 261 | `get :campaigns, on: :member` |
| 262 | `get :agent_bot, on: :member` |
| 263 | `post :set_agent_bot, on: :member` |
| 264 | `delete :avatar, on: :member` |
| 265 | `post :sync_templates, on: :member` |
| 266 | `get :health, on: :member` |
| 267 | `post :register_webhook, on: :member` |
| 268 | `post :reset_secret, on: :member` |
| 270 | `resource :conference, only: %i[create destroy], controller: 'conference' do` |
| 271 | `get :token, on: :member` |
| 273 | `post :enable_whatsapp_calling, on: :member` |
| 274 | `post :disable_whatsapp_calling, on: :member` |
| 275 | `post :set_inbound_calls, on: :member` |
| 278 | `resource :csat_template, only: [:show, :create], controller: 'inbox_csat_templates' do` |
| 279 | `post :analyze, on: :collection` |
| 283 | `resources :inbox_members, only: [:create, :show], param: :inbox_id do` |
| 285 | `delete :destroy` |
| 286 | `patch :update` |
| 289 | `resources :labels, only: [:index, :show, :create, :update, :destroy]` |
| 291 | `resources :notifications, only: [:index, :update, :destroy] do` |
| 293 | `post :read_all` |
| 294 | `get :unread_count` |
| 295 | `post :destroy_all` |
| 298 | `post :snooze` |
| 299 | `post :unread` |
| 302 | `resource :notification_settings, only: [:show, :update]` |
| 304 | `resources :teams do` |
| 305 | `resources :team_members, only: [:index, :create] do` |
| 307 | `delete :destroy` |
| 308 | `patch :update` |
| 314 | `resources :assignment_policies do` |
| 315 | `resources :inboxes, only: [:index, :create, :destroy], module: :assignment_policies` |
| 318 | `resources :inboxes, only: [] do` |
| 319 | `resource :assignment_policy, only: [:show, :create, :destroy], module: :inboxes` |
| 322 | `namespace :twitter do` |
| 323 | `resource :authorization, only: [:create]` |
| 326 | `namespace :instagram do` |
| 326 | `namespace :microsoft do` |
| 327 | `resource :authorization, only: [:create]` |
| 330 | `namespace :tiktok do` |
| 330 | `namespace :google do` |
| 331 | `resource :authorization, only: [:create]` |
| 334 | `namespace :notion do` |
| 334 | `namespace :instagram do` |
| 335 | `resource :authorization, only: [:create]` |
| 338 | `namespace :whatsapp do` |
| 338 | `namespace :tiktok do` |
| 339 | `resource :authorization, only: [:create]` |
| 342 | `resources :webhooks, only: [:index, :create, :update, :destroy]` |
| 343 | `namespace :integrations do` |
| 344 | `resources :apps, only: [:index, :show]` |
| 345 | `resources :hooks, only: [:show, :create, :update, :destroy] do` |
| 347 | `post :process_event` |
| 350 | `resource :slack, only: [:create, :update, :destroy], controller: 'slack' do` |
| 352 | `get :list_all_channels` |
| 355 | `resource :dyte, controller: 'dyte', only: [] do` |
| 357 | `post :create_a_meeting` |
| 358 | `post :add_participant_to_meeting` |
| 361 | `resource :shopify, controller: 'shopify', only: [:destroy] do` |
| 363 | `post :auth` |
| 364 | `get :orders` |
| 367 | `resource :linear, controller: 'linear', only: [] do` |
| 369 | `delete :destroy` |
| 370 | `get :teams` |
| 371 | `get :team_entities` |
| 372 | `post :create_issue` |
| 373 | `post :link_issue` |
| 374 | `post :unlink_issue` |
| 375 | `get :search_issue` |
| 376 | `get :linked_issues` |
| 379 | `resource :notion, controller: 'notion', only: [] do` |
| 381 | `delete :destroy` |
| 385 | `resources :portals do` |
| 387 | `patch :archive` |
| 388 | `delete :logo` |
| 389 | `post :send_instructions` |
| 390 | `get :ssl_status` |
| 392 | `resources :categories do` |
| 393 | `post :reorder, on: :collection` |
| 395 | `namespace :articles do` |
| 396 | `resource :bulk_actions, only: [] do` |
| 397 | `post :translate` |
| 398 | `patch :update_status` |
| 399 | `patch :update_category` |
| 400 | `delete :delete_articles` |
| 403 | `resources :articles do` |
| 404 | `post :reorder, on: :collection` |
| 408 | `resources :upload, only: [:create]` |
| 414 | `namespace :integrations do` |
| 415 | `resources :webhooks, only: [:create]` |
| 419 | `post 'auth/saml_login', to: 'auth#saml_login'` |
| 421 | `resource :profile, only: [:show, :update] do` |
| 422 | `delete :avatar, on: :collection` |
| 424 | `post :availability` |
| 425 | `post :auto_offline` |
| 426 | `put :set_active_account` |
| 427 | `post :resend_confirmation` |
| 428 | `post :reset_access_token` |
| 432 | `scope module: 'profile' do` |
| 433 | `resource :mfa, controller: 'mfa', only: [:show, :create, :destroy] do` |
| 434 | `post :verify` |
| 435 | `post :backup_codes` |
| 440 | `resource :notification_subscriptions, only: [:create, :destroy]` |
| 442 | `namespace :widget do` |
| 443 | `resource :direct_uploads, only: [:create]` |
| 444 | `resource :config, only: [:create]` |
| 445 | `resources :campaigns, only: [:index]` |
| 446 | `resources :events, only: [:create]` |
| 447 | `resources :messages, only: [:index, :create, :update]` |
| 448 | `resources :conversations, only: [:index, :create] do` |
| 450 | `post :destroy_custom_attributes` |
| 451 | `post :set_custom_attributes` |
| 452 | `post :update_last_seen` |
| 453 | `post :toggle_typing` |
| 454 | `post :transcript` |
| 455 | `get :toggle_status` |
| 458 | `resource :contact, only: [:show, :update] do` |
| 460 | `post :destroy_custom_attributes` |
| 461 | `patch :set_user` |
| 464 | `resources :inbox_members, only: [:index]` |
| 465 | `resources :labels, only: [:create, :destroy]` |
| 466 | `namespace :integrations do` |
| 467 | `resource :dyte, controller: 'dyte', only: [] do` |
| 469 | `post :add_participant_to_meeting` |
| 476 | `namespace :v2 do` |
| 477 | `resources :accounts, only: [:create] do` |
| 478 | `scope module: :accounts do` |
| 479 | `resources :summary_reports, only: [] do` |
| 481 | `get :agent` |
| 482 | `get :team` |
| 483 | `get :inbox` |
| 484 | `get :label` |
| 485 | `get :channel` |
| 488 | `resources :reports, only: [:index] do` |
| 490 | `get :summary` |
| 491 | `get :bot_summary` |
| 492 | `get :agents` |
| 493 | `get :inboxes` |
| 494 | `get :labels` |
| 495 | `get :teams` |
| 496 | `get :conversations` |
| 497 | `get :conversations_summary` |
| 498 | `get :conversation_traffic` |
| 499 | `get :bot_metrics` |
| 500 | `get :inbox_label_matrix` |
| 501 | `get :first_response_time_distribution` |
| 502 | `get :outgoing_messages_count` |
| 505 | `resource :year_in_review, only: [:show]` |
| 506 | `resources :live_reports, only: [] do` |
| 508 | `get :conversation_metrics` |
| 509 | `get :grouped_conversation_metrics` |
| 518 | `namespace :enterprise, defaults: { format: 'json' } do` |
| 519 | `namespace :api do` |
| 520 | `namespace :v1 do` |
| 521 | `resources :accounts do` |
| 523 | `post :checkout` |
| 524 | `post :subscription` |
| 525 | `get :limits` |
| 526 | `post :toggle_deletion` |
| 527 | `post :topup_checkout` |
| 533 | `post 'webhooks/stripe', to: 'webhooks/stripe#process_payload'` |
| 534 | `post 'webhooks/firecrawl', to: 'webhooks/firecrawl#process_payload'` |
| 540 | `namespace :platform, defaults: { format: 'json' } do` |
| 541 | `namespace :api do` |
| 542 | `namespace :v1 do` |
| 543 | `resources :users, only: [:create, :show, :update, :destroy] do` |
| 545 | `get :login` |
| 546 | `post :token` |
| 549 | `resources :agent_bots, only: [:index, :create, :show, :update, :destroy] do` |
| 550 | `delete :avatar, on: :member` |
| 552 | `resources :accounts, only: [:index, :create, :show, :update, :destroy] do` |
| 553 | `resources :account_users, only: [:index, :create] do` |
| 555 | `delete :destroy` |
| 558 | `resources :email_channel_migrations, only: [:create]` |
| 566 | `namespace :public, defaults: { format: 'json' } do` |
| 567 | `namespace :api do` |
| 568 | `namespace :v1 do` |
| 569 | `resources :inboxes do` |
| 570 | `scope module: :inboxes do` |
| 571 | `resources :contacts, only: [:create, :show, :update] do` |
| 572 | `resources :conversations, only: [:index, :create, :show] do` |
| 574 | `post :toggle_status` |
| 575 | `post :toggle_typing` |
| 576 | `post :update_last_seen` |
| 579 | `resources :messages, only: [:index, :create, :update]` |
| 585 | `resources :csat_survey, only: [:show, :update]` |
| 590 | `get 'hc/:slug', to: 'public/api/v1/portals#show'` |
| 591 | `get 'hc/:slug/sitemap.xml', to: 'public/api/v1/portals#sitemap'` |
| 592 | `get 'hc/:slug/:locale', to: 'public/api/v1/portals#show', as: :public_portal_locale` |
| 593 | `get 'hc/:slug/:locale/search', to: 'public/api/v1/portals/search#index', as: :portal_search` |
| 594 | `get 'hc/:slug/:locale/articles', to: 'public/api/v1/portals/articles#index'` |
| 595 | `get 'hc/:slug/:locale/categories', to: 'public/api/v1/portals/categories#index'` |
| 596 | `get 'hc/:slug/:locale/categories/:category_slug', to: 'public/api/v1/portals/categories#show', as: :public_portal_category` |
| 597 | `get 'hc/:slug/:locale/categories/:category_slug/articles', to: 'public/api/v1/portals/articles#index'` |
| 598 | `get 'hc/:slug/articles/:article_slug.png', to: 'public/api/v1/portals/articles#tracking_pixel'` |
| 599 | `get 'hc/:slug/articles/:article_slug.md', to: 'public/api/v1/portals/articles#show_markdown', as: :public_portal_article_markdown,` |
| 601 | `get 'hc/:slug/articles/:article_slug', to: 'public/api/v1/portals/articles#show', as: :public_portal_article` |
| 605 | `resource :app, only: [:index] do` |
| 606 | `resources :accounts do` |
| 607 | `resources :conversations, only: [:show]` |
| 613 | `mount Facebook::Messenger::Server, at: 'bot'` |
| 614 | `get 'webhooks/twitter', to: 'api/v1/webhooks#twitter_crc'` |
| 615 | `post 'webhooks/twitter', to: 'api/v1/webhooks#twitter_events'` |
| 616 | `post 'webhooks/line/:line_channel_id', to: 'webhooks/line#process_payload'` |
| 617 | `post 'webhooks/telegram/:bot_token', to: 'webhooks/telegram#process_payload'` |
| 618 | `post 'webhooks/sms/:phone_number', to: 'webhooks/sms#process_payload'` |
| 619 | `get 'webhooks/whatsapp/:phone_number', to: 'webhooks/whatsapp#verify'` |
| 620 | `post 'webhooks/whatsapp/:phone_number', to: 'webhooks/whatsapp#process_payload'` |
| 621 | `get 'webhooks/instagram', to: 'webhooks/instagram#verify'` |
| 622 | `post 'webhooks/instagram', to: 'webhooks/instagram#events'` |
| 623 | `post 'webhooks/tiktok', to: 'webhooks/tiktok#events'` |
| 624 | `post 'webhooks/shopify', to: 'webhooks/shopify#events'` |
| 626 | `namespace :twitter do` |
| 627 | `resource :callback, only: [:show]` |
| 630 | `namespace :linear do` |
| 631 | `resource :callback, only: [:show]` |
| 634 | `namespace :shopify do` |
| 635 | `resource :callback, only: [:show]` |
| 638 | `namespace :twilio do` |
| 639 | `resources :callback, only: [:create]` |
| 640 | `resources :delivery_status, only: [:create]` |
| 643 | `post 'voice/call/:phone', to: 'voice#call_twiml', as: :voice_call` |
| 644 | `post 'voice/status/:phone', to: 'voice#status', as: :voice_status` |
| 645 | `post 'voice/conference_status/:phone', to: 'voice#conference_status', as: :voice_conference_status` |
| 646 | `post 'voice/recording_status/:phone', to: 'voice#recording_status', as: :voice_recording_status` |
| 650 | `get 'microsoft/callback', to: 'microsoft/callbacks#show'` |
| 651 | `get 'google/callback', to: 'google/callbacks#show'` |
| 652 | `get 'instagram/callback', to: 'instagram/callbacks#show'` |
| 653 | `get 'tiktok/callback', to: 'tiktok/callbacks#show'` |
| 654 | `get 'notion/callback', to: 'notion/callbacks#show'` |
| 657 | `get '.well-known/assetlinks.json' => 'android_app#assetlinks'` |
| 658 | `get '.well-known/apple-app-site-association' => 'apple_app#site_association'` |
| 659 | `get '.well-known/microsoft-identity-association.json' => 'microsoft#identity_association'` |
| 660 | `get '.well-known/cf-custom-hostname-challenge/:id', to: 'custom_domains#verify'` |
| 669 | `get 'super_admin/logout', to: 'super_admin/devise/sessions#destroy'` |
| 670 | `namespace :super_admin do` |
| 673 | `resource :app_config, only: [:show, :create]` |
| 674 | `resource :push_diagnostics, only: [:show, :create] do` |
| 675 | `post :destroy_subscriptions, on: :collection` |
| 679 | `resources :accounts, only: [:index, :new, :create, :show, :edit, :update, :destroy] do` |
| 680 | `post :seed, on: :member` |
| 681 | `post :reset_cache, on: :member` |
| 683 | `resources :users, only: [:index, :new, :create, :show, :edit, :update, :destroy] do` |
| 684 | `delete :avatar, on: :member, action: :destroy_avatar` |
| 687 | `resources :access_tokens, only: [:index, :show]` |
| 688 | `resources :installation_configs, only: [:index, :new, :create, :show, :edit, :update]` |
| 689 | `resources :agent_bots, only: [:index, :new, :create, :show, :edit, :update, :destroy] do` |
| 690 | `delete :avatar, on: :member, action: :destroy_avatar` |
| 692 | `resources :platform_apps, only: [:index, :new, :create, :show, :edit, :update, :destroy]` |
| 693 | `resources :platform_banners` |
| 694 | `resource :instance_status, only: [:show]` |
| 696 | `resource :settings, only: [:show] do` |
| 697 | `get :refresh, on: :collection` |
| 701 | `resources :account_users, only: [:new, :create, :show, :destroy]` |
| 704 | `mount Sidekiq::Web => '/monitoring/sidekiq'` |
| 708 | `namespace :installation do` |
| 709 | `get 'onboarding', to: 'onboarding#index'` |
| 710 | `post 'onboarding', to: 'onboarding#create'` |
| 715 | `get '/swagger/*path', to: 'swagger#respond'` |
| 716 | `get '/swagger', to: 'swagger#respond'` |
| 720 | `resources :widget_tests, only: [:index] unless Rails.env.production?` |
| 342 | `namespace :notion do` |
| 343 | `resource :authorization, only: [:create]` |
| 346 | `namespace :whatsapp do` |
| 347 | `resource :authorization, only: [:create]` |
| 350 | `resources :webhooks, only: [:index, :create, :update, :destroy]` |
| 351 | `namespace :integrations do` |
| 352 | `resources :apps, only: [:index, :show]` |
| 353 | `resources :hooks, only: [:show, :create, :update, :destroy] do` |
| 355 | `post :process_event` |
| 358 | `resource :slack, only: [:create, :update, :destroy], controller: 'slack' do` |
| 360 | `get :list_all_channels` |
| 363 | `resource :dyte, controller: 'dyte', only: [] do` |
| 365 | `post :create_a_meeting` |
| 366 | `post :add_participant_to_meeting` |
| 369 | `resource :shopify, controller: 'shopify', only: [:destroy] do` |
| 371 | `post :auth` |
| 372 | `get :orders` |
| 375 | `resource :linear, controller: 'linear', only: [] do` |
| 377 | `delete :destroy` |
| 378 | `get :teams` |
| 379 | `get :team_entities` |
| 380 | `post :create_issue` |
| 381 | `post :link_issue` |
| 382 | `post :unlink_issue` |
| 383 | `get :search_issue` |
| 384 | `get :linked_issues` |
| 387 | `resource :notion, controller: 'notion', only: [] do` |
| 389 | `delete :destroy` |
| 393 | `resources :portals do` |
| 395 | `patch :archive` |
| 396 | `delete :logo` |
| 397 | `post :send_instructions` |
| 398 | `get :ssl_status` |
| 400 | `resources :categories do` |
| 401 | `post :reorder, on: :collection` |
| 403 | `namespace :articles do` |
| 404 | `resource :bulk_actions, only: [] do` |
| 405 | `post :translate` |
| 406 | `patch :update_status` |
| 407 | `patch :update_category` |
| 408 | `delete :delete_articles` |
| 411 | `resources :articles do` |
| 412 | `post :reorder, on: :collection` |
| 416 | `resources :upload, only: [:create]` |
| 422 | `namespace :integrations do` |
| 423 | `resources :webhooks, only: [:create]` |
| 427 | `post 'auth/saml_login', to: 'auth#saml_login'` |
| 429 | `resource :profile, only: [:show, :update] do` |
| 430 | `delete :avatar, on: :collection` |
| 432 | `post :availability` |
| 433 | `post :auto_offline` |
| 434 | `put :set_active_account` |
| 435 | `post :resend_confirmation` |
| 436 | `post :reset_access_token` |
| 440 | `scope module: 'profile' do` |
| 441 | `resource :mfa, controller: 'mfa', only: [:show, :create, :destroy] do` |
| 442 | `post :verify` |
| 443 | `post :backup_codes` |
| 445 | `resources :sessions, only: [:index, :destroy]` |
| 449 | `resource :notification_subscriptions, only: [:create, :destroy]` |
| 451 | `namespace :widget do` |
| 452 | `resource :direct_uploads, only: [:create]` |
| 453 | `resource :config, only: [:create]` |
| 454 | `resources :campaigns, only: [:index]` |
| 455 | `resources :events, only: [:create]` |
| 456 | `resources :messages, only: [:index, :create, :update]` |
| 457 | `resources :conversations, only: [:index, :create] do` |
| 459 | `post :destroy_custom_attributes` |
| 460 | `post :set_custom_attributes` |
| 461 | `post :update_last_seen` |
| 462 | `post :toggle_typing` |
| 463 | `post :transcript` |
| 464 | `get :toggle_status` |
| 467 | `resource :contact, only: [:show, :update] do` |
| 469 | `post :destroy_custom_attributes` |
| 470 | `patch :set_user` |
| 473 | `resources :inbox_members, only: [:index]` |
| 474 | `resources :labels, only: [:create, :destroy]` |
| 475 | `namespace :integrations do` |
| 476 | `resource :dyte, controller: 'dyte', only: [] do` |
| 478 | `post :add_participant_to_meeting` |
| 485 | `namespace :v2 do` |
| 486 | `resources :accounts, only: [:create] do` |
| 487 | `scope module: :accounts do` |
| 488 | `resources :summary_reports, only: [] do` |
| 490 | `get :agent` |
| 491 | `get :team` |
| 492 | `get :inbox` |
| 493 | `get :label` |
| 494 | `get :channel` |
| 497 | `resources :reports, only: [:index] do` |
| 499 | `get :summary` |
| 500 | `get :bot_summary` |
| 501 | `get :agents` |
| 502 | `get :inboxes` |
| 503 | `get :labels` |
| 504 | `get :teams` |
| 505 | `get :conversations` |
| 506 | `get :conversations_summary` |
| 507 | `get :conversation_traffic` |
| 508 | `get :drilldown` |
| 509 | `get :bot_metrics` |
| 510 | `get :inbox_label_matrix` |
| 511 | `get :first_response_time_distribution` |
| 512 | `get :outgoing_messages_count` |
| 515 | `resource :year_in_review, only: [:show]` |
| 516 | `resources :live_reports, only: [] do` |
| 518 | `get :conversation_metrics` |
| 519 | `get :grouped_conversation_metrics` |
| 528 | `namespace :enterprise, defaults: { format: 'json' } do` |
| 529 | `namespace :api do` |
| 530 | `namespace :v1 do` |
| 531 | `resources :accounts do` |
| 533 | `post :checkout` |
| 534 | `post :subscription` |
| 535 | `post :select_billing_currency` |
| 536 | `get :limits` |
| 537 | `post :toggle_deletion` |
| 538 | `post :topup_checkout` |
| 539 | `get :topup_options` |
| 545 | `post 'webhooks/stripe', to: 'webhooks/stripe#process_payload'` |
| 546 | `post 'webhooks/firecrawl', to: 'webhooks/firecrawl#process_payload'` |
| 552 | `namespace :platform, defaults: { format: 'json' } do` |
| 553 | `namespace :api do` |
| 554 | `namespace :v1 do` |
| 555 | `resources :users, only: [:create, :show, :update, :destroy] do` |
| 557 | `get :login` |
| 558 | `post :token` |
| 561 | `resources :agent_bots, only: [:index, :create, :show, :update, :destroy] do` |
| 562 | `delete :avatar, on: :member` |
| 564 | `resources :accounts, only: [:index, :create, :show, :update, :destroy] do` |
| 565 | `resources :account_users, only: [:index, :create] do` |
| 567 | `delete :destroy` |
| 570 | `resources :email_channel_migrations, only: [:create]` |
| 578 | `namespace :public, defaults: { format: 'json' } do` |
| 579 | `namespace :api do` |
| 580 | `namespace :v1 do` |
| 581 | `resources :inboxes do` |
| 582 | `scope module: :inboxes do` |
| 583 | `resources :contacts, only: [:create, :show, :update] do` |
| 584 | `resources :conversations, only: [:index, :create, :show] do` |
| 586 | `post :toggle_status` |
| 587 | `post :toggle_typing` |
| 588 | `post :update_last_seen` |
| 591 | `resources :messages, only: [:index, :create, :update]` |
| 597 | `resources :csat_survey, only: [:show, :update]` |
| 602 | `get 'hc/:slug', to: 'public/api/v1/portals#show'` |
| 603 | `get 'hc/:slug/sitemap.xml', to: 'public/api/v1/portals#sitemap'` |
| 604 | `get 'hc/:slug/:locale', to: 'public/api/v1/portals#show', as: :public_portal_locale` |
| 605 | `get 'hc/:slug/:locale/search', to: 'public/api/v1/portals/search#index', as: :portal_search` |
| 606 | `get 'hc/:slug/:locale/articles', to: 'public/api/v1/portals/articles#index'` |
| 607 | `get 'hc/:slug/:locale/categories', to: 'public/api/v1/portals/categories#index'` |
| 608 | `get 'hc/:slug/:locale/categories/:category_slug', to: 'public/api/v1/portals/categories#show', as: :public_portal_category` |
| 609 | `get 'hc/:slug/:locale/categories/:category_slug/articles', to: 'public/api/v1/portals/articles#index'` |
| 610 | `get 'hc/:slug/articles/:article_slug.png', to: 'public/api/v1/portals/articles#tracking_pixel'` |
| 611 | `get 'hc/:slug/articles/:article_slug.md', to: 'public/api/v1/portals/articles#show_markdown', as: :public_portal_article_markdown,` |
| 613 | `get 'hc/:slug/articles/:article_slug', to: 'public/api/v1/portals/articles#show', as: :public_portal_article` |
| 617 | `resource :app, only: [:index] do` |
| 618 | `resources :accounts do` |
| 619 | `resources :conversations, only: [:show]` |
| 625 | `mount Facebook::Messenger::Server, at: 'bot'` |
| 626 | `get 'webhooks/twitter', to: 'api/v1/webhooks#twitter_crc'` |
| 627 | `post 'webhooks/twitter', to: 'api/v1/webhooks#twitter_events'` |
| 628 | `post 'webhooks/line/:line_channel_id', to: 'webhooks/line#process_payload'` |
| 629 | `post 'webhooks/telegram/:bot_token', to: 'webhooks/telegram#process_payload'` |
| 630 | `post 'webhooks/sms/:phone_number', to: 'webhooks/sms#process_payload'` |
| 631 | `get 'webhooks/whatsapp/:phone_number', to: 'webhooks/whatsapp#verify'` |
| 632 | `post 'webhooks/whatsapp/:phone_number', to: 'webhooks/whatsapp#process_payload'` |
| 633 | `get 'webhooks/instagram', to: 'webhooks/instagram#verify'` |
| 634 | `post 'webhooks/instagram', to: 'webhooks/instagram#events'` |
| 635 | `post 'webhooks/tiktok', to: 'webhooks/tiktok#events'` |
| 636 | `post 'webhooks/shopify', to: 'webhooks/shopify#events'` |
| 638 | `namespace :twitter do` |
| 639 | `resource :callback, only: [:show]` |
| 642 | `namespace :linear do` |
| 643 | `resource :callback, only: [:show]` |
| 646 | `namespace :shopify do` |
| 647 | `resource :callback, only: [:show]` |
| 650 | `namespace :twilio do` |
| 651 | `resources :callback, only: [:create]` |
| 652 | `resources :delivery_status, only: [:create]` |
| 655 | `post 'voice/call/:phone', to: 'voice#call_twiml', as: :voice_call` |
| 656 | `post 'voice/status/:phone', to: 'voice#status', as: :voice_status` |
| 657 | `post 'voice/conference_status/:phone', to: 'voice#conference_status', as: :voice_conference_status` |
| 658 | `post 'voice/recording_status/:phone', to: 'voice#recording_status', as: :voice_recording_status` |
| 662 | `get 'microsoft/callback', to: 'microsoft/callbacks#show'` |
| 663 | `get 'google/callback', to: 'google/callbacks#show'` |
| 664 | `get 'instagram/callback', to: 'instagram/callbacks#show'` |
| 665 | `get 'tiktok/callback', to: 'tiktok/callbacks#show'` |
| 666 | `get 'notion/callback', to: 'notion/callbacks#show'` |
| 669 | `get '.well-known/assetlinks.json' => 'android_app#assetlinks'` |
| 670 | `get '.well-known/apple-app-site-association' => 'apple_app#site_association'` |
| 671 | `get '.well-known/microsoft-identity-association.json' => 'microsoft#identity_association'` |
| 672 | `get '.well-known/cf-custom-hostname-challenge/:id', to: 'custom_domains#verify'` |
| 681 | `get 'super_admin/logout', to: 'super_admin/devise/sessions#destroy'` |
| 682 | `namespace :super_admin do` |
| 685 | `resource :app_config, only: [:show, :create]` |
| 686 | `resource :push_diagnostics, only: [:show, :create] do` |
| 687 | `post :destroy_subscriptions, on: :collection` |
| 691 | `resources :accounts, only: [:index, :new, :create, :show, :edit, :update, :destroy] do` |
| 692 | `post :seed, on: :member` |
| 693 | `post :reset_cache, on: :member` |
| 695 | `resources :users, only: [:index, :new, :create, :show, :edit, :update, :destroy] do` |
| 696 | `delete :avatar, on: :member, action: :destroy_avatar` |
| 699 | `resources :access_tokens, only: [:index, :show]` |
| 700 | `resources :installation_configs, only: [:index, :new, :create, :show, :edit, :update]` |
| 701 | `resources :agent_bots, only: [:index, :new, :create, :show, :edit, :update, :destroy] do` |
| 702 | `delete :avatar, on: :member, action: :destroy_avatar` |
| 704 | `resources :platform_apps, only: [:index, :new, :create, :show, :edit, :update, :destroy]` |
| 705 | `resources :platform_banners` |
| 706 | `resource :instance_status, only: [:show]` |
| 708 | `resource :settings, only: [:show] do` |
| 709 | `get :refresh, on: :collection` |
| 713 | `resources :account_users, only: [:new, :create, :show, :destroy]` |
| 716 | `mount Sidekiq::Web => '/monitoring/sidekiq'` |
| 720 | `namespace :installation do` |
| 721 | `get 'onboarding', to: 'onboarding#index'` |
| 722 | `post 'onboarding', to: 'onboarding#create'` |
| 727 | `get '/swagger/*path', to: 'swagger#respond'` |
| 728 | `get '/swagger', to: 'swagger#respond'` |
| 732 | `resources :widget_tests, only: [:index] unless Rails.env.production?` |
+3 -3
View File
@@ -1,6 +1,6 @@
# Frontend Smoke Report
Updated: 2026-06-13T12:24:46Z
Updated: 2026-07-13T17:38:17Z
## Status
@@ -46,8 +46,8 @@ scripts/parity_frontend_smoke.sh --enterprise-browser-smoke
## Reused Chatwoot Frontend
- URL: http://localhost:3036
- Source: `/home/rogee/Projects/gochat/reference/chatwoot`
- Command: `(cd /home/rogee/Projects/gochat/reference/chatwoot && env CHATWOOT_API_HOST=http://127.0.0.1:13000 pnpm exec vite --host localhost --port 3036)`
- Source: `/home/rogee/Projects/gochat/docs/chatwoot`
- Command: `(cd /home/rogee/Projects/gochat/docs/chatwoot && env CHATWOOT_API_HOST=http://127.0.0.1:13000 pnpm exec vite --host localhost --port 3036)`
- Log: `/home/rogee/Projects/gochat/.tmp/frontend-smoke-live/chatwoot-vite.log`
## Seed Path
+46 -2
View File
@@ -21,6 +21,7 @@ DELETE /api/v1/accounts/:account_id/captain/assistants/:assistant_id
DELETE /api/v1/accounts/:account_id/captain/assistants/:assistant_id/documents/:document_id
DELETE /api/v1/accounts/:account_id/captain/assistants/:assistant_id/inboxes/:inbox_id
DELETE /api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/:scenario_id
DELETE /api/v1/accounts/:account_id/captain/auto_reply_rules/:rule_id
DELETE /api/v1/accounts/:account_id/captain/copilot_threads/:thread_id
DELETE /api/v1/accounts/:account_id/captain/custom_tools/:tool_id
DELETE /api/v1/accounts/:account_id/captain/documents/:document_id
@@ -114,6 +115,7 @@ DELETE /api/v1/notifications/destroy_all
DELETE /api/v1/profile/avatar
DELETE /api/v1/profile/mfa
DELETE /api/v1/profile/mfa/
DELETE /api/v1/profile/sessions/:id
DELETE /api/v1/push_subscriptions/:id
DELETE /api/v1/widget/labels/:label_id
DELETE /auth/sign_out
@@ -168,6 +170,7 @@ GET /api/v1/accounts/:account_id/automation_rules/:automation_id
GET /api/v1/accounts/:account_id/banners
GET /api/v1/accounts/:account_id/cache_keys
GET /api/v1/accounts/:account_id/callbacks/register_facebook_page
GET /api/v1/accounts/:account_id/calls
GET /api/v1/accounts/:account_id/campaigns
GET /api/v1/accounts/:account_id/campaigns/
GET /api/v1/accounts/:account_id/campaigns/:campaign_id
@@ -182,10 +185,16 @@ GET /api/v1/accounts/:account_id/captain/assistants/
GET /api/v1/accounts/:account_id/captain/assistants/:assistant_id
GET /api/v1/accounts/:account_id/captain/assistants/:assistant_id/documents/
GET /api/v1/accounts/:account_id/captain/assistants/:assistant_id/documents/:document_id
GET /api/v1/accounts/:account_id/captain/assistants/:assistant_id/drilldown
GET /api/v1/accounts/:account_id/captain/assistants/:assistant_id/inboxes
GET /api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/
GET /api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/:scenario_id
GET /api/v1/accounts/:account_id/captain/assistants/:assistant_id/stats
GET /api/v1/accounts/:account_id/captain/assistants/:assistant_id/summary
GET /api/v1/accounts/:account_id/captain/assistants/tools
GET /api/v1/accounts/:account_id/captain/auto_reply_rules
GET /api/v1/accounts/:account_id/captain/auto_reply_rules/
GET /api/v1/accounts/:account_id/captain/auto_reply_rules/:rule_id
GET /api/v1/accounts/:account_id/captain/copilot/stream
GET /api/v1/accounts/:account_id/captain/copilot_messages/
GET /api/v1/accounts/:account_id/captain/copilot_threads
@@ -250,6 +259,8 @@ GET /api/v1/accounts/:account_id/conversations/:conversation_id/whatsapp_calls/:
GET /api/v1/accounts/:account_id/conversations/meta
GET /api/v1/accounts/:account_id/conversations/search
GET /api/v1/accounts/:account_id/conversations/unread_counts
GET /api/v1/accounts/:account_id/copilot/config
GET /api/v1/accounts/:account_id/copilot/config/
GET /api/v1/accounts/:account_id/csat_survey_responses
GET /api/v1/accounts/:account_id/csat_survey_responses/
GET /api/v1/accounts/:account_id/csat_survey_responses/download
@@ -332,9 +343,11 @@ GET /api/v1/accounts/:account_id/microsoft/webhooks
GET /api/v1/accounts/:account_id/microsoft_channels/authorization
GET /api/v1/accounts/:account_id/notification_settings
GET /api/v1/accounts/:account_id/notification_settings/
GET /api/v1/accounts/:account_id/notifications
GET /api/v1/accounts/:account_id/notifications/
GET /api/v1/accounts/:account_id/notifications/:notification_id
GET /api/v1/accounts/:account_id/notifications/unread_count
GET /api/v1/accounts/:account_id/onboarding/help_center_generation
GET /api/v1/accounts/:account_id/platform_apps/
GET /api/v1/accounts/:account_id/platform_apps/:platform_app_id
GET /api/v1/accounts/:account_id/platform_apps/:platform_app_id/access_tokens
@@ -348,6 +361,7 @@ GET /api/v1/accounts/:account_id/portals/:portal_id/articles/
GET /api/v1/accounts/:account_id/portals/:portal_id/articles/:article_id
GET /api/v1/accounts/:account_id/portals/:portal_id/articles/:article_id/edit
GET /api/v1/accounts/:account_id/portals/:portal_id/articles/search
GET /api/v1/accounts/:account_id/portals/:portal_id/articles/semantic_search
GET /api/v1/accounts/:account_id/portals/:portal_id/articles/status_counts
GET /api/v1/accounts/:account_id/portals/:portal_id/categories
GET /api/v1/accounts/:account_id/portals/:portal_id/categories/
@@ -421,6 +435,7 @@ GET /api/v1/oidc/discovery
GET /api/v1/profile
GET /api/v1/profile/mfa
GET /api/v1/profile/mfa/
GET /api/v1/profile/sessions
GET /api/v1/push_subscriptions
GET /api/v1/saml/login
GET /api/v1/saml/metadata
@@ -443,6 +458,7 @@ GET /api/v2/accounts/:account_id/reports/bot_summary
GET /api/v2/accounts/:account_id/reports/conversation_traffic
GET /api/v2/accounts/:account_id/reports/conversations
GET /api/v2/accounts/:account_id/reports/conversations_summary
GET /api/v2/accounts/:account_id/reports/drilldown
GET /api/v2/accounts/:account_id/reports/first_response_time_distribution
GET /api/v2/accounts/:account_id/reports/inbox_label_matrix
GET /api/v2/accounts/:account_id/reports/inboxes
@@ -461,7 +477,9 @@ GET /app/*params
GET /auth/validate_token
GET /cable
GET /enterprise/api/v1/accounts/:account_id/limits
GET /enterprise/api/v1/accounts/:account_id/topup_options
GET /enterprise/api/v1/limits
GET /enterprise/api/v1/topup_options
GET /google/callback
GET /hc/:slug
GET /hc/:slug/:locale
@@ -492,6 +510,8 @@ GET /platform/api/v1/apps/:id/permissibles
GET /platform/api/v1/apps/search
GET /platform/api/v1/banners
GET /platform/api/v1/banners/:id
GET /platform/api/v1/copilot/config
GET /platform/api/v1/copilot/embeddings/reindex
GET /platform/api/v1/installation_configs
GET /platform/api/v1/installation_configs/:id
GET /platform/api/v1/users
@@ -509,6 +529,7 @@ GET /public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:convers
GET /shopify/callback
GET /tiktok/callback
GET /twitter/callback
GET /webhooks/fake/:identifier
GET /webhooks/instagram
GET /webhooks/tiktok/:business_id
GET /webhooks/twitter
@@ -521,14 +542,18 @@ GET /widget/widget/:website_token/pre_chat_form
GET /widget/widget/:website_token/theme_config
GET /widget/widget/:website_token/uploads/:upload_uuid
GET /ws
PATCH /api/v1/accounts/:account_id
PATCH /api/v1/accounts/:account_id/agent_bot_inboxes/:agent_bot_inbox_id/status
PATCH /api/v1/accounts/:account_id/agent_bots/:agent_bot_id
PATCH /api/v1/accounts/:account_id/agent_capacity_policies/:id
PATCH /api/v1/accounts/:account_id/agent_capacity_policies/:id/inbox_limits/:limit_id
PATCH /api/v1/accounts/:account_id/agents/:agent_id
PATCH /api/v1/accounts/:account_id/assignment_policies/:policy_id
PATCH /api/v1/accounts/:account_id/automation_rules/:automation_id
PATCH /api/v1/accounts/:account_id/campaigns/:campaign_id
PATCH /api/v1/accounts/:account_id/canned_responses/:id
PATCH /api/v1/accounts/:account_id/captain/assistant_responses/:response_id
PATCH /api/v1/accounts/:account_id/captain/assistants/:assistant_id
PATCH /api/v1/accounts/:account_id/channels/facebook_channel/:fb_id
PATCH /api/v1/accounts/:account_id/companies/:company_id
PATCH /api/v1/accounts/:account_id/contacts/:contact_id
@@ -560,6 +585,8 @@ PATCH /api/v1/accounts/:account_id/inboxes/:inbox_id/twilio_sms_channels/:tw_id
PATCH /api/v1/accounts/:account_id/integrations/hooks/:id
PATCH /api/v1/accounts/:account_id/integrations/slack
PATCH /api/v1/accounts/:account_id/integrations/slack/
PATCH /api/v1/accounts/:account_id/labels/:tag_id
PATCH /api/v1/accounts/:account_id/macros/:macro_id
PATCH /api/v1/accounts/:account_id/notification_settings
PATCH /api/v1/accounts/:account_id/notification_settings/
PATCH /api/v1/accounts/:account_id/notifications/:notification_id
@@ -601,6 +628,7 @@ POST /api/v1/accounts/:account_id/agent_capacity_policies/
POST /api/v1/accounts/:account_id/agent_capacity_policies/:id/inbox_limits
POST /api/v1/accounts/:account_id/agent_capacity_policies/:id/users
POST /api/v1/accounts/:account_id/agents
POST /api/v1/accounts/:account_id/agents/:agent_id/reset_password
POST /api/v1/accounts/:account_id/agents/bulk_assign
POST /api/v1/accounts/:account_id/agents/bulk_create
POST /api/v1/accounts/:account_id/agents/bulk_unassign
@@ -633,10 +661,14 @@ POST /api/v1/accounts/:account_id/captain/assistants/:assistant_id/documents/
POST /api/v1/accounts/:account_id/captain/assistants/:assistant_id/inboxes
POST /api/v1/accounts/:account_id/captain/assistants/:assistant_id/playground
POST /api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/
POST /api/v1/accounts/:account_id/captain/auto_reply_rules
POST /api/v1/accounts/:account_id/captain/auto_reply_rules/
POST /api/v1/accounts/:account_id/captain/auto_reply_rules/evaluate
POST /api/v1/accounts/:account_id/captain/bulk_actions/
POST /api/v1/accounts/:account_id/captain/conversation_insights/:conversation_id/analyze_participants
POST /api/v1/accounts/:account_id/captain/conversation_insights/:conversation_id/extract_action_items
POST /api/v1/accounts/:account_id/captain/conversation_insights/:conversation_id/suggest_labels
POST /api/v1/accounts/:account_id/captain/conversations/:conversation_id/respond
POST /api/v1/accounts/:account_id/captain/copilot/suggest_replies
POST /api/v1/accounts/:account_id/captain/copilot/summarize
POST /api/v1/accounts/:account_id/captain/copilot/translate
@@ -650,6 +682,9 @@ POST /api/v1/accounts/:account_id/captain/custom_tools/
POST /api/v1/accounts/:account_id/captain/custom_tools/test
POST /api/v1/accounts/:account_id/captain/documents/
POST /api/v1/accounts/:account_id/captain/documents/:document_id/sync
POST /api/v1/accounts/:account_id/captain/message_reports
POST /api/v1/accounts/:account_id/captain/rag/index/:response_id
POST /api/v1/accounts/:account_id/captain/rag/query
POST /api/v1/accounts/:account_id/captain/scenarios/
POST /api/v1/accounts/:account_id/captain/tasks/follow_up
POST /api/v1/accounts/:account_id/captain/tasks/label_suggestion
@@ -740,6 +775,7 @@ POST /api/v1/accounts/:account_id/inboxes/:inbox_id/members
POST /api/v1/accounts/:account_id/inboxes/:inbox_id/register_webhook
POST /api/v1/accounts/:account_id/inboxes/:inbox_id/reset_secret
POST /api/v1/accounts/:account_id/inboxes/:inbox_id/set_agent_bot
POST /api/v1/accounts/:account_id/inboxes/:inbox_id/set_inbound_calls
POST /api/v1/accounts/:account_id/inboxes/:inbox_id/sync_templates
POST /api/v1/accounts/:account_id/inboxes/web_widget
POST /api/v1/accounts/:account_id/instagram/authorization
@@ -827,7 +863,6 @@ POST /api/v1/auth/mfa/enable
POST /api/v1/auth/mfa/verify
POST /api/v1/auth/oauth/callback
POST /api/v1/auth/refresh
POST /api/v1/auth/register
POST /api/v1/auth/reset_password
POST /api/v1/auth/switch_account
POST /api/v1/ldap/login
@@ -868,10 +903,12 @@ POST /auth/confirmation
POST /auth/password
POST /auth/sign_in
POST /enterprise/api/v1/accounts/:account_id/checkout
POST /enterprise/api/v1/accounts/:account_id/select_billing_currency
POST /enterprise/api/v1/accounts/:account_id/subscription
POST /enterprise/api/v1/accounts/:account_id/toggle_deletion
POST /enterprise/api/v1/accounts/:account_id/topup_checkout
POST /enterprise/api/v1/checkout
POST /enterprise/api/v1/select_billing_currency
POST /enterprise/api/v1/subscription
POST /enterprise/api/v1/toggle_deletion
POST /enterprise/api/v1/topup_checkout
@@ -886,6 +923,8 @@ POST /platform/api/v1/apps
POST /platform/api/v1/apps/:id/permissibles
POST /platform/api/v1/apps/:id/regenerate_access_token
POST /platform/api/v1/banners
POST /platform/api/v1/copilot/config/test
POST /platform/api/v1/copilot/embeddings/reindex
POST /platform/api/v1/installation_configs
POST /platform/api/v1/users
POST /platform/api/v1/users/:id/login
@@ -903,6 +942,7 @@ POST /twilio/voice/call/:phone
POST /twilio/voice/conference_status/:phone
POST /twilio/voice/recording_status/:phone
POST /twilio/voice/status/:phone
POST /webhooks/fake/:identifier
POST /webhooks/instagram
POST /webhooks/line/:line_channel_id
POST /webhooks/shopify
@@ -938,6 +978,7 @@ PUT /api/v1/accounts/:account_id/canned_responses/:id
PUT /api/v1/accounts/:account_id/captain/assistant_responses/:response_id
PUT /api/v1/accounts/:account_id/captain/assistants/:assistant_id
PUT /api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/:scenario_id
PUT /api/v1/accounts/:account_id/captain/auto_reply_rules/:rule_id
PUT /api/v1/accounts/:account_id/captain/custom_tools/:tool_id
PUT /api/v1/accounts/:account_id/captain/preferences
PUT /api/v1/accounts/:account_id/captain/preferences/
@@ -952,6 +993,8 @@ PUT /api/v1/accounts/:account_id/conversations/:conversation_id/messages/:messag
PUT /api/v1/accounts/:account_id/conversations/:conversation_id/participants
PUT /api/v1/accounts/:account_id/conversations/:conversation_id/participants/
PUT /api/v1/accounts/:account_id/conversations/:conversation_id/whatsapp_calls/:call_id
PUT /api/v1/accounts/:account_id/copilot/config
PUT /api/v1/accounts/:account_id/copilot/config/
PUT /api/v1/accounts/:account_id/custom_attribute_definitions/:id
PUT /api/v1/accounts/:account_id/custom_filters/:id
PUT /api/v1/accounts/:account_id/custom_roles/:id
@@ -1002,9 +1045,10 @@ PUT /platform/api/v1/agent_bots/:id
PUT /platform/api/v1/agent_bots/:id/avatar
PUT /platform/api/v1/apps/:id
PUT /platform/api/v1/banners/:id
PUT /platform/api/v1/copilot/config
PUT /platform/api/v1/installation_configs/:id
PUT /public/api/v1/csat_survey/:id
PUT /public/api/v1/inboxes/:inbox_id/contacts/:contact_id
PUT /public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/messages/:message_id
PUT /widget/direct_uploads/:upload_uuid
TOTAL: 1009
TOTAL: 1053
+15 -3
View File
@@ -3,11 +3,11 @@
Generated from:
- GoChat route dump: `docs/parity/gochat-routes.txt`
- Chatwoot route source: `reference/chatwoot/config/routes.rb`
- Chatwoot route source: `docs/chatwoot/config/routes.rb`
This report covers tracked frontend-critical Chatwoot routes from `reference/chatwoot/config/routes.rb`, including API v1 account routes, Captain/Copilot, assignment policies, widget/public APIs, and API v2 reports. Ruby is not installed in the workspace, so Chatwoot routes are sourced from static route declarations instead of `bin/rails routes`.
This report covers tracked frontend-critical Chatwoot 4.15.1 routes from `docs/chatwoot/config/routes.rb`, including API v1 account routes, Captain/Copilot, assignment policies, widget/public APIs, and API v2 reports. Ruby is not installed in the workspace, so Chatwoot routes are sourced from static route declarations instead of `bin/rails routes`.
Summary: 435 exact, 0 method-compatible, 9 parameter-compatible, 0 missing out of 444 tracked critical routes.
Summary: 447 exact, 0 method-compatible, 9 parameter-compatible, 0 missing out of 456 tracked critical routes.
## Missing Critical Routes
@@ -93,6 +93,7 @@ These routes exist with equivalent method and path shape but different parameter
| DELETE | `/api/v1/notification_subscriptions` | `/api/v1/notification_subscriptions` | `api/v1/notification_subscriptions#destroy` | `routes.rb:440` | exact |
| DELETE | `/api/v1/profile/avatar` | `/api/v1/profile/avatar` | `api/v1/profiles#avatar` | `routes.rb:422` | exact |
| DELETE | `/api/v1/profile/mfa` | `/api/v1/profile/mfa` | `api/v1/profile/mfa#destroy` | `routes.rb:433` | exact |
| DELETE | `/api/v1/profile/sessions/:id` | `/api/v1/profile/sessions/:id` | `api/v1/profile/sessions#destroy` | `routes.rb:445` | exact |
| DELETE | `/api/v1/widget/labels/:label_id` | `/api/v1/widget/labels/:label_id` | `api/v1/widget/labels#destroy` | `routes.rb:464` | exact |
| GET | `/.well-known/apple-app-site-association` | `/.well-known/apple-app-site-association` | `apple_app#site_association` | `routes.rb:658` | exact |
| GET | `/.well-known/assetlinks.json` | `/.well-known/assetlinks.json` | `android_app#assetlinks` | `routes.rb:657` | exact |
@@ -116,14 +117,18 @@ These routes exist with equivalent method and path shape but different parameter
| GET | `/api/v1/accounts/:account_id/automation_rules/:automation_id` | `/api/v1/accounts/:account_id/automation_rules/:automation_id` | `api/v1/accounts/automation_rules#show` | `routes.rb:115` | exact |
| GET | `/api/v1/accounts/:account_id/cache_keys` | `/api/v1/accounts/:account_id/cache_keys` | `api/v1/accounts#cache_keys` | `routes.rb:50` | exact |
| GET | `/api/v1/accounts/:account_id/callbacks/register_facebook_page` | `/api/v1/accounts/:account_id/callbacks/register_facebook_page` | `api/v1/accounts/callbacks#register_facebook_page` | `routes.rb:108-109` | exact |
| GET | `/api/v1/accounts/:account_id/calls` | `/api/v1/accounts/:account_id/calls` | `api/v1/accounts/calls#index` | `routes.rb:243` | exact |
| GET | `/api/v1/accounts/:account_id/canned_responses/` | `/api/v1/accounts/:account_id/canned_responses/` | `api/v1/accounts/canned_responses#index` | `routes.rb:114` | exact |
| GET | `/api/v1/accounts/:account_id/captain/assistant_responses/` | `/api/v1/accounts/:account_id/captain/assistant_responses/` | `api/v1/accounts/captain/assistant_responses#index` | `routes.rb:74` | exact |
| GET | `/api/v1/accounts/:account_id/captain/assistant_responses/:response_id` | `/api/v1/accounts/:account_id/captain/assistant_responses/:response_id` | `api/v1/accounts/captain/assistant_responses#show` | `routes.rb:74` | exact |
| GET | `/api/v1/accounts/:account_id/captain/assistants/` | `/api/v1/accounts/:account_id/captain/assistants/` | `api/v1/accounts/captain/assistants#index` | `routes.rb:64` | exact |
| GET | `/api/v1/accounts/:account_id/captain/assistants/:assistant_id` | `/api/v1/accounts/:account_id/captain/assistants/:assistant_id` | `api/v1/accounts/captain/assistants#show` | `routes.rb:64` | exact |
| GET | `/api/v1/accounts/:account_id/captain/assistants/:assistant_id/drilldown` | `/api/v1/accounts/:account_id/captain/assistants/:assistant_id/drilldown` | `api/v1/accounts/captain/assistants#drilldown` | `routes.rb:71` | exact |
| GET | `/api/v1/accounts/:account_id/captain/assistants/:assistant_id/inboxes` | `/api/v1/accounts/:account_id/captain/assistants/:assistant_id/inboxes` | `api/v1/accounts/captain/assistants/inboxes#index` | `routes.rb:71` | exact |
| GET | `/api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/` | `/api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/` | `api/v1/accounts/captain/assistants/scenarios#index` | `routes.rb:72` | exact |
| GET | `/api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/:scenario_id` | `/api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/:scenario_id` | `api/v1/accounts/captain/assistants/scenarios#show` | `routes.rb:72` | exact |
| GET | `/api/v1/accounts/:account_id/captain/assistants/:assistant_id/stats` | `/api/v1/accounts/:account_id/captain/assistants/:assistant_id/stats` | `api/v1/accounts/captain/assistants#stats` | `routes.rb:69` | exact |
| GET | `/api/v1/accounts/:account_id/captain/assistants/:assistant_id/summary` | `/api/v1/accounts/:account_id/captain/assistants/:assistant_id/summary` | `api/v1/accounts/captain/assistants#summary` | `routes.rb:70` | exact |
| GET | `/api/v1/accounts/:account_id/captain/assistants/tools` | `/api/v1/accounts/:account_id/captain/assistants/tools` | `api/v1/accounts/captain/assistants#tools` | `routes.rb:69` | exact |
| GET | `/api/v1/accounts/:account_id/captain/copilot_threads/` | `/api/v1/accounts/:account_id/captain/copilot_threads/` | `api/v1/accounts/captain/copilot_threads#index` | `routes.rb:76` | exact |
| GET | `/api/v1/accounts/:account_id/captain/copilot_threads/:thread_id/copilot_messages/` | `/api/v1/accounts/:account_id/captain/copilot_threads/:thread_id/copilot_messages/` | `api/v1/accounts/captain/copilot_messages#index` | `routes.rb:77` | exact |
@@ -191,6 +196,7 @@ These routes exist with equivalent method and path shape but different parameter
| GET | `/api/v1/accounts/:account_id/notification_settings/` | `/api/v1/accounts/:account_id/notification_settings/` | `api/v1/accounts/notification_settings#show` | `routes.rb:293` | exact |
| GET | `/api/v1/accounts/:account_id/notifications/` | `/api/v1/accounts/:account_id/notifications/` | `api/v1/accounts/notifications#index` | `routes.rb:283` | exact |
| GET | `/api/v1/accounts/:account_id/notifications/unread_count` | `/api/v1/accounts/:account_id/notifications/unread_count` | `api/v1/accounts/notifications#unread_count` | `routes.rb:286` | exact |
| GET | `/api/v1/accounts/:account_id/onboarding/help_center_generation` | `/api/v1/accounts/:account_id/onboarding/help_center_generation` | `api/v1/accounts/onboardings#help_center_generation` | `routes.rb:59` | exact |
| GET | `/api/v1/accounts/:account_id/portals` | `/api/v1/accounts/:account_id/portals` | `api/v1/accounts/portals#index` | `routes.rb:385` | exact |
| GET | `/api/v1/accounts/:account_id/portals/:portal_id` | `/api/v1/accounts/:account_id/portals/:portal_id` | `api/v1/accounts/portals#show` | `routes.rb:385` | exact |
| GET | `/api/v1/accounts/:account_id/portals/:portal_id/articles` | `/api/v1/accounts/:account_id/portals/:portal_id/articles` | `api/v1/accounts/articles#index` | `routes.rb:403` | exact |
@@ -213,6 +219,7 @@ These routes exist with equivalent method and path shape but different parameter
| GET | `/api/v1/accounts/:account_id/whatsapp_calls/:id` | `/api/v1/accounts/:account_id/whatsapp_calls/:id` | `api/v1/accounts/whatsapp_calls#show` | `routes.rb:237` | exact |
| GET | `/api/v1/profile` | `/api/v1/profile` | `api/v1/profiles#show` | `routes.rb:421` | exact |
| GET | `/api/v1/profile/mfa` | `/api/v1/profile/mfa` | `api/v1/profile/mfa#show` | `routes.rb:433` | exact |
| GET | `/api/v1/profile/sessions` | `/api/v1/profile/sessions` | `api/v1/profile/sessions#index` | `routes.rb:445` | exact |
| GET | `/api/v1/widget/campaigns` | `/api/v1/widget/campaigns` | `api/v1/widget/campaigns#index` | `routes.rb:445` | exact |
| GET | `/api/v1/widget/contact` | `/api/v1/widget/contact` | `api/v1/widget/contact#show` | `routes.rb:458` | exact |
| GET | `/api/v1/widget/conversations` | `/api/v1/widget/conversations` | `api/v1/widget/conversations#index` | `routes.rb:448` | exact |
@@ -228,6 +235,7 @@ These routes exist with equivalent method and path shape but different parameter
| GET | `/api/v2/accounts/:account_id/reports/conversation_traffic` | `/api/v2/accounts/:account_id/reports/conversation_traffic` | `api/v2/accounts/reports#conversation_traffic` | `routes.rb:499` | exact |
| GET | `/api/v2/accounts/:account_id/reports/conversations` | `/api/v2/accounts/:account_id/reports/conversations` | `api/v2/accounts/reports#conversations` | `routes.rb:497` | exact |
| GET | `/api/v2/accounts/:account_id/reports/conversations_summary` | `/api/v2/accounts/:account_id/reports/conversations_summary` | `api/v2/accounts/reports#conversations_summary` | `routes.rb:498` | exact |
| GET | `/api/v2/accounts/:account_id/reports/drilldown` | `/api/v2/accounts/:account_id/reports/drilldown` | `api/v2/accounts/reports#drilldown` | `routes.rb:508` | exact |
| GET | `/api/v2/accounts/:account_id/reports/first_response_time_distribution` | `/api/v2/accounts/:account_id/reports/first_response_time_distribution` | `api/v2/accounts/reports#first_response_time_distribution` | `routes.rb:502` | exact |
| GET | `/api/v2/accounts/:account_id/reports/inbox_label_matrix` | `/api/v2/accounts/:account_id/reports/inbox_label_matrix` | `api/v2/accounts/reports#inbox_label_matrix` | `routes.rb:501` | exact |
| GET | `/api/v2/accounts/:account_id/reports/inboxes` | `/api/v2/accounts/:account_id/reports/inboxes` | `api/v2/accounts/reports#inboxes` | `routes.rb:494` | exact |
@@ -244,6 +252,7 @@ These routes exist with equivalent method and path shape but different parameter
| GET | `/app` | `/app` | `dashboard#index` | `routes.rb:19` | exact |
| GET | `/app/*params` | `/app/*params` | `dashboard#index` | `routes.rb:20` | exact |
| GET | `/enterprise/api/v1/accounts/:account_id/limits` | `/enterprise/api/v1/accounts/:account_id/limits` | `enterprise/api/v1/accounts#limits` | `routes.rb:525` | exact |
| GET | `/enterprise/api/v1/accounts/:account_id/topup_options` | `/enterprise/api/v1/accounts/:account_id/topup_options` | `enterprise/api/v1/accounts#topup_options` | `routes.rb:539` | exact |
| GET | `/google/callback` | `/google/callback` | `google/callbacks#show` | `routes.rb:650` | exact |
| GET | `/hc/:slug` | `/hc/:slug` | `public/api/v1/portals#show` | `routes.rb:590` | exact |
| GET | `/hc/:slug/:locale` | `/hc/:slug/:locale` | `public/api/v1/portals#show` | `routes.rb:592` | exact |
@@ -318,6 +327,7 @@ These routes exist with equivalent method and path shape but different parameter
| POST | `/api/v1/accounts/:account_id/captain/custom_tools/test` | `/api/v1/accounts/:account_id/captain/custom_tools/test` | `api/v1/accounts/captain/custom_tools#test` | `routes.rb:80` | exact |
| POST | `/api/v1/accounts/:account_id/captain/documents/` | `/api/v1/accounts/:account_id/captain/documents/` | `api/v1/accounts/captain/documents#create` | `routes.rb:82` | exact |
| POST | `/api/v1/accounts/:account_id/captain/documents/:document_id/sync` | `/api/v1/accounts/:account_id/captain/documents/:document_id/sync` | `api/v1/accounts/captain/documents#sync` | `routes.rb:83` | exact |
| POST | `/api/v1/accounts/:account_id/captain/message_reports` | `/api/v1/accounts/:account_id/captain/message_reports` | `api/v1/accounts/captain/message_reports#create` | `routes.rb:80` | exact |
| POST | `/api/v1/accounts/:account_id/captain/tasks/follow_up` | `/api/v1/accounts/:account_id/captain/tasks/follow_up` | `api/v1/accounts/captain/tasks#follow_up` | `routes.rb:90` | exact |
| POST | `/api/v1/accounts/:account_id/captain/tasks/label_suggestion` | `/api/v1/accounts/:account_id/captain/tasks/label_suggestion` | `api/v1/accounts/captain/tasks#label_suggestion` | `routes.rb:89` | exact |
| POST | `/api/v1/accounts/:account_id/captain/tasks/reply_suggestion` | `/api/v1/accounts/:account_id/captain/tasks/reply_suggestion` | `api/v1/accounts/captain/tasks#reply_suggestion` | `routes.rb:88` | exact |
@@ -359,6 +369,7 @@ These routes exist with equivalent method and path shape but different parameter
| POST | `/api/v1/accounts/:account_id/inboxes/:inbox_id/register_webhook` | `/api/v1/accounts/:account_id/inboxes/:inbox_id/register_webhook` | `api/v1/accounts/inboxes#register_webhook` | `routes.rb:260` | exact |
| POST | `/api/v1/accounts/:account_id/inboxes/:inbox_id/reset_secret` | `/api/v1/accounts/:account_id/inboxes/:inbox_id/reset_secret` | `api/v1/accounts/inboxes#reset_secret` | `routes.rb:262` | exact |
| POST | `/api/v1/accounts/:account_id/inboxes/:inbox_id/set_agent_bot` | `/api/v1/accounts/:account_id/inboxes/:inbox_id/set_agent_bot` | `api/v1/accounts/inboxes#set_agent_bot` | `routes.rb:256` | exact |
| POST | `/api/v1/accounts/:account_id/inboxes/:inbox_id/set_inbound_calls` | `/api/v1/accounts/:account_id/inboxes/:inbox_id/set_inbound_calls` | `api/v1/accounts/inboxes#set_inbound_calls` | `routes.rb:275` | exact |
| POST | `/api/v1/accounts/:account_id/inboxes/:inbox_id/sync_templates` | `/api/v1/accounts/:account_id/inboxes/:inbox_id/sync_templates` | `api/v1/accounts/inboxes#sync_templates` | `routes.rb:258` | exact |
| POST | `/api/v1/accounts/:account_id/instagram/authorization` | `/api/v1/accounts/:account_id/instagram/authorization` | `api/v1/accounts/instagram/authorizations#create` | `routes.rb:327` | exact |
| POST | `/api/v1/accounts/:account_id/integrations/dyte/add_participant_to_meeting` | `/api/v1/accounts/:account_id/integrations/dyte/add_participant_to_meeting` | `api/v1/accounts/integrations/dyte#add_participant_to_meeting` | `routes.rb:358` | exact |
@@ -422,6 +433,7 @@ These routes exist with equivalent method and path shape but different parameter
| POST | `/api/v1/widget/messages` | `/api/v1/widget/messages` | `api/v1/widget/messages#create` | `routes.rb:447` | exact |
| POST | `/api/v2/accounts/` | `/api/v2/accounts/` | `api/v2/accounts#create` | `routes.rb:478` | exact |
| POST | `/enterprise/api/v1/accounts/:account_id/checkout` | `/enterprise/api/v1/accounts/:account_id/checkout` | `enterprise/api/v1/accounts#checkout` | `routes.rb:523` | exact |
| POST | `/enterprise/api/v1/accounts/:account_id/select_billing_currency` | `/enterprise/api/v1/accounts/:account_id/select_billing_currency` | `enterprise/api/v1/accounts#select_billing_currency` | `routes.rb:535` | exact |
| POST | `/enterprise/api/v1/accounts/:account_id/subscription` | `/enterprise/api/v1/accounts/:account_id/subscription` | `enterprise/api/v1/accounts#subscription` | `routes.rb:524` | exact |
| POST | `/enterprise/api/v1/accounts/:account_id/toggle_deletion` | `/enterprise/api/v1/accounts/:account_id/toggle_deletion` | `enterprise/api/v1/accounts#toggle_deletion` | `routes.rb:526` | exact |
| POST | `/enterprise/api/v1/accounts/:account_id/topup_checkout` | `/enterprise/api/v1/accounts/:account_id/topup_checkout` | `enterprise/api/v1/accounts#topup_checkout` | `routes.rb:527` | exact |
+61 -5
View File
@@ -1,15 +1,15 @@
# Chatwoot Parity Development Plan
Updated: 2026-06-07
Updated: 2026-07-14
## Goal
Build GoChat as a Go backend that can directly reuse the frontend from `reference/chatwoot`. The backend API, data contracts, side effects, permissions, and runtime behavior must match the local `reference/chatwoot` repository first. Existing docs are secondary when they conflict with the reference implementation.
Build GoChat as a Go backend that can directly reuse the Chatwoot frontend. The backend API, data contracts, side effects, permissions, and runtime behavior must match the current read-only upstream snapshot under `docs/chatwoot` first. Existing docs and the older `reference/chatwoot` 4.14.1 checkout are secondary when they conflict with the current 4.15.1 snapshot.
## Confirmed Decisions
- Frontend: reuse Chatwoot frontend directly. Backend compatibility is mandatory.
- Baseline: `reference/chatwoot` is the source of truth for routes, controllers, models, serializers, jobs, and service behavior.
- Baseline: `docs/chatwoot` 4.15.1 is the current source of truth for routes, controllers, models, serializers, jobs, and service behavior. `reference/chatwoot` 4.14.1 remains a regression fixture only.
- Immediate order: keep `go test ./...` green first, then deepen Chatwoot behavior parity.
- Search: final implementation must use Meilisearch. DB/LIKE search is not acceptable as the final engine.
- Enterprise scope: exclude SSO/SAML/LDAP/OIDC. Include the remaining paid features already present in planning and code: SLA, Audit, CustomRole, AgentCapacity, Captain/Copilot, CSAT, InboxLimit, automation, macros, assignment policies, and related limits/workflows.
@@ -20,13 +20,69 @@ This file is the only active execution tracker. The `.hermes/plans/*` files and
| Decision axis | Locked rule | Tracking consequence |
| --- | --- | --- |
| Product surface | Reuse the `reference/chatwoot` frontend without adapters. | Backend routes, payloads, status codes, pagination, errors, permissions, jobs, and realtime side effects must be Chatwoot-compatible. |
| Reference order | Local `reference/chatwoot` beats prior docs and assumptions. | Every parity slice records inspected reference controllers, Jbuilder views, models, jobs, and frontend API clients. |
| Product surface | Reuse the current `docs/chatwoot` frontend without adapters. | Backend routes, payloads, status codes, pagination, errors, permissions, jobs, and realtime side effects must be Chatwoot-compatible. |
| Reference order | Local `docs/chatwoot` 4.15.1 beats the 4.14.1 regression fixture, prior docs, and assumptions. | Every parity slice records inspected upstream controllers, Jbuilder views, models, jobs, and frontend API clients. |
| Test order | Keep the Go suite green before expanding behavior. | A checkpoint cannot close without focused tests, `go test ./...`, and `git diff --check`; docs-only checkpoints require at least `git diff --check`. |
| Search | Meilisearch is mandatory for final behavior. | DB search can exist only as explicit local fallback and must not be the production parity path. |
| Enterprise | SSO/SAML/LDAP/OIDC are out. All other paid features in this tracker are in. | SLA, Audit, CustomRole, AgentCapacity, Captain/Copilot, CSAT, InboxLimit, automation, macros, assignment policies, and limits stay tracked until verified or explicitly split. |
| Commit hygiene | Code, tests, generated route artifacts, and tracker updates land together. | If a route changes, regenerate `docs/parity/gochat-routes.txt`; if the tracked set changes, regenerate `docs/parity/route-parity.md`. |
## 2026-07-13 Chatwoot 4.15.1 Alignment Execution Plan
### Completion contract
This alignment cycle is complete only when every row below is implemented, its focused contract tests pass, the generated route manifest is derived from the 4.15.1 source rather than the old hard-coded 4.14 list, full backend tests and the bundled frontend build pass, and an unmodified `docs/chatwoot` frontend completes the enterprise browser smoke without proxied API 4xx/5xx failures. Internal Go tables may remain idiomatic, but every frontend-visible request, response, status, permission, side effect, and realtime payload must match Chatwoot 4.15.1.
| ID | Missing or drifted contract | GoChat owner | Required behavior | Focused acceptance | End-to-end acceptance | Status |
| --- | --- | --- | --- | --- | --- | --- | --- |
| C415.1 | `GET /api/v1/accounts/:account_id/onboarding/help_center_generation` | account handler/service | Return `{ generation_id, state, articles_count, categories_count }`; derive counts from the account-scoped portal generation when present and stable nil/zero values otherwise. | Handler test freezes exact raw payload, account scope, and admin permission. | 4.15.1 onboarding status component polls successfully without 404. | Verified |
| C415.2 | Captain assistant `stats`, `summary`, and `drilldown` | Captain handler/service | Match range/timezone parsing, metrics payload, summary `{ message }` or 422 error, supported drilldown metrics, and pagination. | Focused handler/service fixtures for all three routes, invalid metric, account scope, and empty data. | Captain overview page and drilldown drawer load without API errors. | Verified |
| C415.3 | `POST /api/v1/accounts/:account_id/captain/message_reports` | Captain handler/service/model | Persist account/conversation/message/user/reason/description; permit only Captain messages; return the 4.15.1 Jbuilder shape. | Migration plus create, invalid sender, foreign account, and validation tests. | Report-Captain-message dialog submits successfully. | Verified |
| C415.4 | `GET /api/v1/accounts/:account_id/calls` | call handler/service | Return the current user's active voice calls using the upstream `_call` serializer, including provider and conversation/contact data. | Empty/list/account/user scope serializer fixtures. | Dashboard call store boot path has no 404 and incoming call card remains functional. | Verified |
| C415.5 | `POST /api/v1/accounts/:account_id/inboxes/:inbox_id/set_inbound_calls` | inbox handler/service | Validate voice-capable WhatsApp/Twilio inbox, persist `channel_config.inbound_calls_enabled`, and return empty 200 while invalid inboxes return Chatwoot-compatible 422. | Enable/disable, unsupported channel, permission, persistence, cache/event tests. | Voice configuration toggles persist after reload. | Verified |
| C415.6 | Profile session index/destroy | profile handler/service/model + auth lifecycle | Track Devise-compatible client sessions, list exact browser/device/location/timestamps/current fields, reject current-session revocation with 422, revoke another client token/session with empty 200. | Migration, login/validate activity, list ordering/current flag, destroy/current guard tests. | Active Sessions page lists and revokes another session without 404. | Verified |
| C415.7 | `GET /api/v2/accounts/:account_id/reports/drilldown` | analytics handler/service | Match metric/bucket/range/type/id/group/business-hours/timezone/page/per-page contract and paginated conversation payload. | Supported metrics, invalid metric, pagination, timezone, and account scope tests. | Reports drilldown drawer loads rows and paginates. | Verified |
| C415.8 | Billing currency selection and top-up options | enterprise account handler/service | Persist valid unlocked currency, reject invalid/locked selection, expose `{ id, currency, options }`, and include `billing_currency` in account payload when set. | Literal and account-scoped route tests for success/error/no-mutation; serializer test. | Billing currency picker and purchase credits modal load without API errors. | Verified |
| C415.9 | `assignable_agents?include_agent_bots=true` and `assignee_type` assignment | assignable/conversation handlers and services | Return User and AgentBot owners with `assignee_type`; assignment must set exactly one of user/bot assignee, validate account accessibility, and serialize the selected resource. | User/bot list and assignment fixtures, invalid/foreign bot, unassign and mutual-exclusion tests. | Conversation assignee dropdown lists bots and persists a bot assignment. | Verified |
| C415.10 | 4.15.1 serializer additions | account, help-center, inbox, team, assignment-policy, SLA serializers/models | Add `icon_color`, `locale_translations`, `billing_currency`, `help_center_generation_id`, `inbound_calls_enabled`, `exclude_older_than_hours`, and SLA due-at fields with upstream null/conditional behavior. | Migration and owner-slice serializer/request round-trip tests for every field. | Categories/teams/help-center/billing/voice/SLA screens render and retain values. | Verified |
| C415.11 | Route parity source drift | `cmd/route_parity`, parity artifacts | Track the current 4.15.1 additions above and fail CI when a frontend-critical route is absent; generated report must name `docs/chatwoot/config/routes.rb`. | Route-parity unit test proves each new route is tracked and a removed route is reported missing. | Fresh dump/report shows zero missing tracked 4.15.1 frontend routes. | Verified |
| C415.12 | Clean 4.15.1 direct-connect gate | smoke harness | Default the upstream smoke source to `docs/chatwoot`, cover the new pages/API calls, WebSocket event delivery, widget boot, and assert no proxied API 4xx/5xx. | Shell syntax, prerequisite check, browser report schema, and explicit new-path assertions. | `scripts/parity_frontend_smoke.sh --enterprise-browser-smoke` passes against PostgreSQL, Redis, Meilisearch, GoChat, and unmodified 4.15.1 Vite. | Verified |
### 2026-07-14 verification outcome
All twelve tracked Chatwoot 4.15.1 alignment rows are implemented and verified. The unmodified frontend is directly connectable for the exercised core and enterprise surface; the focused tests below cover the upstream semantics that are not fully observable from the browser gate alone. This is a compatibility claim for the tracked frontend contract, not a claim that every third-party provider integration or unexercised Chatwoot server endpoint has been reproduced.
| ID | Evidence | Remaining compatibility boundary |
| --- | --- | --- |
| C415.1 | `TestHelpCenterGeneration_ExactRawPayload`; live API smoke passed. | None found in the tracked contract. |
| C415.2 | `TestCaptainAssistantSummaryCachesOnlySuccessfulLLMResponses`, `TestCaptainAssistantStatsAndDrilldownUseExactResolvedReopenCohort`, and `TestCaptainAssistantHandler_OverviewDrilldownAndMessageReportContracts`; Captain overview browser checks passed. | None found in the tracked summary/cache/error, resolved/reopen cohort, or frontend contract. |
| C415.3 | Same focused Captain contract test; live message-report create returned the 4.15.1 shape. | None found in the tracked request/persistence/serializer contract. |
| C415.4 | `TestWhatsAppCallHandler_IndexMatchesChatwootCallsEnvelope`, `TestWhatsAppCallService_IndexScopesAgentsToHandledCalls`, and `TestWhatsAppCallService_IndexMatchesConversationAndReportManagerVisibility`; live calls index passed. | None found in the tracked serializer, inbox membership, accepted-agent, administrator, or `report_manage` visibility contract. |
| C415.5 | `TestInboxService_SetInboundCalls_PersistsVoiceInboxSetting`, `TestInboxService_SetInboundCalls_RejectsUnsupportedInbox`; live disable/enable and voice-settings browser checks passed. | None found in the tracked frontend contract. |
| C415.6 | `TestSessions_IndexAndDestroyMatchChatwootContract` and `TestRefreshTokenStoreScopesTokensByClient`; Active Sessions browser request passed. | None found in the tracked per-client row, refresh-token, current-session guard, or other-session revocation lifecycle. |
| C415.7 | `TestDrilldown_ReturnsChatwootMessageRecordEnvelope`, `TestDrilldown_PaginatesAndScopesAccount`, `TestDrilldown_FirstResponseInfersMessageAndMetricValue`, and `TestDrilldown_DimensionsCountStrategiesAndTimezoneBucketsMatchChatwoot`; live drilldown passed. | None found in the tracked dimension scope, distinct strategy, bot handoff exclusion, invalid grouping, timezone bucket, pagination, or envelope contract. |
| C415.8 | `TestEnterpriseAccountBillingCurrencyAndTopupOptions`, `TestEnterpriseAccountBillingCurrencyRejectsInvalidAndLockedWithoutMutation`, `TestEnterpriseAccountSubscriptionRequiresCurrencySelectionForNewBRLAccount`, `TestEnterpriseBillingWorkerCreatesBRLCustomerAndSubscription`, and `TestEnterpriseBillingWorkerAlwaysClearsCreationFlagOnFailure`; billing browser checks passed. | None found in the tracked feature gate, locale selection, price fallback, durable customer/subscription creation, persisted Stripe attributes, or ensure-style flag cleanup contract. |
| C415.9 | `TestList_IncludeAgentBotsAddsTypedOwners`, `TestAssignAgentBot_MutuallyExclusiveAndAccountScoped`; live bot assignment and restore passed. | None found in the tracked frontend contract. |
| C415.10 | `TestChatwoot415SerializerFields`, `TestChatwoot415AssignmentPolicyFieldRoundTrip`, `TestChatwoot415CaptainMessageSenderSerializer`; affected live pages passed. | None found in the tracked serializer fields. |
| C415.11 | `TestChatwoot415RoutesAreTrackedAndReportedMissing`; generated report has 447 exact, 9 parameter-compatible, and 0 missing routes out of 456 tracked critical routes. | Parameter-compatible entries use equivalent Gin parameter names/path dispatch; they are not missing URLs, but should stay visible in the parity report. |
| C415.12 | `scripts/parity_frontend_smoke.sh --enterprise-browser-smoke` passed against PostgreSQL, Redis, Meilisearch, GoChat, Chrome, and unmodified `docs/chatwoot`; browser report status is `passed` with 59 passed checks and no failed frontend API requests. | The gate proves the covered frontend surface, not every possible Chatwoot workflow or third-party provider callback. |
### Required final verification
```bash
cd backend
GOCACHE=/tmp/gochat-gocache GOMODCACHE=/tmp/gochat-gomodcache go test ./internal/handler/api/v1 ./internal/service ./internal/router ./cmd/route_parity -count=1
GOCACHE=/tmp/gochat-gocache GOMODCACHE=/tmp/gochat-gomodcache go test ./...
GOCACHE=/tmp/gochat-gocache GOMODCACHE=/tmp/gochat-gomodcache go run ./cmd/dump_routes > ../docs/parity/gochat-routes.txt
GOCACHE=/tmp/gochat-gocache GOMODCACHE=/tmp/gochat-gomodcache go run ./cmd/route_parity -chatwoot ../docs/chatwoot/config/routes.rb
cd ..
pnpm -C frontend build
CHATWOOT_DIR="$PWD/docs/chatwoot" backend/scripts/parity_frontend_smoke.sh --enterprise-browser-smoke
git diff --check
```
Every C415 row is now `Verified` with focused-test evidence. The final direct-connect claim still requires the current full suite, frontend build, route report, and unmodified 4.15.1 browser smoke to remain green together.
Hermes plan landing map:
| Hermes source | Landed tracker area | Remaining rule |