Files
jarvis/public_html/api.php
T
myron 5d5eb2fdac feat: complete calendar integration + planner widget + 298 new KB intents
- Add calendar sync route to api.php (/api/calendar → calendar_sync.php)
- Add CALENDAR SYNC tab to admin with feed CRUD (add/edit/delete Google/ICS feeds)
- Add cal_sync_now action to admin for on-demand iCloud/Google sync
- Add cron: calendar_sync.php every 15 min (iCloud CalDAV + ICS feeds)
- Add PLANNER mini panel to index.html (left panel, shows today tasks + appointments)
- Update loadPlannerSummary() to render tasks/appts with priority dots and times
- Seed 298 new KB intents across 37 categories: science, history, tech, geography,
  math, health, food, space, philosophy, psychology, sports, music, film, travel,
  language, literature, finance, productivity, nature, facts, home automation,
  architecture, geopolitics, and more — 543 total intents
2026-05-31 22:47:35 +00:00

109 lines
3.4 KiB
PHP

<?php
/**
* JARVIS API Router
*/
require_once __DIR__ . '/../api/config.php';
require_once __DIR__ . '/../api/lib/db.php';
require_once __DIR__ . '/../api/lib/kb_engine.php';
session_start();
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, X-Session-Token');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }
$uri = $_SERVER['REQUEST_URI'] ?? '/';
$method = $_SERVER['REQUEST_METHOD'];
$path = trim(parse_url($uri, PHP_URL_PATH), '/');
$parts = explode('/', $path);
// Remove 'api' prefix if present
if (($parts[0] ?? '') === 'api') array_shift($parts);
$endpoint = $parts[0] ?? '';
$action = $parts[1] ?? '';
// Auth check (except login and ping)
if ($endpoint !== 'auth' && $endpoint !== 'agent' && $endpoint !== 'netscan') {
$token = $_SESSION['jarvis_token'] ?? ($_SERVER['HTTP_X_SESSION_TOKEN'] ?? '');
if (empty($token) || $token !== ($_SESSION['jarvis_token'] ?? '')) {
$localIP = $_SERVER['REMOTE_ADDR'] ?? '';
$isLocal = in_array($localIP, ['127.0.0.1', '::1', JARVIS_IP]);
if (!$isLocal && $endpoint !== 'ping') {
http_response_code(401);
echo json_encode(['error' => 'Unauthorized', 'code' => 401]);
exit;
}
}
}
if ($endpoint !== 'auth') session_write_close(); // Skip for auth so login can write session token
$body = file_get_contents('php://input');
$data = json_decode($body, true) ?? [];
switch ($endpoint) {
case 'ping':
echo json_encode(['status' => 'online', 'time' => date('c'), 'codename' => JARVIS_CODENAME]);
break;
case 'auth':
require __DIR__ . '/../api/endpoints/auth.php';
break;
case 'chat':
require __DIR__ . '/../api/endpoints/chat.php';
break;
case 'system':
require __DIR__ . '/../api/endpoints/system.php';
break;
case 'netscan':
require __DIR__ . '/../api/endpoints/netscan.php';
break;
case 'network':
require __DIR__ . '/../api/endpoints/network.php';
break;
case 'proxmox':
require __DIR__ . '/../api/endpoints/proxmox.php';
break;
case 'ha':
require __DIR__ . '/../api/endpoints/ha.php';
break;
case 'tts':
require __DIR__ . '/../api/endpoints/tts.php';
break;
case 'email':
require __DIR__ . '/../api/endpoints/email.php';
break;
case 'do':
require __DIR__ . '/../api/endpoints/do_server.php';
break;
case 'alerts':
require __DIR__ . '/../api/endpoints/alerts.php';
break;
case 'facts':
require __DIR__ . '/../api/endpoints/facts_collector.php';
break;
case 'weather':
require __DIR__ . '/../api/endpoints/weather.php';
break;
case 'news':
require __DIR__ . '/../api/endpoints/news.php';
break;
case 'sites':
require __DIR__ . '/../api/endpoints/sites.php';
break;
case "agent":
require __DIR__ . '/../api/endpoints/agent.php';
break;
case "planner":
require __DIR__ . '/../api/endpoints/planner.php';
break;
case "calendar":
require __DIR__ . '/../api/endpoints/calendar_sync.php';
break;
default:
http_response_code(404);
echo json_encode(['error' => 'Unknown endpoint: ' . $endpoint]);
}