package main import ( "bufio" "flag" "fmt" "os" "regexp" "sort" "strings" ) type route struct { Method string Path string Controller string Source string } type sourceDecl struct { Line int Text string } var criticalRoutes = []route{ {Method: "POST", Path: "/api/v1/accounts/", Controller: "api/v1/accounts#create", Source: "routes.rb:47"}, {Method: "GET", Path: "/api/v1/accounts/:account_id", Controller: "api/v1/accounts#show", Source: "routes.rb:47"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id", Controller: "api/v1/accounts#update", Source: "routes.rb:47"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/update_active_at", Controller: "api/v1/accounts#update_active_at", Source: "routes.rb:49"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/cache_keys", Controller: "api/v1/accounts#cache_keys", Source: "routes.rb:50"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/actions/contact_merge", Controller: "api/v1/accounts/actions/contact_merges#create", Source: "routes.rb:55"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/agents", Controller: "api/v1/accounts/agents#index", Source: "routes.rb:59"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/agents", Controller: "api/v1/accounts/agents#create", Source: "routes.rb:59"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/agents/:agent_id", Controller: "api/v1/accounts/agents#update", Source: "routes.rb:59"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/agents/:agent_id", Controller: "api/v1/accounts/agents#destroy", Source: "routes.rb:59"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/agents/bulk_create", Controller: "api/v1/accounts/agents#bulk_create", Source: "routes.rb:60"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/assignable_agents", Controller: "api/v1/accounts/assignable_agents#index", Source: "routes.rb:104"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/audit_logs/", Controller: "api/v1/accounts/audit_logs#show", Source: "routes.rb:105"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/canned_responses/", Controller: "api/v1/accounts/canned_responses#index", Source: "routes.rb:114"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/canned_responses/", Controller: "api/v1/accounts/canned_responses#create", Source: "routes.rb:114"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/canned_responses/:id", Controller: "api/v1/accounts/canned_responses#update", Source: "routes.rb:114"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/canned_responses/:id", Controller: "api/v1/accounts/canned_responses#destroy", Source: "routes.rb:114"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/conversations/", Controller: "api/v1/accounts/conversations#index", Source: "routes.rb:134"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/conversations/", Controller: "api/v1/accounts/conversations#create", Source: "routes.rb:134"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id", Controller: "api/v1/accounts/conversations#show", Source: "routes.rb:134"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id", Controller: "api/v1/accounts/conversations#update", Source: "routes.rb:134"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id", Controller: "api/v1/accounts/conversations#destroy", Source: "routes.rb:134"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/conversations/meta", Controller: "api/v1/accounts/conversations#meta", Source: "routes.rb:136"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/conversations/search", Controller: "api/v1/accounts/conversations#search", Source: "routes.rb:137"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/conversations/unread_counts", Controller: "api/v1/accounts/conversations/unread_counts#index", Source: "routes.rb:138"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/conversations/filter", Controller: "api/v1/accounts/conversations#filter", Source: "routes.rb:139"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id/assignments", Controller: "api/v1/accounts/conversations/assignments#create", Source: "routes.rb:148"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id/labels", Controller: "api/v1/accounts/conversations/labels#create", Source: "routes.rb:149"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id/labels", Controller: "api/v1/accounts/conversations/labels#index", Source: "routes.rb:149"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id/toggle_status", Controller: "api/v1/accounts/conversations#toggle_status", Source: "routes.rb:158"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id/toggle_priority", Controller: "api/v1/accounts/conversations#toggle_priority", Source: "routes.rb:159"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id/transcript", Controller: "api/v1/accounts/conversations#transcript", Source: "routes.rb:157"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id/messages/", Controller: "api/v1/accounts/conversations/messages#index", Source: "routes.rb:142"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id/messages/", Controller: "api/v1/accounts/conversations/messages#create", Source: "routes.rb:142"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id/messages/:message_id", Controller: "api/v1/accounts/conversations/messages#update", Source: "routes.rb:142"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id/messages/:message_id", Controller: "api/v1/accounts/conversations/messages#destroy", Source: "routes.rb:142"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id/messages/:message_id/translate", Controller: "api/v1/accounts/conversations/messages#translate", Source: "routes.rb:144"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/conversations/:conversation_id/messages/:message_id/retry", Controller: "api/v1/accounts/conversations/messages#retry", Source: "routes.rb:145"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/contacts/", Controller: "api/v1/accounts/contacts#index", Source: "routes.rb:197"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/contacts/", Controller: "api/v1/accounts/contacts#create", Source: "routes.rb:197"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/contacts/:contact_id", Controller: "api/v1/accounts/contacts#show", Source: "routes.rb:197"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/contacts/:contact_id", Controller: "api/v1/accounts/contacts#update", Source: "routes.rb:197"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/contacts/:contact_id", Controller: "api/v1/accounts/contacts#destroy", Source: "routes.rb:197"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/contacts/search", Controller: "api/v1/accounts/contacts#search", Source: "routes.rb:201"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/contacts/active", Controller: "api/v1/accounts/contacts#active", Source: "routes.rb:200"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/contacts/filter", Controller: "api/v1/accounts/contacts#filter", Source: "routes.rb:202"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/contacts/import", Controller: "api/v1/accounts/contacts#import", Source: "routes.rb:203"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/contacts/export", Controller: "api/v1/accounts/contacts#export", Source: "routes.rb:204"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/contacts/:contact_id/contactable_inboxes", Controller: "api/v1/accounts/contacts#contactable_inboxes", Source: "routes.rb:206"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/contacts/:contact_id/destroy_custom_attributes", Controller: "api/v1/accounts/contacts#destroy_custom_attributes", Source: "routes.rb:207"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/contacts/:contact_id/avatar", Controller: "api/v1/accounts/contacts#avatar", Source: "routes.rb:208"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/contacts/:contact_id/conversations", Controller: "api/v1/accounts/contacts/conversations#index", Source: "routes.rb:211"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/contacts/:contact_id/contact_inboxes/", Controller: "api/v1/accounts/contacts/contact_inboxes#create", Source: "routes.rb:212"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/contacts/:contact_id/labels/", Controller: "api/v1/accounts/contacts/labels#index", Source: "routes.rb:213"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/contacts/:contact_id/labels/", Controller: "api/v1/accounts/contacts/labels#create", Source: "routes.rb:213"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/contacts/:contact_id/notes", Controller: "api/v1/accounts/contacts/notes#index", Source: "routes.rb:214"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/contacts/:contact_id/notes", Controller: "api/v1/accounts/contacts/notes#create", Source: "routes.rb:214"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/companies/", Controller: "api/v1/accounts/companies#index", Source: "routes.rb:179"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/companies/", Controller: "api/v1/accounts/companies#create", Source: "routes.rb:179"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/companies/:company_id", Controller: "api/v1/accounts/companies#show", Source: "routes.rb:179"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/companies/:company_id", Controller: "api/v1/accounts/companies#update", Source: "routes.rb:179"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/companies/:company_id", Controller: "api/v1/accounts/companies#destroy", Source: "routes.rb:179"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/companies/search", Controller: "api/v1/accounts/companies#search", Source: "routes.rb:181"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/companies/:company_id/destroy_custom_attributes", Controller: "api/v1/accounts/companies#destroy_custom_attributes", Source: "routes.rb:184"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/companies/:company_id/avatar", Controller: "api/v1/accounts/companies#avatar", Source: "routes.rb:185"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/companies/:company_id/contacts", Controller: "api/v1/accounts/companies/contacts#index", Source: "routes.rb:188"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/companies/:company_id/contacts", Controller: "api/v1/accounts/companies/contacts#create", Source: "routes.rb:188"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/companies/:company_id/contacts/:contact_id", Controller: "api/v1/accounts/companies/contacts#destroy", Source: "routes.rb:188"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/companies/:company_id/contacts/search", Controller: "api/v1/accounts/companies/contacts#search", Source: "routes.rb:190"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/companies/:company_id/conversations", Controller: "api/v1/accounts/companies/conversations#index", Source: "routes.rb:193"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/companies/:company_id/notes", Controller: "api/v1/accounts/companies/notes#index", Source: "routes.rb:194"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/search", Controller: "api/v1/accounts/search#index", Source: "routes.rb:170"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/search/conversations", Controller: "api/v1/accounts/search#conversations", Source: "routes.rb:173"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/search/messages", Controller: "api/v1/accounts/search#messages", Source: "routes.rb:174"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/search/contacts", Controller: "api/v1/accounts/search#contacts", Source: "routes.rb:175"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/search/articles", Controller: "api/v1/accounts/search#articles", Source: "routes.rb:176"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/inboxes/", Controller: "api/v1/accounts/inboxes#index", Source: "routes.rb:252"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/inboxes/", Controller: "api/v1/accounts/inboxes#create", Source: "routes.rb:252"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id", Controller: "api/v1/accounts/inboxes#show", Source: "routes.rb:252"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id", Controller: "api/v1/accounts/inboxes#update", Source: "routes.rb:252"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id", Controller: "api/v1/accounts/inboxes#destroy", Source: "routes.rb:252"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/assignable_agents", Controller: "api/v1/accounts/inboxes#assignable_agents", Source: "routes.rb:253"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/campaigns", Controller: "api/v1/accounts/inboxes#campaigns", Source: "routes.rb:254"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/agent_bot", Controller: "api/v1/accounts/inboxes#agent_bot", Source: "routes.rb:255"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/set_agent_bot", Controller: "api/v1/accounts/inboxes#set_agent_bot", Source: "routes.rb:256"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/avatar", Controller: "api/v1/accounts/inboxes#avatar", Source: "routes.rb:257"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/sync_templates", Controller: "api/v1/accounts/inboxes#sync_templates", Source: "routes.rb:258"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/health", Controller: "api/v1/accounts/inboxes#health", Source: "routes.rb:259"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/register_webhook", Controller: "api/v1/accounts/inboxes#register_webhook", Source: "routes.rb:260"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/reset_secret", Controller: "api/v1/accounts/inboxes#reset_secret", Source: "routes.rb:262"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/inbox_members/", Controller: "api/v1/accounts/inbox_members#create", Source: "routes.rb:275"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/inbox_members/:inbox_id", Controller: "api/v1/accounts/inbox_members#show", Source: "routes.rb:275"}, {Method: "PATCH", Path: "/api/v1/accounts/:account_id/inbox_members/", Controller: "api/v1/accounts/inbox_members#update", Source: "routes.rb:278"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/inbox_members/", Controller: "api/v1/accounts/inbox_members#destroy", Source: "routes.rb:277"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/labels/", Controller: "api/v1/accounts/labels#index", Source: "routes.rb:281"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/labels/", Controller: "api/v1/accounts/labels#create", Source: "routes.rb:281"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/labels/:tag_id", Controller: "api/v1/accounts/labels#show", Source: "routes.rb:281"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/labels/:tag_id", Controller: "api/v1/accounts/labels#update", Source: "routes.rb:281"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/labels/:tag_id", Controller: "api/v1/accounts/labels#destroy", Source: "routes.rb:281"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/notifications/", Controller: "api/v1/accounts/notifications#index", Source: "routes.rb:283"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/notifications/:notification_id", Controller: "api/v1/accounts/notifications#update", Source: "routes.rb:283"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/notifications/:notification_id", Controller: "api/v1/accounts/notifications#destroy", Source: "routes.rb:283"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/notifications/read_all", Controller: "api/v1/accounts/notifications#read_all", Source: "routes.rb:285"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/notifications/unread_count", Controller: "api/v1/accounts/notifications#unread_count", Source: "routes.rb:286"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/notifications/destroy_all", Controller: "api/v1/accounts/notifications#destroy_all", Source: "routes.rb:287"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/notifications/:notification_id/snooze", Controller: "api/v1/accounts/notifications#snooze", Source: "routes.rb:290"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/notifications/:notification_id/unread", Controller: "api/v1/accounts/notifications#unread", Source: "routes.rb:291"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/notification_settings/", Controller: "api/v1/accounts/notification_settings#show", Source: "routes.rb:293"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/notification_settings/", Controller: "api/v1/accounts/notification_settings#update", Source: "routes.rb:293"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/teams/", Controller: "api/v1/accounts/teams#index", Source: "routes.rb:296"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/teams/", Controller: "api/v1/accounts/teams#create", Source: "routes.rb:296"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/teams/:team_id", Controller: "api/v1/accounts/teams#show", Source: "routes.rb:296"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/teams/:team_id", Controller: "api/v1/accounts/teams#update", Source: "routes.rb:296"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/teams/:team_id", Controller: "api/v1/accounts/teams#destroy", Source: "routes.rb:296"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/teams/:team_id/team_members/", Controller: "api/v1/accounts/teams/team_members#index", Source: "routes.rb:297"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/teams/:team_id/team_members/", Controller: "api/v1/accounts/teams/team_members#create", Source: "routes.rb:297"}, {Method: "PATCH", Path: "/api/v1/accounts/:account_id/teams/:team_id/team_members/", Controller: "api/v1/accounts/teams/team_members#update", Source: "routes.rb:300"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/teams/:team_id/team_members/", Controller: "api/v1/accounts/teams/team_members#destroy", Source: "routes.rb:299"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/custom_attribute_definitions/", Controller: "api/v1/accounts/custom_attribute_definitions#index", Source: "routes.rb:250"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/custom_attribute_definitions/", Controller: "api/v1/accounts/custom_attribute_definitions#create", Source: "routes.rb:250"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/custom_attribute_definitions/:id", Controller: "api/v1/accounts/custom_attribute_definitions#show", Source: "routes.rb:250"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/custom_attribute_definitions/:id", Controller: "api/v1/accounts/custom_attribute_definitions#update", Source: "routes.rb:250"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/custom_attribute_definitions/:id", Controller: "api/v1/accounts/custom_attribute_definitions#destroy", Source: "routes.rb:250"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/custom_filters/", Controller: "api/v1/accounts/custom_filters#index", Source: "routes.rb:251"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/custom_filters/", Controller: "api/v1/accounts/custom_filters#create", Source: "routes.rb:251"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/custom_filters/:id", Controller: "api/v1/accounts/custom_filters#show", Source: "routes.rb:251"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/custom_filters/:id", Controller: "api/v1/accounts/custom_filters#update", Source: "routes.rb:251"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/custom_filters/:id", Controller: "api/v1/accounts/custom_filters#destroy", Source: "routes.rb:251"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/automation_rules/", Controller: "api/v1/accounts/automation_rules#index", Source: "routes.rb:115"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/automation_rules/", Controller: "api/v1/accounts/automation_rules#create", Source: "routes.rb:115"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/automation_rules/:automation_id", Controller: "api/v1/accounts/automation_rules#show", Source: "routes.rb:115"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/automation_rules/:automation_id", Controller: "api/v1/accounts/automation_rules#update", Source: "routes.rb:115"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/automation_rules/:automation_id", Controller: "api/v1/accounts/automation_rules#destroy", Source: "routes.rb:115"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/automation_rules/:automation_id/clone", Controller: "api/v1/accounts/automation_rules#clone", Source: "routes.rb:116"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/macros/", Controller: "api/v1/accounts/macros#index", Source: "routes.rb:118"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/macros/", Controller: "api/v1/accounts/macros#create", Source: "routes.rb:118"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/macros/:macro_id", Controller: "api/v1/accounts/macros#show", Source: "routes.rb:118"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/macros/:macro_id", Controller: "api/v1/accounts/macros#update", Source: "routes.rb:118"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/macros/:macro_id", Controller: "api/v1/accounts/macros#destroy", Source: "routes.rb:118"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/macros/:macro_id/execute", Controller: "api/v1/accounts/macros#execute", Source: "routes.rb:119"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/sla_policies", Controller: "api/v1/accounts/sla_policies#index", Source: "routes.rb:121"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/sla_policies", Controller: "api/v1/accounts/sla_policies#create", Source: "routes.rb:121"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/sla_policies/:id", Controller: "api/v1/accounts/sla_policies#show", Source: "routes.rb:121"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/sla_policies/:id", Controller: "api/v1/accounts/sla_policies#update", Source: "routes.rb:121"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/sla_policies/:id", Controller: "api/v1/accounts/sla_policies#destroy", Source: "routes.rb:121"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/custom_roles/", Controller: "api/v1/accounts/custom_roles#index", Source: "routes.rb:122"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/agent_capacity_policies/", Controller: "api/v1/accounts/agent_capacity_policies#index", Source: "routes.rb:123"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/agent_capacity_policies/", Controller: "api/v1/accounts/agent_capacity_policies#create", Source: "routes.rb:123"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/agent_capacity_policies/:id", Controller: "api/v1/accounts/agent_capacity_policies#show", Source: "routes.rb:123"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/agent_capacity_policies/:id", Controller: "api/v1/accounts/agent_capacity_policies#update", Source: "routes.rb:123"}, {Method: "PATCH", Path: "/api/v1/accounts/:account_id/agent_capacity_policies/:id", Controller: "api/v1/accounts/agent_capacity_policies#update", Source: "routes.rb:123"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/agent_capacity_policies/:id", Controller: "api/v1/accounts/agent_capacity_policies#destroy", Source: "routes.rb:123"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/agent_capacity_policies/:agent_capacity_policy_id/users", Controller: "api/v1/accounts/agent_capacity_policies/users#index", Source: "routes.rb:125"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/agent_capacity_policies/:agent_capacity_policy_id/users", Controller: "api/v1/accounts/agent_capacity_policies/users#create", Source: "routes.rb:125"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/agent_capacity_policies/:agent_capacity_policy_id/users/:id", Controller: "api/v1/accounts/agent_capacity_policies/users#destroy", Source: "routes.rb:125"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/agent_capacity_policies/:agent_capacity_policy_id/inbox_limits", Controller: "api/v1/accounts/agent_capacity_policies/inbox_limits#create", Source: "routes.rb:126"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/agent_capacity_policies/:agent_capacity_policy_id/inbox_limits/:id", Controller: "api/v1/accounts/agent_capacity_policies/inbox_limits#update", Source: "routes.rb:126"}, {Method: "PATCH", Path: "/api/v1/accounts/:account_id/agent_capacity_policies/:agent_capacity_policy_id/inbox_limits/:id", Controller: "api/v1/accounts/agent_capacity_policies/inbox_limits#update", Source: "routes.rb:126"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/agent_capacity_policies/:agent_capacity_policy_id/inbox_limits/:id", Controller: "api/v1/accounts/agent_capacity_policies/inbox_limits#destroy", Source: "routes.rb:126"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/csat_survey_responses/", Controller: "api/v1/accounts/csat_survey_responses#index", Source: "routes.rb:219"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/csat_survey_responses/metrics", Controller: "api/v1/accounts/csat_survey_responses#metrics", Source: "routes.rb:221"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/applied_slas", Controller: "api/v1/accounts/applied_slas#index", Source: "routes.rb:228"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/applied_slas/metrics", Controller: "api/v1/accounts/applied_slas#metrics", Source: "routes.rb:230"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/applied_slas/download", Controller: "api/v1/accounts/applied_slas#download", Source: "routes.rb:231"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/preferences/", Controller: "api/v1/accounts/captain/preferences#show", Source: "routes.rb:63"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/captain/preferences/", Controller: "api/v1/accounts/captain/preferences#update", Source: "routes.rb:63"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistants/", Controller: "api/v1/accounts/captain/assistants#index", Source: "routes.rb:64"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/assistants/", Controller: "api/v1/accounts/captain/assistants#create", Source: "routes.rb:64"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id", Controller: "api/v1/accounts/captain/assistants#show", Source: "routes.rb:64"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id", Controller: "api/v1/accounts/captain/assistants#update", Source: "routes.rb:64"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id", Controller: "api/v1/accounts/captain/assistants#destroy", Source: "routes.rb:64"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/playground", Controller: "api/v1/accounts/captain/assistants#playground", Source: "routes.rb:66"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistants/tools", Controller: "api/v1/accounts/captain/assistants#tools", Source: "routes.rb:69"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/inboxes", Controller: "api/v1/accounts/captain/assistants/inboxes#index", Source: "routes.rb:71"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/inboxes", Controller: "api/v1/accounts/captain/assistants/inboxes#create", Source: "routes.rb:71"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/inboxes/:inbox_id", Controller: "api/v1/accounts/captain/assistants/inboxes#destroy", Source: "routes.rb:71"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/", Controller: "api/v1/accounts/captain/assistants/scenarios#index", Source: "routes.rb:72"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/", Controller: "api/v1/accounts/captain/assistants/scenarios#create", Source: "routes.rb:72"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/:scenario_id", Controller: "api/v1/accounts/captain/assistants/scenarios#show", Source: "routes.rb:72"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/:scenario_id", Controller: "api/v1/accounts/captain/assistants/scenarios#update", Source: "routes.rb:72"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/:scenario_id", Controller: "api/v1/accounts/captain/assistants/scenarios#destroy", Source: "routes.rb:72"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistant_responses/", Controller: "api/v1/accounts/captain/assistant_responses#index", Source: "routes.rb:74"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/assistant_responses/", Controller: "api/v1/accounts/captain/assistant_responses#create", Source: "routes.rb:74"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistant_responses/:response_id", Controller: "api/v1/accounts/captain/assistant_responses#show", Source: "routes.rb:74"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/captain/assistant_responses/:response_id", Controller: "api/v1/accounts/captain/assistant_responses#update", Source: "routes.rb:74"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/captain/assistant_responses/:response_id", Controller: "api/v1/accounts/captain/assistant_responses#destroy", Source: "routes.rb:74"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/bulk_actions/", Controller: "api/v1/accounts/captain/bulk_actions#create", Source: "routes.rb:75"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/copilot_threads/", Controller: "api/v1/accounts/captain/copilot_threads#index", Source: "routes.rb:76"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/copilot_threads/", Controller: "api/v1/accounts/captain/copilot_threads#create", Source: "routes.rb:76"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/copilot_threads/:thread_id/copilot_messages/", Controller: "api/v1/accounts/captain/copilot_messages#index", Source: "routes.rb:77"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/copilot_threads/:thread_id/copilot_messages/", Controller: "api/v1/accounts/captain/copilot_messages#create", Source: "routes.rb:77"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/custom_tools/", Controller: "api/v1/accounts/captain/custom_tools#index", Source: "routes.rb:79"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/custom_tools/", Controller: "api/v1/accounts/captain/custom_tools#create", Source: "routes.rb:79"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/custom_tools/:tool_id", Controller: "api/v1/accounts/captain/custom_tools#show", Source: "routes.rb:79"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/captain/custom_tools/:tool_id", Controller: "api/v1/accounts/captain/custom_tools#update", Source: "routes.rb:79"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/captain/custom_tools/:tool_id", Controller: "api/v1/accounts/captain/custom_tools#destroy", Source: "routes.rb:79"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/custom_tools/test", Controller: "api/v1/accounts/captain/custom_tools#test", Source: "routes.rb:80"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/documents/", Controller: "api/v1/accounts/captain/documents#index", Source: "routes.rb:82"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/documents/", Controller: "api/v1/accounts/captain/documents#create", Source: "routes.rb:82"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/captain/documents/:document_id", Controller: "api/v1/accounts/captain/documents#show", Source: "routes.rb:82"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/captain/documents/:document_id", Controller: "api/v1/accounts/captain/documents#destroy", Source: "routes.rb:82"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/documents/:document_id/sync", Controller: "api/v1/accounts/captain/documents#sync", Source: "routes.rb:83"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/tasks/rewrite", Controller: "api/v1/accounts/captain/tasks#rewrite", Source: "routes.rb:86"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/tasks/summarize", Controller: "api/v1/accounts/captain/tasks#summarize", Source: "routes.rb:87"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/tasks/reply_suggestion", Controller: "api/v1/accounts/captain/tasks#reply_suggestion", Source: "routes.rb:88"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/tasks/label_suggestion", Controller: "api/v1/accounts/captain/tasks#label_suggestion", Source: "routes.rb:89"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/captain/tasks/follow_up", Controller: "api/v1/accounts/captain/tasks#follow_up", Source: "routes.rb:90"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/assignment_policies/", Controller: "api/v1/accounts/assignment_policies#index", Source: "routes.rb:306"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/assignment_policies/", Controller: "api/v1/accounts/assignment_policies#create", Source: "routes.rb:306"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/assignment_policies/:policy_id", Controller: "api/v1/accounts/assignment_policies#show", Source: "routes.rb:306"}, {Method: "PUT", Path: "/api/v1/accounts/:account_id/assignment_policies/:policy_id", Controller: "api/v1/accounts/assignment_policies#update", Source: "routes.rb:306"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/assignment_policies/:policy_id", Controller: "api/v1/accounts/assignment_policies#destroy", Source: "routes.rb:306"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/assignment_policies/:policy_id/inboxes", Controller: "api/v1/accounts/assignment_policies/inboxes#index", Source: "routes.rb:307"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/assignment_policies/:policy_id/inboxes", Controller: "api/v1/accounts/assignment_policies/inboxes#create", Source: "routes.rb:307"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/assignment_policies/:policy_id/inboxes/:inbox_id", Controller: "api/v1/accounts/assignment_policies/inboxes#destroy", Source: "routes.rb:307"}, {Method: "GET", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/assignment_policy/", Controller: "api/v1/accounts/inboxes/assignment_policy#show", Source: "routes.rb:311"}, {Method: "POST", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/assignment_policy/", Controller: "api/v1/accounts/inboxes/assignment_policy#create", Source: "routes.rb:311"}, {Method: "DELETE", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/assignment_policy/", Controller: "api/v1/accounts/inboxes/assignment_policy#destroy", Source: "routes.rb:311"}, {Method: "POST", Path: "/api/v1/widget/direct_uploads", Controller: "api/v1/widget/direct_uploads#create", Source: "routes.rb:443"}, {Method: "POST", Path: "/api/v1/widget/config", Controller: "api/v1/widget/config#create", Source: "routes.rb:444"}, {Method: "GET", Path: "/api/v1/widget/campaigns", Controller: "api/v1/widget/campaigns#index", Source: "routes.rb:445"}, {Method: "POST", Path: "/api/v1/widget/events", Controller: "api/v1/widget/events#create", Source: "routes.rb:446"}, {Method: "GET", Path: "/api/v1/widget/messages", Controller: "api/v1/widget/messages#index", Source: "routes.rb:447"}, {Method: "POST", Path: "/api/v1/widget/messages", Controller: "api/v1/widget/messages#create", Source: "routes.rb:447"}, {Method: "PUT", Path: "/api/v1/widget/messages/:message_id", Controller: "api/v1/widget/messages#update", Source: "routes.rb:447"}, {Method: "GET", Path: "/api/v1/widget/conversations", Controller: "api/v1/widget/conversations#index", Source: "routes.rb:448"}, {Method: "POST", Path: "/api/v1/widget/conversations", Controller: "api/v1/widget/conversations#create", Source: "routes.rb:448"}, {Method: "POST", Path: "/api/v1/widget/conversations/destroy_custom_attributes", Controller: "api/v1/widget/conversations#destroy_custom_attributes", Source: "routes.rb:450"}, {Method: "POST", Path: "/api/v1/widget/conversations/set_custom_attributes", Controller: "api/v1/widget/conversations#set_custom_attributes", Source: "routes.rb:451"}, {Method: "POST", Path: "/api/v1/widget/conversations/update_last_seen", Controller: "api/v1/widget/conversations#update_last_seen", Source: "routes.rb:452"}, {Method: "POST", Path: "/api/v1/widget/conversations/toggle_typing", Controller: "api/v1/widget/conversations#toggle_typing", Source: "routes.rb:453"}, {Method: "POST", Path: "/api/v1/widget/conversations/transcript", Controller: "api/v1/widget/conversations#transcript", Source: "routes.rb:454"}, {Method: "GET", Path: "/api/v1/widget/conversations/toggle_status", Controller: "api/v1/widget/conversations#toggle_status", Source: "routes.rb:455"}, {Method: "GET", Path: "/api/v1/widget/contact", Controller: "api/v1/widget/contact#show", Source: "routes.rb:458"}, {Method: "PUT", Path: "/api/v1/widget/contact", Controller: "api/v1/widget/contact#update", Source: "routes.rb:458"}, {Method: "POST", Path: "/api/v1/widget/contact/destroy_custom_attributes", Controller: "api/v1/widget/contact#destroy_custom_attributes", Source: "routes.rb:460"}, {Method: "PATCH", Path: "/api/v1/widget/contact/set_user", Controller: "api/v1/widget/contact#set_user", Source: "routes.rb:461"}, {Method: "GET", Path: "/api/v1/widget/inbox_members", Controller: "api/v1/widget/inbox_members#index", Source: "routes.rb:463"}, {Method: "POST", Path: "/api/v1/widget/labels", Controller: "api/v1/widget/labels#create", Source: "routes.rb:464"}, {Method: "DELETE", Path: "/api/v1/widget/labels/:label_id", Controller: "api/v1/widget/labels#destroy", Source: "routes.rb:464"}, {Method: "POST", Path: "/api/v1/widget/integrations/dyte/add_participant_to_meeting", Controller: "api/v1/widget/integrations/dyte#add_participant_to_meeting", Source: "routes.rb:469"}, {Method: "POST", Path: "/public/api/v1/inboxes/:inbox_id/contacts", Controller: "public/api/v1/inboxes/contacts#create", Source: "routes.rb:572"}, {Method: "GET", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id", Controller: "public/api/v1/inboxes/contacts#show", Source: "routes.rb:572"}, {Method: "PUT", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id", Controller: "public/api/v1/inboxes/contacts#update", Source: "routes.rb:572"}, {Method: "GET", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations", Controller: "public/api/v1/inboxes/conversations#index", Source: "routes.rb:573"}, {Method: "POST", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations", Controller: "public/api/v1/inboxes/conversations#create", Source: "routes.rb:573"}, {Method: "GET", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id", Controller: "public/api/v1/inboxes/conversations#show", Source: "routes.rb:573"}, {Method: "POST", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/toggle_status", Controller: "public/api/v1/inboxes/conversations#toggle_status", Source: "routes.rb:575"}, {Method: "POST", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/toggle_typing", Controller: "public/api/v1/inboxes/conversations#toggle_typing", Source: "routes.rb:576"}, {Method: "POST", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/update_last_seen", Controller: "public/api/v1/inboxes/conversations#update_last_seen", Source: "routes.rb:577"}, {Method: "GET", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/messages", Controller: "public/api/v1/inboxes/messages#index", Source: "routes.rb:580"}, {Method: "POST", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/messages", Controller: "public/api/v1/inboxes/messages#create", Source: "routes.rb:580"}, {Method: "PUT", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/messages/:message_id", Controller: "public/api/v1/inboxes/messages#update", Source: "routes.rb:580"}, {Method: "GET", Path: "/public/api/v1/csat_survey/:id", Controller: "public/api/v1/csat_survey#show", Source: "routes.rb:585"}, {Method: "PUT", Path: "/public/api/v1/csat_survey/:id", Controller: "public/api/v1/csat_survey#update", Source: "routes.rb:585"}, {Method: "POST", Path: "/api/v2/accounts/", Controller: "api/v2/accounts#create", Source: "routes.rb:478"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/summary_reports/agent", Controller: "api/v2/accounts/summary_reports#agent", Source: "routes.rb:481"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/summary_reports/team", Controller: "api/v2/accounts/summary_reports#team", Source: "routes.rb:482"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/summary_reports/inbox", Controller: "api/v2/accounts/summary_reports#inbox", Source: "routes.rb:483"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/summary_reports/label", Controller: "api/v2/accounts/summary_reports#label", Source: "routes.rb:484"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/summary_reports/channel", Controller: "api/v2/accounts/summary_reports#channel", Source: "routes.rb:485"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/reports", Controller: "api/v2/accounts/reports#index", Source: "routes.rb:488"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/reports/summary", Controller: "api/v2/accounts/reports#summary", Source: "routes.rb:491"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/reports/bot_summary", Controller: "api/v2/accounts/reports#bot_summary", Source: "routes.rb:492"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/reports/agents", Controller: "api/v2/accounts/reports#agents", Source: "routes.rb:493"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/reports/inboxes", Controller: "api/v2/accounts/reports#inboxes", Source: "routes.rb:494"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/reports/labels", Controller: "api/v2/accounts/reports#labels", Source: "routes.rb:495"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/reports/teams", Controller: "api/v2/accounts/reports#teams", Source: "routes.rb:496"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/reports/conversations", Controller: "api/v2/accounts/reports#conversations", Source: "routes.rb:497"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/reports/conversations_summary", Controller: "api/v2/accounts/reports#conversations_summary", Source: "routes.rb:498"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/reports/conversation_traffic", Controller: "api/v2/accounts/reports#conversation_traffic", Source: "routes.rb:499"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/reports/bot_metrics", Controller: "api/v2/accounts/reports#bot_metrics", Source: "routes.rb:500"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/reports/inbox_label_matrix", Controller: "api/v2/accounts/reports#inbox_label_matrix", Source: "routes.rb:501"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/reports/first_response_time_distribution", Controller: "api/v2/accounts/reports#first_response_time_distribution", Source: "routes.rb:502"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/reports/outgoing_messages_count", Controller: "api/v2/accounts/reports#outgoing_messages_count", Source: "routes.rb:503"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/live_reports/conversation_metrics", Controller: "api/v2/accounts/live_reports#conversation_metrics", Source: "routes.rb:508"}, {Method: "GET", Path: "/api/v2/accounts/:account_id/live_reports/grouped_conversation_metrics", Controller: "api/v2/accounts/live_reports#grouped_conversation_metrics", Source: "routes.rb:509"}, } func main() { gochatPath := flag.String("gochat", "docs/parity/gochat_routes.txt", "GoChat route dump") chatwootPath := flag.String("chatwoot", "reference/chatwoot/config/routes.rb", "Chatwoot routes.rb path") outPath := flag.String("out", "docs/parity/route_parity.md", "route parity markdown output") chatwootOut := flag.String("chatwoot-out", "docs/parity/chatwoot_routes_static.md", "Chatwoot static route source output") flag.Parse() gochatRoutes, err := readRouteDump(*gochatPath) fatalIf(err) decls, err := extractChatwootDecls(*chatwootPath) fatalIf(err) fatalIf(writeChatwootSource(*chatwootOut, *chatwootPath, decls)) fatalIf(writeParity(*outPath, *gochatPath, *chatwootPath, gochatRoutes)) } func readRouteDump(path string) (map[string]route, error) { f, err := os.Open(path) if err != nil { return nil, err } defer f.Close() routes := map[string]route{} scanner := bufio.NewScanner(f) for scanner.Scan() { line := strings.TrimSpace(scanner.Text()) if line == "" || strings.HasPrefix(line, "TOTAL:") { continue } parts := strings.Fields(line) if len(parts) < 2 { continue } r := route{Method: parts[0], Path: parts[1]} routes[key(r.Method, r.Path)] = r } return routes, scanner.Err() } func extractChatwootDecls(path string) ([]sourceDecl, error) { f, err := os.Open(path) if err != nil { return nil, err } defer f.Close() interesting := regexp.MustCompile(`^\s*(namespace|scope|resources?|get|post|put|patch|delete|mount|mount_devise_token_auth_for)\b`) var out []sourceDecl scanner := bufio.NewScanner(f) lineNo := 0 for scanner.Scan() { lineNo++ line := scanner.Text() trimmed := strings.TrimSpace(line) if trimmed == "" || strings.HasPrefix(trimmed, "#") { continue } if interesting.MatchString(line) { out = append(out, sourceDecl{Line: lineNo, Text: trimmed}) } } return out, scanner.Err() } func writeChatwootSource(path string, source string, decls []sourceDecl) error { var b strings.Builder b.WriteString("# Chatwoot Route Source Declarations\n\n") b.WriteString("Source: `" + source + "`\n\n") b.WriteString("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.\n\n") b.WriteString("| Line | Declaration |\n") b.WriteString("| --- | --- |\n") for _, decl := range decls { b.WriteString(fmt.Sprintf("| %d | `%s` |\n", decl.Line, escapePipes(decl.Text))) } return os.WriteFile(path, []byte(b.String()), 0o644) } func writeParity(path string, gochatPath string, chatwootPath string, gochatRoutes map[string]route) error { var exact, methodCompatible, compatible, missing []route for _, expected := range criticalRoutes { if _, ok := gochatRoutes[key(expected.Method, expected.Path)]; ok { exact = append(exact, expected) continue } if hasMethodCompatible(gochatRoutes, expected) { methodCompatible = append(methodCompatible, expected) continue } if hasParamCompatible(gochatRoutes, expected) { compatible = append(compatible, expected) continue } missing = append(missing, expected) } sortRoutes(exact) sortRoutes(methodCompatible) sortRoutes(compatible) sortRoutes(missing) var b strings.Builder b.WriteString("# Route Parity Report\n\n") b.WriteString("Generated from:\n\n") b.WriteString("- GoChat route dump: `" + gochatPath + "`\n") b.WriteString("- Chatwoot route source: `" + chatwootPath + "`\n\n") b.WriteString("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`.\n\n") b.WriteString(fmt.Sprintf("Summary: %d exact, %d method-compatible, %d parameter-compatible, %d missing out of %d tracked critical routes.\n\n", len(exact), len(methodCompatible), len(compatible), len(missing), len(criticalRoutes))) b.WriteString("## Missing Critical Routes\n\n") writeRouteTable(&b, missing, gochatRoutes, "missing") b.WriteString("\n## Method-Compatible Routes\n\n") b.WriteString("These routes exist at the same path but with a compatible HTTP method. Rails resource `update` routes expose both `PATCH` and `PUT`; GoChat currently exposes only one method for some update endpoints. Keep these tracked until both methods are registered or the frontend is proven to call only the implemented method.\n\n") writeRouteTable(&b, methodCompatible, gochatRoutes, "method-compatible") b.WriteString("\n## Parameter-Compatible Routes\n\n") b.WriteString("These routes exist with equivalent method and path shape but different parameter names. They need handler/serializer parity review, and exact external path compatibility must be preserved.\n\n") writeRouteTable(&b, compatible, gochatRoutes, "parameter-compatible") b.WriteString("\n## Exact Critical Routes\n\n") writeRouteTable(&b, exact, gochatRoutes, "exact") return os.WriteFile(path, []byte(b.String()), 0o644) } func writeRouteTable(b *strings.Builder, routes []route, gochatRoutes map[string]route, status string) { b.WriteString("| Method | Chatwoot Path | GoChat Match | Controller | Source | Status |\n") b.WriteString("| --- | --- | --- | --- | --- | --- |\n") if len(routes) == 0 { b.WriteString("| - | - | - | - | - | none |\n") return } for _, r := range routes { match := "-" if status == "exact" { match = r.Path } else if status == "method-compatible" { match = methodCompatibleRoute(gochatRoutes, r) } else if status == "parameter-compatible" { match = compatiblePath(gochatRoutes, r) } b.WriteString(fmt.Sprintf("| %s | `%s` | `%s` | `%s` | `%s` | %s |\n", r.Method, r.Path, match, r.Controller, r.Source, status)) } } func hasMethodCompatible(routes map[string]route, expected route) bool { return methodCompatibleRoute(routes, expected) != "-" } func methodCompatibleRoute(routes map[string]route, expected route) string { for _, method := range compatibleMethods(expected.Method) { if _, ok := routes[key(method, expected.Path)]; ok { return method + " " + expected.Path } } return "-" } func compatibleMethods(method string) []string { switch method { case "PUT": return []string{"PATCH"} case "PATCH": return []string{"PUT"} default: return nil } } func hasParamCompatible(routes map[string]route, expected route) bool { return compatiblePath(routes, expected) != "-" } func compatiblePath(routes map[string]route, expected route) string { normExpected := normalizeParams(expected.Path) for _, r := range routes { if r.Method == expected.Method && normalizeParams(r.Path) == normExpected { return r.Path } } return "-" } func normalizeParams(path string) string { parts := strings.Split(path, "/") for i, part := range parts { if strings.HasPrefix(part, ":") { parts[i] = ":param" } } return strings.Join(parts, "/") } func key(method, path string) string { return method + " " + path } func sortRoutes(routes []route) { sort.Slice(routes, func(i, j int) bool { if routes[i].Method != routes[j].Method { return routes[i].Method < routes[j].Method } return routes[i].Path < routes[j].Path }) } func escapePipes(s string) string { return strings.ReplaceAll(s, "|", "\\|") } func fatalIf(err error) { if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } }