Permissions and who can see what
Every permission key the AI Support console uses, which screen and which route needs each one, the twelve Super-Admin-only settings, and two role grants that actually work.
Roles are edited at Admin → CRM → Roles (/admin/crm/role), and the key
list they draw from is at /admin/crm/permission.
This addon uses thirteen keys of its own and three keys that belong to the
core platform. Every other page in this documentation names only the keys its
own subject needs: The console,
Install, Settings and
Channels name access.ai.support and
access.ai.support.settings, and Cost and
budgets and Knowledge
pipeline name the route keys their own screens depend
on. That first pair is the one to be careful with: it reads like it opens the
whole addon, and it opens three URLs — Overview, Settings and Actions. It does
not open Sources, Gaps, Agents, the Handbook or the Live Inbox, and it loads not
one figure on Overview. This page is the whole list.
Two gates, not one
Every screen is checked twice, and the two checks use different keys on several screens.
- The page gate decides whether the URL opens at all. It is the key in
frontend/middlewares/permissions.jsonfor that path — or, for a path with no entry,access.admin, which is the fail-closed fallback rather than a licence. - The route gate decides whether the data behind the page loads. It is the
permissiondeclared on each backend route.
Grant the page key and not the route key and the screen opens, renders its
frame, and shows nothing — no error, no permission message. The most common
instance of this is Overview: the page opens on access.ai.support, and every
figure on it comes from a route that requires view.ai.support.analytics.
Nobody reports that as an access problem. They report it as "the dashboard is empty".
The addon's own keys
| Key | What it actually unlocks | Routes |
|---|---|---|
access.ai.support |
Opens /admin/ai/support. Also gates the master on/off route and all eight admin-assistant console routes — ask, pending, catalogue, approve, dismiss, and the three conversation routes |
9 |
access.ai.support.provider |
The Provider screen and all three of its routes — read, test, activate | 3 |
access.ai.support.settings |
The Settings screen and the Actions console, read and write | 6 |
view.ai.support.analytics |
The Overview figures and the escalation report | 2 |
view.ai.support.knowledge |
Sources, Gaps, the retrieval tester, the coverage report | 8 |
create.ai.support.knowledge |
Writing an article, drafting one from a gap, Teach from this ticket | 3 |
edit.ai.support.knowledge |
Editing or publishing an article, updating a gap, Re-index | 3 |
delete.ai.support.knowledge |
Deleting an article | 1 |
view.ai.support.agent |
The Agents screen | 1 |
create.ai.support.agent |
Creating an agent, and Create default agent | 2 |
edit.ai.support.agent |
Editing an agent | 1 |
delete.ai.support.agent |
Deleting an agent | 1 |
view.ai.support.handbook |
The Handbook screen, and the documentation-only half of it | 1 |
Those thirteen plus the three core keys below cover all 48 admin routes this addon ships. Every route declares one, and every one of the sixteen is seeded — there is no route in here that a role grant cannot reach and no key in here that does not exist to be granted.
The admin assistant is bounded by every OTHER key you hold
The operator's own assistant — the Handbook screen, which is what both the nav and the page header call it — is the one surface in this addon whose reach is not described by a key of its own, and the table above cannot say so. Two keys open it and neither one grants anything:
view.ai.support.handbookopens the screen and lets you ask a documentation question. That is the whole of what it grants.access.ai.supportunlocks the live half: reading queues, opening screens, procedures, and approving actions.
Settings sit in front of both halves, and no role grant substitutes for one.
Every question on this screen — documentation or live — first needs
aiSupportEnabled, the same master switch the customer assistant runs on, so an
install that has never switched the assistant on has no operator assistant
either. The live half then needs aiSupportAdminAssistantEnabled, which ships
off and only a Super Admin can turn on: while it is off, the live route
refuses every request outright — a Super Admin included — with a plain sentence
saying so, while the documentation-only route never consults it and keeps
answering. Actions need aiSupportAdminActionsEnabled and at least one key in
aiSupportAdminActionKeys on top of that, and procedures containing an action
step disappear with them.
Everything the live half can actually reach is then filtered by the rest of
your role. A colleague holding access.ai.support and nothing else gets an
assistant that can answer from documentation, name no screen, count no queue and
offer no action — because each of those is gated on the key its own screen
demands, checked against their session on every request.
So the honest reading of access.ai.support here is "may open the assistant",
not "may use it". What it can do for a given person is the intersection with
what that person could already do by clicking:
| Capability | Gated on |
|---|---|
| Count a queue | The queue's own key, section by section — access.withdraw, access.deposit, access.kyc.application, access.support.ticket, access.p2p.dispute. A queue you cannot open is not counted; it is absent, not zero |
| Read platform health | Block by block — access.extension for the addon list, access.deposit.gateway for the gateways, access.exchange for the exchange, access.ai.support.settings for the assistant's own tier and budget |
| Read the audit trail | access.admin.audit |
| Open a screen | The permission the catalogue records for that screen, all 120 of them — the page gate itself for all but the four below |
| Rebuild the knowledge index | edit.ai.support.knowledge |
| Reload the settings cache | edit.settings |
| Back up the database | access.database |
| Re-sync the currency icons | edit.currency.icon |
| Send yourself a test email | access.notification.settings |
| Test the AI provider | access.ai.support.provider |
| A procedure | Every step's key. A procedure you cannot finish is never offered |
The six rows from Rebuild the knowledge index to Test the AI provider are
the whole action catalogue. Each is offered only when it is ticked
in aiSupportAdminActionKeys and you hold the key beside it: the allowlist is
the operator's decision about the install, the permission is the check against
you. Neither substitutes for the other, and neither can widen the other.
The permission is re-derived from the live catalogue when you approve, never read off the proposal — so re-gating an action takes effect on proposals already written rather than on the next one.
/admin/copy-trading/leader, /follower, /health and /settings are the only
four of the 120 that do not appear in frontend/middlewares/permissions.json.
The copy-trading console ships no permission.ts, so the catalogue carries
view.copy_trading — the key its own read routes declare — for all four.
That is the key the assistant filters on. The URL itself falls back to
access.admin, so the two differ: a colleague with access.admin can type those
four addresses and get in, and the assistant will still not name them until they
hold view.copy_trading. Grant that key if you want copy trading in the
assistant's catalogue; looking for a per-screen key in permissions.json will
not find one.
The three core keys it reuses
These are not ai.support keys and they are the ones most often missed, because
nothing in the addon's name suggests them.
| Key | What it unlocks here | Why it is this key |
|---|---|---|
view.support.ticket |
The entire Live Inbox — the queue and every conversation | The inbox is a support-agent workspace that happens to show AI drafts. Your ticket agents already hold this key, so the screen appears on upgrade with no grant step. |
edit.support.ticket |
Take over, Release, requesting a draft, and cancelling a process a customer abandoned | Same reasoning: acting on a conversation is a ticket action. |
view.user |
The Ask about this user rail on /admin/crm/user/{id} |
Deliberately the same key as the customer page the rail sits on. It never widens access — the model is shown strictly less than the page already shows. |
view.support.ticket is also the key the prompt-cache alarm notifies. When
prompt caching stops working, the hourly job raises an admin notification to
everyone holding it.
Screen by screen
| Screen | Path | Page gate | Also needs |
|---|---|---|---|
| Overview | /admin/ai/support |
access.ai.support |
view.ai.support.analytics for every figure |
| Live Inbox | /admin/ai/support/inbox |
view.support.ticket |
edit.support.ticket to take over, release or draft; create.ai.support.knowledge for Teach from this ticket |
| Handbook | /admin/ai/support/handbook |
view.ai.support.handbook |
access.ai.support for the live half — see below. Super Admin for the three switches |
| Sources | /admin/ai/support/knowledge |
view.ai.support.knowledge |
edit.ai.support.knowledge for Re-index |
| Gaps | /admin/ai/support/gaps |
view.ai.support.knowledge |
create.ai.support.knowledge to draft an article from a gap; edit.ai.support.knowledge to publish that draft and to close the gap |
| Provider | /admin/ai/support/provider |
access.ai.support.provider |
— |
| Agents | /admin/ai/support/agents |
view.ai.support.agent |
create / edit / delete.ai.support.agent for the row actions |
| Settings | /admin/ai/support/settings |
access.ai.support.settings |
Super Admin for twelve keys — below |
| Actions | /admin/ai/support/workflows |
access.ai.support.settings |
Super Admin for the three capability keys |
Two of these deserve a sentence, because they look like oversights and are not.
Actions has no key of its own. It is the Settings screen's workflow field
promoted to a page, and every request it makes — the operation, workflow and
guide catalogues, and the settings read and write — is gated on
access.ai.support.settings on the server. A separate access key for Actions
would gate the door and nothing behind it: the page would open and all four
fetches would return 403.
Gaps shares the knowledge key. A gap is the knowledge base's to-do list, and closing one writes an article.
The twelve settings no role grant can unlock
Twelve keys are refused by that route for anyone who is not a Super Admin,
and no permission grant changes that. The check is by role name: rolesGate
treats the role literally named Super Admin as bypassing permission checks
entirely, and this route resolves the caller's role on every request.
The twelve are not a hand-written list. The route intersects this addon's own keys with the platform's protected-settings register, so a thirteenth added to that register is locked here the moment it lands, with no edit to this screen.
| Key | What it decides | Where a Super Admin changes it |
|---|---|---|
aiSupportEnabled |
Whether the assistant speaks to customers at all | Guardrails, master switch |
aiSupportAutonomy |
COPILOT / AUTO_TICKET / AUTO_ALL — whether a human approves each reply |
Guardrails, master switch |
aiSupportProvider |
Which AI service answers | Provider |
aiSupportDailyBudgetUsd |
The daily spend ceiling | Guardrails |
aiSupportMonthlyBudgetUsd |
The monthly spend ceiling | Guardrails |
aiSupportAccountToolsEnabled |
Whether the assistant may read customer account data at all | Guardrails |
aiSupportOperationsEnabled |
Whether it may offer an action a customer confirms | Actions |
aiSupportWorkflowsEnabled |
Whether it may carry a customer through a multi-step process | Actions |
aiSupportWorkflowKeys |
Which processes are allowed | Actions |
aiSupportAdminAssistantEnabled |
Whether your own console — its queues, its screens, what a colleague changed this morning — is described to a model at all | Handbook |
aiSupportAdminActionsEnabled |
Whether that assistant may offer you a platform-wide action to approve | Handbook |
aiSupportAdminActionKeys |
Which of the six admin actions it may offer. Empty means none | Handbook |
The last three are a different decision from the nine above them, which is why they are separate keys rather than sharing the customer ones. The nine decide what an automated system says to your customers, and every action behind them runs on the confirming customer's own account. The three decide whether your operational state leaves the install, and the actions behind them rebuild indexes, flush caches and dump the database.
All twelve are disclosed to everyone with access.ai.support.settings rather
than hidden. The master switch and the autonomy mode are the panel at the top of
the Guardrails tab; the other ten are rows under Super Admin controls, each
showing its current value. For anyone who is not a Super Admin every one of them
carries a padlock and, where one exists, a link to the screen that does change
it; a Super Admin gets live controls for the two budget ceilings and the
account-tools switch, which have no other home in the product. A control an
operator cannot find is a control they
assume does not exist, and hunting for a master switch that is merely hidden
produces a support ticket of its own.
The Settings screen submits every changed field as a single payload, and the write route collects every refused key and throws one 403 for the entire batch. It does not drop the offender and save the rest.
So an admin who changes the retention period and touches a protected key loses the retention period too, with nothing on screen naming the control that did it. The locked rendering is derived from the same list the server enforces precisely so you cannot reach that state from the UI — but you can reach it from a stale page, or from an API client.
The two errors are worded differently on purpose. "These settings cannot be changed here" means the key does not belong to this addon and no role will accept it. "Only a Super Admin can change these" names the people who can.
A minimum working grant for a support lead
Someone who runs the desk day to day: works the inbox, closes gaps, keeps the knowledge base honest, and tunes thresholds. They do not need to be able to switch the assistant on or change what it spends.
access.ai.support
access.ai.support.settings
view.ai.support.analytics
view.ai.support.knowledge
create.ai.support.knowledge
edit.ai.support.knowledge
view.ai.support.agent
edit.ai.support.agent
view.support.ticket
edit.support.ticketWhat that grant does not include, deliberately:
access.ai.support.provider— changing the AI service is a billing decision.delete.ai.support.knowledgeanddelete.ai.support.agent— deleting an article is how a good answer disappears without anyone noticing.view.ai.support.handbook— add it if you want them asking the operator documentation. Every answer is a real model call, and admin-side calls are summed into the same daily and monthly ceilings the customer assistant spends against, so it is a decision rather than an omission.view.user— the Ask about this user rail is on the customer record, not in this console, and that key opens the whole customer page.
A read-only reviewer grant
Someone auditing what the assistant said and what it cost, who must change nothing:
access.ai.support
view.ai.support.analytics
view.ai.support.knowledge
view.ai.support.agent
view.support.ticketview.support.ticket is what makes the Live Inbox readable. Without
edit.support.ticket they can read every conversation and the reasoning rail
behind it, and cannot take one over, release one, or ask for a draft.
Leave access.ai.support.settings out of a reviewer grant even though it is
named access: on this addon that single key is read and write, on both
Settings and Actions.