SIMON Master Console Rebuild
True command center for SIMON + WEB360
This rebuild gives you a cleaner production spine: interactive tree, live viewer, guarded editor, dynamic graphics, architecture map, and note storage. It is designed to sit beside your existing
console.php
and become the stronger replacement path.
Dashboard
Tree
Viewer
System Map
File Registry
Notes
Files
15,404
Folders
428
Scanned Size
3.85 GB
PHP Files
949
Editable Text Files
12,653
File viewer
guarded to /htdocs
/si/phone/route.php
<?php declare(strict_types=1); /* |-------------------------------------------------------------------------- | SI TELEPHONE ROUTER |-------------------------------------------------------------------------- | Location: /htdocs/si/phone/route.php | | Handles speech from incoming.php and always returns valid TwiML. | This file does not contain incoming-caller greeting logic. |-------------------------------------------------------------------------- */ require_once __DIR__ . '/bootstrap.php'; require_once dirname(__DIR__) . '/_core/knowledge.php'; /** * Send a valid TwiML response and stop execution. */ function si_route_respond(string $innerXml): never { si_phone_xml( '<?xml version="1.0" encoding="UTF-8"?>' . '<Response>' . $innerXml . '</Response>' ); exit; } /** * Escape spoken text for XML. */ function si_route_say(string $text): string { return '<Say voice="Polly.Matthew">' . si_phone_escape($text) . '</Say>'; } /** * Return a safe fallback response without triggering Twilio backup. */ function si_route_safe_fallback(string $message = ''): never { $message = trim($message); if ($message === '') { $message = 'I am sorry, I had trouble processing that request. ' . 'Please say what you need, or ask to leave a message.'; } $routeUrl = si_phone_escape(si_phone_base_url() . '/route.php'); si_route_respond( si_route_say($message) . '<Gather input="speech" ' . 'action="' . $routeUrl . '" ' . 'method="POST" ' . 'timeout="6" ' . 'speechTimeout="auto" ' . 'actionOnEmptyResult="true">' . si_route_say('How may I help you?') . '</Gather>' . si_route_say('Thank you for calling. Goodbye.') . '<Hangup />' ); } try { $speechRaw = trim((string) si_phone_post('SpeechResult')); $digits = trim((string) si_phone_post('Digits')); $confidence = trim((string) si_phone_post('Confidence')); $caller = trim((string) si_phone_post('From')); si_phone_log('route_request', [ 'caller' => $caller, 'speech' => $speechRaw, 'digits' => $digits, 'confidence' => $confidence, ]); if ($speechRaw !== '') { si_memory_remember( 'phone', $caller, 'caller', $speechRaw, ['confidence' => $confidence] ); } /* |-------------------------------------------------------------------------- | DTMF shortcuts |-------------------------------------------------------------------------- | 1 = transfer request | 2 = voicemail |-------------------------------------------------------------------------- */ if ($digits === '1') { si_phone_log('dtmf_transfer_requested', [ 'caller' => $caller, ]); $transferUrl = si_phone_escape( si_phone_base_url() . '/transfer.php' ); si_route_respond( si_route_say('I will connect you now.') . '<Redirect method="POST">' . $transferUrl . '</Redirect>' ); } if ($digits === '2') { $messageUrl = si_phone_escape( si_phone_base_url() . '/voicemail.php' ); $transcriptionUrl = si_phone_escape( si_phone_base_url() . '/transcription.php?notify=corporate_vm' ); si_route_respond( si_route_say( 'Please leave your name, telephone number, and message after the tone. ' . 'Press the pound key when finished.' ) . '<Record ' . 'action="' . $messageUrl . '" ' . 'method="POST" ' . 'maxLength="120" ' . 'finishOnKey="#" ' . 'playBeep="true" ' . 'trim="trim-silence" ' . 'transcribe="true" ' . 'transcribeCallback="' . $transcriptionUrl . '" ' . '/>' . '<Redirect method="POST">' . $messageUrl . '</Redirect>' ); } /* |-------------------------------------------------------------------------- | Empty speech |-------------------------------------------------------------------------- */ if ($speechRaw === '') { $incomingUrl = si_phone_escape( si_phone_base_url() . '/incoming.php' ); si_route_respond( si_route_say( 'I did not hear a request. Please say what you need.' ) . '<Redirect method="POST">' . $incomingUrl . '</Redirect>' ); } /* |-------------------------------------------------------------------------- | Explicit transfer request |-------------------------------------------------------------------------- */ $explicitTransfer = preg_match( '/\b(' . 'connect me|' . 'transfer me|' . 'put me through|' . 'let me speak|' . 'i need to speak|' . 'talk to keith|' . 'speak to keith|' . 'human representative|' . 'live person|' . 'operator' . ')\b/i', $speechRaw ) === 1; if ($explicitTransfer) { si_phone_log('explicit_transfer_requested', [ 'caller' => $caller, 'speech' => $speechRaw, ]); $transferUrl = si_phone_escape( si_phone_base_url() . '/transfer.php' ); si_route_respond( si_route_say('I will connect you now.') . '<Redirect method="POST">' . $transferUrl . '</Redirect>' ); } /* |-------------------------------------------------------------------------- | Explicit voicemail request |-------------------------------------------------------------------------- */ $explicitMessage = preg_match( '/\b(' . 'leave (a )?message|' . 'leave (a )?voicemail|' . 'record (a )?message|' . 'have keith call me|' . 'ask keith to call|' . 'send keith (a )?message' . ')\b/i', $speechRaw ) === 1; if ($explicitMessage) { si_phone_log('explicit_message_requested', [ 'caller' => $caller, 'speech' => $speechRaw, ]); $messageUrl = si_phone_escape( si_phone_base_url() . '/voicemail.php' ); $transcriptionUrl = si_phone_escape( si_phone_base_url() . '/transcription.php?notify=corporate_vm' ); si_route_respond( si_route_say( 'Please leave your name, telephone number, and message after the tone. ' . 'Press the pound key when finished.' ) . '<Record ' . 'action="' . $messageUrl . '" ' . 'method="POST" ' . 'maxLength="120" ' . 'finishOnKey="#" ' . 'playBeep="true" ' . 'trim="trim-silence" ' . 'transcribe="true" ' . 'transcribeCallback="' . $transcriptionUrl . '" ' . '/>' . '<Redirect method="POST">' . $messageUrl . '</Redirect>' ); } /* |-------------------------------------------------------------------------- | Knowledge response |-------------------------------------------------------------------------- */ $plainAnswer = ''; if (function_exists('si_knowledge_ai_answer')) { try { $plainAnswer = trim( (string) si_knowledge_ai_answer($speechRaw, $caller) ); } catch (Throwable $aiError) { si_phone_log('knowledge_ai_error', [ 'caller' => $caller, 'message' => $aiError->getMessage(), ]); $plainAnswer = ''; } } if ($plainAnswer === '' && function_exists('si_knowledge_answer')) { $plainAnswer = trim( (string) si_knowledge_answer($speechRaw, $caller) ); } if ($plainAnswer === '') { $plainAnswer = 'I do not have a verified answer yet. ' . 'You may ask another question, leave a message, or request Keith.'; } if (strlen($plainAnswer) > 2400) { $plainAnswer = substr($plainAnswer, 0, 2400); } if ($caller !== '') { si_memory_remember( 'phone', $caller, 'si', $plainAnswer ); } $routeUrl = si_phone_escape( si_phone_base_url() . '/route.php' ); si_route_respond( si_route_say($plainAnswer) . '<Gather input="speech dtmf" ' . 'action="' . $routeUrl . '" ' . 'method="POST" ' . 'numDigits="1" ' . 'timeout="6" ' . 'speechTimeout="auto" ' . 'actionOnEmptyResult="true">' . si_route_say( 'What else may I help you with? ' . 'You may also press 1 for a transfer or 2 to leave a message.' ) . '</Gather>' . si_route_say('Thank you for calling. Goodbye.') . '<Hangup />' ); } catch (Throwable $error) { try { si_phone_log('route_fatal_error', [ 'message' => $error->getMessage(), 'file' => basename($error->getFile()), 'line' => $error->getLine(), ]); } catch (Throwable $loggingError) { // Do not allow a logging failure to prevent TwiML output. } si_route_safe_fallback(); }
Save file
Quick jump
open a path
Open