Files
jarvis/public_html/api.php
T
myron 27a0259e64 Phase 10: Memory Core — auto-extraction knowledge graph
- reactor.py v9.0.0+: memory_extract + memory_store handlers (21 handlers)
  - handle_memory_extract: Haiku-powered fact extraction from conversations
  - handle_memory_store: explicit memory insertion from voice commands
  - FastAPI: /memory/facts CRUD, /memory/context (relevance retrieval), /memory/stats
- chat.php: Tier 0.9k voice commands (remember/forget/recall/memory status)
  - Memory context injected into Groq + Claude system prompts
  - Auto-trigger memory_extract after every LLM response (async, non-blocking)
- memory.php: new API endpoint proxying Arc Reactor memory routes
- api.php: added memory route
- admin/index.php: MEMORY CORE nav + tab (browse by category, search, add/delete facts)
- index.html: MEMORY count in bottom bar (polls every 60s)
2026-06-11 12:33:05 +00:00

118 lines
3.7 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 "arc":
require __DIR__ . "/../api/endpoints/arc.php";
break;
case "directives":
require __DIR__ . "/../api/endpoints/directives.php";
break;
case "memory":
require __DIR__ . "/../api/endpoints/memory.php";
break;
case "calendar":
require __DIR__ . '/../api/endpoints/calendar_sync.php';
break;
default:
http_response_code(404);
echo json_encode(['error' => 'Unknown endpoint: ' . $endpoint]);
}