{
 "system": "Vast Helpdesk",
 "howTo": [
  "Vast Helpdesk is a help desk run by typed terminal commands. It manages Business, cPanel, Email, Go Meter, Nextcloud, Shop and Web chat for a company and its clients.",
  "To run commands, send them as terminal lines, one per line, each starting with \"$ \" (or inside a ``` code block). Example:",
  "$ list businesses",
  "$ add business Solar Co",
  "Replace the example values with the real ones (names, emails, folders). Several steps: one line each, in the order they should run.",
  "Several steps are run ONE AT A TIME: the help desk runs the first, sends you its result (\"Done so far: 1. $ find folder TestMe → No folder named like TestMe\"), and asks for the next. Reply with the next command only, or \"done\" when it is finished (optionally \"reply: <a short message for the person who asked>\"). So you can decide from each result, e.g. create a folder only if it was not found.",
  "If you are only given the name of a docs section and do not have these commands, reply \"send docs\" and the commands are sent to you.",
  "Only the commands in these pages exist. Everything else in a reply is ignored by the help desk. If you are not sure, give the most likely command.",
  "Every command is checked by the help desk before it runs (who is asking, what they own, limits, confirmations), so suggesting a command is always safe.",
  "Commands that create something (a folder, a user) reuse it when it already exists, so \"create it if it is missing\" is simply the create command: no need to search or check first.",
  "Names do not have to be exact: clients, staff, chats, groups, businesses and mailboxes are found by part of the name, a small typo, a phone number written any way, or an earlier name. When several fit, the person is asked which one (a numbered list).",
  "Before something changes, the person answers yes (do it), no (not what I meant: the help desk asks again) or cancel (stop)."
 ],
 "format": "One terminal line per command, starting with \"$ \". Replace example values with real ones.",
 "sections": [
  {
   "id": "console",
   "title": "Console",
   "lead": "Managing the help desk itself: clients, chats, tickets, rules, plugins and settings. Staff only.",
   "tips": [],
   "commands": [
    {
     "id": "audit_recent",
     "command": "what happened today",
     "form": null,
     "title": "Recent activity",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": true
      }
     ],
     "also": [
      "what did Hadi do"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "audit_recent",
      "command": "what happened today",
      "form": null,
      "title": "Recent activity",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": true
       }
      ],
      "also": [
       "what did Hadi do"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Recent activity",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "admins_list",
     "command": "list admins",
     "form": null,
     "title": "List admins",
     "details": [],
     "also": [],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "admins_list",
      "command": "list admins",
      "form": null,
      "title": "List admins",
      "details": [],
      "also": [],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "List admins",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "clients_list",
     "command": "list clients",
     "form": null,
     "title": "List clients",
     "details": [
      {
       "name": "q",
       "kind": "name or number to find",
       "optional": true
      }
     ],
     "also": [
      "how many clients do i have",
      "i need to know how many clients i have"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "clients_list",
      "command": "list clients",
      "form": null,
      "title": "List clients",
      "details": [
       {
        "name": "q",
        "kind": "name or number to find",
        "optional": true
       }
      ],
      "also": [
       "how many clients do i have",
       "i need to know how many clients i have"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "List clients",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "pending_list",
     "command": "pending",
     "form": null,
     "title": "What is waiting for confirmation",
     "details": [],
     "also": [
      "list pending"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "pending_list",
      "command": "pending",
      "form": null,
      "title": "What is waiting for confirmation",
      "details": [],
      "also": [
       "list pending"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "What is waiting for confirmation",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "undo_last",
     "command": "undo",
     "form": null,
     "title": "Undo my last action",
     "details": [],
     "also": [
      "undo that"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "undo_last",
      "command": "undo",
      "form": null,
      "title": "Undo my last action",
      "details": [],
      "also": [
       "undo that"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Undo my last action",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "status",
     "command": "status",
     "form": null,
     "title": "Status of the assistant",
     "details": [],
     "also": [
      "are you online"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "status",
      "command": "status",
      "form": null,
      "title": "Status of the assistant",
      "details": [],
      "also": [
       "are you online"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Shows today's numbers, waiting confirmations, whether the brain is answering, and the outgoing-message budget.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "brains_info",
     "command": "which model is with me",
     "form": null,
     "title": "Which brains (AI) are in use, their models and today's cost",
     "details": [],
     "also": [
      "which brain",
      "show brains"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "brains_info",
      "command": "which model is with me",
      "form": null,
      "title": "Which brains (AI) are in use, their models and today's cost",
      "details": [],
      "also": [
       "which brain",
       "show brains"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Each brain in the order it is asked, whether it answers, its model, conversations kept and today's cost against its budget.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "pause",
     "command": "pause",
     "form": null,
     "title": "Pause the assistant",
     "details": [],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "pause",
      "command": "pause",
      "form": null,
      "title": "Pause the assistant",
      "details": [],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Pause the assistant",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "resume",
     "command": "resume",
     "form": null,
     "title": "Resume the assistant",
     "details": [],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "resume",
      "command": "resume",
      "form": null,
      "title": "Resume the assistant",
      "details": [],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Resume the assistant",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "rules_list",
     "command": "list rules",
     "form": null,
     "title": "Show global rules",
     "details": [],
     "also": [],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "rules_list",
      "command": "list rules",
      "form": null,
      "title": "Show global rules",
      "details": [],
      "also": [],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Show global rules",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "rule_global_add",
     "command": "add rule: never share /Legal after 10pm",
     "form": "add rule: <text>",
     "title": "Add a global rule",
     "details": [
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [
      "add global rule nobody can share /Finance"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "rule_global_add",
      "command": "add rule: never share /Legal after 10pm",
      "form": "add rule: <text>",
      "title": "Add a global rule",
      "details": [
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [
       "add global rule nobody can share /Finance"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Add a global rule",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "rule_global_remove",
     "command": "remove rule 4",
     "form": "remove rule <number>",
     "title": "Remove a global rule",
     "details": [
      {
       "name": "num",
       "kind": "number",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "rule_global_remove",
      "command": "remove rule 4",
      "form": "remove rule <number>",
      "title": "Remove a global rule",
      "details": [
       {
        "name": "num",
        "kind": "number",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Remove a global rule",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_add",
     "command": "add client Acme",
     "form": "add client <client name>",
     "title": "Add a client",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      }
     ],
     "also": [
      "register new client \"Acme Ltd\""
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_add",
      "command": "add client Acme",
      "form": "add client <client name>",
      "title": "Add a client",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       }
      ],
      "also": [
       "register new client \"Acme Ltd\""
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Add a client",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_remove",
     "command": "remove client Acme",
     "form": "remove client <client name>",
     "title": "Remove a client",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_remove",
      "command": "remove client Acme",
      "form": "remove client <client name>",
      "title": "Remove a client",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Remove a client",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_duplicates",
     "command": "duplicate clients",
     "form": null,
     "title": "List clients that share a phone number or email",
     "details": [],
     "also": [
      "which clients share a number"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "client_duplicates",
      "command": "duplicate clients",
      "form": null,
      "title": "List clients that share a phone number or email",
      "details": [],
      "also": [
       "which clients share a number"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "One phone number or email belongs to one client (10.7.1). Lists numbers and emails under two clients (from before 10.7.1) and web chat leads named with another client's number, with the merge command to type.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_merge",
     "command": "merge client Rami web visitor into Rami Khoury",
     "form": "merge client <client name> into <text>",
     "title": "Merge one client into another (numbers, emails, chats, tickets)",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_merge",
      "command": "merge client Rami web visitor into Rami Khoury",
      "form": "merge client <client name> into <text>",
      "title": "Merge one client into another (numbers, emails, chats, tickets)",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "The second client keeps its name and settings and gains the first one's numbers, emails, chats, allowed commands, notes and open tickets; the first is removed. Asks first; a new version of the rules document (rules rollback undoes it, the moved tickets stay).",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_show",
     "command": "show rules for Acme",
     "form": "show rules for <client name>",
     "title": "Show one client's rules",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      }
     ],
     "also": [
      "show client Acme"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "client_show",
      "command": "show rules for Acme",
      "form": "show rules for <client name>",
      "title": "Show one client's rules",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       }
      ],
      "also": [
       "show client Acme"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Show one client's rules",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_notes_show",
     "command": "show notes of client Acme",
     "form": "show notes of client <client name>",
     "title": "Show a client's private notes",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      }
     ],
     "also": [
      "list current private notes for Acme"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "client_notes_show",
      "command": "show notes of client Acme",
      "form": "show notes of client <client name>",
      "title": "Show a client's private notes",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       }
      ],
      "also": [
       "list current private notes for Acme"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Show a client's private notes",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_note",
     "command": "note for client Acme: be very polite, he is an old customer",
     "form": "note for client Acme: <text>",
     "title": "Set private notes for a client (they guide the AI)",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_note",
      "command": "note for client Acme: be very polite, he is an old customer",
      "form": "note for client Acme: <text>",
      "title": "Set private notes for a client (they guide the AI)",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Never shown to the client. Sent to the AI with that client's requests.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_note_clear",
     "command": "clear notes for Acme",
     "form": "clear notes for <client name>",
     "title": "Clear a client's private notes",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_note_clear",
      "command": "clear notes for Acme",
      "form": "clear notes for <client name>",
      "title": "Clear a client's private notes",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Clear a client's private notes",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_enforce",
     "command": "staff only on for Acme",
     "form": "<staff only, no ai or approve every change> <on or off> for <client name>",
     "title": "Switch an enforced rule for a client",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "cmode",
       "kind": "staff only, no ai or approve every change",
       "optional": false
      },
      {
       "name": "switch",
       "kind": "on or off",
       "optional": false
      }
     ],
     "also": [
      "turn off no ai for client Acme",
      "approve every change on for Acme"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_enforce",
      "command": "staff only on for Acme",
      "form": "<staff only, no ai or approve every change> <on or off> for <client name>",
      "title": "Switch an enforced rule for a client",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "cmode",
        "kind": "staff only, no ai or approve every change",
        "optional": false
       },
       {
        "name": "switch",
        "kind": "on or off",
        "optional": false
       }
      ],
      "also": [
       "turn off no ai for client Acme",
       "approve every change on for Acme"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Enforced by the server. staff only: the router never answers, every message goes to staff. no ai: this client's messages are never sent to an AI. approve every change: each change waits for a staff yes.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "chat_add_client",
     "command": "add number +96171123456 to client Acme",
     "form": "add number <chat name or phone number> to client <client name>",
     "title": "Link a chat, a group or a number to a client",
     "details": [
      {
       "name": "chatref",
       "kind": "chat name or phone number",
       "optional": false
      },
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      }
     ],
     "also": [
      "add group \"Acme support\" to client Acme",
      "add requester +96171123456 to client Acme"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "chat_add_client",
      "command": "add number +96171123456 to client Acme",
      "form": "add number <chat name or phone number> to client <client name>",
      "title": "Link a chat, a group or a number to a client",
      "details": [
       {
        "name": "chatref",
        "kind": "chat name or phone number",
        "optional": false
       },
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       }
      ],
      "also": [
       "add group \"Acme support\" to client Acme",
       "add requester +96171123456 to client Acme"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "For a group, the router asks which members may make requests (default: only the ones you list). Nobody is ever added to a WhatsApp group by the router.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "chat_add_admin",
     "command": "make group \"nextcloud ai\" an admin group",
     "form": "make group \"<chat name or phone number>\" an admin group",
     "title": "Make a chat an admin chat",
     "details": [
      {
       "name": "chatref",
       "kind": "chat name or phone number",
       "optional": false
      }
     ],
     "also": [
      "add +96170111222 to admins"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "chat_add_admin",
      "command": "make group \"nextcloud ai\" an admin group",
      "form": "make group \"<chat name or phone number>\" an admin group",
      "title": "Make a chat an admin chat",
      "details": [
       {
        "name": "chatref",
        "kind": "chat name or phone number",
        "optional": false
       }
      ],
      "also": [
       "add +96170111222 to admins"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Make a chat an admin chat",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "chat_remove",
     "command": "remove group \"Acme support\"",
     "form": "remove group \"<chat name or phone number>\"",
     "title": "Stop listening to a chat",
     "details": [
      {
       "name": "chatref",
       "kind": "chat name or phone number",
       "optional": false
      }
     ],
     "also": [
      "stop listening to number +96171123456",
      "stop listening to +96171123456"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "chat_remove",
      "command": "remove group \"Acme support\"",
      "form": "remove group \"<chat name or phone number>\"",
      "title": "Stop listening to a chat",
      "details": [
       {
        "name": "chatref",
        "kind": "chat name or phone number",
        "optional": false
       }
      ],
      "also": [
       "stop listening to number +96171123456",
       "stop listening to +96171123456"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Stop listening to a chat",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "never_all",
     "command": "never listen to all current chats",
     "form": null,
     "title": "Never listen to all the chats that exist now (not admin or client chats)",
     "details": [],
     "also": [
      "make all current chats never listen",
      "ignore all existing chats"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "never_all",
      "command": "never listen to all current chats",
      "form": null,
      "title": "Never listen to all the chats that exist now (not admin or client chats)",
      "details": [],
      "also": [
       "make all current chats never listen",
       "ignore all existing chats"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Every chat that exists NOW and is not an admin or client chat (and not staff or a client's own person) is set to never listen: it is not answered even when it names a business keyword or a default business is set. Chats that start after this are handled as usual. You see how many first and confirm.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "never_add",
     "command": "never listen to +96171123456",
     "form": "never listen to <chat name or phone number>",
     "title": "Never listen to a chat (even with a business keyword)",
     "details": [
      {
       "name": "chatref",
       "kind": "chat name or phone number",
       "optional": false
      }
     ],
     "also": [
      "never listen to group \"Family\"",
      "always ignore number +96171123456"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "never_add",
      "command": "never listen to +96171123456",
      "form": "never listen to <chat name or phone number>",
      "title": "Never listen to a chat (even with a business keyword)",
      "details": [
       {
        "name": "chatref",
        "kind": "chat name or phone number",
        "optional": false
       }
      ],
      "also": [
       "never listen to group \"Family\"",
       "always ignore number +96171123456"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "That chat is never answered, even when it names a business keyword or a default business is set. An admin or client chat must be stopped first.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "never_remove",
     "command": "listen again to +96171123456",
     "form": "listen again to <chat name or phone number>",
     "title": "Listen again to a chat set to never listen",
     "details": [
      {
       "name": "chatref",
       "kind": "chat name or phone number",
       "optional": false
      }
     ],
     "also": [
      "stop ignoring group \"Family\""
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "never_remove",
      "command": "listen again to +96171123456",
      "form": "listen again to <chat name or phone number>",
      "title": "Listen again to a chat set to never listen",
      "details": [
       {
        "name": "chatref",
        "kind": "chat name or phone number",
        "optional": false
       }
      ],
      "also": [
       "stop ignoring group \"Family\""
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "It is then treated like any new chat: a business keyword or the default business can answer it.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "never_list",
     "command": "list never listen chats",
     "form": null,
     "title": "Chats set to never listen",
     "details": [],
     "also": [
      "show ignored chats"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "never_list",
      "command": "list never listen chats",
      "form": null,
      "title": "Chats set to never listen",
      "details": [],
      "also": [
       "show ignored chats"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Chats set to never listen",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "admin_add",
     "command": "add admin +96170111222",
     "form": "add admin <chat name or phone number>",
     "title": "Add an admin person",
     "details": [
      {
       "name": "chatref",
       "kind": "chat name or phone number",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "admin_add",
      "command": "add admin +96170111222",
      "form": "add admin <chat name or phone number>",
      "title": "Add an admin person",
      "details": [
       {
        "name": "chatref",
        "kind": "chat name or phone number",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Add an admin person",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "admin_remove",
     "command": "remove admin +96170111222",
     "form": "remove admin <chat name or phone number>",
     "title": "Remove an admin person",
     "details": [
      {
       "name": "chatref",
       "kind": "chat name or phone number",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "admin_remove",
      "command": "remove admin +96170111222",
      "form": "remove admin <chat name or phone number>",
      "title": "Remove an admin person",
      "details": [
       {
        "name": "chatref",
        "kind": "chat name or phone number",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Remove an admin person",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_owns",
     "command": "client Acme owns domain acme.com",
     "form": "client <client name> owns <what the client owns (e.g. a domain or a folder)> <the domain, folder or account>",
     "title": "Say what a client owns",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "otype",
       "kind": "what the client owns (e.g. a domain or a folder)",
       "optional": false
      },
      {
       "name": "resource",
       "kind": "the domain, folder or account",
       "optional": false
      }
     ],
     "also": [
      "give Acme folder /Clients/Acme",
      "client Acme owns cpanel account Main"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_owns",
      "command": "client Acme owns domain acme.com",
      "form": "client <client name> owns <what the client owns (e.g. a domain or a folder)> <the domain, folder or account>",
      "title": "Say what a client owns",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "otype",
        "kind": "what the client owns (e.g. a domain or a folder)",
        "optional": false
       },
       {
        "name": "resource",
        "kind": "the domain, folder or account",
        "optional": false
       }
      ],
      "also": [
       "give Acme folder /Clients/Acme",
       "client Acme owns cpanel account Main"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "This is the list the server checks every client request against. Anything not listed here is refused.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_disowns",
     "command": "remove domain old.com from Acme",
     "form": "remove <what the client owns (e.g. a domain or a folder)> <the domain, folder or account> from <client name>",
     "title": "Remove something a client owns",
     "details": [
      {
       "name": "otype",
       "kind": "what the client owns (e.g. a domain or a folder)",
       "optional": false
      },
      {
       "name": "resource",
       "kind": "the domain, folder or account",
       "optional": false
      },
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_disowns",
      "command": "remove domain old.com from Acme",
      "form": "remove <what the client owns (e.g. a domain or a folder)> <the domain, folder or account> from <client name>",
      "title": "Remove something a client owns",
      "details": [
       {
        "name": "otype",
        "kind": "what the client owns (e.g. a domain or a folder)",
        "optional": false
       },
       {
        "name": "resource",
        "kind": "the domain, folder or account",
        "optional": false
       },
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Remove something a client owns",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_allow",
     "command": "allow Acme to create mailboxes",
     "form": "allow <client name> to <command name>",
     "title": "Allow a client to do something",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "what",
       "kind": "command name",
       "optional": false
      }
     ],
     "also": [
      "allow Acme to add dns records"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_allow",
      "command": "allow Acme to create mailboxes",
      "form": "allow <client name> to <command name>",
      "title": "Allow a client to do something",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "what",
        "kind": "command name",
        "optional": false
       }
      ],
      "also": [
       "allow Acme to add dns records"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "\"what\" is matched against the titles in this playbook. If it is unclear the router shows the closest titles and asks. Wildcards such as \"anything\" or \"everything\" are never accepted.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_deny",
     "command": "stop Acme from adding dns records",
     "form": "stop <client name> from <command name>",
     "title": "Stop a client from doing something",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "what",
       "kind": "command name",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_deny",
      "command": "stop Acme from adding dns records",
      "form": "stop <client name> from <command name>",
      "title": "Stop a client from doing something",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "what",
        "kind": "command name",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Stop a client from doing something",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_files_set",
     "command": "allow client Acme to send files",
     "form": "allow client <client name> to send files",
     "title": "Let a client send files (photos, voice notes, documents) or not",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "switch",
       "kind": "on or off",
       "optional": true
      }
     ],
     "also": [
      "stop Acme from sending files",
      "files off for client Acme"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_files_set",
      "command": "allow client Acme to send files",
      "form": "allow client <client name> to send files",
      "title": "Let a client send files (photos, voice notes, documents) or not",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "switch",
        "kind": "on or off",
        "optional": true
       }
      ],
      "also": [
       "stop Acme from sending files",
       "files off for client Acme"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Their photos, voice notes and documents then reach the team (with their open ticket, if any). The AI does not look at them. Clients of a business can also be allowed all at once (allow clients of business … to send files). Settings → Files must allow receiving files too.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "files_test",
     "command": "test file on whatsapp",
     "form": "test file on <channel (as Files → Test lists it)>",
     "title": "Test sending files (a photo and a PDF) over a channel: WhatsApp, Telegram or a mailbox",
     "details": [
      {
       "name": "ch",
       "kind": "channel (as Files → Test lists it)",
       "optional": false
      },
      {
       "name": "to",
       "kind": "to (time)",
       "optional": true
      }
     ],
     "also": [
      "test files on telegram to Hadi",
      "test file on email sales"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "files_test",
      "command": "test file on whatsapp",
      "form": "test file on <channel (as Files → Test lists it)>",
      "title": "Test sending files (a photo and a PDF) over a channel: WhatsApp, Telegram or a mailbox",
      "details": [
       {
        "name": "ch",
        "kind": "channel (as Files → Test lists it)",
        "optional": false
       },
       {
        "name": "to",
        "kind": "to (time)",
        "optional": true
       }
      ],
      "also": [
       "test files on telegram to Hadi",
       "test file on email sales"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Sends a small test photo and PDF (to your console by default, or a staff member or an admin chat named after \"to\"; a mailbox sends them to itself and checks that they arrive) and reports each step. The test files are deleted afterwards. Also in the panel: Files → Test.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "msg_send",
     "command": "send a message to Yahya: your order is ready",
     "form": "send a message to Yahya: <text>",
     "title": "Send a message to a chat, a client, or many (all clients, the clients of a business, all chats, chats not listening, one channel)",
     "details": [
      {
       "name": "target",
       "kind": "user or group",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [
      "send to all clients: we are closed tomorrow",
      "send to solar clients: new battery prices next week"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "msg_send",
      "command": "send a message to Yahya: your order is ready",
      "form": "send a message to Yahya: <text>",
      "title": "Send a message to a chat, a client, or many (all clients, the clients of a business, all chats, chats not listening, one channel)",
      "details": [
       {
        "name": "target",
        "kind": "user or group",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [
       "send to all clients: we are closed tomorrow",
       "send to solar clients: new battery prices next week"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Shows who gets it, who is left out and why, the pace and the text, then asks for a yes. On WhatsApp only listened chats that wrote to us before, at most 30 per send and 30 a day, one every 30-60 seconds, 09:00-20:00; each message gets their name and \"Reply STOP\".",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "broadcast_status",
     "command": "broadcast status",
     "form": null,
     "title": "Broadcasts: sent, waiting, paused",
     "details": [],
     "also": [
      "list broadcasts"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "broadcast_status",
      "command": "broadcast status",
      "form": null,
      "title": "Broadcasts: sent, waiting, paused",
      "details": [],
      "also": [
       "list broadcasts"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Broadcasts: sent, waiting, paused",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "broadcast_cancel",
     "command": "cancel broadcast",
     "form": null,
     "title": "Cancel a broadcast (what was sent stays sent)",
     "details": [
      {
       "name": "value",
       "kind": "value",
       "optional": true
      }
     ],
     "also": [
      "stop broadcast A1B2C3"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "broadcast_cancel",
      "command": "cancel broadcast",
      "form": null,
      "title": "Cancel a broadcast (what was sent stays sent)",
      "details": [
       {
        "name": "value",
        "kind": "value",
        "optional": true
       }
      ],
      "also": [
       "stop broadcast A1B2C3"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Cancel a broadcast (what was sent stays sent)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "broadcast_resume",
     "command": "resume broadcast",
     "form": null,
     "title": "Resume a paused broadcast",
     "details": [
      {
       "name": "value",
       "kind": "value",
       "optional": true
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "broadcast_resume",
      "command": "resume broadcast",
      "form": null,
      "title": "Resume a paused broadcast",
      "details": [
       {
        "name": "value",
        "kind": "value",
        "optional": true
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Resume a paused broadcast",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "setting_show",
     "command": "setting client messages per minute",
     "form": "setting <name>",
     "title": "Show one setting (or all of them, with their names)",
     "details": [
      {
       "name": "name",
       "kind": "name",
       "optional": true
      }
     ],
     "also": [
      "what is the setting time zone",
      "list all settings"
     ],
     "readOnly": true,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "setting_show",
      "command": "setting client messages per minute",
      "form": "setting <name>",
      "title": "Show one setting (or all of them, with their names)",
      "details": [
       {
        "name": "name",
        "kind": "name",
        "optional": true
       }
      ],
      "also": [
       "what is the setting time zone",
       "list all settings"
      ],
      "readOnly": true,
      "who": [
       "owner"
      ],
      "whatItDoes": "Show one setting (or all of them, with their names)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "setting_set",
     "command": "set setting client messages per minute to 10",
     "form": "set setting <name> to <value>",
     "title": "Change one setting (any core setting, by its name)",
     "details": [
      {
       "name": "name",
       "kind": "name",
       "optional": false
      },
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [
      "set setting time zone to Asia/Beirut",
      "turn off setting chat logs"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "setting_set",
      "command": "set setting client messages per minute to 10",
      "form": "set setting <name> to <value>",
      "title": "Change one setting (any core setting, by its name)",
      "details": [
       {
        "name": "name",
        "kind": "name",
        "optional": false
       },
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [
       "set setting time zone to Asia/Beirut",
       "turn off setting chat logs"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Any setting listed by \"list all settings\"; it shows the change and asks for a yes. Plugin settings: \"set <plugin> setting <name> to <value>\".",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "verify_status",
     "command": "verification status",
     "form": null,
     "title": "Verification codes: settings, codes waiting, numbers locked after wrong codes",
     "details": [],
     "also": [
      "locked codes"
     ],
     "readOnly": true,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "verify_status",
      "command": "verification status",
      "form": null,
      "title": "Verification codes: settings, codes waiting, numbers locked after wrong codes",
      "details": [],
      "also": [
       "locked codes"
      ],
      "readOnly": true,
      "who": [
       "owner"
      ],
      "whatItDoes": "Codes that prove someone controls a number or email the help desk knows (the panel sign-in, a client confirming it is them in the web chat). The codes themselves are never shown or logged.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "verify_unlock",
     "command": "unlock verification +96171123456",
     "form": "unlock verification <value>",
     "title": "Unlock a number or email locked after too many wrong verification codes",
     "details": [
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [
      "unlock codes for sara@example.com",
      "unlock verification all"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "verify_unlock",
      "command": "unlock verification +96171123456",
      "form": "unlock verification <value>",
      "title": "Unlock a number or email locked after too many wrong verification codes",
      "details": [
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [
       "unlock codes for sara@example.com",
       "unlock verification all"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Unlock a number or email locked after too many wrong verification codes",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "files_log",
     "command": "files log",
     "form": null,
     "title": "The files log (received, refused, sent, failed…)",
     "details": [
      {
       "name": "q",
       "kind": "name or number to find",
       "optional": true
      }
     ],
     "also": [
      "files log failed"
     ],
     "readOnly": true,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "files_log",
      "command": "files log",
      "form": null,
      "title": "The files log (received, refused, sent, failed…)",
      "details": [
       {
        "name": "q",
        "kind": "name or number to find",
        "optional": true
       }
      ],
      "also": [
       "files log failed"
      ],
      "readOnly": true,
      "who": [
       "owner"
      ],
      "whatItDoes": "The files log (received, refused, sent, failed…)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "limit_tickets",
     "command": "set tickets for Acme to 3 per week",
     "form": "set tickets for <client name> to <number> per week",
     "title": "Set weekly tickets",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "num",
       "kind": "number",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "limit_tickets",
      "command": "set tickets for Acme to 3 per week",
      "form": "set tickets for <client name> to <number> per week",
      "title": "Set weekly tickets",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "num",
        "kind": "number",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Set weekly tickets",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "limit_mailboxes",
     "command": "set max mailboxes for Acme to 5",
     "form": "set max mailboxes for <client name> to <number>",
     "title": "Set max mailboxes",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "num",
       "kind": "number",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "limit_mailboxes",
      "command": "set max mailboxes for Acme to 5",
      "form": "set max mailboxes for <client name> to <number>",
      "title": "Set max mailboxes",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "num",
        "kind": "number",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Set max mailboxes",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "limit_mailbox_size",
     "command": "set mailbox size for Acme to 1024 MB",
     "form": "set mailbox size for <client name> to <number> MB",
     "title": "Set max mailbox size (MB)",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "num",
       "kind": "number",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "limit_mailbox_size",
      "command": "set mailbox size for Acme to 1024 MB",
      "form": "set mailbox size for <client name> to <number> MB",
      "title": "Set max mailbox size (MB)",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "num",
        "kind": "number",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Set max mailbox size (MB)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "limit_hours",
     "command": "set support hours for Acme 8-20",
     "form": "set support hours for <client name> 8-20",
     "title": "Set support hours",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "from",
       "kind": "from (time)",
       "optional": false
      },
      {
       "name": "to",
       "kind": "to (time)",
       "optional": false
      }
     ],
     "also": [
      "set hours for Acme 08:00 to 18:00"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "limit_hours",
      "command": "set support hours for Acme 8-20",
      "form": "set support hours for <client name> 8-20",
      "title": "Set support hours",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "from",
        "kind": "from (time)",
        "optional": false
       },
       {
        "name": "to",
        "kind": "to (time)",
        "optional": false
       }
      ],
      "also": [
       "set hours for Acme 08:00 to 18:00"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Set support hours",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "guide_show",
     "command": "nextcloud commands",
     "form": "<a service name, console or custom> commands",
     "title": "Show a command guide (a service, console or custom)",
     "details": [
      {
       "name": "topic",
       "kind": "a service name, console or custom",
       "optional": false
      }
     ],
     "also": [
      "send me nextcloud api",
      "list nextcloud commands"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "guide_show",
      "command": "nextcloud commands",
      "form": "<a service name, console or custom> commands",
      "title": "Show a command guide (a service, console or custom)",
      "details": [
       {
        "name": "topic",
        "kind": "a service name, console or custom",
        "optional": false
       }
      ],
      "also": [
       "send me nextcloud api",
       "list nextcloud commands"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Show a command guide (a service, console or custom)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "docs_link",
     "command": "docs",
     "form": null,
     "title": "Vast Helpdesk docs link (to give an AI)",
     "details": [],
     "also": [
      "send me the docs",
      "vast helpdesk docs"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "docs_link",
      "command": "docs",
      "form": null,
      "title": "Vast Helpdesk docs link (to give an AI)",
      "details": [],
      "also": [
       "send me the docs",
       "vast helpdesk docs"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Vast Helpdesk docs link (to give an AI)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "chats_list",
     "command": "list chats",
     "form": null,
     "title": "List chats (number them to assign)",
     "details": [
      {
       "name": "q",
       "kind": "name or number to find",
       "optional": true
      }
     ],
     "also": [
      "list new chats",
      "chats"
     ],
     "readOnly": true,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "chats_list",
      "command": "list chats",
      "form": null,
      "title": "List chats (number them to assign)",
      "details": [
       {
        "name": "q",
        "kind": "name or number to find",
        "optional": true
       }
      ],
      "also": [
       "list new chats",
       "chats"
      ],
      "readOnly": true,
      "who": [
       "owner"
      ],
      "whatItDoes": "List chats (number them to assign)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "chat_assign",
     "command": "assign chat 3 to client Acme",
     "form": "assign chat <number> to client <client name>",
     "title": "Assign a listed chat to a client",
     "details": [
      {
       "name": "num",
       "kind": "number",
       "optional": false
      },
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      }
     ],
     "also": [
      "chat 3 to Acme"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "chat_assign",
      "command": "assign chat 3 to client Acme",
      "form": "assign chat <number> to client <client name>",
      "title": "Assign a listed chat to a client",
      "details": [
       {
        "name": "num",
        "kind": "number",
        "optional": false
       },
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       }
      ],
      "also": [
       "chat 3 to Acme"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Assign a listed chat to a client",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "chat_make_admin",
     "command": "make chat 5 admin",
     "form": "make chat <number> admin",
     "title": "Make a listed chat an admin chat",
     "details": [
      {
       "name": "num",
       "kind": "number",
       "optional": false
      }
     ],
     "also": [
      "chat 5 admin"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "chat_make_admin",
      "command": "make chat 5 admin",
      "form": "make chat <number> admin",
      "title": "Make a listed chat an admin chat",
      "details": [
       {
        "name": "num",
        "kind": "number",
        "optional": false
       }
      ],
      "also": [
       "chat 5 admin"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Make a listed chat an admin chat",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "chat_unassign",
     "command": "unassign chat 4",
     "form": "unassign chat <number>",
     "title": "Stop listening to a listed chat",
     "details": [
      {
       "name": "num",
       "kind": "number",
       "optional": false
      }
     ],
     "also": [
      "ignore chat 4"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "chat_unassign",
      "command": "unassign chat 4",
      "form": "unassign chat <number>",
      "title": "Stop listening to a listed chat",
      "details": [
       {
        "name": "num",
        "kind": "number",
        "optional": false
       }
      ],
      "also": [
       "ignore chat 4"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Stop listening to a listed chat",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_rename",
     "command": "rename client 96176316570 to Nour Store",
     "form": "rename client <client name> to <text>",
     "title": "Rename a client",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [
      "rename Acme to Acme Ltd"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_rename",
      "command": "rename client 96176316570 to Nour Store",
      "form": "rename client <client name> to <text>",
      "title": "Rename a client",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [
       "rename Acme to Acme Ltd"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Rename a client",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "plugins_list",
     "command": "plugins",
     "form": null,
     "title": "List plugins",
     "details": [],
     "also": [
      "list plugins"
     ],
     "readOnly": true,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "plugins_list",
      "command": "plugins",
      "form": null,
      "title": "List plugins",
      "details": [],
      "also": [
       "list plugins"
      ],
      "readOnly": true,
      "who": [
       "owner"
      ],
      "whatItDoes": "List plugins",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "plugin_switch",
     "command": "turn on plugin telegram",
     "form": "turn <on or off> plugin <word>",
     "title": "Turn a plugin on or off",
     "details": [
      {
       "name": "switch",
       "kind": "on or off",
       "optional": false
      },
      {
       "name": "word",
       "kind": "word",
       "optional": false
      }
     ],
     "also": [
      "plugin telegram off"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "plugin_switch",
      "command": "turn on plugin telegram",
      "form": "turn <on or off> plugin <word>",
      "title": "Turn a plugin on or off",
      "details": [
       {
        "name": "switch",
        "kind": "on or off",
        "optional": false
       },
       {
        "name": "word",
        "kind": "word",
        "optional": false
       }
      ],
      "also": [
       "plugin telegram off"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Turn a plugin on or off",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "plugin_test",
     "command": "test plugin metaai",
     "form": "test plugin <word>",
     "title": "Test a plugin",
     "details": [
      {
       "name": "word",
       "kind": "word",
       "optional": false
      }
     ],
     "also": [
      "test cpanel"
     ],
     "readOnly": true,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "plugin_test",
      "command": "test plugin metaai",
      "form": "test plugin <word>",
      "title": "Test a plugin",
      "details": [
       {
        "name": "word",
        "kind": "word",
        "optional": false
       }
      ],
      "also": [
       "test cpanel"
      ],
      "readOnly": true,
      "who": [
       "owner"
      ],
      "whatItDoes": "Test a plugin",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "router_restart",
     "command": "restart",
     "form": null,
     "title": "Restart the router",
     "details": [],
     "also": [
      "restart the router"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "router_restart",
      "command": "restart",
      "form": null,
      "title": "Restart the router",
      "details": [],
      "also": [
       "restart the router"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Restart the router",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "guard_resume",
     "command": "resume sending",
     "form": null,
     "title": "Resume sending after the ban guard stopped",
     "details": [],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "guard_resume",
      "command": "resume sending",
      "form": null,
      "title": "Resume sending after the ban guard stopped",
      "details": [],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Resume sending after the ban guard stopped",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "set_console_word",
     "command": "set console word j2d8",
     "form": "set console word <word>",
     "title": "Set the console word",
     "details": [
      {
       "name": "word",
       "kind": "word",
       "optional": false
      }
     ],
     "also": [
      "console word off"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "set_console_word",
      "command": "set console word j2d8",
      "form": "set console word <word>",
      "title": "Set the console word",
      "details": [
       {
        "name": "word",
        "kind": "word",
        "optional": false
       }
      ],
      "also": [
       "console word off"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Set the console word",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "set_free_replies",
     "command": "meta replies off",
     "form": "meta replies <on or off>",
     "title": "Let the AI answer in its own words (on/off)",
     "details": [
      {
       "name": "switch",
       "kind": "on or off",
       "optional": false
      }
     ],
     "also": [
      "turn on free replies"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "set_free_replies",
      "command": "meta replies off",
      "form": "meta replies <on or off>",
      "title": "Let the AI answer in its own words (on/off)",
      "details": [
       {
        "name": "switch",
        "kind": "on or off",
        "optional": false
       }
      ],
      "also": [
       "turn on free replies"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Let the AI answer in its own words (on/off)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "set_support_hours",
     "command": "set support hours 8-20",
     "form": null,
     "title": "Set the general support hours",
     "details": [
      {
       "name": "from",
       "kind": "from (time)",
       "optional": false
      },
      {
       "name": "to",
       "kind": "to (time)",
       "optional": false
      }
     ],
     "also": [
      "set our support hours to 09:00 to 17:00"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "set_support_hours",
      "command": "set support hours 8-20",
      "form": null,
      "title": "Set the general support hours",
      "details": [
       {
        "name": "from",
        "kind": "from (time)",
        "optional": false
       },
       {
        "name": "to",
        "kind": "to (time)",
        "optional": false
       }
      ],
      "also": [
       "set our support hours to 09:00 to 17:00"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Set the general support hours",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "owner_grant",
     "command": "give owner permissions to Hadi",
     "form": "give owner permissions to <person or people>",
     "title": "Give owner permissions (including the shell) to a staff member or a group",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      }
     ],
     "also": [
      "grant owner rights to group Ops",
      "make Hadi an owner"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "owner_grant",
      "command": "give owner permissions to Hadi",
      "form": "give owner permissions to <person or people>",
      "title": "Give owner permissions (including the shell) to a staff member or a group",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       }
      ],
      "also": [
       "grant owner rights to group Ops",
       "make Hadi an owner"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Owner permissions = every owner command AND the shell (Terminal mode). For a group, EVERYONE in it gets them. Only the owner, from their own console, can give or take them away.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "owner_revoke",
     "command": "remove owner permissions from Hadi",
     "form": "remove owner permissions from <person or people>",
     "title": "Take owner permissions away from a staff member or a group",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      }
     ],
     "also": [
      "take owner rights from group Ops"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "owner_revoke",
      "command": "remove owner permissions from Hadi",
      "form": "remove owner permissions from <person or people>",
      "title": "Take owner permissions away from a staff member or a group",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       }
      ],
      "also": [
       "take owner rights from group Ops"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Only the owner, from their own console.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "set_terminal_word",
     "command": "set terminal word shell",
     "form": "set terminal word <word>",
     "title": "Set (or clear) the Terminal mode word",
     "details": [
      {
       "name": "word",
       "kind": "word",
       "optional": false
      }
     ],
     "also": [
      "terminal word off"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "set_terminal_word",
      "command": "set terminal word shell",
      "form": "set terminal word <word>",
      "title": "Set (or clear) the Terminal mode word",
      "details": [
       {
        "name": "word",
        "kind": "word",
        "optional": false
       }
      ],
      "also": [
       "terminal word off"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "This word, said in your console, opens Terminal mode (a brain gets a direct line to Nextcloud, cPanel or a shell). Empty/off disables it. Owner console only, always.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "run_selftest",
     "command": "self test",
     "form": null,
     "title": "Run the live self-test",
     "details": [
      {
       "name": "text",
       "kind": "text",
       "optional": true
      }
     ],
     "also": [
      "run the selftest",
      "selftest quick"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "run_selftest",
      "command": "self test",
      "form": null,
      "title": "Run the live self-test",
      "details": [
       {
        "name": "text",
        "kind": "text",
        "optional": true
       }
      ],
      "also": [
       "run the selftest",
       "selftest quick"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Sends scripted READ-ONLY messages through the real router (and the brain) and checks the answers; nothing is changed, nothing reaches staff or clients. Add \"quick\" to skip the AI questions.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "find_group",
     "command": "find group gova ops",
     "form": "find group <text>",
     "title": "Look for a group in WhatsApp (where it is known, and why it may be missing)",
     "details": [
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [
      "look for group Sales team"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "find_group",
      "command": "find group gova ops",
      "form": "find group <text>",
      "title": "Look for a group in WhatsApp (where it is known, and why it may be missing)",
      "details": [
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [
       "look for group Sales team"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Checks every place WhatsApp Web keeps groups and says where the name was found; nothing is changed.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "staff_add",
     "command": "add staff Hadi +96170111222",
     "form": "add staff <name> <chat name or phone number>",
     "title": "Add a staff member (name, number, what they may do)",
     "details": [
      {
       "name": "name",
       "kind": "name",
       "optional": false
      },
      {
       "name": "chatref",
       "kind": "chat name or phone number",
       "optional": false
      },
      {
       "name": "fams",
       "kind": "what they may do",
       "optional": true
      }
     ],
     "also": [
      "add staff Sara Haddad +96170333444 can manage email, nextcloud",
      "add Omar +96170555666 as staff"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "staff_add",
      "command": "add staff Hadi +96170111222",
      "form": "add staff <name> <chat name or phone number>",
      "title": "Add a staff member (name, number, what they may do)",
      "details": [
       {
        "name": "name",
        "kind": "name",
        "optional": false
       },
       {
        "name": "chatref",
        "kind": "chat name or phone number",
        "optional": false
       },
       {
        "name": "fams",
        "kind": "what they may do",
        "optional": true
       }
      ],
      "also": [
       "add staff Sara Haddad +96170333444 can manage email, nextcloud",
       "add Omar +96170555666 as staff"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Creates the person on the Staff page with their name and, optionally, only some permission families (email, domains, dns, folders, shares, nextcloud users, deleting, tickets). Without \"can manage\" they get the general admin permissions.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "report_now",
     "command": "daily report",
     "form": null,
     "title": "The daily report so far (what happened, AI use and credit left)",
     "details": [],
     "also": [
      "today's report",
      "send the daily report now"
     ],
     "readOnly": true,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "report_now",
      "command": "daily report",
      "form": null,
      "title": "The daily report so far (what happened, AI use and credit left)",
      "details": [],
      "also": [
       "today's report",
       "send the daily report now"
      ],
      "readOnly": true,
      "who": [
       "owner"
      ],
      "whatItDoes": "The same report that comes by itself every day (Settings → Daily report): a few lines on what happened since the last one, written by the AI, then each brain's calls, cost, budget left today and prepaid credit left. Asking for it does not change what the next one counts.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "report_set",
     "command": "set daily report time to 21:00",
     "form": "set daily report time to <time (HH:MM)>",
     "title": "Daily report: its time, on or off, AI or plain numbers",
     "details": [
      {
       "name": "at",
       "kind": "time (HH:MM)",
       "optional": true
      },
      {
       "name": "switch",
       "kind": "on or off",
       "optional": true
      }
     ],
     "also": [
      "daily report at 8:30",
      "daily report off"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "report_set",
      "command": "set daily report time to 21:00",
      "form": "set daily report time to <time (HH:MM)>",
      "title": "Daily report: its time, on or off, AI or plain numbers",
      "details": [
       {
        "name": "at",
        "kind": "time (HH:MM)",
        "optional": true
       },
       {
        "name": "switch",
        "kind": "on or off",
        "optional": true
       }
      ],
      "also": [
       "daily report at 8:30",
       "daily report off"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "The time is in your time zone (Settings). \"ai off\": the report lists the plain numbers instead of a summary written by the AI. Asks for a yes first.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "tidy_set",
     "command": "tidy up on",
     "form": "tidy up <on, off, console, staff or all>",
     "title": "Tidy up finished requests: delete their questions and yes/no answers",
     "details": [
      {
       "name": "tmode",
       "kind": "on, off, console, staff or all",
       "optional": false
      }
     ],
     "also": [
      "tidy up console",
      "tidy up off"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "tidy_set",
      "command": "tidy up on",
      "form": "tidy up <on, off, console, staff or all>",
      "title": "Tidy up finished requests: delete their questions and yes/no answers",
      "details": [
       {
        "name": "tmode",
        "kind": "on, off, console, staff or all",
        "optional": false
       }
      ],
      "also": [
       "tidy up console",
       "tidy up off"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "When a request is done or cancelled, the help desk deletes its own questions (\"Did you mean…?\", \"Plan … reply yes\") and your yes/no/cancel, so the request and its outcome are left. console: your console only; staff (on): console and staff chats; all: client chats too; off: nothing is deleted. WhatsApp: in your console nothing is left behind; in other chats WhatsApp shows \"This message was deleted\", and a person's answer is deleted only in a group where the help desk's number is an admin. Telegram: deleted cleanly within 48 hours.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "settings_show",
     "command": "settings",
     "form": null,
     "title": "Show the settings (tidy, quiet time, limits, new chats, report, console word…)",
     "details": [],
     "also": [
      "show settings",
      "is tidy on?"
     ],
     "readOnly": true,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "settings_show",
      "command": "settings",
      "form": null,
      "title": "Show the settings (tidy, quiet time, limits, new chats, report, console word…)",
      "details": [],
      "also": [
       "show settings",
       "is tidy on?"
      ],
      "readOnly": true,
      "who": [
       "owner"
      ],
      "whatItDoes": "Only shows: change each with its own command (tidy up on, set quiet time 5, new chats off…).",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "new_chats_set",
     "command": "new chats off",
     "form": "new chats <on or off>",
     "title": "Answer new chats (new leads) on or off: everyone already listed still works",
     "details": [
      {
       "name": "switch",
       "kind": "on or off",
       "optional": true
      }
     ],
     "also": [
      "new chats on",
      "stop answering new chats"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "new_chats_set",
      "command": "new chats off",
      "form": "new chats <on or off>",
      "title": "Answer new chats (new leads) on or off: everyone already listed still works",
      "details": [
       {
        "name": "switch",
        "kind": "on or off",
        "optional": true
       }
      ],
      "also": [
       "new chats on",
       "stop answering new chats"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Off: nobody new is answered or added as a lead (a business keyword or the default business no longer answers unknown numbers). Your console, admins, staff and every client already listed keep working. Unknown chats still appear under Chats as \"wrote to you\".",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "set_quiet_time",
     "command": "set quiet time 5",
     "form": "set quiet time <number>",
     "title": "Set how long the router stays quiet after a manual reply",
     "details": [
      {
       "name": "num",
       "kind": "number",
       "optional": false
      }
     ],
     "also": [
      "quiet time 10 minutes"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "set_quiet_time",
      "command": "set quiet time 5",
      "form": "set quiet time <number>",
      "title": "Set how long the router stays quiet after a manual reply",
      "details": [
       {
        "name": "num",
        "kind": "number",
        "optional": false
       }
      ],
      "also": [
       "quiet time 10 minutes"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "When you answer a client by hand, the router stays silent in that chat for this many minutes (1-720).",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_requester_remove",
     "command": "remove requester +96171123456 from client Acme",
     "form": "remove requester <chat name or phone number> from client <client name>",
     "title": "Remove a requester from a client",
     "details": [
      {
       "name": "chatref",
       "kind": "chat name or phone number",
       "optional": false
      },
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_requester_remove",
      "command": "remove requester +96171123456 from client Acme",
      "form": "remove requester <chat name or phone number> from client <client name>",
      "title": "Remove a requester from a client",
      "details": [
       {
        "name": "chatref",
        "kind": "chat name or phone number",
        "optional": false
       },
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "That number may no longer ask for this client (in its groups or privately). Add one: \"add requester +961… to client Acme\".",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_language",
     "command": "set language of Acme to arabic",
     "form": "set language of <client name> to <word>",
     "title": "Set the language a client is answered in",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "word",
       "kind": "word",
       "optional": false
      }
     ],
     "also": [
      "answer Acme in english",
      "set language of Acme to auto"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_language",
      "command": "set language of Acme to arabic",
      "form": "set language of <client name> to <word>",
      "title": "Set the language a client is answered in",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "word",
        "kind": "word",
        "optional": false
       }
      ],
      "also": [
       "answer Acme in english",
       "set language of Acme to auto"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "arabic, english, or auto (the language they write in).",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_pause",
     "command": "pause client Acme",
     "form": "pause client <client name>",
     "title": "Pause a client (the router stops answering them)",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      }
     ],
     "also": [
      "stop answering Acme"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_pause",
      "command": "pause client Acme",
      "form": "pause client <client name>",
      "title": "Pause a client (the router stops answering them)",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       }
      ],
      "also": [
       "stop answering Acme"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Nothing they write is answered or sent to an AI until \"unpause client Acme\" (or \"resume client Acme\"). Staff can still answer by hand.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "clients_without_chats",
     "command": "clients without chats",
     "form": null,
     "title": "Clients that have no chat linked",
     "details": [],
     "also": [],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "clients_without_chats",
      "command": "clients without chats",
      "form": null,
      "title": "Clients that have no chat linked",
      "details": [],
      "also": [],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Clients that have no chat linked",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "groups_list",
     "command": "list whatsapp groups",
     "form": "list <filter> groups",
     "title": "List the groups on WhatsApp/Telegram (all, admin, client, not listened to)",
     "details": [
      {
       "name": "filter",
       "kind": "filter",
       "optional": true
      }
     ],
     "also": [
      "list admin groups",
      "list client groups"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "groups_list",
      "command": "list whatsapp groups",
      "form": "list <filter> groups",
      "title": "List the groups on WhatsApp/Telegram (all, admin, client, not listened to)",
      "details": [
       {
        "name": "filter",
        "kind": "filter",
        "optional": true
       }
      ],
      "also": [
       "list admin groups",
       "list client groups"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "\"list groups\" alone lists the Nextcloud groups; say which: whatsapp, telegram, admin, client, or new (not listened to). Numbered: \"chat 3 to client Acme\" works on the list.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "chat_continue",
     "command": "continue chat +96171123456",
     "form": "continue chat <chat name or phone number>",
     "title": "Continue a chat: reset its limits and answer what was held",
     "details": [
      {
       "name": "chatref",
       "kind": "chat name or phone number",
       "optional": false
      }
     ],
     "also": [
      "reset chat \"Yahya Sharafeddine\""
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "chat_continue",
      "command": "continue chat +96171123456",
      "form": "continue chat <chat name or phone number>",
      "title": "Continue a chat: reset its limits and answer what was held",
      "details": [
       {
        "name": "chatref",
        "kind": "chat name or phone number",
        "optional": false
       }
      ],
      "also": [
       "reset chat \"Yahya Sharafeddine\""
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Resets that chat only: the too-fast limits, the daily message count, the 24-hour mute and the quiet time after a manual reply, then answers held messages. If its client was stopped, it asks first before answering the client again.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "chat_show",
     "command": "show group \"nextcloud ai\"",
     "form": "show group \"<chat name or phone number>\"",
     "title": "Show the settings of a group or chat",
     "details": [
      {
       "name": "chatref",
       "kind": "chat name or phone number",
       "optional": false
      }
     ],
     "also": [
      "settings of chat +96171123456"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "chat_show",
      "command": "show group \"nextcloud ai\"",
      "form": "show group \"<chat name or phone number>\"",
      "title": "Show the settings of a group or chat",
      "details": [
       {
        "name": "chatref",
        "kind": "chat name or phone number",
        "optional": false
       }
      ],
      "also": [
       "settings of chat +96171123456"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "What it is (admin or which client), owner permissions, what it may manage, who may ask, whether the trigger word is needed.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "group_limit",
     "command": "limit group \"nextcloud ai\" to nextcloud",
     "form": "limit group \"<chat name or phone number>\" to <text>",
     "title": "Choose what an admin group may manage",
     "details": [
      {
       "name": "chatref",
       "kind": "chat name or phone number",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [
      "let group \"Ops\" manage everything"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "group_limit",
      "command": "limit group \"nextcloud ai\" to nextcloud",
      "form": "limit group \"<chat name or phone number>\" to <text>",
      "title": "Choose what an admin group may manage",
      "details": [
       {
        "name": "chatref",
        "kind": "chat name or phone number",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [
       "let group \"Ops\" manage everything"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Choose what an admin group may manage",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "group_trigger",
     "command": "trigger word off for group \"Acme support\"",
     "form": "trigger word <on or off> for group \"<chat name or phone number>\"",
     "title": "Need the trigger word in a group (on/off)",
     "details": [
      {
       "name": "chatref",
       "kind": "chat name or phone number",
       "optional": false
      },
      {
       "name": "switch",
       "kind": "on or off",
       "optional": false
      }
     ],
     "also": [
      "group \"Ops\" trigger on"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "group_trigger",
      "command": "trigger word off for group \"Acme support\"",
      "form": "trigger word <on or off> for group \"<chat name or phone number>\"",
      "title": "Need the trigger word in a group (on/off)",
      "details": [
       {
        "name": "chatref",
        "kind": "chat name or phone number",
        "optional": false
       },
       {
        "name": "switch",
        "kind": "on or off",
        "optional": false
       }
      ],
      "also": [
       "group \"Ops\" trigger on"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Off: every message in that group is read (no \"meta …\" needed). On: only messages that start with a trigger word.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "staff_show",
     "command": "show staff Hadi",
     "form": "show staff <person or people>",
     "title": "Show a staff member (permissions, alerts, tickets)",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      }
     ],
     "also": [
      "what can Hadi do"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "staff_show",
      "command": "show staff Hadi",
      "form": "show staff <person or people>",
      "title": "Show a staff member (permissions, alerts, tickets)",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       }
      ],
      "also": [
       "what can Hadi do"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Show a staff member (permissions, alerts, tickets)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "staff_alerts",
     "command": "alerts on for Hadi",
     "form": "alerts <on or off> for <person or people>",
     "title": "Private alerts for a staff member (on/off)",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      },
      {
       "name": "switch",
       "kind": "on or off",
       "optional": false
      }
     ],
     "also": [
      "turn off alerts for Hadi"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "staff_alerts",
      "command": "alerts on for Hadi",
      "form": "alerts <on or off> for <person or people>",
      "title": "Private alerts for a staff member (on/off)",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       },
       {
        "name": "switch",
        "kind": "on or off",
        "optional": false
       }
      ],
      "also": [
       "turn off alerts for Hadi"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "On: client requests for staff are also sent to them in a private chat.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "staff_rename",
     "command": "rename staff Hadi to Hadi Nasser",
     "form": "rename staff <person or people> to <text>",
     "title": "Rename a staff member",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "staff_rename",
      "command": "rename staff Hadi to Hadi Nasser",
      "form": "rename staff <person or people> to <text>",
      "title": "Rename a staff member",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Rename a staff member",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "staff_permissions",
     "command": "let Hadi manage nextcloud and tickets",
     "form": "let <person or people> manage <text>",
     "title": "Choose what a staff member may do",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [
      "let Hadi do everything"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "staff_permissions",
      "command": "let Hadi manage nextcloud and tickets",
      "form": "let <person or people> manage <text>",
      "title": "Choose what a staff member may do",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [
       "let Hadi do everything"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Name services (nextcloud, cpanel…) or kinds of change (sharing, users, mail…); everyone may read. \"everything\" = the general admin permissions.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "staff_active",
     "command": "switch off staff Hadi",
     "form": "switch <on or off> staff <person or people>",
     "title": "Switch a staff member on or off",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      },
      {
       "name": "switch",
       "kind": "on or off",
       "optional": false
      }
     ],
     "also": [
      "turn on staff Hadi"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "staff_active",
      "command": "switch off staff Hadi",
      "form": "switch <on or off> staff <person or people>",
      "title": "Switch a staff member on or off",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       },
       {
        "name": "switch",
        "kind": "on or off",
        "optional": false
       }
      ],
      "also": [
       "turn on staff Hadi"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Off: treated as a stranger (nothing they write is acted on), but kept in the list to switch on later. \"remove admin +961…\" deletes them.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "terminal_steps",
     "command": "terminal steps off",
     "form": "terminal steps <on or off>",
     "title": "Terminal: show each step, or only the result",
     "details": [
      {
       "name": "switch",
       "kind": "on or off",
       "optional": false
      }
     ],
     "also": [
      "terminal steps on"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "terminal_steps",
      "command": "terminal steps off",
      "form": "terminal steps <on or off>",
      "title": "Terminal: show each step, or only the result",
      "details": [
       {
        "name": "switch",
        "kind": "on or off",
        "optional": false
       }
      ],
      "also": [
       "terminal steps on"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Off (default): a Terminal session sends only the result at the end. Inside a session, \"steps on\" / \"steps off\" changes it for that session.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "client_resume",
     "command": "resume client mahmoud",
     "form": "resume client <client name>",
     "title": "Answer a client again now (end the pause after a manual reply)",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      }
     ],
     "also": [
      "answer mahmoud again"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "client_resume",
      "command": "resume client mahmoud",
      "form": "resume client <client name>",
      "title": "Answer a client again now (end the pause after a manual reply)",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       }
      ],
      "also": [
       "answer mahmoud again"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Answer a client again now (end the pause after a manual reply)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "meta_docs_mode",
     "command": "meta docs name",
     "form": "meta docs <mode>",
     "title": "What the AI gets with each question: the commands, or only the docs name",
     "details": [
      {
       "name": "mode",
       "kind": "mode",
       "optional": false
      }
     ],
     "also": [
      "meta docs full"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "meta_docs_mode",
      "command": "meta docs name",
      "form": "meta docs <mode>",
      "title": "What the AI gets with each question: the commands, or only the docs name",
      "details": [
       {
        "name": "mode",
        "kind": "mode",
        "optional": false
       }
      ],
      "also": [
       "meta docs full"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "full: the matching commands in every question (works on its own). name: only the docs section name (shorter; send \"teach the brain\" first). Each brain can also be set on its own (Plugins).",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "chat_docs_mode",
     "command": "chat 3 docs name",
     "form": "chat <number> docs <mode>",
     "title": "What the AI gets for one chat (full, name or default)",
     "details": [
      {
       "name": "num",
       "kind": "number",
       "optional": false
      },
      {
       "name": "mode",
       "kind": "mode",
       "optional": false
      }
     ],
     "also": [
      "chat 3 meta docs full",
      "chat 3 docs default"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "chat_docs_mode",
      "command": "chat 3 docs name",
      "form": "chat <number> docs <mode>",
      "title": "What the AI gets for one chat (full, name or default)",
      "details": [
       {
        "name": "num",
        "kind": "number",
        "optional": false
       },
       {
        "name": "mode",
        "kind": "mode",
        "optional": false
       }
      ],
      "also": [
       "chat 3 meta docs full",
       "chat 3 docs default"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Uses the numbers from \"list chats\". default = the general setting.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "docs_indexing",
     "command": "docs indexing on",
     "form": "docs indexing <on or off>",
     "title": "Let search engines index the docs (on/off)",
     "details": [
      {
       "name": "switch",
       "kind": "on or off",
       "optional": false
      }
     ],
     "also": [
      "turn off docs crawlers"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "docs_indexing",
      "command": "docs indexing on",
      "form": "docs indexing <on or off>",
      "title": "Let search engines index the docs (on/off)",
      "details": [
       {
        "name": "switch",
        "kind": "on or off",
        "optional": false
       }
      ],
      "also": [
       "turn off docs crawlers"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "On: robots.txt allows the docs, a sitemap lists them and the pages say \"index\". Off: the pages say \"noindex\" (tools that open a link still can).",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "plugin_settings",
     "command": "plugin chatgpt settings",
     "form": "plugin <word> settings",
     "title": "Show the settings of a plugin",
     "details": [
      {
       "name": "word",
       "kind": "word",
       "optional": false
      }
     ],
     "also": [
      "settings of the cpanel plugin"
     ],
     "readOnly": true,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "plugin_settings",
      "command": "plugin chatgpt settings",
      "form": "plugin <word> settings",
      "title": "Show the settings of a plugin",
      "details": [
       {
        "name": "word",
        "kind": "word",
        "optional": false
       }
      ],
      "also": [
       "settings of the cpanel plugin"
      ],
      "readOnly": true,
      "who": [
       "owner"
      ],
      "whatItDoes": "Show the settings of a plugin",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "plugin_setting_set",
     "command": "set plugin chatgpt model to gpt-6.1-sol",
     "form": "set plugin <word> <setting> to <value>",
     "title": "Change one setting of a plugin (a brain's model or mode, a budget…)",
     "details": [
      {
       "name": "word",
       "kind": "word",
       "optional": false
      },
      {
       "name": "field",
       "kind": "setting",
       "optional": false
      },
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [
      "set plugin chatgpt prompt mode to simple",
      "set plugin claude daily budget to 5"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "plugin_setting_set",
      "command": "set plugin chatgpt model to gpt-6.1-sol",
      "form": "set plugin <word> <setting> to <value>",
      "title": "Change one setting of a plugin (a brain's model or mode, a budget…)",
      "details": [
       {
        "name": "word",
        "kind": "word",
        "optional": false
       },
       {
        "name": "field",
        "kind": "setting",
        "optional": false
       },
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [
       "set plugin chatgpt prompt mode to simple",
       "set plugin claude daily budget to 5"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "The setting is named as on the plugin's card (its label or key). API keys and other secrets are never set from chat: use the panel.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "logs_show",
     "command": "logs",
     "form": null,
     "title": "Show the router log (last lines)",
     "details": [
      {
       "name": "text",
       "kind": "text",
       "optional": true
      }
     ],
     "also": [
      "show logs for mahmoud",
      "logs whatsapp"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "logs_show",
      "command": "logs",
      "form": null,
      "title": "Show the router log (last lines)",
      "details": [
       {
        "name": "text",
        "kind": "text",
        "optional": true
       }
      ],
      "also": [
       "show logs for mahmoud",
       "logs whatsapp"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "The last 15 lines of data/logs/router.log, optionally only lines containing a word (a client, a chat, SEND_FAILED…).",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "teach_meta",
     "command": "teach meta",
     "form": null,
     "title": "Send the Vast Helpdesk docs to the brains that keep a chat",
     "details": [],
     "also": [
      "teach the brain",
      "send the docs to the ai"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "teach_meta",
      "command": "teach meta",
      "form": null,
      "title": "Send the Vast Helpdesk docs to the brains that keep a chat",
      "details": [],
      "also": [
       "teach the brain",
       "send the docs to the ai"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Sends all commands (all.txt) once into the chat of every brain that keeps one (Meta AI), so it knows them. Needed when a brain is sent only the docs section name (Simple); repeat after adding commands. Brains that keep one conversation per person, or start fresh each time, get what they need with each message.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "set_trigger_words",
     "command": "set trigger words meta, ميتا",
     "form": "set trigger words <text>",
     "title": "Set the group trigger words",
     "details": [
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "set_trigger_words",
      "command": "set trigger words meta, ميتا",
      "form": "set trigger words <text>",
      "title": "Set the group trigger words",
      "details": [
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Set the group trigger words",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "rules_rollback",
     "command": "undo the last rule change",
     "form": null,
     "title": "Undo the last rule change",
     "details": [],
     "also": [
      "rollback rules"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "rules_rollback",
      "command": "undo the last rule change",
      "form": null,
      "title": "Undo the last rule change",
      "details": [],
      "also": [
       "rollback rules"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Undo the last rule change",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "rules_history",
     "command": "rules history",
     "form": null,
     "title": "Rule change history",
     "details": [],
     "also": [],
     "readOnly": true,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "rules_history",
      "command": "rules history",
      "form": null,
      "title": "Rule change history",
      "details": [],
      "also": [],
      "readOnly": true,
      "who": [
       "owner"
      ],
      "whatItDoes": "Rule change history",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "playbook_list",
     "command": "list commands",
     "form": null,
     "title": "List playbook commands",
     "details": [],
     "also": [],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "playbook_list",
      "command": "list commands",
      "form": null,
      "title": "List playbook commands",
      "details": [],
      "also": [],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "List playbook commands",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "playbook_toggle",
     "command": "disable command delete mailbox",
     "form": "<enable or disable> command <command name>",
     "title": "Switch a playbook command on/off",
     "details": [
      {
       "name": "onoff",
       "kind": "enable or disable",
       "optional": false
      },
      {
       "name": "what",
       "kind": "command name",
       "optional": false
      }
     ],
     "also": [
      "enable command dns records"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "playbook_toggle",
      "command": "disable command delete mailbox",
      "form": "<enable or disable> command <command name>",
      "title": "Switch a playbook command on/off",
      "details": [
       {
        "name": "onoff",
        "kind": "enable or disable",
        "optional": false
       },
       {
        "name": "what",
        "kind": "command name",
        "optional": false
       }
      ],
      "also": [
       "enable command dns records"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Switch a playbook command on/off",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "playbook_forget_phrase",
     "command": "forget phrase \"show me the shop list\"",
     "form": "forget phrase \"<phrase>\"",
     "title": "Forget wording the help desk learned for a command",
     "details": [
      {
       "name": "phrase",
       "kind": "phrase",
       "optional": false
      }
     ],
     "also": [
      "unlearn wording \"show me the people\""
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "playbook_forget_phrase",
      "command": "forget phrase \"show me the shop list\"",
      "form": "forget phrase \"<phrase>\"",
      "title": "Forget wording the help desk learned for a command",
      "details": [
       {
        "name": "phrase",
        "kind": "phrase",
        "optional": false
       }
      ],
      "also": [
       "unlearn wording \"show me the people\""
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "For wording learned by mistake (after a \"yes\" to a wrong \"Did you mean…?\"). Built-in wording is never removed.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "playbook_add_phrase",
     "command": "add phrase \"my mail is dead\" to command email not working",
     "form": "add phrase \"<phrase>\" to command <command name>",
     "title": "Teach a command a new phrase",
     "details": [
      {
       "name": "phrase",
       "kind": "phrase",
       "optional": false
      },
      {
       "name": "what",
       "kind": "command name",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "playbook_add_phrase",
      "command": "add phrase \"my mail is dead\" to command email not working",
      "form": "add phrase \"<phrase>\" to command <command name>",
      "title": "Teach a command a new phrase",
      "details": [
       {
        "name": "phrase",
        "kind": "phrase",
        "optional": false
       },
       {
        "name": "what",
        "kind": "command name",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "The phrase is matched exactly (spaces and letter case ignored). New commands with new actions are added by a developer, never by chat.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    }
   ]
  },
  {
   "id": "tickets",
   "title": "Tickets",
   "lead": "How requests that need a person are handled. A ticket is opened when the assistant cannot answer, an action fails, the client asks for a person, or a client says it is not solved. LIFE CYCLE: new (nobody has it yet) -> active (assigned, being worked on) -> pending (waiting for the client) or hold (waiting for something else) -> closed. A client who writes again brings a pending ticket back to active. PRIORITY: urgent, high, normal or low, set from the words (smoke, down, cannot log in...) and by the brain, or by staff. Each has a time for the next reply and a time to resolve (Settings -> Tickets); late tickets are reminded to whoever has them, then to the dispatchers, then to the owner. WHO GETS IT: per business (and for IT requests in Settings): automatic = the available person with the least open tickets; alert all = the first to take it owns it; a dispatcher decides. Staff who are away are skipped. A person who sends a ticket back (return) hands it to a dispatcher, who gives it to someone else: it is never reassigned automatically. Staff reply to the help desk with the ticket number; the client is told when it is assigned, put on hold, and closed, and can ask for the status of the ticket at any time. A ticket waiting for the client closes by itself after a few days; a client who writes again within a week of a closed ticket gets a follow-up linked to it, given to the same person.",
   "tips": [
    {
     "what": "A ticket arrives: the person who has it gets the client, the request, the brain's summary and what to do first. Take it if nobody has it:",
     "commands": [
      "take A7F3"
     ]
    },
    {
     "what": "Answer the client (they receive it in their chat; the help desk stays quiet there, and whatever the client writes back is shown to you):",
     "commands": [
      "reply to A7F3: Can you send a photo of the display?"
     ]
    },
    {
     "what": "Finished: say what you did. The client is told it is closed, and is offered your note if they have heard nothing else:",
     "commands": [
      "A7F3 closed: replaced the fuse, tested for an hour"
     ]
    },
    {
     "what": "Waiting for something (a part, a supplier): put it on hold, optionally with a date to be reminded. The client is told:",
     "commands": [
      "A7F3 on hold for 2 days: waiting for the spare part",
      "resume A7F3"
     ]
    },
    {
     "what": "Not yours: send it back. It goes to a dispatcher with your reason, who assigns it to someone else:",
     "commands": [
      "return A7F3: this is a billing question"
     ]
    },
    {
     "what": "Dispatcher: give a ticket to a person, or to whoever has the least open tickets:",
     "commands": [
      "assign A7F3 to Hadi",
      "assign A7F3 auto",
      "ticket queue"
     ]
    },
    {
     "what": "Change how urgent it is, leave a note for colleagues (the client never sees it), look at a ticket, or reopen a closed one:",
     "commands": [
      "priority of A7F3 urgent",
      "note on A7F3: the client is a repeat customer",
      "ticket A7F3",
      "reopen A7F3"
     ]
    },
    {
     "what": "Let the brain draft the answer from the ticket and the business documents. Nothing is sent until you say yes:",
     "commands": [
      "suggest a reply for A7F3"
     ]
    },
    {
     "what": "See your own tickets, and tell the help desk when you are not available (tickets are then not given to you automatically):",
     "commands": [
      "my tickets",
      "I'm away",
      "I'm back"
     ]
    }
   ],
   "commands": [
    {
     "id": "tickets_report",
     "command": "tickets this week",
     "form": null,
     "title": "Tickets this week",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": true
      }
     ],
     "also": [
      "tickets for Acme"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "tickets_report",
      "command": "tickets this week",
      "form": null,
      "title": "Tickets this week",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": true
       }
      ],
      "also": [
       "tickets for Acme"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Tickets this week",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_reply",
     "command": "reply to A7F3: we fixed it, please try again",
     "form": "reply to A7F3: <text>",
     "title": "Reply to a client ticket",
     "details": [
      {
       "name": "tid",
       "kind": "ticket code",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_reply",
      "command": "reply to A7F3: we fixed it, please try again",
      "form": "reply to A7F3: <text>",
      "title": "Reply to a client ticket",
      "details": [
       {
        "name": "tid",
        "kind": "ticket code",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Your text is relayed to the client by the router as written. The router then stays quiet in that chat for a while (handoff).",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_take",
     "command": "take A7F3",
     "form": "take <ticket code>",
     "title": "Take a ticket (you will handle it)",
     "details": [
      {
       "name": "tid",
       "kind": "ticket code",
       "optional": false
      }
     ],
     "also": [
      "i'll handle A7F3"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_take",
      "command": "take A7F3",
      "form": "take <ticket code>",
      "title": "Take a ticket (you will handle it)",
      "details": [
       {
        "name": "tid",
        "kind": "ticket code",
        "optional": false
       }
      ],
      "also": [
       "i'll handle A7F3"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Take a ticket (you will handle it)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_close",
     "command": "close ticket A7F3",
     "form": "close ticket <ticket code>",
     "title": "Close a ticket (with what you did)",
     "details": [
      {
       "name": "tid",
       "kind": "ticket code",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": true
      }
     ],
     "also": [
      "A7F3 closed: replaced the fuse, client informed",
      "A7F3 solved"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_close",
      "command": "close ticket A7F3",
      "form": "close ticket <ticket code>",
      "title": "Close a ticket (with what you did)",
      "details": [
       {
        "name": "tid",
        "kind": "ticket code",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": true
       }
      ],
      "also": [
       "A7F3 closed: replaced the fuse, client informed",
       "A7F3 solved"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Say what you did after a colon: it is saved with the ticket (the client is not shown it unless you choose to send it). The client is told the ticket is closed. Closing a ticket nobody owns takes it.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_hold",
     "command": "A7F3 on hold: waiting for the spare part",
     "form": "<ticket code> on hold: <text>",
     "title": "Put a ticket on hold (waiting for something)",
     "details": [
      {
       "name": "tid",
       "kind": "ticket code",
       "optional": false
      },
      {
       "name": "until",
       "kind": "until (a date or a time)",
       "optional": true
      },
      {
       "name": "text",
       "kind": "text",
       "optional": true
      }
     ],
     "also": [
      "hold A7F3 for 2 days: client is travelling",
      "hold ticket A7F3 until friday"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_hold",
      "command": "A7F3 on hold: waiting for the spare part",
      "form": "<ticket code> on hold: <text>",
      "title": "Put a ticket on hold (waiting for something)",
      "details": [
       {
        "name": "tid",
        "kind": "ticket code",
        "optional": false
       },
       {
        "name": "until",
        "kind": "until (a date or a time)",
        "optional": true
       },
       {
        "name": "text",
        "kind": "text",
        "optional": true
       }
      ],
      "also": [
       "hold A7F3 for 2 days: client is travelling",
       "hold ticket A7F3 until friday"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "The clocks stop and the client is told it is on hold. Say for how long (for 2 days, until friday, until 2026-10-05) and you are reminded then; without a date, resume it yourself.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_resume",
     "command": "resume A7F3",
     "form": "resume <ticket code>",
     "title": "Resume a ticket that was on hold",
     "details": [
      {
       "name": "tid",
       "kind": "ticket code",
       "optional": false
      }
     ],
     "also": [
      "A7F3 is back"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_resume",
      "command": "resume A7F3",
      "form": "resume <ticket code>",
      "title": "Resume a ticket that was on hold",
      "details": [
       {
        "name": "tid",
        "kind": "ticket code",
        "optional": false
       }
      ],
      "also": [
       "A7F3 is back"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Resume a ticket that was on hold",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_return",
     "command": "return A7F3: this is a billing question",
     "form": "return A7F3: <text>",
     "title": "Send a ticket back to the admin to give to someone else",
     "details": [
      {
       "name": "tid",
       "kind": "ticket code",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": true
      }
     ],
     "also": [
      "A7F3 back to admin: not my area",
      "A7F3 is not mine"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_return",
      "command": "return A7F3: this is a billing question",
      "form": "return A7F3: <text>",
      "title": "Send a ticket back to the admin to give to someone else",
      "details": [
       {
        "name": "tid",
        "kind": "ticket code",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": true
       }
      ],
      "also": [
       "A7F3 back to admin: not my area",
       "A7F3 is not mine"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "The ticket goes back to the dispatcher (or the owner), with your reason, to be given to another person. It is never reassigned automatically.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_assign",
     "command": "assign A7F3 to Hadi",
     "form": "assign <ticket code> to <person or people>",
     "title": "Assign a ticket to a staff member (dispatchers)",
     "details": [
      {
       "name": "tid",
       "kind": "ticket code",
       "optional": false
      },
      {
       "name": "who",
       "kind": "person or people",
       "optional": true
      }
     ],
     "also": [
      "assign A7F3 auto",
      "reassign A7F3 to Sara"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_assign",
      "command": "assign A7F3 to Hadi",
      "form": "assign <ticket code> to <person or people>",
      "title": "Assign a ticket to a staff member (dispatchers)",
      "details": [
       {
        "name": "tid",
        "kind": "ticket code",
        "optional": false
       },
       {
        "name": "who",
        "kind": "person or people",
        "optional": true
       }
      ],
      "also": [
       "assign A7F3 auto",
       "reassign A7F3 to Sara"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Only the owner and staff marked as dispatchers. \"auto\" picks the available person with the least open tickets. The person is told; so is the client, the first time.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_priority",
     "command": "priority of A7F3 urgent",
     "form": "priority of <ticket code> <priority (urgent, high, normal or low)>",
     "title": "Set the priority of a ticket",
     "details": [
      {
       "name": "tid",
       "kind": "ticket code",
       "optional": false
      },
      {
       "name": "prio",
       "kind": "priority (urgent, high, normal or low)",
       "optional": false
      }
     ],
     "also": [
      "A7F3 high"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_priority",
      "command": "priority of A7F3 urgent",
      "form": "priority of <ticket code> <priority (urgent, high, normal or low)>",
      "title": "Set the priority of a ticket",
      "details": [
       {
        "name": "tid",
        "kind": "ticket code",
        "optional": false
       },
       {
        "name": "prio",
        "kind": "priority (urgent, high, normal or low)",
        "optional": false
       }
      ],
      "also": [
       "A7F3 high"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "urgent, high, normal or low. The due times follow the priority (set in Settings → Tickets).",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_reopen",
     "command": "reopen A7F3",
     "form": "reopen <ticket code>",
     "title": "Reopen a closed ticket",
     "details": [
      {
       "name": "tid",
       "kind": "ticket code",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_reopen",
      "command": "reopen A7F3",
      "form": "reopen <ticket code>",
      "title": "Reopen a closed ticket",
      "details": [
       {
        "name": "tid",
        "kind": "ticket code",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Reopen a closed ticket",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_note",
     "command": "note on A7F3: the client is the CEO",
     "form": "note on A7F3: <text>",
     "title": "Add an internal note to a ticket",
     "details": [
      {
       "name": "tid",
       "kind": "ticket code",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [
      "add a note on ticket A7F3: called twice, no answer"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_note",
      "command": "note on A7F3: the client is the CEO",
      "form": "note on A7F3: <text>",
      "title": "Add an internal note to a ticket",
      "details": [
       {
        "name": "tid",
        "kind": "ticket code",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [
       "add a note on ticket A7F3: called twice, no answer"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Internal: the client never sees it. It stays in the history.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_show",
     "command": "ticket A7F3",
     "form": "ticket <ticket code>",
     "title": "Show a ticket: the client, the request, the summary and the history",
     "details": [
      {
       "name": "tid",
       "kind": "ticket code",
       "optional": false
      }
     ],
     "also": [
      "show ticket A7F3"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_show",
      "command": "ticket A7F3",
      "form": "ticket <ticket code>",
      "title": "Show a ticket: the client, the request, the summary and the history",
      "details": [
       {
        "name": "tid",
        "kind": "ticket code",
        "optional": false
       }
      ],
      "also": [
       "show ticket A7F3"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Show a ticket: the client, the request, the summary and the history",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "tickets_list",
     "command": "list tickets",
     "form": null,
     "title": "List tickets (open, new, overdue, on hold, waiting, closed today; of a client, a business or a staff member)",
     "details": [
      {
       "name": "pre",
       "kind": "which ones",
       "optional": true
      },
      {
       "name": "filter",
       "kind": "filter",
       "optional": true
      }
     ],
     "also": [
      "list tickets of Acme",
      "overdue tickets"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "tickets_list",
      "command": "list tickets",
      "form": null,
      "title": "List tickets (open, new, overdue, on hold, waiting, closed today; of a client, a business or a staff member)",
      "details": [
       {
        "name": "pre",
        "kind": "which ones",
        "optional": true
       },
       {
        "name": "filter",
        "kind": "filter",
        "optional": true
       }
      ],
      "also": [
       "list tickets of Acme",
       "overdue tickets"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Open tickets by default. Narrow it: new, on hold, waiting (for the client), in progress, overdue, urgent/high, closed (today), older than N days; of a client, of business X, or assigned to a staff member. Dispatchers and the owner see all; others their own and their queue's.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_find",
     "command": "find ticket about printer",
     "form": "find ticket about <text>",
     "title": "Find tickets about something",
     "details": [
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [
      "search tickets for invoice"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_find",
      "command": "find ticket about printer",
      "form": "find ticket about <text>",
      "title": "Find tickets about something",
      "details": [
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [
       "search tickets for invoice"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Searches the subject, summary, the request, the client and who has it, in open and closed tickets.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_open_for",
     "command": "open a ticket for Acme: the printer on the 2nd floor is broken",
     "form": "open a ticket for Acme: <text>",
     "title": "Open a ticket for a client yourself",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_open_for",
      "command": "open a ticket for Acme: the printer on the 2nd floor is broken",
      "form": "open a ticket for Acme: <text>",
      "title": "Open a ticket for a client yourself",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "For a request that came by phone or email. The ticket goes to the queue (or the business's staff) like any other; it does not use the client's weekly tickets and the client is not messaged.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_subject",
     "command": "rename ticket A7F3: printer on the 2nd floor",
     "form": "rename ticket A7F3: <text>",
     "title": "Change the subject of a ticket",
     "details": [
      {
       "name": "tid",
       "kind": "ticket code",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_subject",
      "command": "rename ticket A7F3: printer on the 2nd floor",
      "form": "rename ticket A7F3: <text>",
      "title": "Change the subject of a ticket",
      "details": [
       {
        "name": "tid",
        "kind": "ticket code",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Change the subject of a ticket",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "tickets_close_bulk",
     "command": "close all tickets",
     "form": null,
     "title": "Close several tickets at once (all, or of a client, on hold, older than N days…)",
     "details": [
      {
       "name": "pre",
       "kind": "which ones",
       "optional": true
      },
      {
       "name": "filter",
       "kind": "filter",
       "optional": true
      }
     ],
     "also": [
      "close all tickets of Acme",
      "close all tickets on hold"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "tickets_close_bulk",
      "command": "close all tickets",
      "form": null,
      "title": "Close several tickets at once (all, or of a client, on hold, older than N days…)",
      "details": [
       {
        "name": "pre",
        "kind": "which ones",
        "optional": true
       },
       {
        "name": "filter",
        "kind": "filter",
        "optional": true
       }
      ],
      "also": [
       "close all tickets of Acme",
       "close all tickets on hold"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Owner and dispatchers. You see how many and which, then say yes. The clients are not messaged (so a big clean-up never floods them). Undo within 24 hours: \"reopen the tickets I just closed\".",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "tickets_reopen_bulk",
     "command": "reopen the tickets I just closed",
     "form": null,
     "title": "Reopen the tickets I just closed at once",
     "details": [],
     "also": [
      "undo the bulk close"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "tickets_reopen_bulk",
      "command": "reopen the tickets I just closed",
      "form": null,
      "title": "Reopen the tickets I just closed at once",
      "details": [],
      "also": [
       "undo the bulk close"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Reopen the tickets I just closed at once",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "tickets_mine",
     "command": "my tickets",
     "form": null,
     "title": "List my open tickets",
     "details": [],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "tickets_mine",
      "command": "my tickets",
      "form": null,
      "title": "List my open tickets",
      "details": [],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "List my open tickets",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "tickets_queue",
     "command": "ticket queue",
     "form": null,
     "title": "List the tickets waiting to be assigned",
     "details": [],
     "also": [
      "unassigned tickets"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "tickets_queue",
      "command": "ticket queue",
      "form": null,
      "title": "List the tickets waiting to be assigned",
      "details": [],
      "also": [
       "unassigned tickets"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "List the tickets waiting to be assigned",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_suggest",
     "command": "suggest a reply for A7F3",
     "form": "suggest a reply for <ticket code>",
     "title": "Ask the brain to draft a reply to the client (you confirm before it is sent)",
     "details": [
      {
       "name": "tid",
       "kind": "ticket code",
       "optional": false
      }
     ],
     "also": [
      "draft reply to A7F3"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "ticket_suggest",
      "command": "suggest a reply for A7F3",
      "form": "suggest a reply for <ticket code>",
      "title": "Ask the brain to draft a reply to the client (you confirm before it is sent)",
      "details": [
       {
        "name": "tid",
        "kind": "ticket code",
        "optional": false
       }
      ],
      "also": [
       "draft reply to A7F3"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "The brain writes a draft from the ticket, the conversation and the business docs, and lists nothing it does not know. Nothing is sent until you say yes.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "staff_away",
     "command": "away",
     "form": null,
     "title": "Mark myself as away (no automatic tickets)",
     "details": [],
     "also": [
      "I'm off duty"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "staff_away",
      "command": "away",
      "form": null,
      "title": "Mark myself as away (no automatic tickets)",
      "details": [],
      "also": [
       "I'm off duty"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Mark myself as away (no automatic tickets)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "staff_back",
     "command": "I'm back",
     "form": null,
     "title": "Mark myself as available again",
     "details": [],
     "also": [
      "available"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "staff_back",
      "command": "I'm back",
      "form": null,
      "title": "Mark myself as available again",
      "details": [],
      "also": [
       "available"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Mark myself as available again",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "staff_mark_away",
     "command": "mark Hadi away",
     "form": "mark <person or people> away",
     "title": "Mark a staff member away (no automatic tickets)",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      }
     ],
     "also": [
      "set Sara as away"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "staff_mark_away",
      "command": "mark Hadi away",
      "form": "mark <person or people> away",
      "title": "Mark a staff member away (no automatic tickets)",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       }
      ],
      "also": [
       "set Sara as away"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "For the owner and dispatchers: someone is off and cannot say it themselves. Tickets are then not given to them automatically; their open tickets stay theirs.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "staff_mark_back",
     "command": "mark Hadi back",
     "form": "mark <person or people> back",
     "title": "Mark a staff member available again",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      }
     ],
     "also": [
      "set Sara as available"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "staff_mark_back",
      "command": "mark Hadi back",
      "form": "mark <person or people> back",
      "title": "Mark a staff member available again",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       }
      ],
      "also": [
       "set Sara as available"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Mark a staff member available again",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_grant",
     "command": "give Acme 2 more tickets this week",
     "form": "give <client name> <number> more tickets this week",
     "title": "Give a client extra tickets",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "num",
       "kind": "number",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "ticket_grant",
      "command": "give Acme 2 more tickets this week",
      "form": "give <client name> <number> more tickets this week",
      "title": "Give a client extra tickets",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "num",
        "kind": "number",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Sanity limit: a grant above 10 tickets is refused unless you repeat it with \"confirm\".",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "staff_dispatcher",
     "command": "make Hadi a dispatcher",
     "form": "make <person or people> a dispatcher",
     "title": "Make a staff member a dispatcher (or not)",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      },
      {
       "name": "switch",
       "kind": "on or off",
       "optional": true
      }
     ],
     "also": [
      "dispatcher Hadi off",
      "Hadi is not a dispatcher"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "staff_dispatcher",
      "command": "make Hadi a dispatcher",
      "form": "make <person or people> a dispatcher",
      "title": "Make a staff member a dispatcher (or not)",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       },
       {
        "name": "switch",
        "kind": "on or off",
        "optional": true
       }
      ],
      "also": [
       "dispatcher Hadi off",
       "Hadi is not a dispatcher"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "A dispatcher may assign tickets (\"assign A7F3 to Sara\") and receives the tickets nobody could take or that a person sent back. The owner always is one.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_settings",
     "command": "ticket settings",
     "form": null,
     "title": "Show the ticket settings (who gets tickets, due times, auto-close)",
     "details": [],
     "also": [
      "due times"
     ],
     "readOnly": true,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "ticket_settings",
      "command": "ticket settings",
      "form": null,
      "title": "Show the ticket settings (who gets tickets, due times, auto-close)",
      "details": [],
      "also": [
       "due times"
      ],
      "readOnly": true,
      "who": [
       "owner"
      ],
      "whatItDoes": "Show the ticket settings (who gets tickets, due times, auto-close)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_dispatch_set",
     "command": "set ticket dispatch to auto",
     "form": "set ticket dispatch to <mode>",
     "title": "Set who gets IT tickets (claim, auto or admin)",
     "details": [
      {
       "name": "mode",
       "kind": "mode",
       "optional": false
      }
     ],
     "also": [
      "set dispatch to claim"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "ticket_dispatch_set",
      "command": "set ticket dispatch to auto",
      "form": "set ticket dispatch to <mode>",
      "title": "Set who gets IT tickets (claim, auto or admin)",
      "details": [
       {
        "name": "mode",
        "kind": "mode",
        "optional": false
       }
      ],
      "also": [
       "set dispatch to claim"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "claim: every staff member is told and the first to take it owns it. auto: the available person with the least open tickets. admin: a dispatcher assigns it. Each business has its own (set business dispatch of …).",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_sla_set",
     "command": "set urgent reply time to 10 minutes",
     "form": "set <priority (urgent, high, normal or low)> <next reply or resolution> time to <number> <minutes, hours or days>",
     "title": "Set a due time for a priority (next reply or resolution)",
     "details": [
      {
       "name": "prio",
       "kind": "priority (urgent, high, normal or low)",
       "optional": false
      },
      {
       "name": "kind",
       "kind": "next reply or resolution",
       "optional": false
      },
      {
       "name": "num",
       "kind": "number",
       "optional": false
      },
      {
       "name": "unit",
       "kind": "minutes, hours or days",
       "optional": true
      }
     ],
     "also": [
      "set low resolve time to 3 days"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "ticket_sla_set",
      "command": "set urgent reply time to 10 minutes",
      "form": "set <priority (urgent, high, normal or low)> <next reply or resolution> time to <number> <minutes, hours or days>",
      "title": "Set a due time for a priority (next reply or resolution)",
      "details": [
       {
        "name": "prio",
        "kind": "priority (urgent, high, normal or low)",
        "optional": false
       },
       {
        "name": "kind",
        "kind": "next reply or resolution",
        "optional": false
       },
       {
        "name": "num",
        "kind": "number",
        "optional": false
       },
       {
        "name": "unit",
        "kind": "minutes, hours or days",
        "optional": true
       }
      ],
      "also": [
       "set low resolve time to 3 days"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Minutes unless you say hours or days. Late tickets are reminded to whoever has them, then the dispatchers (twice the time), then the owner (four times).",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_autoclose_set",
     "command": "auto close after 3 days",
     "form": "auto close after <number> days",
     "title": "Close tickets waiting for the client after some days (0 = never)",
     "details": [
      {
       "name": "num",
       "kind": "number",
       "optional": false
      }
     ],
     "also": [
      "set auto-close to 0 days"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "ticket_autoclose_set",
      "command": "auto close after 3 days",
      "form": "auto close after <number> days",
      "title": "Close tickets waiting for the client after some days (0 = never)",
      "details": [
       {
        "name": "num",
        "kind": "number",
        "optional": false
       }
      ],
      "also": [
       "set auto-close to 0 days"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Close tickets waiting for the client after some days (0 = never)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_followup_set",
     "command": "set follow-up window to 10 days",
     "form": "set follow-up window to <number> days",
     "title": "Set the follow-up window (days)",
     "details": [
      {
       "name": "num",
       "kind": "number",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "ticket_followup_set",
      "command": "set follow-up window to 10 days",
      "form": "set follow-up window to <number> days",
      "title": "Set the follow-up window (days)",
      "details": [
       {
        "name": "num",
        "kind": "number",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "A client who writes again within this time after a closed ticket gets a follow-up linked to it, given to the same person.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_triage_set",
     "command": "turn off ai triage",
     "form": "turn <on or off> ai triage",
     "title": "Turn AI triage of new tickets on or off",
     "details": [
      {
       "name": "switch",
       "kind": "on or off",
       "optional": false
      }
     ],
     "also": [
      "ai triage on"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "ticket_triage_set",
      "command": "turn off ai triage",
      "form": "turn <on or off> ai triage",
      "title": "Turn AI triage of new tickets on or off",
      "details": [
       {
        "name": "switch",
        "kind": "on or off",
        "optional": false
       }
      ],
      "also": [
       "ai triage on"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "On: a brain sets the subject, priority, summary and first step of each new ticket. Off: simple rules do it.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs",
       "changes the help desk itself (owner console)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    }
   ]
  },
  {
   "id": "clients",
   "title": "What clients can ask",
   "lead": "Commands a client may use (each client has their own allowed list).",
   "tips": [],
   "commands": [
    {
     "id": "greet",
     "command": "Hello",
     "form": null,
     "title": "Greeting",
     "details": [],
     "also": [
      "good morning"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "greet",
      "command": "Hello",
      "form": null,
      "title": "Greeting",
      "details": [],
      "also": [
       "good morning"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Greeting",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "thanks",
       "help",
       "how many tickets do I have left",
       "opening hours"
      ]
     }
    },
    {
     "id": "thanks",
     "command": "thanks",
     "form": null,
     "title": "Thanks",
     "details": [],
     "also": [
      "thank you",
      "Thanks All good"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "thanks",
      "command": "thanks",
      "form": null,
      "title": "Thanks",
      "details": [],
      "also": [
       "thank you",
       "Thanks All good"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Thanks",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "help",
       "how many tickets do I have left",
       "opening hours"
      ]
     }
    },
    {
     "id": "help_menu",
     "command": "help",
     "form": null,
     "title": "Menu / what can you do",
     "details": [],
     "also": [
      "what can you do"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "help_menu",
      "command": "help",
      "form": null,
      "title": "Menu / what can you do",
      "details": [],
      "also": [
       "what can you do"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Menu / what can you do",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "how many tickets do I have left",
       "opening hours"
      ]
     }
    },
    {
     "id": "tickets_left",
     "command": "how many tickets do I have left",
     "form": null,
     "title": "How many tickets are left",
     "details": [],
     "also": [
      "my tickets"
     ],
     "readOnly": true,
     "who": [
      "client"
     ],
     "explanation": {
      "id": "tickets_left",
      "command": "how many tickets do I have left",
      "form": null,
      "title": "How many tickets are left",
      "details": [],
      "also": [
       "my tickets"
      ],
      "readOnly": true,
      "who": [
       "client"
      ],
      "whatItDoes": "How many tickets are left",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "opening hours"
      ]
     }
    },
    {
     "id": "hours",
     "command": "opening hours",
     "form": null,
     "title": "Opening hours",
     "details": [],
     "also": [
      "when are you available"
     ],
     "readOnly": true,
     "who": [
      "client"
     ],
     "explanation": {
      "id": "hours",
      "command": "opening hours",
      "form": null,
      "title": "Opening hours",
      "details": [],
      "also": [
       "when are you available"
      ],
      "readOnly": true,
      "who": [
       "client"
      ],
      "whatItDoes": "Opening hours",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "talk_to_staff",
     "command": "I want to talk to a human",
     "form": null,
     "title": "Talk to a person",
     "details": [],
     "also": [
      "staff"
     ],
     "readOnly": false,
     "who": [
      "client"
     ],
     "explanation": {
      "id": "talk_to_staff",
      "command": "I want to talk to a human",
      "form": null,
      "title": "Talk to a person",
      "details": [],
      "also": [
       "staff"
      ],
      "readOnly": false,
      "who": [
       "client"
      ],
      "whatItDoes": "Talk to a person",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "ticket_status",
     "command": "status of my request",
     "form": null,
     "title": "Status of my request",
     "details": [],
     "also": [
      "any update"
     ],
     "readOnly": true,
     "who": [
      "client"
     ],
     "explanation": {
      "id": "ticket_status",
      "command": "status of my request",
      "form": null,
      "title": "Status of my request",
      "details": [],
      "also": [
       "any update"
      ],
      "readOnly": true,
      "who": [
       "client"
      ],
      "whatItDoes": "Status of my request",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "lang_en",
     "command": "english please",
     "form": null,
     "title": "Reply in English",
     "details": [],
     "also": [],
     "readOnly": false,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "lang_en",
      "command": "english please",
      "form": null,
      "title": "Reply in English",
      "details": [],
      "also": [],
      "readOnly": false,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Reply in English",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "lang_ar",
     "command": "arabic please",
     "form": null,
     "title": "Reply in Arabic",
     "details": [],
     "also": [
      "can we speak arabic"
     ],
     "readOnly": false,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "lang_ar",
      "command": "arabic please",
      "form": null,
      "title": "Reply in Arabic",
      "details": [],
      "also": [
       "can we speak arabic"
      ],
      "readOnly": false,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Reply in Arabic",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "Hello",
       "thanks",
       "help",
       "how many tickets do I have left"
      ]
     }
    },
    {
     "id": "email_check",
     "command": "my email is not working",
     "form": null,
     "title": "My email is not working (check it)",
     "details": [
      {
       "name": "email",
       "kind": "email address",
       "optional": true
      },
      {
       "name": "domain",
       "kind": "domain",
       "optional": true
      }
     ],
     "also": [
      "I can't log in to my email info@acme.com",
      "not receiving emails"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "email_check",
      "command": "my email is not working",
      "form": null,
      "title": "My email is not working (check it)",
      "details": [
       {
        "name": "email",
        "kind": "email address",
        "optional": true
       },
       {
        "name": "domain",
        "kind": "domain",
        "optional": true
       }
      ],
      "also": [
       "I can't log in to my email info@acme.com",
       "not receiving emails"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "My email is not working (check it)",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List email accounts",
       "List DNS records"
      ],
      "gates": [
       "runs without confirmation (it only reads)",
       "uses one of the client's weekly tickets"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com",
       "create subdomain app.acme.com"
      ]
     }
    },
    {
     "id": "email_password_reset",
     "command": "reset password of info@acme.com",
     "form": "reset password of <email address>",
     "title": "Reset an email password",
     "details": [
      {
       "name": "email",
       "kind": "email address",
       "optional": true
      }
     ],
     "also": [
      "change my email password",
      "I forgot my email password"
     ],
     "readOnly": false,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "email_password_reset",
      "command": "reset password of info@acme.com",
      "form": "reset password of <email address>",
      "title": "Reset an email password",
      "details": [
       {
        "name": "email",
        "kind": "email address",
        "optional": true
       }
      ],
      "also": [
       "change my email password",
       "I forgot my email password"
      ],
      "readOnly": false,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "If the request came from a group, the action runs only when the requester DMs the router, so no password is ever held or posted in the group.",
      "uses": "a change",
      "runsThrough": [
       "Reset an email password"
      ],
      "gates": [
       "shown for a yes before it runs",
       "uses one of the client's weekly tickets"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "send password",
       "create email info@acme.com",
       "create subdomain app.acme.com"
      ]
     }
    },
    {
     "id": "send_password",
     "command": "send password",
     "form": null,
     "title": "Send me the password (private chat)",
     "details": [],
     "also": [
      "send me the password"
     ],
     "readOnly": false,
     "who": [
      "client"
     ],
     "explanation": {
      "id": "send_password",
      "command": "send password",
      "form": null,
      "title": "Send me the password (private chat)",
      "details": [],
      "also": [
       "send me the password"
      ],
      "readOnly": false,
      "who": [
       "client"
      ],
      "whatItDoes": "Runs a password request that was made from a group, now that the person is in a private chat. Nothing is stored in between.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "create email info@acme.com",
       "create subdomain app.acme.com"
      ]
     }
    },
    {
     "id": "email_create",
     "command": "create email info@acme.com",
     "form": "create email <email address>",
     "title": "Create an email account",
     "details": [
      {
       "name": "email",
       "kind": "email address",
       "optional": true
      }
     ],
     "also": [
      "I need a new email",
      "add mailbox sales@acme.com"
     ],
     "readOnly": false,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "email_create",
      "command": "create email info@acme.com",
      "form": "create email <email address>",
      "title": "Create an email account",
      "details": [
       {
        "name": "email",
        "kind": "email address",
        "optional": true
       }
      ],
      "also": [
       "I need a new email",
       "add mailbox sales@acme.com"
      ],
      "readOnly": false,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Create an email account",
      "uses": "a small change",
      "runsThrough": [
       "Create an email account"
      ],
      "gates": [
       "shown for a yes before it runs",
       "uses one of the client's weekly tickets"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create subdomain app.acme.com"
      ]
     }
    },
    {
     "id": "subdomain_create",
     "command": "create subdomain app.acme.com",
     "form": "create subdomain <full subdomain>",
     "title": "Create a subdomain",
     "details": [
      {
       "name": "fqdn",
       "kind": "full subdomain",
       "optional": true
      }
     ],
     "also": [
      "I need a new subdomain"
     ],
     "readOnly": false,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "subdomain_create",
      "command": "create subdomain app.acme.com",
      "form": "create subdomain <full subdomain>",
      "title": "Create a subdomain",
      "details": [
       {
        "name": "fqdn",
        "kind": "full subdomain",
        "optional": true
       }
      ],
      "also": [
       "I need a new subdomain"
      ],
      "readOnly": false,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Create a subdomain",
      "uses": "a small change",
      "runsThrough": [
       "Create a subdomain"
      ],
      "gates": [
       "shown for a yes before it runs",
       "uses one of the client's weekly tickets"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com"
      ]
     }
    },
    {
     "id": "dns_view",
     "command": "show my dns records",
     "form": null,
     "title": "Show DNS records",
     "details": [
      {
       "name": "domain",
       "kind": "domain",
       "optional": true
      }
     ],
     "also": [
      "list dns for acme.com"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "dns_view",
      "command": "show my dns records",
      "form": null,
      "title": "Show DNS records",
      "details": [
       {
        "name": "domain",
        "kind": "domain",
        "optional": true
       }
      ],
      "also": [
       "list dns for acme.com"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Show DNS records",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List DNS records"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com"
      ]
     }
    },
    {
     "id": "domains_list",
     "command": "list my domains",
     "form": null,
     "title": "List my domains",
     "details": [],
     "also": [
      "which domains do I have"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "domains_list",
      "command": "list my domains",
      "form": null,
      "title": "List my domains",
      "details": [],
      "also": [
       "which domains do I have"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "List my domains",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List domains"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com"
      ]
     }
    },
    {
     "id": "mailbox_list",
     "command": "list my mailboxes",
     "form": null,
     "title": "List my email accounts",
     "details": [
      {
       "name": "domain",
       "kind": "domain",
       "optional": true
      }
     ],
     "also": [
      "show emails for acme.com"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mailbox_list",
      "command": "list my mailboxes",
      "form": null,
      "title": "List my email accounts",
      "details": [
       {
        "name": "domain",
        "kind": "domain",
        "optional": true
       }
      ],
      "also": [
       "show emails for acme.com"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "List my email accounts",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List email accounts"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com"
      ]
     }
    },
    {
     "id": "disk_usage",
     "command": "disk usage",
     "form": null,
     "title": "Disk / hosting usage",
     "details": [],
     "also": [
      "how much space am I using"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "disk_usage",
      "command": "disk usage",
      "form": null,
      "title": "Disk / hosting usage",
      "details": [],
      "also": [
       "how much space am I using"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "For clients only when the client owns a whole cPanel account (owns.cpanel_dedicated). On a shared account the numbers include other clients, so it stays off.",
      "uses": "only reads (safe)",
      "runsThrough": [
       "cPanel usage"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com"
      ]
     }
    },
    {
     "id": "dns_add",
     "command": "add dns acme.com www A 203.0.113.10",
     "form": "add dns <domain> <name> <record type> <value>",
     "title": "Add a DNS record",
     "details": [
      {
       "name": "domain",
       "kind": "domain",
       "optional": false
      },
      {
       "name": "name",
       "kind": "name",
       "optional": false
      },
      {
       "name": "dnstype",
       "kind": "record type",
       "optional": false
      },
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [
      "add a CNAME record for shop on acme.com pointing to shops.example.net"
     ],
     "readOnly": false,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "dns_add",
      "command": "add dns acme.com www A 203.0.113.10",
      "form": "add dns <domain> <name> <record type> <value>",
      "title": "Add a DNS record",
      "details": [
       {
        "name": "domain",
        "kind": "domain",
        "optional": false
       },
       {
        "name": "name",
        "kind": "name",
        "optional": false
       },
       {
        "name": "dnstype",
        "kind": "record type",
        "optional": false
       },
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [
       "add a CNAME record for shop on acme.com pointing to shops.example.net"
      ],
      "readOnly": false,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "OFF for clients unless the owner enables it for that client. When on, it still goes to staff for approval (medium risk).",
      "uses": "a change",
      "runsThrough": [
       "Add a DNS record"
      ],
      "gates": [
       "a staff member must approve it",
       "uses one of the client's weekly tickets"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com"
      ]
     }
    },
    {
     "id": "nc_own_password",
     "command": "reset my nextcloud password",
     "form": null,
     "title": "Reset my Nextcloud password",
     "details": [],
     "also": [],
     "readOnly": false,
     "who": [
      "client"
     ],
     "explanation": {
      "id": "nc_own_password",
      "command": "reset my nextcloud password",
      "form": null,
      "title": "Reset my Nextcloud password",
      "details": [],
      "also": [],
      "readOnly": false,
      "who": [
       "client"
      ],
      "whatItDoes": "Reset my Nextcloud password",
      "uses": "a change",
      "runsThrough": [
       "Reset a Nextcloud password"
      ],
      "gates": [
       "shown for a yes before it runs",
       "uses one of the client's weekly tickets"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales",
       "change /Docs for hadi to edit"
      ]
     }
    },
    {
     "id": "nc_own_space",
     "command": "nextcloud space",
     "form": null,
     "title": "How much Nextcloud space do I have",
     "details": [],
     "also": [],
     "readOnly": true,
     "who": [
      "client"
     ],
     "explanation": {
      "id": "nc_own_space",
      "command": "nextcloud space",
      "form": null,
      "title": "How much Nextcloud space do I have",
      "details": [],
      "also": [],
      "readOnly": true,
      "who": [
       "client"
      ],
      "whatItDoes": "How much Nextcloud space do I have",
      "uses": "only reads (safe)",
      "runsThrough": [
       "Nextcloud user details"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales",
       "change /Docs for hadi to edit"
      ]
     }
    },
    {
     "id": "nc_folders",
     "command": "list folders",
     "form": null,
     "title": "List folders (and their subfolders)",
     "details": [
      {
       "name": "path",
       "kind": "folder",
       "optional": true
      }
     ],
     "also": [
      "list folders in /Clients",
      "show subfolders of /Clients/Acme"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_folders",
      "command": "list folders",
      "form": null,
      "title": "List folders (and their subfolders)",
      "details": [
       {
        "name": "path",
        "kind": "folder",
        "optional": true
       }
      ],
      "also": [
       "list folders in /Clients",
       "show subfolders of /Clients/Acme"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Top level (or the folder named) with one level of subfolders. Clients only see their own folders.",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List folders"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_tree",
     "command": "list all files",
     "form": null,
     "title": "List all files in every folder and subfolder",
     "details": [
      {
       "name": "path",
       "kind": "folder",
       "optional": true
      },
      {
       "name": "folder",
       "kind": "folder",
       "optional": true
      }
     ],
     "also": [
      "list all files found on nextcloud",
      "list all files in /CompanyFiles"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_tree",
      "command": "list all files",
      "form": null,
      "title": "List all files in every folder and subfolder",
      "details": [
       {
        "name": "path",
        "kind": "folder",
        "optional": true
       },
       {
        "name": "folder",
        "kind": "folder",
        "optional": true
       }
      ],
      "also": [
       "list all files found on nextcloud",
       "list all files in /CompanyFiles"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "One answer with every file and folder below a folder (6 levels, 600 items at most), with sizes and the total. A folder can be named without its path (\"inside CompanyFiles\"). Clients only see their own folders.",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List all files (every subfolder)"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_files",
     "command": "list files",
     "form": null,
     "title": "List files in a folder (with sizes)",
     "details": [
      {
       "name": "path",
       "kind": "folder",
       "optional": true
      },
      {
       "name": "folder",
       "kind": "folder",
       "optional": true
      }
     ],
     "also": [
      "list files in /Clients/Acme",
      "what files are in /Docs"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_files",
      "command": "list files",
      "form": null,
      "title": "List files in a folder (with sizes)",
      "details": [
       {
        "name": "path",
        "kind": "folder",
        "optional": true
       },
       {
        "name": "folder",
        "kind": "folder",
        "optional": true
       }
      ],
      "also": [
       "list files in /Clients/Acme",
       "what files are in /Docs"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Files and folders inside one folder (one level), with sizes and dates; the top level when no folder is named. Clients only see their own folders.",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List files"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    }
   ]
  },
  {
   "id": "custom",
   "title": "Custom commands",
   "lead": "Commands made by the owner in the panel.",
   "tips": [],
   "commands": []
  },
  {
   "id": "business",
   "title": "Business",
   "lead": "Commands of the Business plugin.",
   "tips": [],
   "commands": [
    {
     "id": "business_add",
     "command": "add business Solar Co",
     "form": "add business <business name>",
     "title": "Add a business (a service like a cPanel account)",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [
      "create a business Green Energy"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_add",
      "command": "add business Solar Co",
      "form": "add business <business name>",
      "title": "Add a business (a service like a cPanel account)",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [
       "create a business Green Energy"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Then fill in its profile, docs and FAQ in the panel (Plugins, Business), by command, or with the AI (improve docs of Solar Co: …), link clients to it (assign client Acme to business Solar Co) and assign its staff.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses",
       "show business Solar Co"
      ]
     }
    },
    {
     "id": "business_add_fill",
     "command": "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
     "form": "add business BaladMart: <value>",
     "title": "Add a business and let the AI draft everything for it",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      },
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [
      "create business Green Garden: a plant nursery",
      "create a new business KhadraGlass and get its info from khadraglass.com"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_add_fill",
      "command": "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
      "form": "add business BaladMart: <value>",
      "title": "Add a business and let the AI draft everything for it",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       },
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [
       "create business Green Garden: a plant nursery",
       "create a new business KhadraGlass and get its info from khadraglass.com"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "The business is added, then the AI drafts its profile, documents and FAQ from your description. You see the draft first; facts only you know (phone, address, prices, hours) are asked for, never invented.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "remove business Solar Co",
       "list businesses",
       "show business Solar Co"
      ]
     }
    },
    {
     "id": "business_remove",
     "command": "remove business Solar Co",
     "form": "remove business <business name>",
     "title": "Remove a business",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_remove",
      "command": "remove business Solar Co",
      "form": "remove business <business name>",
      "title": "Remove a business",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Clients linked to it are unlinked; open tickets stay. Its docs and FAQ history are deleted with it.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "list businesses",
       "show business Solar Co"
      ]
     }
    },
    {
     "id": "business_list",
     "command": "list businesses",
     "form": null,
     "title": "List the businesses",
     "details": [],
     "also": [
      "show all businesses"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_list",
      "command": "list businesses",
      "form": null,
      "title": "List the businesses",
      "details": [],
      "also": [
       "show all businesses"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "How many clients, staff, FAQ entries, documents and open tickets each has.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "show business Solar Co"
      ]
     }
    },
    {
     "id": "business_show",
     "command": "show business Solar Co",
     "form": "show business <business name>",
     "title": "Show a business profile (and whether it is on)",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [
      "view business solar",
      "is business solar enabled"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_show",
      "command": "show business Solar Co",
      "form": "show business <business name>",
      "title": "Show a business profile (and whether it is on)",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [
       "view business solar",
       "is business solar enabled"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "The profile the assistant answers from, plus its clients, staff and open tickets. A unique start of the name is enough.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_set",
     "command": "set business phone of Solar Co to +96170111222",
     "form": "set business <setting> of <business name> to <value>",
     "title": "Set any detail of a business (phone, hours, services, notes…)",
     "details": [
      {
       "name": "field",
       "kind": "setting",
       "optional": false
      },
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      },
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [
      "set business hours of Solar Co to Mon-Fri 8-17, Sat closed",
      "set business notes of Solar to Never promise installation dates"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_set",
      "command": "set business phone of Solar Co to +96170111222",
      "form": "set business <setting> of <business name> to <value>",
      "title": "Set any detail of a business (phone, hours, services, notes…)",
      "details": [
       {
        "name": "field",
        "kind": "setting",
        "optional": false
       },
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       },
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [
       "set business hours of Solar Co to Mon-Fri 8-17, Sat closed",
       "set business notes of Solar to Never promise installation dates"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Hours are written like: Mon-Fri 9-18, Sat 9-13, Sun closed (a split shift: Fri 7-13, 15-19); only the days you name change. Notes tell the assistant how to handle the clients of the business. Services: one per item, \"Name | price | note\", items separated by \";\". Every field the assistant is told can be set this way.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_faq_add",
     "command": "add faq to Solar Co: Do you offer a warranty? = Yes, 10 years on panels",
     "form": "add faq to Solar Co: <value>",
     "title": "Add a question and answer to a business FAQ",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      },
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [
      "add a faq for Solar: Can I get a quote? = Yes, send your address"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_faq_add",
      "command": "add faq to Solar Co: Do you offer a warranty? = Yes, 10 years on panels",
      "form": "add faq to Solar Co: <value>",
      "title": "Add a question and answer to a business FAQ",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       },
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [
       "add a faq for Solar: Can I get a quote? = Yes, send your address"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Write the question, an equals sign, then the answer. Customers who ask it are answered at once.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_faq_remove",
     "command": "remove faq from Solar Co: warranty",
     "form": "remove faq from Solar Co: <value>",
     "title": "Remove a question from a business FAQ",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      },
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_faq_remove",
      "command": "remove faq from Solar Co: warranty",
      "form": "remove faq from Solar Co: <value>",
      "title": "Remove a question from a business FAQ",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       },
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Say enough of the question to be specific (at least 4 letters). It can be brought back from the version history.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_note_add",
     "command": "add note to Solar Co: Always ask for the roof photo first",
     "form": "add note to Solar Co: <value>",
     "title": "Add a note on handling the clients of a business",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      },
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_note_add",
      "command": "add note to Solar Co: Always ask for the roof photo first",
      "form": "add note to Solar Co: <value>",
      "title": "Add a note on handling the clients of a business",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       },
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Notes are followed by the assistant on every answer.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_doc_add",
     "command": "add doc to Solar Co: Warranty terms = Panels 10 years, inverters 5 years",
     "form": "add doc to Solar Co: <value>",
     "title": "Add a document section to a business",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      },
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [
      "add a document for Solar: Battery care = Check every six months"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_doc_add",
      "command": "add doc to Solar Co: Warranty terms = Panels 10 years, inverters 5 years",
      "form": "add doc to Solar Co: <value>",
      "title": "Add a document section to a business",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       },
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [
       "add a document for Solar: Battery care = Check every six months"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Write the title, an equals sign, then the text. A section with the same title is replaced. For long documents upload a file in the panel.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_assign",
     "command": "assign client Acme to business Solar Co",
     "form": "assign client <client name> to business <business name>",
     "title": "Link a client to a business",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_assign",
      "command": "assign client Acme to business Solar Co",
      "form": "assign client <client name> to business <business name>",
      "title": "Link a client to a business",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "That client is answered by the business assistant; when it cannot answer, or they ask for a person, a ticket goes to the staff of the business.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_unassign",
     "command": "unassign client Acme from its business",
     "form": "unassign client <client name> from its business",
     "title": "Unlink a client from its business",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_unassign",
      "command": "unassign client Acme from its business",
      "form": "unassign client <client name> from its business",
      "title": "Unlink a client from its business",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Unlink a client from its business",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_staff_add",
     "command": "assign staff Hadi to business Solar Co",
     "form": "assign staff <person or people> to business <business name>",
     "title": "Assign a staff member to a business (they handle its tickets)",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      },
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_staff_add",
      "command": "assign staff Hadi to business Solar Co",
      "form": "assign staff <person or people> to business <business name>",
      "title": "Assign a staff member to a business (they handle its tickets)",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       },
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Only the staff assigned to a business are alerted about its tickets, and only they (or the owner) can take, answer and close them.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_staff_remove",
     "command": "unassign staff Hadi from business Solar Co",
     "form": "unassign staff <person or people> from business <business name>",
     "title": "Take a staff member off a business",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      },
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_staff_remove",
      "command": "unassign staff Hadi from business Solar Co",
      "form": "unassign staff <person or people> from business <business name>",
      "title": "Take a staff member off a business",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       },
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Take a staff member off a business",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_improve",
     "command": "improve docs of Solar Co: add a section about the 10 year panel warranty and a FAQ about cash discounts",
     "form": "improve docs of Solar Co: <value>",
     "title": "Ask the brain to improve a business: profile, docs, FAQ, notes (you confirm before anything is changed)",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      },
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [
      "improve business docs for Solar: we now install batteries too, from $900"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_improve",
      "command": "improve docs of Solar Co: add a section about the 10 year panel warranty and a FAQ about cash discounts",
      "form": "improve docs of Solar Co: <value>",
      "title": "Ask the brain to improve a business: profile, docs, FAQ, notes (you confirm before anything is changed)",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       },
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [
       "improve business docs for Solar: we now install batteries too, from $900"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "The brain writes a PROPOSAL from your request (it must not invent facts and lists what is missing). You see exactly what would be added or replaced and confirm; only then is anything saved, as a new version you can undo.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_missing",
     "command": "what is missing for business Solar Co?",
     "form": "what is missing for business <business name>",
     "title": "What a business is still missing (and fill it in with the AI)",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [
      "missing info of business grocery"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_missing",
      "command": "what is missing for business Solar Co?",
      "form": "what is missing for business <business name>",
      "title": "What a business is still missing (and fill it in with the AI)",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [
       "missing info of business grocery"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Lists what customers usually ask about that the business has no answer for yet. Reply with the facts (no trigger word needed) and the AI puts each where it belongs, or say *write the rest*.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_improve_site",
     "command": "improve business khadraglass with info from khadraglass.com",
     "form": "improve business <business name> with info from <value>",
     "title": "Fill or improve a business from its website (the AI reads the pages)",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      },
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [
      "improve khadraglass from https://khadraglass.com",
      "fill business khadraglass docs from khadraglass.com"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_improve_site",
      "command": "improve business khadraglass with info from khadraglass.com",
      "form": "improve business <business name> with info from <value>",
      "title": "Fill or improve a business from its website (the AI reads the pages)",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       },
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [
       "improve khadraglass from https://khadraglass.com",
       "fill business khadraglass docs from khadraglass.com"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "The AI (OpenAI) opens the pages of that website itself and proposes the profile, documents and FAQ from what is there; the help desk fetches nothing. You see the proposal and the pages it read before anything is saved.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_improve_start",
     "command": "improve grocery business docs",
     "form": "improve <business name> business docs",
     "title": "Start improving a business with the brain (it asks what to change)",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [
      "improve business grocery",
      "improve grocery business"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_improve_start",
      "command": "improve grocery business docs",
      "form": "improve <business name> business docs",
      "title": "Start improving a business with the brain (it asks what to change)",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [
       "improve business grocery",
       "improve grocery business"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "The brain asks what to change; your next message (no trigger word needed) is the request. Then it proposes, and you say yes, no, or what to change in it.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_default",
     "command": "set default business khadraglass",
     "form": "set default business <business name>",
     "title": "Make a business the default (it answers new chats that name no keyword)",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [
      "make khadraglass the default business"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_default",
      "command": "set default business khadraglass",
      "form": "set default business <business name>",
      "title": "Make a business the default (it answers new chats that name no keyword)",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [
       "make khadraglass the default business"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Every NEW person who writes privately and names no business keyword is answered by that business, and the chat is listened to. Chats set to never listen stay ignored; groups are not affected. One business at most.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_default_off",
     "command": "no default business",
     "form": null,
     "title": "No default business",
     "details": [],
     "also": [
      "remove the default business"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_default_off",
      "command": "no default business",
      "form": null,
      "title": "No default business",
      "details": [],
      "also": [
       "remove the default business"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "No default business",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_keyword",
     "command": "add keyword glass to business khadraglass",
     "form": "<add or remove> keyword <value> to business <business name>",
     "title": "Add or remove a lead keyword of a business",
     "details": [
      {
       "name": "op",
       "kind": "add or remove",
       "optional": false
      },
      {
       "name": "value",
       "kind": "value",
       "optional": false
      },
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [
      "add keywords mirrors, shower cabins to khadraglass",
      "remove keyword glass from business khadraglass"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_keyword",
      "command": "add keyword glass to business khadraglass",
      "form": "<add or remove> keyword <value> to business <business name>",
      "title": "Add or remove a lead keyword of a business",
      "details": [
       {
        "name": "op",
        "kind": "add or remove",
        "optional": false
       },
       {
        "name": "value",
        "kind": "value",
        "optional": false
       },
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [
       "add keywords mirrors, shower cabins to khadraglass",
       "remove keyword glass from business khadraglass"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "A new person whose message contains a keyword (as a whole word) reaches that business. Up to 20 per business; a keyword belongs to one business only.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_keywords",
     "command": "keywords of business khadraglass",
     "form": "keywords of business <business name>",
     "title": "Lead keywords of a business",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [
      "show the lead keywords of khadraglass"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_keywords",
      "command": "keywords of business khadraglass",
      "form": "keywords of business <business name>",
      "title": "Lead keywords of a business",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [
       "show the lead keywords of khadraglass"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Lead keywords of a business",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_keywords_all",
     "command": "list keywords",
     "form": null,
     "title": "Lead keywords of every business, and the default one",
     "details": [],
     "also": [
      "show all business keywords"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_keywords_all",
      "command": "list keywords",
      "form": null,
      "title": "Lead keywords of every business, and the default one",
      "details": [],
      "also": [
       "show all business keywords"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Lead keywords of every business, and the default one",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_history",
     "command": "business history Solar Co",
     "form": "business history <business name>",
     "title": "Earlier versions of a business",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_history",
      "command": "business history Solar Co",
      "form": "business history <business name>",
      "title": "Earlier versions of a business",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Who changed what and when: the profile, documents, FAQ and notes. Go back with *restore business NAME version N*.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_restore",
     "command": "restore business Solar Co version 1",
     "form": "restore business <business name> version <number>",
     "title": "Restore an earlier version of a business",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      },
      {
       "name": "num",
       "kind": "number",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_restore",
      "command": "restore business Solar Co version 1",
      "form": "restore business <business name> version <number>",
      "title": "Restore an earlier version of a business",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       },
       {
        "name": "num",
        "kind": "number",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Version 1 is how it was just before the last change; see *business history NAME*.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_switch",
     "command": "switch business Solar Co off",
     "form": "switch business <business name> <on or off>",
     "title": "Switch a business on or off",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      },
      {
       "name": "state",
       "kind": "on or off",
       "optional": false
      }
     ],
     "also": [
      "turn on business Solar Co"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_switch",
      "command": "switch business Solar Co off",
      "form": "switch business <business name> <on or off>",
      "title": "Switch a business on or off",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       },
       {
        "name": "state",
        "kind": "on or off",
        "optional": false
       }
      ],
      "also": [
       "turn on business Solar Co"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Switch a business on or off",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_doc_remove",
     "command": "remove doc Old prices from business Solar Co",
     "form": "remove doc <value> from business <business name>",
     "title": "Remove a document section of a business",
     "details": [
      {
       "name": "value",
       "kind": "value",
       "optional": false
      },
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_doc_remove",
      "command": "remove doc Old prices from business Solar Co",
      "form": "remove doc <value> from business <business name>",
      "title": "Remove a document section of a business",
      "details": [
       {
        "name": "value",
        "kind": "value",
        "optional": false
       },
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Remove a document section of a business",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_media_add",
     "command": "add image to business Solar Co: 450W panel",
     "form": "add image to business Solar Co: <value>",
     "title": "Add a photo or file to a business (its assistant can send it to customers)",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      },
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [
      "add file to business Solar Co: Price list 2026; tags: prices, catalogue"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_media_add",
      "command": "add image to business Solar Co: 450W panel",
      "form": "add image to business Solar Co: <value>",
      "title": "Add a photo or file to a business (its assistant can send it to customers)",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       },
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [
       "add file to business Solar Co: Price list 2026; tags: prices, catalogue"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Send the photo or file in this chat first, then say this within 10 minutes. \"; tags: a, b\" adds words it is also found by. The assistant sends it when a customer asks for it, by this name only.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_media_list",
     "command": "photos of business Solar Co",
     "form": "photos of business <business name>",
     "title": "Photos and files of a business",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [
      "files of Solar Co"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_media_list",
      "command": "photos of business Solar Co",
      "form": "photos of business <business name>",
      "title": "Photos and files of a business",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [
       "files of Solar Co"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Photos and files of a business",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_media_remove",
     "command": "remove photo 450W panel from business Solar Co",
     "form": "remove photo <value> from business <business name>",
     "title": "Remove a photo or file from a business",
     "details": [
      {
       "name": "value",
       "kind": "value",
       "optional": false
      },
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_media_remove",
      "command": "remove photo 450W panel from business Solar Co",
      "form": "remove photo <value> from business <business name>",
      "title": "Remove a photo or file from a business",
      "details": [
       {
        "name": "value",
        "kind": "value",
        "optional": false
       },
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Remove a photo or file from a business",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_client_files",
     "command": "allow clients of business Solar Co to send files",
     "form": "allow clients of business <business name> to send files",
     "title": "Let the clients of a business send files (photos, voice notes, documents) or not",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [
      "stop clients of Solar Co from sending files"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_client_files",
      "command": "allow clients of business Solar Co to send files",
      "form": "allow clients of business <business name> to send files",
      "title": "Let the clients of a business send files (photos, voice notes, documents) or not",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [
       "stop clients of Solar Co from sending files"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Its clients and new leads: their photos, voice notes and documents reach the staff of the business. The AI does not look at them.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    },
    {
     "id": "business_context",
     "command": "business docs of Solar Co",
     "form": "business docs of <business name>",
     "title": "Show what the assistant of a business is told",
     "details": [
      {
       "name": "bname",
       "kind": "business name",
       "optional": false
      }
     ],
     "also": [
      "what does the assistant know about Solar Co?"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "business_context",
      "command": "business docs of Solar Co",
      "form": "business docs of <business name>",
      "title": "Show what the assistant of a business is told",
      "details": [
       {
        "name": "bname",
        "kind": "business name",
        "optional": false
       }
      ],
      "also": [
       "what does the assistant know about Solar Co?"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Everything sent first in every customer conversation, its size, and anything left out because it is too long.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "add business Solar Co",
       "add business BaladMart: a big supermarket with fresh food, groceries, household goods and electronics, delivery in Beirut",
       "remove business Solar Co",
       "list businesses"
      ]
     }
    }
   ]
  },
  {
   "id": "cpanel",
   "title": "cPanel",
   "lead": "Mailboxes, email passwords, domains, subdomains and DNS on the hosting server.",
   "tips": [],
   "commands": [
    {
     "id": "email_check",
     "command": "my email is not working",
     "form": null,
     "title": "My email is not working (check it)",
     "details": [
      {
       "name": "email",
       "kind": "email address",
       "optional": true
      },
      {
       "name": "domain",
       "kind": "domain",
       "optional": true
      }
     ],
     "also": [
      "I can't log in to my email info@acme.com",
      "not receiving emails"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "email_check",
      "command": "my email is not working",
      "form": null,
      "title": "My email is not working (check it)",
      "details": [
       {
        "name": "email",
        "kind": "email address",
        "optional": true
       },
       {
        "name": "domain",
        "kind": "domain",
        "optional": true
       }
      ],
      "also": [
       "I can't log in to my email info@acme.com",
       "not receiving emails"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "My email is not working (check it)",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List email accounts",
       "List DNS records"
      ],
      "gates": [
       "runs without confirmation (it only reads)",
       "uses one of the client's weekly tickets"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com",
       "create subdomain app.acme.com"
      ]
     }
    },
    {
     "id": "email_password_reset",
     "command": "reset password of info@acme.com",
     "form": "reset password of <email address>",
     "title": "Reset an email password",
     "details": [
      {
       "name": "email",
       "kind": "email address",
       "optional": true
      }
     ],
     "also": [
      "change my email password",
      "I forgot my email password"
     ],
     "readOnly": false,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "email_password_reset",
      "command": "reset password of info@acme.com",
      "form": "reset password of <email address>",
      "title": "Reset an email password",
      "details": [
       {
        "name": "email",
        "kind": "email address",
        "optional": true
       }
      ],
      "also": [
       "change my email password",
       "I forgot my email password"
      ],
      "readOnly": false,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "If the request came from a group, the action runs only when the requester DMs the router, so no password is ever held or posted in the group.",
      "uses": "a change",
      "runsThrough": [
       "Reset an email password"
      ],
      "gates": [
       "shown for a yes before it runs",
       "uses one of the client's weekly tickets"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "send password",
       "create email info@acme.com",
       "create subdomain app.acme.com"
      ]
     }
    },
    {
     "id": "send_password",
     "command": "send password",
     "form": null,
     "title": "Send me the password (private chat)",
     "details": [],
     "also": [
      "send me the password"
     ],
     "readOnly": false,
     "who": [
      "client"
     ],
     "explanation": {
      "id": "send_password",
      "command": "send password",
      "form": null,
      "title": "Send me the password (private chat)",
      "details": [],
      "also": [
       "send me the password"
      ],
      "readOnly": false,
      "who": [
       "client"
      ],
      "whatItDoes": "Runs a password request that was made from a group, now that the person is in a private chat. Nothing is stored in between.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "create email info@acme.com",
       "create subdomain app.acme.com"
      ]
     }
    },
    {
     "id": "email_create",
     "command": "create email info@acme.com",
     "form": "create email <email address>",
     "title": "Create an email account",
     "details": [
      {
       "name": "email",
       "kind": "email address",
       "optional": true
      }
     ],
     "also": [
      "I need a new email",
      "add mailbox sales@acme.com"
     ],
     "readOnly": false,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "email_create",
      "command": "create email info@acme.com",
      "form": "create email <email address>",
      "title": "Create an email account",
      "details": [
       {
        "name": "email",
        "kind": "email address",
        "optional": true
       }
      ],
      "also": [
       "I need a new email",
       "add mailbox sales@acme.com"
      ],
      "readOnly": false,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Create an email account",
      "uses": "a small change",
      "runsThrough": [
       "Create an email account"
      ],
      "gates": [
       "shown for a yes before it runs",
       "uses one of the client's weekly tickets"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create subdomain app.acme.com"
      ]
     }
    },
    {
     "id": "subdomain_create",
     "command": "create subdomain app.acme.com",
     "form": "create subdomain <full subdomain>",
     "title": "Create a subdomain",
     "details": [
      {
       "name": "fqdn",
       "kind": "full subdomain",
       "optional": true
      }
     ],
     "also": [
      "I need a new subdomain"
     ],
     "readOnly": false,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "subdomain_create",
      "command": "create subdomain app.acme.com",
      "form": "create subdomain <full subdomain>",
      "title": "Create a subdomain",
      "details": [
       {
        "name": "fqdn",
        "kind": "full subdomain",
        "optional": true
       }
      ],
      "also": [
       "I need a new subdomain"
      ],
      "readOnly": false,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Create a subdomain",
      "uses": "a small change",
      "runsThrough": [
       "Create a subdomain"
      ],
      "gates": [
       "shown for a yes before it runs",
       "uses one of the client's weekly tickets"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com"
      ]
     }
    },
    {
     "id": "dns_view",
     "command": "show my dns records",
     "form": null,
     "title": "Show DNS records",
     "details": [
      {
       "name": "domain",
       "kind": "domain",
       "optional": true
      }
     ],
     "also": [
      "list dns for acme.com"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "dns_view",
      "command": "show my dns records",
      "form": null,
      "title": "Show DNS records",
      "details": [
       {
        "name": "domain",
        "kind": "domain",
        "optional": true
       }
      ],
      "also": [
       "list dns for acme.com"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Show DNS records",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List DNS records"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com"
      ]
     }
    },
    {
     "id": "domains_list",
     "command": "list my domains",
     "form": null,
     "title": "List my domains",
     "details": [],
     "also": [
      "which domains do I have"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "domains_list",
      "command": "list my domains",
      "form": null,
      "title": "List my domains",
      "details": [],
      "also": [
       "which domains do I have"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "List my domains",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List domains"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com"
      ]
     }
    },
    {
     "id": "mailbox_list",
     "command": "list my mailboxes",
     "form": null,
     "title": "List my email accounts",
     "details": [
      {
       "name": "domain",
       "kind": "domain",
       "optional": true
      }
     ],
     "also": [
      "show emails for acme.com"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mailbox_list",
      "command": "list my mailboxes",
      "form": null,
      "title": "List my email accounts",
      "details": [
       {
        "name": "domain",
        "kind": "domain",
        "optional": true
       }
      ],
      "also": [
       "show emails for acme.com"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "List my email accounts",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List email accounts"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com"
      ]
     }
    },
    {
     "id": "disk_usage",
     "command": "disk usage",
     "form": null,
     "title": "Disk / hosting usage",
     "details": [],
     "also": [
      "how much space am I using"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "disk_usage",
      "command": "disk usage",
      "form": null,
      "title": "Disk / hosting usage",
      "details": [],
      "also": [
       "how much space am I using"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "For clients only when the client owns a whole cPanel account (owns.cpanel_dedicated). On a shared account the numbers include other clients, so it stays off.",
      "uses": "only reads (safe)",
      "runsThrough": [
       "cPanel usage"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com"
      ]
     }
    },
    {
     "id": "dns_add",
     "command": "add dns acme.com www A 203.0.113.10",
     "form": "add dns <domain> <name> <record type> <value>",
     "title": "Add a DNS record",
     "details": [
      {
       "name": "domain",
       "kind": "domain",
       "optional": false
      },
      {
       "name": "name",
       "kind": "name",
       "optional": false
      },
      {
       "name": "dnstype",
       "kind": "record type",
       "optional": false
      },
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [
      "add a CNAME record for shop on acme.com pointing to shops.example.net"
     ],
     "readOnly": false,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "dns_add",
      "command": "add dns acme.com www A 203.0.113.10",
      "form": "add dns <domain> <name> <record type> <value>",
      "title": "Add a DNS record",
      "details": [
       {
        "name": "domain",
        "kind": "domain",
        "optional": false
       },
       {
        "name": "name",
        "kind": "name",
        "optional": false
       },
       {
        "name": "dnstype",
        "kind": "record type",
        "optional": false
       },
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [
       "add a CNAME record for shop on acme.com pointing to shops.example.net"
      ],
      "readOnly": false,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "OFF for clients unless the owner enables it for that client. When on, it still goes to staff for approval (medium risk).",
      "uses": "a change",
      "runsThrough": [
       "Add a DNS record"
      ],
      "gates": [
       "a staff member must approve it",
       "uses one of the client's weekly tickets"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com"
      ]
     }
    },
    {
     "id": "email_delete",
     "command": "delete mailbox old@acme.com",
     "form": "delete mailbox <email address>",
     "title": "Delete an email account",
     "details": [
      {
       "name": "email",
       "kind": "email address",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "email_delete",
      "command": "delete mailbox old@acme.com",
      "form": "delete mailbox <email address>",
      "title": "Delete an email account",
      "details": [
       {
        "name": "email",
        "kind": "email address",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Switched off by default (also in Permissions). When on, only the owner can confirm. Never available to clients.",
      "uses": "a big or destructive change",
      "runsThrough": [
       "Delete an email account"
      ],
      "gates": [
       "shown for a yes before it runs",
       "uses one of the client's weekly tickets"
      ],
      "errors": [
       "the cPanel account must exist and the mailbox/domain must belong to the client"
      ],
      "related": [
       "my email is not working",
       "reset password of info@acme.com",
       "send password",
       "create email info@acme.com"
      ]
     }
    }
   ]
  },
  {
   "id": "email",
   "title": "Email",
   "lead": "Mailboxes forwarded to the owner and staff on WhatsApp or Telegram; replies and new emails written by you or by the AI, always confirmed.",
   "tips": [
    {
     "what": "Answer an email: the person's exact words, or \"with ai:\" and what the AI should write (always shown first, sent on yes):",
     "commands": [
      "reply to email M7K2Q: Thank you, we received it",
      "reply to email M7K2Q with ai: thank them and say we deliver on Monday",
      "reply all to M7K2Q: noted"
     ]
    },
    {
     "what": "Answer the newest email forwarded to this chat (\"ai: …\" without quoting it answers the newest one of the last 12 hours, and says which):",
     "commands": [
      "reply to this email with a short thank-you",
      "reply to this email: Received, thank you",
      "ai: thank them and say we deliver on Monday"
     ]
    },
    {
     "what": "A new email (subject after \"subject:\" and \" | \"; otherwise the AI suggests one):",
     "commands": [
      "email john@example.com: subject: Visit | We will visit on Monday at 10",
      "send email to john@example.com and tell them thanks"
     ]
    },
    {
     "what": "Forward, mark read or unread, see an email whole:",
     "commands": [
      "forward email M7K2Q to accounts@example.com: please handle this",
      "mark email M7K2Q as read",
      "show email M7K2Q"
     ]
    },
    {
     "what": "Lists and status:",
     "commands": [
      "recent emails",
      "unanswered emails",
      "email status",
      "check mailboxes"
     ]
    },
    {
     "what": "Never fetch some emails again: a sender, its name on any domain (cwp@*), a whole domain, or a subject (any sender). Replying \"ignore\" to a forwarded email lists these choices; the number saves it:",
     "commands": [
      "ignore emails from news@shop.example",
      "ignore emails from cwp@*",
      "ignore emails from @spam.example",
      "ignore emails with subject \"Automatic Backup created\"",
      "stop ignoring cwp@*",
      "stop ignoring subject \"Automatic Backup created\"",
      "ignored senders"
     ]
    }
   ],
   "commands": [
    {
     "id": "mail_reply",
     "command": "reply to email M7K2Q: thank you, we received it",
     "form": "reply to email M7K2Q: <text>",
     "title": "Answer an email (your words, or the AI writes it)",
     "details": [
      {
       "name": "mcode",
       "kind": "email code (like M7K2Q)",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": true
      },
      {
       "name": "ai",
       "kind": "with ai (the AI writes it)",
       "optional": true
      },
      {
       "name": "all",
       "kind": "all (everyone the email went to)",
       "optional": true
      }
     ],
     "also": [
      "reply to M7K2Q with ai: tell him we deliver on Monday",
      "reply all to M7K2Q: noted, thanks"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_reply",
      "command": "reply to email M7K2Q: thank you, we received it",
      "form": "reply to email M7K2Q: <text>",
      "title": "Answer an email (your words, or the AI writes it)",
      "details": [
       {
        "name": "mcode",
        "kind": "email code (like M7K2Q)",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": true
       },
       {
        "name": "ai",
        "kind": "with ai (the AI writes it)",
        "optional": true
       },
       {
        "name": "all",
        "kind": "all (everyone the email went to)",
        "optional": true
       }
      ],
      "also": [
       "reply to M7K2Q with ai: tell him we deliver on Monday",
       "reply all to M7K2Q: noted, thanks"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Easiest: reply (quote) the forwarded email in WhatsApp or Telegram. Your words are sent as written; start with \"ai\" (or say \"with ai\") to have the AI write it from what you say. \"all\" also answers everyone the email went to. The draft is shown first and waits for a yes; any other answer changes it (\"shorter\", \"text: …\", \"subject: …\", \"cc: …\").",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "ai: thank them, we deliver on Monday",
       "reply to this email with a success message and make it professional",
       "email john@example.com: the meeting moved to 3 pm",
       "mark email M7K2Q as read"
      ]
     }
    },
    {
     "id": "mail_ai_last",
     "command": "ai: thank them, we deliver on Monday",
     "form": "ai: <what the AI should write>",
     "title": "Answer the newest email of this chat with the AI (\"ai: …\", without quoting it)",
     "details": [
      {
       "name": "instr",
       "kind": "what the AI should write",
       "optional": false
      }
     ],
     "also": [
      "ai tell them a short bedtime story",
      "ai: write a small story for him"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_ai_last",
      "command": "ai: thank them, we deliver on Monday",
      "form": "ai: <what the AI should write>",
      "title": "Answer the newest email of this chat with the AI (\"ai: …\", without quoting it)",
      "details": [
       {
        "name": "instr",
        "kind": "what the AI should write",
        "optional": false
       }
      ],
      "also": [
       "ai tell them a short bedtime story",
       "ai: write a small story for him"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Answers the newest email this chat received in the last 12 hours (it says which one, from whom and its subject) with a reply the AI writes from your words; you see it before it is sent. For an older email, reply to it (swipe it) or use its code.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "reply to this email with a success message and make it professional",
       "email john@example.com: the meeting moved to 3 pm",
       "mark email M7K2Q as read"
      ]
     }
    },
    {
     "id": "mail_reply_last",
     "command": "reply to this email with a success message and make it professional",
     "form": "reply to this email <what the AI should write>",
     "title": "Answer the email this chat just received",
     "details": [
      {
       "name": "text",
       "kind": "text",
       "optional": true
      },
      {
       "name": "instr",
       "kind": "what the AI should write",
       "optional": true
      },
      {
       "name": "all",
       "kind": "all (everyone the email went to)",
       "optional": true
      }
     ],
     "also": [
      "reply to this email: Thank you, received",
      "answer the last email saying we will call tomorrow"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_reply_last",
      "command": "reply to this email with a success message and make it professional",
      "form": "reply to this email <what the AI should write>",
      "title": "Answer the email this chat just received",
      "details": [
       {
        "name": "text",
        "kind": "text",
        "optional": true
       },
       {
        "name": "instr",
        "kind": "what the AI should write",
        "optional": true
       },
       {
        "name": "all",
        "kind": "all (everyone the email went to)",
        "optional": true
       }
      ],
      "also": [
       "reply to this email: Thank you, received",
       "answer the last email saying we will call tomorrow"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "The newest email forwarded to this chat (last 3 days). \"with …\", \"saying …\": the AI writes the answer from it; after a colon, your exact words. Shown first; sent on yes.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "ai: thank them, we deliver on Monday",
       "email john@example.com: the meeting moved to 3 pm",
       "mark email M7K2Q as read"
      ]
     }
    },
    {
     "id": "mail_send",
     "command": "email john@example.com: the meeting moved to 3 pm",
     "form": "email john@example.com: <text>",
     "title": "Send a new email (your words, or the AI writes it)",
     "details": [
      {
       "name": "rcpt",
       "kind": "email address(es)",
       "optional": false
      },
      {
       "name": "mb",
       "kind": "mailbox",
       "optional": true
      },
      {
       "name": "ai",
       "kind": "with ai (the AI writes it)",
       "optional": true
      },
      {
       "name": "text",
       "kind": "text",
       "optional": true
      },
      {
       "name": "instr",
       "kind": "what the AI should write",
       "optional": true
      }
     ],
     "also": [
      "email it to john@example.com: here is the signed contract",
      "send email to john@example.com and tell them thanks"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_send",
      "command": "email john@example.com: the meeting moved to 3 pm",
      "form": "email john@example.com: <text>",
      "title": "Send a new email (your words, or the AI writes it)",
      "details": [
       {
        "name": "rcpt",
        "kind": "email address(es)",
        "optional": false
       },
       {
        "name": "mb",
        "kind": "mailbox",
        "optional": true
       },
       {
        "name": "ai",
        "kind": "with ai (the AI writes it)",
        "optional": true
       },
       {
        "name": "text",
        "kind": "text",
        "optional": true
       },
       {
        "name": "instr",
        "kind": "what the AI should write",
        "optional": true
       }
      ],
      "also": [
       "email it to john@example.com: here is the signed contract",
       "send email to john@example.com and tell them thanks"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "From your mailbox (say \"from NAME\" when you have several). Start the text with \"subject: …\" then a new line (or \" | \") to set the subject; otherwise the AI suggests one. \"with ai\": the AI writes the subject and the text from what you say. Shown first; sent on yes.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "ai: thank them, we deliver on Monday",
       "reply to this email with a success message and make it professional",
       "mark email M7K2Q as read"
      ]
     }
    },
    {
     "id": "mail_mark",
     "command": "mark email M7K2Q as read",
     "form": "mark email <email code (like M7K2Q)> as <read or unread>",
     "title": "Mark an email read or unread in the mailbox",
     "details": [
      {
       "name": "mcode",
       "kind": "email code (like M7K2Q)",
       "optional": false
      },
      {
       "name": "mstate",
       "kind": "read or unread",
       "optional": false
      }
     ],
     "also": [
      "mark M7K2Q unread"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_mark",
      "command": "mark email M7K2Q as read",
      "form": "mark email <email code (like M7K2Q)> as <read or unread>",
      "title": "Mark an email read or unread in the mailbox",
      "details": [
       {
        "name": "mcode",
        "kind": "email code (like M7K2Q)",
        "optional": false
       },
       {
        "name": "mstate",
        "kind": "read or unread",
        "optional": false
       }
      ],
      "also": [
       "mark M7K2Q unread"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "The same as a 👍 on the forwarded email (taking the 👍 away: unread), or replying \"read\" / \"unread\" to it. Changes only the read mark on the server.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "ai: thank them, we deliver on Monday",
       "reply to this email with a success message and make it professional",
       "email john@example.com: the meeting moved to 3 pm"
      ]
     }
    },
    {
     "id": "mail_forward",
     "command": "forward email M7K2Q to accounts@example.com",
     "form": "forward email <email code (like M7K2Q)> to <email address to forward to>",
     "title": "Forward an email (with its attachments) to another address",
     "details": [
      {
       "name": "mcode",
       "kind": "email code (like M7K2Q)",
       "optional": false
      },
      {
       "name": "fwd",
       "kind": "email address to forward to",
       "optional": false
      },
      {
       "name": "text",
       "kind": "text",
       "optional": true
      }
     ],
     "also": [
      "forward M7K2Q to hadi@example.com: please handle this"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_forward",
      "command": "forward email M7K2Q to accounts@example.com",
      "form": "forward email <email code (like M7K2Q)> to <email address to forward to>",
      "title": "Forward an email (with its attachments) to another address",
      "details": [
       {
        "name": "mcode",
        "kind": "email code (like M7K2Q)",
        "optional": false
       },
       {
        "name": "fwd",
        "kind": "email address to forward to",
        "optional": false
       },
       {
        "name": "text",
        "kind": "text",
        "optional": true
       }
      ],
      "also": [
       "forward M7K2Q to hadi@example.com: please handle this"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Or reply \"forward to name@example.com: your note\" to the forwarded email. The whole email (fetched again from the mailbox) and its attachments, from the same mailbox. Shown first; sent on yes.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "ai: thank them, we deliver on Monday",
       "reply to this email with a success message and make it professional",
       "email john@example.com: the meeting moved to 3 pm"
      ]
     }
    },
    {
     "id": "mail_ignore",
     "command": "ignore emails from news@shop.example",
     "form": "ignore emails from <person or people>",
     "title": "Ignore every future email from a sender (or a domain)",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      },
      {
       "name": "mb",
       "kind": "mailbox",
       "optional": true
      }
     ],
     "also": [
      "ignore all emails from spam.example",
      "ignore sender news@shop.example"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_ignore",
      "command": "ignore emails from news@shop.example",
      "form": "ignore emails from <person or people>",
      "title": "Ignore every future email from a sender (or a domain)",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       },
       {
        "name": "mb",
        "kind": "mailbox",
        "optional": true
       }
      ],
      "also": [
       "ignore all emails from spam.example",
       "ignore sender news@shop.example"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Easiest: reply \"ignore\" to the forwarded email and choose: this sender, its name on any domain (cwp@*: every server that sends as \"cwp\"), its whole domain, or its kind of subject; the number saves it. \"name@*\" ignores that name on every domain; \"@x.com\" a domain and its subdomains. Their future emails are not downloaded or forwarded and stay unread in the mailbox. Shown first; saved on yes. The list is also under Plugins → Email → the mailbox → Edit.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "ai: thank them, we deliver on Monday",
       "reply to this email with a success message and make it professional",
       "email john@example.com: the meeting moved to 3 pm"
      ]
     }
    },
    {
     "id": "mail_ignore_subject",
     "command": "ignore emails with subject \"Automatic Backup created\"",
     "form": "ignore emails with subject <text>",
     "title": "Ignore every future email whose subject contains some words (any sender)",
     "details": [
      {
       "name": "text",
       "kind": "text",
       "optional": false
      },
      {
       "name": "mb",
       "kind": "mailbox",
       "optional": true
      }
     ],
     "also": [
      "ignore emails whose subject contains weekly newsletter",
      "ignore subject Automatic Backup created"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_ignore_subject",
      "command": "ignore emails with subject \"Automatic Backup created\"",
      "form": "ignore emails with subject <text>",
      "title": "Ignore every future email whose subject contains some words (any sender)",
      "details": [
       {
        "name": "text",
        "kind": "text",
        "optional": false
       },
       {
        "name": "mb",
        "kind": "mailbox",
        "optional": true
       }
      ],
      "also": [
       "ignore emails whose subject contains weekly newsletter",
       "ignore subject Automatic Backup created"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Any sender: an email whose subject contains these words (letter case does not matter, at least 4 letters) is not downloaded or forwarded and stays unread in the mailbox. Good for automatic notices from many servers (backups, reports). Shown first; saved on yes. Undo: stop ignoring subject …",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "ai: thank them, we deliver on Monday",
       "reply to this email with a success message and make it professional",
       "email john@example.com: the meeting moved to 3 pm"
      ]
     }
    },
    {
     "id": "mail_unignore_subject",
     "command": "stop ignoring subject \"Automatic Backup created\"",
     "form": "stop ignoring subject <text>",
     "title": "Stop ignoring a subject",
     "details": [
      {
       "name": "text",
       "kind": "text",
       "optional": false
      }
     ],
     "also": [
      "unignore subject weekly newsletter"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_unignore_subject",
      "command": "stop ignoring subject \"Automatic Backup created\"",
      "form": "stop ignoring subject <text>",
      "title": "Stop ignoring a subject",
      "details": [
       {
        "name": "text",
        "kind": "text",
        "optional": false
       }
      ],
      "also": [
       "unignore subject weekly newsletter"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Stop ignoring a subject",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "ai: thank them, we deliver on Monday",
       "reply to this email with a success message and make it professional",
       "email john@example.com: the meeting moved to 3 pm"
      ]
     }
    },
    {
     "id": "mail_unignore",
     "command": "stop ignoring news@shop.example",
     "form": "stop ignoring <person or people>",
     "title": "Stop ignoring a sender",
     "details": [
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      }
     ],
     "also": [
      "unblock @spam.example"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_unignore",
      "command": "stop ignoring news@shop.example",
      "form": "stop ignoring <person or people>",
      "title": "Stop ignoring a sender",
      "details": [
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       }
      ],
      "also": [
       "unblock @spam.example"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Stop ignoring a sender",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "ai: thank them, we deliver on Monday",
       "reply to this email with a success message and make it professional",
       "email john@example.com: the meeting moved to 3 pm"
      ]
     }
    },
    {
     "id": "mail_ignored",
     "command": "ignored senders",
     "form": null,
     "title": "Ignored senders of my mailboxes",
     "details": [],
     "also": [
      "show blocked senders"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_ignored",
      "command": "ignored senders",
      "form": null,
      "title": "Ignored senders of my mailboxes",
      "details": [],
      "also": [
       "show blocked senders"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Ignored senders of my mailboxes",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "ai: thank them, we deliver on Monday",
       "reply to this email with a success message and make it professional",
       "email john@example.com: the meeting moved to 3 pm"
      ]
     }
    },
    {
     "id": "mail_show",
     "command": "show email M7K2Q",
     "form": "show email <email code (like M7K2Q)>",
     "title": "Show an email in full, with its attachments",
     "details": [
      {
       "name": "mcode",
       "kind": "email code (like M7K2Q)",
       "optional": false
      }
     ],
     "also": [
      "open email M7K2Q"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_show",
      "command": "show email M7K2Q",
      "form": "show email <email code (like M7K2Q)>",
      "title": "Show an email in full, with its attachments",
      "details": [
       {
        "name": "mcode",
        "kind": "email code (like M7K2Q)",
        "optional": false
       }
      ],
      "also": [
       "open email M7K2Q"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Fetched again from the mailbox: the whole text, the earlier messages of the thread and the attachments.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "ai: thank them, we deliver on Monday",
       "reply to this email with a success message and make it professional",
       "email john@example.com: the meeting moved to 3 pm"
      ]
     }
    },
    {
     "id": "mail_recent",
     "command": "recent emails",
     "form": null,
     "title": "Recent emails of my mailboxes (or only the unanswered ones)",
     "details": [
      {
       "name": "open",
       "kind": "unanswered",
       "optional": true
      }
     ],
     "also": [
      "any new emails?",
      "inbox"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_recent",
      "command": "recent emails",
      "form": null,
      "title": "Recent emails of my mailboxes (or only the unanswered ones)",
      "details": [
       {
        "name": "open",
        "kind": "unanswered",
        "optional": true
       }
      ],
      "also": [
       "any new emails?",
       "inbox"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "The last 10 emails of the mailboxes you get, with their codes and who answered.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "ai: thank them, we deliver on Monday",
       "reply to this email with a success message and make it professional",
       "email john@example.com: the meeting moved to 3 pm"
      ]
     }
    },
    {
     "id": "mail_check",
     "command": "check mailboxes",
     "form": null,
     "title": "Check the mailboxes for new email now",
     "details": [],
     "also": [
      "check for new emails",
      "fetch emails now"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_check",
      "command": "check mailboxes",
      "form": null,
      "title": "Check the mailboxes for new email now",
      "details": [],
      "also": [
       "check for new emails",
       "fetch emails now"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Normally not needed: new email arrives by itself at once (IDLE) and every few minutes. Also retries a mailbox whose login was refused.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "ai: thank them, we deliver on Monday",
       "reply to this email with a success message and make it professional",
       "email john@example.com: the meeting moved to 3 pm"
      ]
     }
    },
    {
     "id": "mail_boxes",
     "command": "email status",
     "form": null,
     "title": "Mailboxes: connected or not, and who gets each",
     "details": [],
     "also": [
      "connected mailboxes",
      "who gets which mailbox"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "mail_boxes",
      "command": "email status",
      "form": null,
      "title": "Mailboxes: connected or not, and who gets each",
      "details": [],
      "also": [
       "connected mailboxes",
       "who gets which mailbox"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "For staff: only the mailboxes they get.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "ai: thank them, we deliver on Monday",
       "reply to this email with a success message and make it professional",
       "email john@example.com: the meeting moved to 3 pm"
      ]
     }
    },
    {
     "id": "mail_assign",
     "command": "assign mailbox sales to Hadi, group Ops",
     "form": "assign mailbox <mailbox> to <person or people>",
     "title": "Choose who gets a mailbox",
     "details": [
      {
       "name": "mb",
       "kind": "mailbox",
       "optional": false
      },
      {
       "name": "who",
       "kind": "person or people",
       "optional": false
      }
     ],
     "also": [
      "give the mailbox support to owner, staff"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "mail_assign",
      "command": "assign mailbox sales to Hadi, group Ops",
      "form": "assign mailbox <mailbox> to <person or people>",
      "title": "Choose who gets a mailbox",
      "details": [
       {
        "name": "mb",
        "kind": "mailbox",
        "optional": false
       },
       {
        "name": "who",
        "kind": "person or people",
        "optional": false
       }
      ],
      "also": [
       "give the mailbox support to owner, staff"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "Replaces \"Who gets it\": owner, staff names or numbers, \"staff\" (everyone), \"group NAME\" (an admin group). Clients never get email. Shown first; saved on yes.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reply to email M7K2Q: thank you, we received it",
       "ai: thank them, we deliver on Monday",
       "reply to this email with a success message and make it professional",
       "email john@example.com: the meeting moved to 3 pm"
      ]
     }
    }
   ]
  },
  {
   "id": "gometer",
   "title": "Go Meter",
   "lead": "Scanner monitoring: Go Meter systems, their keys, recipients and alerts.",
   "tips": [],
   "commands": [
    {
     "id": "gometer_status",
     "command": "gometer status",
     "form": null,
     "title": "Go Meter status (each system: last reading, silence, recipients)",
     "details": [
      {
       "name": "name",
       "kind": "name",
       "optional": true
      }
     ],
     "also": [
      "go meter status tardeba"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "gometer_status",
      "command": "gometer status",
      "form": null,
      "title": "Go Meter status (each system: last reading, silence, recipients)",
      "details": [
       {
        "name": "name",
        "kind": "name",
        "optional": true
       }
      ],
      "also": [
       "go meter status tardeba"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Go Meter status (each system: last reading, silence, recipients)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "gometer events",
       "gometer recipients",
       "gometer log",
       "gometer pause"
      ]
     }
    },
    {
     "id": "gometer_events",
     "command": "gometer events",
     "form": null,
     "title": "Go Meter: the last readings, silences and alerts of a system",
     "details": [
      {
       "name": "name",
       "kind": "name",
       "optional": true
      }
     ],
     "also": [
      "gometer events tardeba"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "gometer_events",
      "command": "gometer events",
      "form": null,
      "title": "Go Meter: the last readings, silences and alerts of a system",
      "details": [
       {
        "name": "name",
        "kind": "name",
        "optional": true
       }
      ],
      "also": [
       "gometer events tardeba"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Go Meter: the last readings, silences and alerts of a system",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "gometer status",
       "gometer recipients",
       "gometer log",
       "gometer pause"
      ]
     }
    },
    {
     "id": "gometer_recipients",
     "command": "gometer recipients",
     "form": null,
     "title": "Go Meter: who gets the alerts of a system",
     "details": [
      {
       "name": "name",
       "kind": "name",
       "optional": true
      }
     ],
     "also": [
      "who gets gometer alerts for tardeba"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "gometer_recipients",
      "command": "gometer recipients",
      "form": null,
      "title": "Go Meter: who gets the alerts of a system",
      "details": [
       {
        "name": "name",
        "kind": "name",
        "optional": true
       }
      ],
      "also": [
       "who gets gometer alerts for tardeba"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Recipients and their alert levels are chosen in the panel: Plugins → Go Meter → Recipients.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "gometer status",
       "gometer events",
       "gometer log",
       "gometer pause"
      ]
     }
    },
    {
     "id": "gometer_log",
     "command": "gometer log",
     "form": null,
     "title": "Go Meter: send the log of a day (as a file, here)",
     "details": [
      {
       "name": "value",
       "kind": "value",
       "optional": true
      }
     ],
     "also": [
      "gometer log 2026-10-17",
      "send me the gometer log for yesterday"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "gometer_log",
      "command": "gometer log",
      "form": null,
      "title": "Go Meter: send the log of a day (as a file, here)",
      "details": [
       {
        "name": "value",
        "kind": "value",
        "optional": true
       }
      ],
      "also": [
       "gometer log 2026-10-17",
       "send me the gometer log for yesterday"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "The day's audit trail (events, decisions, sends; no keys) as a file in this chat. Kept for \"Days to keep the Go Meter log\".",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "gometer status",
       "gometer events",
       "gometer recipients",
       "gometer pause"
      ]
     }
    },
    {
     "id": "gometer_pause",
     "command": "gometer pause",
     "form": null,
     "title": "Go Meter: pause the alerts of a system (readings and the watchdog go on)",
     "details": [
      {
       "name": "name",
       "kind": "name",
       "optional": true
      }
     ],
     "also": [
      "gometer alerts off tardeba"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "gometer_pause",
      "command": "gometer pause",
      "form": null,
      "title": "Go Meter: pause the alerts of a system (readings and the watchdog go on)",
      "details": [
       {
        "name": "name",
        "kind": "name",
        "optional": true
       }
      ],
      "also": [
       "gometer alerts off tardeba"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Go Meter: pause the alerts of a system (readings and the watchdog go on)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "gometer status",
       "gometer events",
       "gometer recipients",
       "gometer log"
      ]
     }
    },
    {
     "id": "gometer_resume",
     "command": "gometer resume",
     "form": null,
     "title": "Go Meter: alerts on again",
     "details": [
      {
       "name": "name",
       "kind": "name",
       "optional": true
      }
     ],
     "also": [
      "gometer alerts on tardeba"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "gometer_resume",
      "command": "gometer resume",
      "form": null,
      "title": "Go Meter: alerts on again",
      "details": [
       {
        "name": "name",
        "kind": "name",
        "optional": true
       }
      ],
      "also": [
       "gometer alerts on tardeba"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Go Meter: alerts on again",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "gometer status",
       "gometer events",
       "gometer recipients",
       "gometer log"
      ]
     }
    },
    {
     "id": "gometer_test",
     "command": "gometer test",
     "form": null,
     "title": "Go Meter: send a test message to a system's recipients",
     "details": [
      {
       "name": "name",
       "kind": "name",
       "optional": true
      }
     ],
     "also": [
      "gometer test alert tardeba"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "gometer_test",
      "command": "gometer test",
      "form": null,
      "title": "Go Meter: send a test message to a system's recipients",
      "details": [
       {
        "name": "name",
        "kind": "name",
        "optional": true
       }
      ],
      "also": [
       "gometer test alert tardeba"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Asks for a yes first. The same limits and the WhatsApp ban guard apply as for real alerts.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "gometer status",
       "gometer events",
       "gometer recipients",
       "gometer log"
      ]
     }
    }
   ]
  },
  {
   "id": "nextcloud",
   "title": "Nextcloud",
   "lead": "Files, folders, shares, users, groups and quotas on the Nextcloud server. Staff only, unless allowed for a client.",
   "tips": [
    {
     "what": "Give a client Nextcloud access in one step (user + password + folder + share + their record):",
     "commands": [
      "$ set up nextcloud for client narjis with folder /Gova"
     ]
    },
    {
     "what": "Several steps run one at a time: after each you get its result and send the next command (or \"done\"). Create commands also reuse what already exists (an existing user keeps their password):",
     "commands": [
      "$ create user narjis",
      "$ create folder /Gova",
      "$ share /Gova with narjis edit"
     ]
    },
    {
     "what": "Decide from a result: search first, then create only if it was not found, then share:",
     "commands": [
      "$ find folder TestMe",
      "(result: No folder named like \"TestMe\")",
      "$ create folder /TestMe",
      "$ share /TestMe with narjis edit",
      "done"
     ]
    },
    {
     "what": "Find a folder when you only know part of its name:",
     "commands": [
      "$ find folder alex"
     ]
    },
    {
     "what": "See inside a folder (with one level of subfolders):",
     "commands": [
      "$ list folders in /Clients"
     ]
    },
    {
     "what": "See the files in a folder, with sizes and dates (one level):",
     "commands": [
      "$ list files in /Clients/Acme"
     ]
    },
    {
     "what": "Users and passwords: a new user gets a strong random password, or the one you type; either way the login is sent to you privately. A password you type is never shown back, logged or sent to a brain (delete your message afterwards):",
     "commands": [
      "$ create user sara",
      "$ create user sara with a random password",
      "$ create user sara with password Blue-Cedar-2026",
      "$ reset password of sara",
      "$ set password of sara to Blue-Cedar-2026"
     ]
    },
    {
     "what": "Check access: who sees a folder, and what a user can open:",
     "commands": [
      "$ who can see /Gova",
      "$ what does narjis have access to"
     ]
    }
   ],
   "commands": [
    {
     "id": "nc_own_password",
     "command": "reset my nextcloud password",
     "form": null,
     "title": "Reset my Nextcloud password",
     "details": [],
     "also": [],
     "readOnly": false,
     "who": [
      "client"
     ],
     "explanation": {
      "id": "nc_own_password",
      "command": "reset my nextcloud password",
      "form": null,
      "title": "Reset my Nextcloud password",
      "details": [],
      "also": [],
      "readOnly": false,
      "who": [
       "client"
      ],
      "whatItDoes": "Reset my Nextcloud password",
      "uses": "a change",
      "runsThrough": [
       "Reset a Nextcloud password"
      ],
      "gates": [
       "shown for a yes before it runs",
       "uses one of the client's weekly tickets"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales",
       "change /Docs for hadi to edit"
      ]
     }
    },
    {
     "id": "nc_own_space",
     "command": "nextcloud space",
     "form": null,
     "title": "How much Nextcloud space do I have",
     "details": [],
     "also": [],
     "readOnly": true,
     "who": [
      "client"
     ],
     "explanation": {
      "id": "nc_own_space",
      "command": "nextcloud space",
      "form": null,
      "title": "How much Nextcloud space do I have",
      "details": [],
      "also": [],
      "readOnly": true,
      "who": [
       "client"
      ],
      "whatItDoes": "How much Nextcloud space do I have",
      "uses": "only reads (safe)",
      "runsThrough": [
       "Nextcloud user details"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales",
       "change /Docs for hadi to edit"
      ]
     }
    },
    {
     "id": "nc_share",
     "command": "share /Clients/ABC with Sales edit",
     "form": "share <folder> with <user or group> <view or edit>",
     "title": "Share a folder",
     "details": [
      {
       "name": "path",
       "kind": "folder",
       "optional": false
      },
      {
       "name": "target",
       "kind": "user or group",
       "optional": false
      },
      {
       "name": "ttype",
       "kind": "whether it is a user or a group",
       "optional": true
      },
      {
       "name": "perm",
       "kind": "view or edit",
       "optional": true
      }
     ],
     "also": [
      "share \"/My Docs\" to group \"Team A\" view only",
      "give hadi access to /Movies"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_share",
      "command": "share /Clients/ABC with Sales edit",
      "form": "share <folder> with <user or group> <view or edit>",
      "title": "Share a folder",
      "details": [
       {
        "name": "path",
        "kind": "folder",
        "optional": false
       },
       {
        "name": "target",
        "kind": "user or group",
        "optional": false
       },
       {
        "name": "ttype",
        "kind": "whether it is a user or a group",
        "optional": true
       },
       {
        "name": "perm",
        "kind": "view or edit",
        "optional": true
       }
      ],
      "also": [
       "share \"/My Docs\" to group \"Team A\" view only",
       "give hadi access to /Movies"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Share a folder",
      "uses": "a change",
      "runsThrough": [
       "Share a folder"
      ],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "unshare /Clients/ABC from Sales",
       "change /Docs for hadi to edit"
      ]
     }
    },
    {
     "id": "nc_unshare",
     "command": "unshare /Clients/ABC from Sales",
     "form": "unshare <folder> from <user or group>",
     "title": "Stop sharing",
     "details": [
      {
       "name": "path",
       "kind": "folder",
       "optional": false
      },
      {
       "name": "target",
       "kind": "user or group",
       "optional": false
      },
      {
       "name": "ttype",
       "kind": "whether it is a user or a group",
       "optional": true
      }
     ],
     "also": [
      "remove hadi from /Movies"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_unshare",
      "command": "unshare /Clients/ABC from Sales",
      "form": "unshare <folder> from <user or group>",
      "title": "Stop sharing",
      "details": [
       {
        "name": "path",
        "kind": "folder",
        "optional": false
       },
       {
        "name": "target",
        "kind": "user or group",
        "optional": false
       },
       {
        "name": "ttype",
        "kind": "whether it is a user or a group",
        "optional": true
       }
      ],
      "also": [
       "remove hadi from /Movies"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Stop sharing",
      "uses": "a change",
      "runsThrough": [
       "Stop sharing"
      ],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "change /Docs for hadi to edit"
      ]
     }
    },
    {
     "id": "nc_change_permission",
     "command": "change /Docs for hadi to edit",
     "form": "change <folder> for <user or group> to <view or edit>",
     "title": "Change a share to view/edit",
     "details": [
      {
       "name": "path",
       "kind": "folder",
       "optional": false
      },
      {
       "name": "target",
       "kind": "user or group",
       "optional": false
      },
      {
       "name": "ttype",
       "kind": "whether it is a user or a group",
       "optional": true
      },
      {
       "name": "perm",
       "kind": "view or edit",
       "optional": false
      }
     ],
     "also": [
      "set sales to view on /Clients/ABC"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_change_permission",
      "command": "change /Docs for hadi to edit",
      "form": "change <folder> for <user or group> to <view or edit>",
      "title": "Change a share to view/edit",
      "details": [
       {
        "name": "path",
        "kind": "folder",
        "optional": false
       },
       {
        "name": "target",
        "kind": "user or group",
        "optional": false
       },
       {
        "name": "ttype",
        "kind": "whether it is a user or a group",
        "optional": true
       },
       {
        "name": "perm",
        "kind": "view or edit",
        "optional": false
       }
      ],
      "also": [
       "set sales to view on /Clients/ABC"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Change a share to view/edit",
      "uses": "a change",
      "runsThrough": [
       "Change share permission"
      ],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_who_can_see",
     "command": "who can see /Clients/ABC",
     "form": "who can see <folder>",
     "title": "Who can see a folder",
     "details": [
      {
       "name": "path",
       "kind": "folder",
       "optional": false
      }
     ],
     "also": [
      "who has access to /Docs"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_who_can_see",
      "command": "who can see /Clients/ABC",
      "form": "who can see <folder>",
      "title": "Who can see a folder",
      "details": [
       {
        "name": "path",
        "kind": "folder",
        "optional": false
       }
      ],
      "also": [
       "who has access to /Docs"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Who can see a folder",
      "uses": "only reads (safe)",
      "runsThrough": [
       "Who a path is shared with"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_user_access",
     "command": "what does hadi have access to",
     "form": "what does <user> have access to",
     "title": "What a user can access",
     "details": [
      {
       "name": "user",
       "kind": "user",
       "optional": false
      }
     ],
     "also": [
      "access of sara"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_user_access",
      "command": "what does hadi have access to",
      "form": "what does <user> have access to",
      "title": "What a user can access",
      "details": [
       {
        "name": "user",
        "kind": "user",
        "optional": false
       }
      ],
      "also": [
       "access of sara"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "What a user can access",
      "uses": "only reads (safe)",
      "runsThrough": [
       "What a user can access"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_create_folder",
     "command": "create folder /Clients/New",
     "form": "create folder <folder>",
     "title": "Create a folder",
     "details": [
      {
       "name": "path",
       "kind": "folder",
       "optional": false
      }
     ],
     "also": [
      "mkdir /Docs/2026"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_create_folder",
      "command": "create folder /Clients/New",
      "form": "create folder <folder>",
      "title": "Create a folder",
      "details": [
       {
        "name": "path",
        "kind": "folder",
        "optional": false
       }
      ],
      "also": [
       "mkdir /Docs/2026"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Create a folder",
      "uses": "a small change",
      "runsThrough": [
       "Create a folder"
      ],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_public_link",
     "command": "public link for /Docs/Offer 7 days",
     "form": "public link for <folder> <days> days",
     "title": "Public link (password + expiry)",
     "details": [
      {
       "name": "path",
       "kind": "folder",
       "optional": false
      },
      {
       "name": "days",
       "kind": "days",
       "optional": true
      }
     ],
     "also": [
      "link to /Docs"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_public_link",
      "command": "public link for /Docs/Offer 7 days",
      "form": "public link for <folder> <days> days",
      "title": "Public link (password + expiry)",
      "details": [
       {
        "name": "path",
        "kind": "folder",
        "optional": false
       },
       {
        "name": "days",
        "kind": "days",
        "optional": true
       }
      ],
      "also": [
       "link to /Docs"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Public link (password + expiry)",
      "uses": "a change",
      "runsThrough": [
       "Create a public link"
      ],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_create_user",
     "command": "create user sara",
     "form": "create user <user id>",
     "title": "Create a Nextcloud user (random password, or the one you type)",
     "details": [
      {
       "name": "user_id",
       "kind": "user id",
       "optional": false
      },
      {
       "name": "password",
       "kind": "password",
       "optional": true
      }
     ],
     "also": [
      "add nextcloud user omar",
      "create user sara with password Blue-Cedar-2026"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_create_user",
      "command": "create user sara",
      "form": "create user <user id>",
      "title": "Create a Nextcloud user (random password, or the one you type)",
      "details": [
       {
        "name": "user_id",
        "kind": "user id",
        "optional": false
       },
       {
        "name": "password",
        "kind": "password",
        "optional": true
       }
      ],
      "also": [
       "add nextcloud user omar",
       "create user sara with password Blue-Cedar-2026"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Without a password, a strong random one is made. Either way the login details are sent to you privately; a password you type is never shown back, logged or sent to a brain (delete your message afterwards). Nextcloud's own password rules apply. An existing user is reused and keeps its password.",
      "uses": "a change",
      "runsThrough": [
       "Create a Nextcloud user"
      ],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_set_password",
     "command": "set password of sara to Blue-Cedar-2026",
     "form": "set password of <user> to <password>",
     "title": "Set a Nextcloud password you choose",
     "details": [
      {
       "name": "user",
       "kind": "user",
       "optional": false
      },
      {
       "name": "password",
       "kind": "password",
       "optional": false
      }
     ],
     "also": [
      "change sara's password to Blue-Cedar-2026"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_set_password",
      "command": "set password of sara to Blue-Cedar-2026",
      "form": "set password of <user> to <password>",
      "title": "Set a Nextcloud password you choose",
      "details": [
       {
        "name": "user",
        "kind": "user",
        "optional": false
       },
       {
        "name": "password",
        "kind": "password",
        "optional": false
       }
      ],
      "also": [
       "change sara's password to Blue-Cedar-2026"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "The password you type is set as it is: never shown back, logged or sent to a brain (delete your message afterwards). Nextcloud's own password rules apply. For a strong random one sent privately, use *reset password of USER*. The account the help desk signs in with is refused (it would cut the connection).",
      "uses": "a change",
      "runsThrough": [
       "Set a Nextcloud password"
      ],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_reset_password",
     "command": "reset password of sara",
     "form": "reset password of <user>",
     "title": "Reset a Nextcloud password",
     "details": [
      {
       "name": "user",
       "kind": "user",
       "optional": false
      }
     ],
     "also": [
      "change password of sara"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_reset_password",
      "command": "reset password of sara",
      "form": "reset password of <user>",
      "title": "Reset a Nextcloud password",
      "details": [
       {
        "name": "user",
        "kind": "user",
        "optional": false
       }
      ],
      "also": [
       "change password of sara"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "A strong random password, sent to you privately. To choose it yourself: *set password of sara to …*.",
      "uses": "a change",
      "runsThrough": [
       "Reset a Nextcloud password"
      ],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_add_user_group",
     "command": "add sara to group Sales",
     "form": "add <user> to group <group>",
     "title": "Add a user to a group",
     "details": [
      {
       "name": "user",
       "kind": "user",
       "optional": false
      },
      {
       "name": "group",
       "kind": "group",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_add_user_group",
      "command": "add sara to group Sales",
      "form": "add <user> to group <group>",
      "title": "Add a user to a group",
      "details": [
       {
        "name": "user",
        "kind": "user",
        "optional": false
       },
       {
        "name": "group",
        "kind": "group",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Add a user to a group",
      "uses": "a change",
      "runsThrough": [
       "Add user to group"
      ],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_set_quota",
     "command": "set quota of sara to 5 GB",
     "form": "set quota of <user> to <size>",
     "title": "Set storage quota",
     "details": [
      {
       "name": "user",
       "kind": "user",
       "optional": false
      },
      {
       "name": "quota",
       "kind": "size",
       "optional": false
      }
     ],
     "also": [
      "give omar 10 GB of space"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_set_quota",
      "command": "set quota of sara to 5 GB",
      "form": "set quota of <user> to <size>",
      "title": "Set storage quota",
      "details": [
       {
        "name": "user",
        "kind": "user",
        "optional": false
       },
       {
        "name": "quota",
        "kind": "size",
        "optional": false
       }
      ],
      "also": [
       "give omar 10 GB of space"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Set storage quota",
      "uses": "a change",
      "runsThrough": [
       "Set storage quota"
      ],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_disable_user",
     "command": "disable user sara",
     "form": "disable user <user>",
     "title": "Disable a Nextcloud user",
     "details": [
      {
       "name": "user",
       "kind": "user",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_disable_user",
      "command": "disable user sara",
      "form": "disable user <user>",
      "title": "Disable a Nextcloud user",
      "details": [
       {
        "name": "user",
        "kind": "user",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "High risk: only the owner can confirm.",
      "uses": "a big or destructive change",
      "runsThrough": [
       "Disable a Nextcloud user"
      ],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_delete_user",
     "command": "delete user abc111",
     "form": "delete user <user>",
     "title": "Delete a Nextcloud user (and their files)",
     "details": [
      {
       "name": "user",
       "kind": "user",
       "optional": false
      }
     ],
     "also": [
      "delete nextcloud user abc111",
      "remove abc111 from nextcloud"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "nc_delete_user",
      "command": "delete user abc111",
      "form": "delete user <user>",
      "title": "Delete a Nextcloud user (and their files)",
      "details": [
       {
        "name": "user",
        "kind": "user",
        "optional": false
       }
      ],
      "also": [
       "delete nextcloud user abc111",
       "remove abc111 from nextcloud"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "For good: the user and their files are deleted. Only the owner can do it, and it always asks first. To keep the files, disable the user instead. The account the help desk uses and Nextcloud administrators are refused.",
      "uses": "a big or destructive change",
      "runsThrough": [
       "Delete a Nextcloud user"
      ],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_enable_user",
     "command": "enable user sara",
     "form": "enable user <user>",
     "title": "Enable a Nextcloud user",
     "details": [
      {
       "name": "user",
       "kind": "user",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_enable_user",
      "command": "enable user sara",
      "form": "enable user <user>",
      "title": "Enable a Nextcloud user",
      "details": [
       {
        "name": "user",
        "kind": "user",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Enable a Nextcloud user",
      "uses": "a change",
      "runsThrough": [
       "Enable a Nextcloud user"
      ],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_list_users",
     "command": "list users",
     "form": null,
     "title": "List users",
     "details": [],
     "also": [
      "list nextcloud users"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_list_users",
      "command": "list users",
      "form": null,
      "title": "List users",
      "details": [],
      "also": [
       "list nextcloud users"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "List users",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List Nextcloud users"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_access_report",
     "command": "access report",
     "form": null,
     "title": "Access report: what every user can access",
     "details": [],
     "also": [
      "who has access to what",
      "audit access"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_access_report",
      "command": "access report",
      "form": null,
      "title": "Access report: what every user can access",
      "details": [],
      "also": [
       "who has access to what",
       "audit access"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "One report for every user: the folders shared with them, directly or through a group. Built in (no AI needed), so an audit never depends on an AI agreeing to do it.",
      "uses": "only reads (safe)",
      "runsThrough": [
       "Access report (every user)"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_find_folder",
     "command": "find folder alex",
     "form": "find folder <name>",
     "title": "Find a folder by name",
     "details": [
      {
       "name": "name",
       "kind": "name",
       "optional": false
      }
     ],
     "also": [
      "search for folder named invoices",
      "where is folder Gova"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_find_folder",
      "command": "find folder alex",
      "form": "find folder <name>",
      "title": "Find a folder by name",
      "details": [
       {
        "name": "name",
        "kind": "name",
        "optional": false
       }
      ],
      "also": [
       "search for folder named invoices",
       "where is folder Gova"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Searches folder names up to 4 levels deep.",
      "uses": "only reads (safe)",
      "runsThrough": [
       "Find a folder by name"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_client_setup",
     "command": "set up nextcloud for client narjis",
     "form": "set up nextcloud for client <client name>",
     "title": "Give a client Nextcloud access (user, folder, share)",
     "details": [
      {
       "name": "cname",
       "kind": "client name",
       "optional": false
      },
      {
       "name": "path",
       "kind": "folder",
       "optional": true
      },
      {
       "name": "user",
       "kind": "user",
       "optional": true
      }
     ],
     "also": [
      "set up nextcloud for client narjis with folder /Gova",
      "give client Acme nextcloud access as user acme.office"
     ],
     "readOnly": false,
     "who": [
      "owner"
     ],
     "explanation": {
      "id": "nc_client_setup",
      "command": "set up nextcloud for client narjis",
      "form": "set up nextcloud for client <client name>",
      "title": "Give a client Nextcloud access (user, folder, share)",
      "details": [
       {
        "name": "cname",
        "kind": "client name",
        "optional": false
       },
       {
        "name": "path",
        "kind": "folder",
        "optional": true
       },
       {
        "name": "user",
        "kind": "user",
        "optional": true
       }
      ],
      "also": [
       "set up nextcloud for client narjis with folder /Gova",
       "give client Acme nextcloud access as user acme.office"
      ],
      "readOnly": false,
      "who": [
       "owner"
      ],
      "whatItDoes": "One step: creates the Nextcloud user if missing (password sent privately), the folder if missing (default /Clients/<client name>), shares it with edit rights, records that the client owns the user and folder, and lets them list folders, reset their password and see their space. Shown first; runs on yes.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_folders",
     "command": "list folders",
     "form": null,
     "title": "List folders (and their subfolders)",
     "details": [
      {
       "name": "path",
       "kind": "folder",
       "optional": true
      }
     ],
     "also": [
      "list folders in /Clients",
      "show subfolders of /Clients/Acme"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_folders",
      "command": "list folders",
      "form": null,
      "title": "List folders (and their subfolders)",
      "details": [
       {
        "name": "path",
        "kind": "folder",
        "optional": true
       }
      ],
      "also": [
       "list folders in /Clients",
       "show subfolders of /Clients/Acme"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Top level (or the folder named) with one level of subfolders. Clients only see their own folders.",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List folders"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_tree",
     "command": "list all files",
     "form": null,
     "title": "List all files in every folder and subfolder",
     "details": [
      {
       "name": "path",
       "kind": "folder",
       "optional": true
      },
      {
       "name": "folder",
       "kind": "folder",
       "optional": true
      }
     ],
     "also": [
      "list all files found on nextcloud",
      "list all files in /CompanyFiles"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_tree",
      "command": "list all files",
      "form": null,
      "title": "List all files in every folder and subfolder",
      "details": [
       {
        "name": "path",
        "kind": "folder",
        "optional": true
       },
       {
        "name": "folder",
        "kind": "folder",
        "optional": true
       }
      ],
      "also": [
       "list all files found on nextcloud",
       "list all files in /CompanyFiles"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "One answer with every file and folder below a folder (6 levels, 600 items at most), with sizes and the total. A folder can be named without its path (\"inside CompanyFiles\"). Clients only see their own folders.",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List all files (every subfolder)"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_files",
     "command": "list files",
     "form": null,
     "title": "List files in a folder (with sizes)",
     "details": [
      {
       "name": "path",
       "kind": "folder",
       "optional": true
      },
      {
       "name": "folder",
       "kind": "folder",
       "optional": true
      }
     ],
     "also": [
      "list files in /Clients/Acme",
      "what files are in /Docs"
     ],
     "readOnly": true,
     "who": [
      "client",
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_files",
      "command": "list files",
      "form": null,
      "title": "List files in a folder (with sizes)",
      "details": [
       {
        "name": "path",
        "kind": "folder",
        "optional": true
       },
       {
        "name": "folder",
        "kind": "folder",
        "optional": true
       }
      ],
      "also": [
       "list files in /Clients/Acme",
       "what files are in /Docs"
      ],
      "readOnly": true,
      "who": [
       "client",
       "admin",
       "owner"
      ],
      "whatItDoes": "Files and folders inside one folder (one level), with sizes and dates; the top level when no folder is named. Clients only see their own folders.",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List files"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_list_groups",
     "command": "list groups",
     "form": null,
     "title": "List groups",
     "details": [],
     "also": [],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_list_groups",
      "command": "list groups",
      "form": null,
      "title": "List groups",
      "details": [],
      "also": [],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "List groups",
      "uses": "only reads (safe)",
      "runsThrough": [
       "List Nextcloud groups"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    },
    {
     "id": "nc_user_info",
     "command": "info about hadi",
     "form": "info about <user>",
     "title": "User details",
     "details": [
      {
       "name": "user",
       "kind": "user",
       "optional": false
      }
     ],
     "also": [
      "user info sara"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "nc_user_info",
      "command": "info about hadi",
      "form": "info about <user>",
      "title": "User details",
      "details": [
       {
        "name": "user",
        "kind": "user",
        "optional": false
       }
      ],
      "also": [
       "user info sara"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "User details",
      "uses": "only reads (safe)",
      "runsThrough": [
       "Nextcloud user details"
      ],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [
       "Nextcloud must be reachable; a missing folder or user is reported by name"
      ],
      "related": [
       "reset my nextcloud password",
       "nextcloud space",
       "share /Clients/ABC with Sales edit",
       "unshare /Clients/ABC from Sales"
      ]
     }
    }
   ]
  },
  {
   "id": "shop",
   "title": "Shop",
   "lead": "A shop's products, prices, stock now, photos and pre-orders, for the assistant of its business.",
   "tips": [],
   "commands": [
    {
     "id": "shop_status",
     "command": "shop status",
     "form": null,
     "title": "Shop status (catalogue sync, API, pre-orders, webhook)",
     "details": [
      {
       "name": "name",
       "kind": "name",
       "optional": true
      }
     ],
     "also": [
      "shop status Sisters Glow"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "shop_status",
      "command": "shop status",
      "form": null,
      "title": "Shop status (catalogue sync, API, pre-orders, webhook)",
      "details": [
       {
        "name": "name",
        "kind": "name",
        "optional": true
       }
      ],
      "also": [
       "shop status Sisters Glow"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Shop status (catalogue sync, API, pre-orders, webhook)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "sync shop",
       "flush all products",
       "find product luminous serum",
       "list preorders"
      ]
     }
    },
    {
     "id": "shop_sync",
     "command": "sync shop",
     "form": null,
     "title": "Sync a shop's catalogue now",
     "details": [
      {
       "name": "name",
       "kind": "name",
       "optional": true
      }
     ],
     "also": [
      "refresh catalogue of Sisters Glow"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "shop_sync",
      "command": "sync shop",
      "form": null,
      "title": "Sync a shop's catalogue now",
      "details": [
       {
        "name": "name",
        "kind": "name",
        "optional": true
       }
      ],
      "also": [
       "refresh catalogue of Sisters Glow"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Sync a shop's catalogue now",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "shop status",
       "flush all products",
       "find product luminous serum",
       "list preorders"
      ]
     }
    },
    {
     "id": "shop_flush",
     "command": "flush all products",
     "form": null,
     "title": "Remove every product kept here and import the shop's catalogue again",
     "details": [
      {
       "name": "name",
       "kind": "name",
       "optional": true
      }
     ],
     "also": [
      "flush shop",
      "reset catalogue of Sisters Glow"
     ],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "shop_flush",
      "command": "flush all products",
      "form": null,
      "title": "Remove every product kept here and import the shop's catalogue again",
      "details": [
       {
        "name": "name",
        "kind": "name",
        "optional": true
       }
      ],
      "also": [
       "flush shop",
       "reset catalogue of Sisters Glow"
      ],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Asks for a yes first. The products kept on this server are removed and the whole catalogue is imported again from the shop (about a minute); nothing changes at the shop.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "shop status",
       "sync shop",
       "find product luminous serum",
       "list preorders"
      ]
     }
    },
    {
     "id": "shop_find",
     "command": "find product luminous serum",
     "form": "find product <value>",
     "title": "Find a product in a shop (price, stock now, pre-order)",
     "details": [
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [
      "stock of luminous serum"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "shop_find",
      "command": "find product luminous serum",
      "form": "find product <value>",
      "title": "Find a product in a shop (price, stock now, pre-order)",
      "details": [
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [
       "stock of luminous serum"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "The stock is asked from the shop at that moment. Exact quantities are not given by the shop: in stock, few left or out of stock, per branch.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "shop status",
       "sync shop",
       "flush all products",
       "list preorders"
      ]
     }
    },
    {
     "id": "shop_preorders",
     "command": "list preorders",
     "form": null,
     "title": "List pre-orders (requested, confirmed, arrived…)",
     "details": [
      {
       "name": "value",
       "kind": "value",
       "optional": true
      }
     ],
     "also": [
      "confirmed preorders",
      "preorders test"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "shop_preorders",
      "command": "list preorders",
      "form": null,
      "title": "List pre-orders (requested, confirmed, arrived…)",
      "details": [
       {
        "name": "value",
        "kind": "value",
        "optional": true
       }
      ],
      "also": [
       "confirmed preorders",
       "preorders test"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "List pre-orders (requested, confirmed, arrived…)",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "shop status",
       "sync shop",
       "flush all products",
       "find product luminous serum"
      ]
     }
    },
    {
     "id": "shop_preorder_show",
     "command": "preorder P-ABC123",
     "form": "preorder <value>",
     "title": "Show one pre-order",
     "details": [
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [
      "status of preorder P-ABC123"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "shop_preorder_show",
      "command": "preorder P-ABC123",
      "form": "preorder <value>",
      "title": "Show one pre-order",
      "details": [
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [
       "status of preorder P-ABC123"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Show one pre-order",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": [
       "shop status",
       "sync shop",
       "flush all products",
       "find product luminous serum"
      ]
     }
    },
    {
     "id": "shop_preorder_cancel",
     "command": "cancel preorder P-ABC123",
     "form": "cancel preorder <value>",
     "title": "Cancel a pre-order (the customer is told)",
     "details": [
      {
       "name": "value",
       "kind": "value",
       "optional": false
      }
     ],
     "also": [],
     "readOnly": false,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "shop_preorder_cancel",
      "command": "cancel preorder P-ABC123",
      "form": "cancel preorder <value>",
      "title": "Cancel a pre-order (the customer is told)",
      "details": [
       {
        "name": "value",
        "kind": "value",
        "optional": false
       }
      ],
      "also": [],
      "readOnly": false,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Only a requested or confirmed pre-order can be cancelled. Asks for a yes first; the customer is told in their chat.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "shown for a yes before it runs"
      ],
      "errors": [],
      "related": [
       "shop status",
       "sync shop",
       "flush all products",
       "find product luminous serum"
      ]
     }
    }
   ]
  },
  {
   "id": "webchat",
   "title": "Web chat",
   "lead": "The chat widget on websites and in apps: bots, domains, leads and the protocol.",
   "tips": [],
   "commands": [
    {
     "id": "webchat_status",
     "command": "webchat status",
     "form": null,
     "title": "Web chat status (bots, their websites and business, conversations and leads today)",
     "details": [
      {
       "name": "name",
       "kind": "name",
       "optional": true
      }
     ],
     "also": [
      "web chat bots"
     ],
     "readOnly": true,
     "who": [
      "admin",
      "owner"
     ],
     "explanation": {
      "id": "webchat_status",
      "command": "webchat status",
      "form": null,
      "title": "Web chat status (bots, their websites and business, conversations and leads today)",
      "details": [
       {
        "name": "name",
        "kind": "name",
        "optional": true
       }
      ],
      "also": [
       "web chat bots"
      ],
      "readOnly": true,
      "who": [
       "admin",
       "owner"
      ],
      "whatItDoes": "Each bot: on or off, its domains, its business or branch, today's conversations, new leads and AI answers, and the line to install it.",
      "uses": "only reads (safe)",
      "runsThrough": [],
      "gates": [
       "runs without confirmation (it only reads)"
      ],
      "errors": [],
      "related": []
     }
    }
   ]
  }
 ],
 "businesses": [
  {
   "id": "solar",
   "name": "solar",
   "page": "https://ai2.vastlb.net/docs/28d7214129921e77048fbf82/business/solar.txt",
   "text": "BUSINESS: solar\nArea of work: Solar power systems and lithium batteries\nAbout: Solar supplies solar power and energy-storage products, including lithium batteries in 24V and 48V configurations, solar panels, inverters, charge controllers, mounting equipment, cables, protection devices and related accessories. Product models, specifications, availability and pricing vary; contact support to confirm details and get recommendations.\nPhone: 70123123\nAddress: beirut\nOpening hours:\nMon–Sat: 10:00-16:00\nSun: closed\nSunday is off. For information, please contact support.\nWhen closed, say: We are currently closed. Please leave your question and our team will reply.\nServices / products and prices:\n- 48V 5kW lithium battery — $1,000 (Listed price; confirm current price, model and availability)\n- 48V 15kW lithium battery — $3,000 (Listed price; confirm current price, model and availability)\n- Lithium batteries, 24V and 48V; listed size labels include 2.5kW, 5kW, 8kW, 15kW — Contact support for price (Confirm exact model, specifications, units and availability)\n- Solar panels, inverters, charge controllers, mounting equipment, cables, protect — Contact support for price (Confirm product specifications and availability)\nPayment: Whish Money\nDelivery: Delivery availability, coverage, fees and timing have not been provided. Contact support to confirm before ordering.\nPolicies: Battery cells have a listed 10-year warranty. Physical damage is not covered. Warranty terms for other products and return or refund conditions have not been provided; contact support to confirm applicable terms before purchase.\nDocuments:\n## Warranty\n10 years warranty on cells. Warranty does not cover physical damage.\n\n## Product Range\nSolar supplies products for solar power systems and energy storage. Product categories include:\n- Lithium batteries in 24V and 48V configurations. The listed size labels are 2.5kW, 5kW, 8kW, 15kW and 20kW; ask support to confirm the exact model and units.\n- Solar panels, inverters and charge controllers.\n- Mounting equipment, cables, electrical protection devices and related accessories.\n\nThe right products depend on the system design and compatibility requirements. Product availability and specifications can vary; confirm the exact model with support before ordering.\n\n## Pricing\nThe supplied listed prices are $1,000 for a 48V 5kW lithium battery and $3,000 for a 48V 15kW lithium battery. Confirm current prices and availability with support before ordering. Prices for other products and battery models have not been provided. Do not estimate or invent prices; ask support for a quote.\n\n## Solar System Basics\nA solar power system may include panels, an inverter, a compatible battery, a charge controller where required, mounting hardware and electrical protection. The right combination depends on energy use, installation conditions and equipment compatibility. Battery voltage must match the inverter’s supported battery voltage, and power and energy ratings are different measurements. Check the exact product manuals and have electrical work performed by a qualified professional. Do not give model-specific settings or safety-critical instructions without the relevant manufacturer information.\n\nLebanon is 220 V. Then a rule of thumb: monthly kWh ÷ 30 = daily use. Then which battery fits which daily use (e.g. up to 4 kWh → 5 kWh battery, 4–7 → 8 kWh, above that → 15 kWh), and typical fridge and washing-machine use. With that, it answers “150 kWh a month → 5 kWh battery, $1,000” directly instead of searching the internet.\n\n## Payments and Delivery\nWhish Money is the payment method listed by the business. Contact support to confirm payment details for an order. Delivery availability, service area, fees and estimated timing have not been provided; confirm these details with support before placing an order. Do not promise delivery or quote a fee or date without confirmation.\n\n## Warranty and Returns\nThe supplied warranty information states that battery cells have a 10-year warranty and physical damage is not covered. The full warranty terms, exclusions and claim process have not been provided. Warranty terms for other products, along with return and refund conditions, are also unconfirmed. Customers should contact support to verify the applicable terms before purchase or before making a warranty claim.\n\n## Opening Hours\nMonday to Saturday: 10:00–16:00. Sunday: closed. For information, customers can contact support. Outside opening hours, invite customers to leave their question for the team to answer.\n\n## Choosing Solar Products\nThe right products depend on what you want to power, how much energy you use, your installation conditions and compatibility between components. Panels generate electricity; an inverter converts power for compatible loads; a battery stores energy; and a charge controller manages panel-to-battery charging where required. Not every system uses the same components or configuration.\n\nWhen comparing products, check the exact model labels, rated power and energy, supported battery voltage, operating limits and manufacturer compatibility guidance. Power and stored energy are different measurements. The battery size labels supplied by Solar are shown as provided; confirm their units and exact model with support before comparing or ordering. These are general selection points, not a product-specific recommendation.\n\n## Requesting a Quote\nContact support with the product or system you are considering to ask about the exact model, current price and availability. For a more useful product discussion, share what you want to power and any existing inverter or battery model details you have. If you do not know the technical details, send a photo of the equipment label if available. Support can check product information and compatibility questions; confirm all quoted details before placing an order.\n\n## Installation and Service\nSolar’s installation, repair and maintenance services have not been confirmed. Contact support to ask whether assistance is available for your location and project. Product selection and installation should follow the equipment manufacturers’ instructions and applicable requirements. Electrical work should be handled by a qualified professional. Do not rely on general product information as a substitute for model-specific instructions.\n\n## Product Care and Safety\nUse and maintain products according to the exact manufacturer manuals and safety labels. Before connecting or changing equipment, confirm that the models and electrical ratings are compatible. Do not bypass battery protection, alter BMS limits, or improvise wiring or communication connections. Stop and seek qualified help if equipment is damaged, unusually hot, emitting an unusual smell, or displaying a serious alarm. For product-specific troubleshooting, contact support with the model details and any displayed alarms.\n\n## product info\nWrite the battery sizes as kWh (if 5 kWh is what the “48V 5kW” model actually stores).\nKeep “confirm before ordering” in one place only (Policies), and remove it from About, the product lines and Delivery.\nFrequently asked questions:\nQ: What is the difference between 24V and 48V batteries?\nA: A 24V battery system operates at a lower nominal voltage, while a 48V battery system operates at approximately twice the voltage. The inverter must be compatible with the battery voltage.\nQ: Can I connect a 24V battery to a 48V inverter?\nA: No. The battery voltage must match the inverter's supported battery voltage. Do not connect a 24V battery to an inverter designed for a 48V battery unless the inverter specifically supports that configuration.\nQ: What Bulk/Absorption voltage should I use for a 48V LiFePO₄ battery?\nA: For a typical 48V 16S LiFePO₄ battery, a common charging range is approximately 56.8V to 57.6V. The exact value must follow the battery manufacturer's specification.\nQ: Can I set Bulk to 57.6V on a 48V battery?\nA: 57.6V is a common maximum charging setting for a 16S LiFePO₄ battery because it equals 3.6V per cell. However, use 57.6V only if the specific battery model permits it.\nQ: What Float voltage should I use for a 48V LiFePO₄ battery?\nA: A typical starting range is approximately 54.0V to 54.4V. Some lithium batteries require a lower float voltage or recommend disabling float charging. Follow the battery manufacturer's specification.\nQ: What Bulk/Absorption voltage should I use for a 24V LiFePO₄ battery?\nA: For a typical 24V 8S LiFePO₄ battery, a common charging range is approximately 28.4V to 28.8V. The exact setting depends on the battery model.\nQ: What Float voltage should I use for a 24V LiFePO₄ battery?\nA: A typical range is approximately 27.0V to 27.2V, but the battery manufacturer's recommended setting should always take priority.\nQ: Should Equalization be enabled for a lithium battery?\nA: Normally no. Equalization is generally intended for lead-acid batteries and should be disabled for LiFePO₄ unless the battery manufacturer specifically requires it.\nQ: Should temperature compensation be enabled?\nA: Normally no for LiFePO₄ batteries. Lithium batteries use BMS temperature protection. Follow the manufacturer's specifications.\nQ: What battery type should I select on my inverter?\nA: If the inverter supports the battery's BMS protocol, select the appropriate lithium/BMS battery profile. If communication is unavailable, use a custom/user-defined lithium profile based on the battery manufacturer's voltage and current specifications.\nQ: Can I use AGM or GEL settings for a lithium battery?\nA: It is not recommended. Use the appropriate lithium or custom battery profile and the manufacturer's recommended charging parameters.\nQ: What is BMS communication?\nA: BMS communication allows the battery and inverter to exchange information such as battery voltage, SOC, temperature, charging limits, discharging limits, alarms and protection status.\nQ: Does the battery need BMS communication to work?\nA: Not always. Some systems can operate using voltage-based settings without communication. However, when the battery and inverter are compatible, BMS communication is generally preferred.\nQ: Should I use CAN or RS485?\nA: Use the communication method specified by the battery and inverter manufacturers. Do not select CAN or RS485 based only on the connector type.\nQ: Can I use any RJ45 cable for BMS communication?\nA: No. An RJ45 connector does not guarantee that two devices use the same communication protocol or pinout. Always use the correct cable and pinout specified for the battery and inverter combination.\nQ: Why is my inverter showing a BMS communication error?\nA: Check that the correct communication port, cable, pinout, protocol, baud rate and inverter battery profile are being used. For multiple batteries, also check the master/slave configuration and communication addresses.\nQ: Why does my inverter show 0% or 100% battery SOC incorrectly?\nA: This can happen when BMS communication is not configured correctly. Check the CAN/RS485 connection, communication protocol and inverter battery profile.\nQ: Can I connect multiple batteries in parallel?\nA: Only if the specific battery model supports parallel operation. The batteries should normally be compatible models with the correct communication and protection configuration.\nQ: Can I mix different battery brands in parallel?\nA: Mixing different brands or models is generally not recommended unless the manufacturers specifically confirm compatibility.\nQ: Can I connect an old battery with a new battery?\nA: Do not connect batteries of different ages or conditions without confirming compatibility with the manufacturer. Differences in voltage, SOC, internal resistance and BMS configuration can cause unequal current sharing.\nQ: How many batteries can I connect in parallel?\nA: The maximum number depends on the battery BMS, battery model, inverter and manufacturer's specifications. Please provide the battery and inverter models before determining the maximum number.\nQ: Why is my battery not reaching 100%?\nA: Possible causes include incorrect charging voltage, insufficient solar power, heavy loads during charging, BMS charge limitations, cell imbalance, temperature protection or BMS communication problems.\nQ: Why does the battery stop charging before reaching 100%?\nA: The BMS may limit or stop charging because a cell has reached its voltage limit, the battery temperature is outside the permitted range, charging current is too high, or cell imbalance exists.\nQ: Should I increase the charging voltage if the battery does not reach 100%?\nA: No. Do not increase the charging voltage beyond the manufacturer's specification. First check the BMS status, cell voltages, charging current, battery temperature and inverter settings.\nQ: Why does my battery suddenly stop charging?\nA: The BMS may have activated protection because of high cell voltage, low/high temperature, excessive charging current, cell imbalance or another protection condition. Check the BMS alarm/event history.\nQ: Why did my battery suddenly shut down?\nA: Possible causes include low battery voltage, low-cell-voltage protection, excessive discharge current, short circuit, temperature protection or another BMS protection event.\nQ: What should I do if the inverter shows Low Battery?\nA: Reduce heavy loads and check the battery voltage, SOC and BMS status. If available, check individual cell voltages and BMS alarms. Do not repeatedly restart the battery without identifying the cause.\nQ: What does BMS Over Voltage mean?\nA: It means the BMS detected a cell or battery voltage above its permitted limit. Possible causes include excessive charging voltage, cell imbalance or an incorrect inverter charging setting.\nQ: What does BMS Under Voltage mean?\nA: It means the battery or one of its cells has reached a voltage below the permitted limit. Possible causes include deep discharge, excessive load, cell imbalance or a BMS protection event.\nQ: What does BMS Over Current mean?\nA: It means the battery current exceeded the BMS permitted limit. Possible causes include excessive inverter load, startup surge, short circuit or an incorrect battery/inverter configuration.\nQ: What does BMS High Temperature mean?\nA: The battery temperature has exceeded its permitted operating range. Reduce or stop charging/discharging as appropriate and check the battery environment, ventilation and load.\nQ: Why does the battery voltage drop when I turn on a large load?\nA: Voltage naturally drops under load because of the battery's internal resistance, cables, BMS components, temperature and battery condition. A temporary voltage drop does not necessarily indicate a defective battery.\nQ: How much current does a 5kW inverter draw from a 48V battery?\nA: Approximately 104A at 48V before considering inverter losses. Actual battery current can be higher because battery voltage changes and the inverter is not 100% efficient.\nQ: Does a 10kWh battery support a 10kW inverter?\nA: Not necessarily. kWh represents stored energy while kW represents power. The battery BMS and cells must also support the required continuous and peak current.\nQ: What cable size should I use between the battery and inverter?\nA: Cable size depends on battery voltage, inverter power, maximum battery current, cable length, installation conditions and allowable voltage drop. Do not select cable size based only on battery capacity.\nQ: Why is my battery charging slowly?\nA: Possible causes include limited solar power, inverter charging-current settings, BMS charging limits, battery temperature, high loads operating at the same time, or insufficient PV production.\nQ: Why is my battery discharging quickly?\nA: Check the actual loads, inverter efficiency, battery SOC, battery capacity, BMS limits and whether high-power appliances are operating. Battery runtime depends on actual load power, not only the battery's kWh rating.\nQ: Can I charge the battery from both solar and the grid at the same time?\nA: This depends on the inverter configuration. If the inverter supports simultaneous charging sources, it can be configured according to the manufacturer's specifications.\nQ: Can I charge the battery directly from solar panels?\nA: The solar panels must normally connect through a compatible MPPT charge controller or hybrid inverter. Do not connect PV panels directly to the battery unless the equipment is specifically designed for this purpose.\nQ: What information should I provide when asking for battery settings?\nA: Please provide the battery model, battery voltage, battery capacity, number of batteries, inverter brand and model, BMS communication type, current inverter settings and any BMS/inverter alarm.\nQ: What information should I provide if my BMS is not communicating with the inverter?\nA: Provide the battery model, inverter model, BMS communication type (CAN or RS485), communication cable, battery DIP/address settings, inverter battery profile and a photo of the battery and inverter communication ports if available.\nQ: What information should I provide when the battery shuts down?\nA: Provide the battery model, inverter model, battery voltage, SOC, BMS alarm/protection message, inverter alarm message and the load running when the shutdown occurred.\nQ: Can I change the battery BMS settings myself?\nA: Do not change BMS protection limits unless you know the exact battery/BMS specification and have authorization from the manufacturer or qualified technician. Incorrect BMS settings can cause battery damage or unsafe operation.\nQ: Can I bypass the BMS?\nA: No. Do not bypass, disable or modify BMS protection as a troubleshooting method.\nQ: What should the support agent do if it does not know the exact battery model?\nA: The agent should ask for the battery model and label information before giving model-specific voltage, current, communication or BMS settings. It should provide general values only when clearly identified as typical values and should never invent manufacturer specifications.\nQ: What should the support agent do if the customer asks for a CAN or RS485 pinout?\nA: The agent should first identify the exact battery and inverter models. It must not guess the pinout because different manufacturers can use different RJ45 pin assignments.\nQ: What should the support agent do if the customer asks for a charging voltage?\nA: First identify the battery model, voltage (24V or 48V), inverter model and whether BMS communication is being used. Then use the manufacturer's documented settings. If the exact specification is unavailable, clearly state that the value is a typical starting point rather than a guaranteed manufacturer setting.\nQ: What are the most important details to collect from a customer before troubleshooting?\nA: Collect: battery model, 24V or 48V voltage, battery capacity in kWh, number of batteries, inverter brand and model, BMS communication type, battery SOC, battery voltage, inverter settings, BMS alarm and inverter alarm.\nQ: What battery types do you sell?\nA: We sell lithium batteries in 24V and 48V, with sizes 2.5kW, 5kW, 8kW, 15kW and 20kW.\nQ: What warranty do you offer?\nA: 10 years warranty on cells. Warranty does not cover physical damage.\nQ: How can I get the price?\nA: Price will be given after contacting us. Please contact support for a quote.\nQ: What solar products do you sell?\nA: Solar sells products related to solar power, including panels, inverters, batteries, charge controllers and related equipment and accessories. Contact support to confirm availability and pricing for a specific product. ♡\nQ: What lithium battery options are listed?\nA: The listed range includes 24V and 48V batteries in 2.5kW, 5kW, 8kW, 15kW and 20kW sizes. Confirm the exact model and availability with support. ♡\nQ: How much do your batteries cost?\nA: The listed prices are $1,000 for a 48V 5kW battery and $3,000 for a 48V 15kW battery. Please confirm current prices and availability with support. Prices for other products and sizes have not been provided. ♡\nQ: Can you recommend a solar system for my home or business?\nA: We can help you find suitable products. Share your energy needs and any existing inverter or battery model details with support so the team can check compatibility and recommend options. ♡\nQ: Do you offer delivery?\nA: Please contact support to confirm delivery availability, coverage, fees and timing. ♡\nQ: What payment methods do you accept?\nA: Whish Money is the listed payment method. Contact support to confirm payment details for your order. ♡\nQ: What is your return or refund policy?\nA: Return and refund terms have not been provided here. Please contact support to confirm the applicable terms before ordering. ♡\nQ: Can you confirm whether a product is in stock?\nA: Availability depends on the exact model. Please contact support with the product you’re interested in so the team can check for you. ♡\nQ: Do you install solar systems?\nA: Installation services have not been confirmed. Please contact support to ask about installation options for your location and project. ♡\nQ: What information should I share to get a product recommendation?\nA: Tell us what you want to power and share any inverter or battery model details you have. Support can use that information to check suitable product options and compatibility. ♡\nQ: Are the battery size labels shown in kW or kWh?\nA: The listed sizes are shown as supplied, but the unit and exact model should be confirmed with support before you compare products or place an order. ♡\nQ: What should I do if I need to return an item?\nA: Return and refund conditions have not been provided here. Please contact support to confirm the applicable policy before returning an item. ♡\nQ: How do I place an order or request a quote?\nA: Contact support with the product or system you are considering to check the exact model, current price and availability. Confirm the order details with the team before purchasing. ♡\nQ: What details help you recommend products?\nA: Tell us what you want to power and share any inverter or battery model details you have. A photo of the equipment label can help if you are unsure of the model. ♡\nQ: Where is Solar located?\nA: Solar’s listed address is Beirut. Contact support to confirm the exact location or directions. ♡\nQ: What are your opening hours?\nA: We are open Monday to Saturday, 10:00–16:00, and closed on Sunday. Hours are local time; contact support if you need to confirm before visiting. ♡\nQ: Do you provide installation or repair services?\nA: Installation and repair services have not been confirmed. Please contact support to ask whether assistance is available for your location and project. ♡\nQ: What should I do if equipment seems damaged or unsafe?\nA: Stop using the affected equipment if it appears damaged or shows a serious alarm, and contact a qualified professional. Do not bypass protection or attempt unsafe electrical work. Share the product model and alarm details with support if you need help. ♡\nHow to handle this business's clients:\nBe confident and persuasive. Recommend a specific product from our list with its price when the customer’s need is clear; give approximate sizing yourself, customers are not technical. Keep it simple: no long lists of questions. Only say something is in stock, or promise installation or delivery, if it is written here. End every message with ♡.\nTone: friendly.\n\nKeywords that start a chat with this business (new leads): solar, battery, lithium, طاقة, بطاريات, الواح شمسية, batteries, بطارية\nWhen the assistant cannot answer, the client is asked whether to pass the question to the team; when they say yes, or when the client asks for a person, a ticket is opened for this business: 0 staff member(s) are assigned (names and numbers are not published); the ticket goes to the available person with the least work. The client is told the ticket number and, once it is assigned, who has it.\nLimit: 30 customer messages per customer per day."
  },
  {
   "id": "grocery",
   "name": "grocery",
   "page": "https://ai2.vastlb.net/docs/28d7214129921e77048fbf82/business/grocery.txt",
   "text": "BUSINESS: grocery\nArea of work: Grocery retail and supermarket-style shopping\nAbout: A friendly grocery store for everyday food, household essentials and personal-care items. Customers can browse a range of departments, check product availability and choose from the shopping and service options offered at their location.\nPhone: 1231234\nEmail: none\nOpening hours:\nMon: closed\nTue–Sun: 00:00-24:00\nWhen closed, say: We may be closed or unable to respond right now. Please check the store's confirmed opening hours and contact us during business hours for help.\nServices / products and prices:\n- Fresh produce — Prices vary (Seasonal fruit and vegetables)\n- Bakery and prepared foods — Prices vary (Selection may vary by location)\n- Meat, seafood and dairy — Prices vary (Availability may vary)\n- Pantry and packaged groceries — Prices vary (Includes everyday staples and cooking ingredients)\n- Frozen foods and beverages — Prices vary (Selection may vary)\n- Household and personal-care essentials — Prices vary (Product range may vary)\n- Online ordering and delivery — Availability and fees vary (Options depend on location)\nPayment: Cash, debit and credit cards, and supported digital payment methods; available options may vary by location and at checkout.\nDelivery: Delivery or pickup options may be available depending on location and product availability. Fees, service areas, time slots and minimum order requirements need confirmation.\nPolicies: Returns and refunds are handled under the store's published policy and applicable consumer laws. Receipt or proof of purchase may be needed; conditions can vary by product, especially for perishable, opened or temperature-sensitive goods. Any warranty coverage depends on the product and its stated terms.\nDocuments:\n## Departments\n## Fresh food\nShop for fruit, vegetables, meat, seafood, dairy, eggs and bakery items. Selection and availability may vary by store and season.\n\n## Pantry and packaged groceries\nFind staples, cooking ingredients, snacks, breakfast foods, canned goods and other everyday grocery items.\n\n## Frozen foods and beverages\nBrowse frozen meals, desserts, ice and a range of hot and cold drinks, subject to local selection.\n\n## Household and personal care\nLook for cleaning supplies, paper goods, toiletries and other everyday essentials.\n\n## Product availability\nFor current stock, substitutions or a specific product, contact the store or check the available shopping channels. Prices and offers should be confirmed at the store or checkout.\n\n## Products and services\n## Products\nThe store offers a supermarket-style selection of fresh foods, packaged groceries, beverages, frozen products, household essentials and personal-care items. Brand, size, ingredients, availability and price can vary by location and over time.\n\n## Additional services\nOnline ordering, pickup, delivery, prepared foods or other services may be available depending on the store. Confirm local availability, service terms and any applicable fees before ordering.\n\n## Product questions\nFor ingredient, allergen, dietary or product-specific information, check the packaging or ask a team member. Do not rely on a general description when a specific safety or dietary detail matters.\n\n## Ordering\n## In-store shopping\nChoose products in store and review prices and applicable offers before paying. Availability and pricing may change.\n\n## Online orders\nWhere online ordering is offered, select products, review any substitutions and confirm the order details at checkout. The checkout should show the current total, available fulfillment options and any applicable charges before the order is placed.\n\n## Changes and cancellations\nChanges to an order may depend on its preparation or fulfillment status. Contact the store or the ordering channel as soon as possible to ask whether a change or cancellation is still possible.\n\n## Delivery\n## Availability\nDelivery and pickup may be offered in some areas. Service coverage, available time slots and eligible products depend on the location and current operations.\n\n## Fees and order requirements\nAny delivery fee, minimum order, service charge or other applicable condition should be shown before an order is confirmed. Confirm these details at checkout; do not assume a fee or threshold.\n\n## Receiving an order\nCheck the order when it arrives. If an item is missing, damaged, incorrect or unsuitable, contact customer service promptly with the order details and any relevant photos.\n\n## Payment\n## Payment options\nPayment may be made using the methods supported by the store or ordering channel, such as cash, debit or credit cards, and supported digital payment methods. Options can vary by location and channel.\n\n## Before paying\nReview the total and any applicable charges before completing a purchase. For an online order, the available payment methods should be displayed at checkout.\n\n## Returns and refunds\n## Requesting help\nKeep the receipt or order confirmation and contact the store if an item is faulty, damaged, incorrect or otherwise not as expected. Explain the issue and provide the purchase details so the team can review it.\n\n## Product conditions\nReturn eligibility and refund options depend on the store's published policy and applicable law. Perishable, opened, temperature-sensitive or safety-sealed items may have special conditions. Product-specific warranty coverage, where applicable, follows the terms supplied with that product.\n\n## Review\nThe store should explain the available resolution after reviewing the item and purchase. Do not promise a refund, exchange or warranty outcome before the applicable terms have been confirmed.\n\n## Loyalty and offers\n## Loyalty options\nIf a loyalty program is available, its enrollment requirements, benefits and redemption rules should be provided in the program terms. Customers should check that their account or membership is applied before completing a qualifying purchase.\n\n## Promotions\nOffers may have eligibility rules, product exclusions and start or end dates. Check the current offer details at the store or checkout. Availability and prices can change, and an offer should not be represented as active unless its dates and terms are confirmed.\n\n## Customer service\n## Getting assistance\nCustomers can ask the store team for help with product information, stock availability, orders, delivery, payments, returns or refunds. For order-related questions, provide the order number or purchase details where available.\n\n## Escalation\nIf an issue needs review by a person, collect a concise description of the request and relevant purchase details, then pass it to the appropriate team. Avoid promising a response time or outcome unless confirmed by the business.\n\n## Safety and product information\nFor urgent food-safety concerns, allergies or product reactions, direct the customer to the product packaging and an appropriate qualified professional, and escalate the concern to the store team.\nFrequently asked questions:\nQ: What products does grocery sell?\nA: grocery offers a supermarket-style range that may include fresh food, pantry groceries, frozen products, beverages, household essentials and personal-care items. Selection varies by location.\nQ: How can I check whether an item is in stock?\nA: Availability can change. Check the store's available shopping channels or contact the store with the product name and any useful details, such as brand or size.\nQ: How much do products cost?\nA: Prices vary by product and location. Check the shelf price or the current price shown at checkout; online totals should be reviewed before placing an order.\nQ: Can I order online or get groceries delivered?\nA: Online ordering, pickup or delivery may be available depending on your location. Check the available options and terms for your area.\nQ: What are the delivery fees?\nA: Fees and any minimum order requirements depend on the service and location. Review the charges shown before confirming your order.\nQ: Which payment methods are accepted?\nA: Available methods may vary by location and shopping channel. Check with the store or review the options shown at checkout.\nQ: Can I return an item or get a refund?\nA: Return and refund eligibility depends on the store's policy, the product and applicable law. Keep your receipt or order confirmation and contact the store to have your case reviewed.\nQ: Does grocery have a loyalty program?\nA: A loyalty program or offers may be available. Ask the store or check its current customer information for confirmed enrollment details and terms.\nQ: What should I do if an item is missing or damaged in my order?\nA: Contact the store or ordering channel promptly with your order details and explain what is missing or damaged. The team can review the issue and available next steps.\nQ: When is the store open?\nA: Opening hours have not been provided. Please confirm the hours with the store before visiting.\nHow to handle this business's clients:\nFor product, stock, price, offer, delivery, return or refund questions, share only confirmed information. Escalate food-safety, allergy and product-quality concerns to a team member; do not guarantee an outcome or response time without confirmation.\nTone: friendly.\n\nKeywords that start a chat with this business (new leads): grocery, supermarket, electronics, shop\nWhen the assistant cannot answer, the client is asked whether to pass the question to the team; when they say yes, or when the client asks for a person, a ticket is opened for this business: 0 staff member(s) are assigned (names and numbers are not published); the ticket goes to the available person with the least work. The client is told the ticket number and, once it is assigned, who has it.\nLimit: 10 customer messages per customer per day."
  },
  {
   "id": "khadraglass",
   "name": "khadraglass",
   "page": "https://ai2.vastlb.net/docs/28d7214129921e77048fbf82/business/khadraglass.txt",
   "text": "BUSINESS: khadraglass\nTone: friendly.\n\nKeywords that start a chat with this business (new leads): (none)\nWhen the assistant cannot answer, the client is asked whether to pass the question to the team; when they say yes, or when the client asks for a person, a ticket is opened for this business: 0 staff member(s) are assigned (names and numbers are not published); the ticket goes to the available person with the least work. The client is told the ticket number and, once it is assigned, who has it.\nLimit: 40 customer messages per customer per day."
  },
  {
   "id": "vastlb",
   "name": "vastlb",
   "page": "https://ai2.vastlb.net/docs/28d7214129921e77048fbf82/business/vastlb.txt",
   "text": "BUSINESS: vastlb\nArea of work: Lebanon and the Gulf region\nAbout: VAST designs and builds websites, mobile applications, business and management systems, integrations, and digital products. It works with organizations from discovery through delivery and ongoing improvement, and manages servers and websites hosted with VAST, including renewals and related payments.\nPhone: +961 03 190044\nEmail: [email protected]\nWebsite: https://www.vastlb.com\nServices / products and prices:\n- Websites and digital platforms — Tailored quote (Websites, portals, e-commerce experiences, and web applications.)\n- Mobile applications — Tailored quote (iOS and Android applications.)\n- Workflow and management systems — Tailored quote (Custom platforms for processes, approvals, records, reporting, and operations.)\n- Integrations and automation — Tailored quote (Connections between systems, data, services, and workflows.)\n- Product design and user experience — Tailored quote (Research, workflow mapping, prototypes, interface design, and design systems.)\n- Modernization and support — Tailored quote (Improvements, integrations, performance work, new modules, and ongoing support.)\n- Server and hosted website management — Tailored quote (Management and support for servers and websites hosted with VAST, including renewal and related payment handling; confirm scope and terms with VAST.)\n- Go Shop — From USD 49 / month (Rental starting price; scope and package terms apply.)\n- Go School — From USD 2.99 / month (Package starting price; confirm scope and terms.)\n- Go Trak — From USD 53.92 / month (Package starting price; confirm scope and terms.)\n- Go POS — From USD 79 / month (Package starting price; confirm scope and terms.)\nPayment: Payment and commercial arrangements depend on the selected product or project scope. VAST manages renewals and related payments for servers and websites it hosts; confirm account-specific amounts, due\nDelivery: Digital solutions are scoped to the project. VAST describes a process of discovery, definition, design, building, integration and testing, followed by launch and continued improvement. Confirm timelines and deliverables for each project.\nDocuments:\n## About VAST\nVAST is a digital product and software development partner founded in Lebanon. It works with organizations in Lebanon and across the Gulf region, creating digital solutions around how their teams and customers work. Its mission is to turn ideas, workflows, and business requirements into reliable, connected, and scalable digital solutions.\n\nAreas of work include websites and digital platforms, mobile applications, workflow and management systems, integrations and automation, product design and user experience, and modernization and support. VAST also offers ready solutions including Go Shop, Go School, Go Trak, and Go POS.\n\n## Services and solutions\nWebsites and digital platforms: websites, portals, e-commerce experiences, and web applications.\n\nMobile applications: iOS and Android experiences for customers, employees, services, and business operations.\n\nWorkflow and management systems: custom platforms for processes, approvals, users, tasks, documents, reporting, resources, and operations.\n\nIntegrations and automation: system connections, APIs, connectors, webhooks, workflow automation, synchronization, and monitoring.\n\nProduct design and user experience: research, journey and workflow mapping, information architecture, prototypes, interface design, and validation.\n\nModernization and support: technical and experience audits, refactoring, performance and security improvements, integrations, new modules, and ongoing support.\n\nReady solutions include Go Shop for commerce, Go School for school operations, Go Trak for workforce coordination, and Go POS for sales and store operations. Suitability and scope should be confirmed with VAST.\n\n## Packages and pricing\nVAST publishes starting prices for selected ready solutions: Go Shop from USD 49 per month, Go School from USD 2.99 per month, Go Trak from USD 53.92 per month, and Go POS from USD 79 per month. These are package starting prices; confirm the applicable package and current scope with VAST.\n\nGo Shop also lists rental packages starting at USD 49, USD 99, and USD 199 per month, with setup fees of USD 250, USD 500, and USD 1,000 respectively. Its purchase packages start at USD 1,500, USD 3,000, and USD 6,000. Final scope is confirmed with the customer. Third-party services, transaction charges, messaging, specialist integrations, equipment, and hardware may be priced separately when required.\n\nCustom services and projects are quoted according to scope. Do not promise a final price without confirming the customer’s requirements with VAST.\n\n## Project inquiry and delivery\nWhen a customer makes an inquiry, ask about their goals, context, timing, users, workflows, and systems involved. VAST reviews the details, shapes the scope, and discusses a suitable next step or proposal.\n\nThe described delivery process is: discover the business, users, goals, and workflows; define requirements, priorities, scope, and approach; design workflows and experiences; build the solution; integrate and test; then launch, support adoption, collect feedback, and continue improving. Confirm project-specific deliverables, timeline, support, and commercial terms directly with VAST.\n\nCustomers should not include passwords or sensitive information in an inquiry.\n\n## Hosting, server and website support\nVAST manages servers and websites hosted with VAST and provides related support. Customers can contact VAST about a hosting or website issue, or to ask about the service associated with their account. The exact coverage, applicable charges, and support arrangements depend on the service; confirm them with VAST. Do not send passwords or other sensitive access details in an inquiry.\n\n## Hosting renewals and payments\nVAST manages renewals and related payments for servers and websites it hosts. For account-specific renewal status, amount, due date, payment method, or terms, contact VAST for confirmation. Do not assume an amount or deadline without checking the applicable account or renewal notice.\nFrequently asked questions:\nQ: Where does VAST work?\nA: VAST is based in Lebanon and works with organizations in Lebanon and across the Gulf region.\nQ: What ready-made solutions does VAST offer?\nA: The website lists Go Shop for commerce, Go School for school operations, Go Trak for workforce coordination, and Go POS for sales and store operations. Contact VAST to check which solution fits your needs.\nQ: How much do VAST services cost?\nA: Custom work is quoted according to scope. The website lists starting package prices for selected ready solutions; the applicable package and final scope should be confirmed with VAST.\nQ: How do I request a project or proposal?\nA: Share your goals, context, and timing through the inquiry form on the website, or contact VAST by email or phone. VAST will review the details and discuss a suitable next step.\nQ: What languages can VAST support?\nA: The website says VAST works primarily in English, with Arabic and French support according to the client and audience.\nQ: How long will my project take?\nA: Timelines depend on the confirmed scope and requirements. Ask VAST to discuss a project-specific schedule.\nQ: What does VAST do?\nA: VAST designs and builds websites, mobile applications, business systems, integrations, and digital products. It also offers product design, modernization, and support, and manages servers and websites hosted with VAST, including renewals and related payments.\nQ: Can VAST help with a server or website hosted with VAST?\nA: Yes. VAST manages servers and websites hosted with VAST and can assist with related support. Contact VAST with a brief description of the issue and the service or website involved. Confirm the applicable support scope and terms with VAST, and do not send passwords or sensitive access details.\nQ: Does VAST manage hosting renewals and payments?\nA: VAST manages renewals and related payments for servers and websites it hosts. Contact VAST to confirm your account’s renewal status, amount, due date, payment method, and terms.\nHow to handle this business's clients:\nFor custom projects, avoid guaranteeing price, timeline, deliverables, payment terms, or support commitments before VAST confirms the scope. The published package prices are starting prices and may not represent the final cost. Do not ask customers to submit passwords or sensitive information through an inquiry.\nFor server, hosted-website, renewal, or payment inquiries, ask which service, website, or account the customer means and request a brief description of their question or issue. Do not promise a fix, support response time, renewal amount, due date, or payment method unless VAST has confirmed it for that account. Never request passwords or sensitive access details in chat; route account-specific questions to VAST for confirmation.\nTone: friendly.\nLanguages: English, Arabic, and French support according to the client and audience..\n\nKeywords that start a chat with this business (new leads): vastlb, vast, websites, mobile apps, business systems, تصميم تطبيقات, أنظمة الأعمال, server management, website hosting, website support, renewals, إدارة الخوادم, استضافة المواقع\nWhen the assistant cannot answer, the client is asked whether to pass the question to the team; when they say yes, or when the client asks for a person, a ticket is opened for this business: 0 staff member(s) are assigned (names and numbers are not published); the ticket goes to the available person with the least work. The client is told the ticket number and, once it is assigned, who has it.\nLimit: 40 customer messages per customer per day."
  },
  {
   "id": "sisters-glow",
   "name": "Sisters Glow",
   "page": "https://ai2.vastlb.net/docs/28d7214129921e77048fbf82/business/sisters-glow.txt",
   "text": "BUSINESS: Sisters Glow\nArea of work: Beauty and skincare shop\nHow to handle this business's clients:\nAlways list 3 options of the product the client is searching for. The most expensive to the least expensive. But list option each in a seperate messsage and not in a single message.So you send option 1 then you send option 2 then you send option 3. one at a time.\nalways provide a link of the products when liisting or provide an image.\nWhen listing always list first instock options.\nTone: friendly.\nLanguages: English, Arabic (Lebanese), Arabizi.\n\nKeywords that start a chat with this business (new leads): cosemetics cream makeup founda\nWhen the assistant cannot answer, the client is asked whether to pass the question to the team; when they say yes, or when the client asks for a person, a ticket is opened for this business: 0 staff member(s) are assigned (names and numbers are not published); the ticket goes to the available person with the least work. The client is told the ticket number and, once it is assigned, who has it.\nLimit: 40 customer messages per customer per day."
  }
 ]
}