81 lines
2.8 KiB
PHP
81 lines
2.8 KiB
PHP
<?php
|
|
// OPUS5 TASK-LOG - universal session tracker for WEVIA chats + actions
|
|
// GET: list recent tasks, filter by session/user/intent
|
|
// POST: append a task event
|
|
// Storage: /tmp/opus5-task-log.jsonl (rolling append, last 10000 lines)
|
|
|
|
header('Content-Type: application/json');
|
|
header('Access-Control-Allow-Origin: *');
|
|
|
|
$LOG = '/tmp/opus5-task-log.jsonl';
|
|
$MAX_LINES = 10000;
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$raw = file_get_contents('php://input');
|
|
$in = @json_decode($raw, true) ?: [];
|
|
$event = [
|
|
'ts' => date('c'),
|
|
'session' => $in['session'] ?? 'anon',
|
|
'user' => $in['user'] ?? 'yacine',
|
|
'type' => $in['type'] ?? 'chat',
|
|
'intent' => $in['intent'] ?? null,
|
|
'provider' => $in['provider'] ?? null,
|
|
'message' => substr((string)($in['message'] ?? ''), 0, 500),
|
|
'response' => substr((string)($in['response'] ?? ''), 0, 1000),
|
|
'ms' => $in['ms'] ?? null,
|
|
'status' => $in['status'] ?? 'ok',
|
|
];
|
|
$line = json_encode($event, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES) . "\n";
|
|
@file_put_contents($LOG, $line, FILE_APPEND | LOCK_EX);
|
|
|
|
// Trim if needed
|
|
if (file_exists($LOG) && filesize($LOG) > 8 * 1024 * 1024) { // > 8MB
|
|
$lines = @file($LOG, FILE_IGNORE_NEW_LINES);
|
|
if ($lines && count($lines) > $MAX_LINES) {
|
|
$lines = array_slice($lines, -$MAX_LINES);
|
|
@file_put_contents($LOG, implode("\n", $lines) . "\n");
|
|
}
|
|
}
|
|
|
|
http_response_code(200);
|
|
echo json_encode(['ok' => true, 'logged' => $event]);
|
|
exit;
|
|
}
|
|
|
|
// GET: retrieve events
|
|
$limit = max(1, min((int)($_GET['limit'] ?? 50), 500));
|
|
$session = $_GET['session'] ?? '';
|
|
$intent = $_GET['intent'] ?? '';
|
|
$type = $_GET['type'] ?? '';
|
|
|
|
if (!file_exists($LOG)) {
|
|
echo json_encode(['events' => [], 'total' => 0]);
|
|
exit;
|
|
}
|
|
|
|
$lines = @file($LOG, FILE_IGNORE_NEW_LINES) ?: [];
|
|
$events = [];
|
|
foreach (array_reverse($lines) as $line) {
|
|
$e = @json_decode($line, true);
|
|
if (!is_array($e)) continue;
|
|
if ($session && ($e['session'] ?? '') !== $session) continue;
|
|
if ($intent && ($e['intent'] ?? '') !== $intent) continue;
|
|
if ($type && ($e['type'] ?? '') !== $type) continue;
|
|
$events[] = $e;
|
|
if (count($events) >= $limit) break;
|
|
}
|
|
|
|
// Also stats
|
|
$stats = ['total_lines' => count($lines), 'returned' => count($events)];
|
|
$intents_seen = [];
|
|
foreach (array_slice($lines, -200) as $line) {
|
|
$e = @json_decode($line, true);
|
|
if (!is_array($e)) continue;
|
|
$int = $e['intent'] ?? '?';
|
|
$intents_seen[$int] = ($intents_seen[$int] ?? 0) + 1;
|
|
}
|
|
arsort($intents_seen);
|
|
$stats['top_intents_last_200'] = array_slice($intents_seen, 0, 10);
|
|
|
|
echo json_encode(['events' => $events, 'stats' => $stats], JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
|