Rewrote the AI engine to actually run tools instead of just talking about them. Key changes:- Tool system rework: Tools now use usage.md for documentation — loaded automatically and fed into the AI’s system prompt so it knows exactly how and when to use each tool. Added usage field to ToolDefinition. Created extras/tools/ping/usage.md with explicit usage rules.- Two-pass AI response: The AI first analyzes the ticket and selects tools. Non-approval tools execute inline, then a second AI call (composeResponse) writes the actual customer message based on the real tool results — no more guessing “we checked” before the tool runs.- Schema validation: Tools with missing required params are silently skipped instead of failing loudly and appending errors to responses.- Per-tool tracking: Every tool execution now creates an AiAction record (even non-approval ones), so the admin UI can show individual tool calls with status, input, and output per ticket.- Admin UI tools display: Tools appear under the customer profile in the ticket detail sidebar — each call shows tool name, status badge (completed/failed/pending), and output message.- SLA fields: Added slaResponseTime and slaResolutionTime (in minutes) to both Customer and Organization models. Displayed formatted (e.g. “1h 30m”) under the customer profile. Added formatSla and parseSlaInput utilities.- CSAT: Added csatScore, csatSentAt, csatRespondedAt to the Ticket model. Admin can close a ticket and rate satisfaction (1-5 stars). CSAT score displays when ticket is closed.- Decision logic fixes: Fixed decide() to handle request_approval explicitly. When non-approval tools run, ticket stays Open instead of auto-resolving or going to Pending — keeps the conversation flowing for follow-up messages. Fixed addMessage skip logic that was preventing AI re-processing when the status was AiPending. Removed “Resolved” from terminal statuses in the re-trigger check.