Files
Andy DixonandClaude Sonnet 5 1a380a0e99 Rebrand: Nexus Terminal → Alchementary Link
Renames the product across the codebase: Go module path, config/data
paths, keychain service name, export file extension, build tooling,
docs, and UI text. Sidebar brand mark now reads ">_ AlchementaryLink"
with "Alchementary" in the connection-group gold accent colour, and
the window title is "Alchementary Link".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019T8bJS8BCtY5GeSG2HBj1n
2026-09-03 16:41:23 +01:00

308 lines
11 KiB
PHP

<?php
$platform = isset($_GET['platform']) ? $_GET['platform'] : '';
$arch = isset($_GET['arch']) ? $_GET['arch'] : '';
$platform = preg_replace('/[^a-z0-9_-]/i', '', $platform);
$arch = preg_replace('/[^a-z0-9_-]/i', '', $arch);
$manifestPath = __DIR__ . '/manifest.json';
$versionPath = __DIR__ . '/version.txt';
$manifestFiles = glob(__DIR__ . '/manifest-*-*.json') ?: [];
if ($platform && $arch) {
$manifestPath = __DIR__ . '/manifest-' . $platform . '-' . $arch . '.json';
$versionPath = __DIR__ . '/version-' . $platform . '-' . $arch . '.txt';
}
$accept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : '';
$format = isset($_GET['format']) ? strtolower($_GET['format']) : '';
$wantsJson = $format === 'json' || strpos($accept, 'application/json') !== false;
$wantsVersion = $format === 'version';
$manifest = null;
if (is_readable($manifestPath)) {
$raw = file_get_contents($manifestPath);
$decoded = json_decode($raw, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) {
$manifest = $decoded;
}
}
$allManifests = [];
foreach ($manifestFiles as $path) {
$raw = file_get_contents($path);
$decoded = json_decode($raw, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) {
$allManifests[] = $decoded;
}
}
if ($wantsJson) {
header('Content-Type: application/json; charset=utf-8');
if ($manifest) {
echo json_encode($manifest, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
} else {
http_response_code(503);
echo json_encode(['error' => 'manifest unavailable'], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
}
exit;
}
if ($wantsVersion) {
header('Content-Type: text/plain; charset=utf-8');
if ($manifest && !empty($manifest['latestVersion'])) {
echo $manifest['latestVersion'];
} elseif (is_readable($versionPath)) {
echo trim(file_get_contents($versionPath));
} else {
http_response_code(503);
echo 'unknown';
}
exit;
}
if ($platform && $arch && $format === 'download') {
if ($manifest && !empty($manifest['files'][0]['url'])) {
header('Location: ' . $manifest['files'][0]['url'], true, 302);
} else {
http_response_code(404);
echo 'download not available';
}
exit;
}
function h($value)
{
return htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8');
}
function formatSize($bytes)
{
if (!is_numeric($bytes)) {
return '';
}
$bytes = (float)$bytes;
$units = ['B', 'KB', 'MB', 'GB'];
$i = 0;
while ($bytes >= 1024 && $i < count($units) - 1) {
$bytes /= 1024;
$i++;
}
return number_format($bytes, $i === 0 ? 0 : 2) . ' ' . $units[$i];
}
$latest = $manifest && isset($manifest['latestVersion']) ? $manifest['latestVersion'] : 'unknown';
$published = $manifest && isset($manifest['publishedAt']) ? $manifest['publishedAt'] : '';
$platformLabel = $platform && $arch ? strtoupper($platform) . ' / ' . $arch : '';
$files = $manifest && isset($manifest['files']) && is_array($manifest['files']) ? $manifest['files'] : [];
$rows = [];
if (!$platform && !$arch) {
foreach ($allManifests as $entry) {
$file = isset($entry['files'][0]) ? $entry['files'][0] : null;
if (!$file) {
continue;
}
$rows[] = [
'platform' => isset($file['platform']) ? $file['platform'] : '',
'arch' => isset($file['arch']) ? $file['arch'] : '',
'version' => isset($entry['latestVersion']) ? $entry['latestVersion'] : 'unknown',
'size' => isset($file['size']) ? $file['size'] : '',
'url' => isset($file['url']) ? $file['url'] : '',
'filename' => isset($file['filename']) ? $file['filename'] : '',
];
}
usort($rows, function ($a, $b) {
$ka = $a['platform'] . '/' . $a['arch'] . '/' . $a['version'];
$kb = $b['platform'] . '/' . $b['arch'] . '/' . $b['version'];
return strcmp($ka, $kb);
});
}
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Alchementary Link Downloads</title>
<style>
:root {
--bg: #111318;
--panel: #1b1e24;
--text: #e7e9ee;
--muted: #9aa2b2;
--accent: #4ecdc4;
}
body {
margin: 0;
font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, sans-serif;
background: var(--bg);
color: var(--text);
}
.wrap {
max-width: 960px;
margin: 0 auto;
padding: 32px 20px 60px;
}
h1 {
margin: 0 0 6px;
font-size: 28px;
}
.meta {
color: var(--muted);
font-size: 14px;
margin-bottom: 24px;
}
.card {
background: var(--panel);
border: 1px solid #2a2f3a;
border-radius: 12px;
padding: 20px;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 12px;
}
th,
td {
text-align: left;
padding: 10px 8px;
border-bottom: 1px solid #2a2f3a;
font-size: 14px;
}
th {
color: var(--muted);
font-weight: 600;
}
a {
color: var(--accent);
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
.badge {
display: inline-block;
padding: 2px 8px;
border-radius: 999px;
background: rgba(78, 205, 196, 0.12);
color: var(--accent);
font-size: 12px;
}
.empty {
color: var(--muted);
}
</style>
</head>
<body>
<div class="wrap">
<h1>Alchementary Link Downloads</h1>
<div class="meta">Latest version: <span class="badge"><?php echo h($latest); ?></span><?php if ($platformLabel) {
echo ' • ' . h($platformLabel);
} ?><?php if ($published) {
echo ' • Published ' . h($published);
} ?></div>
<div class="card">
<h2 style="margin:0 0 10px;font-size:18px;">Release files</h2>
<?php if (!$platform && !$arch) { ?>
<?php if (empty($rows)) { ?>
<div class="empty">No release files available.</div>
<?php } else { ?>
<table>
<thead>
<tr>
<th>Platform</th>
<th>CPU</th>
<th>Version</th>
<th>Size</th>
<th>Download</th>
</tr>
</thead>
<tbody>
<?php foreach ($rows as $row) { ?>
<?php
$downloadLink = '';
if ($row['platform'] && $row['arch']) {
$downloadLink = '?platform=' . urlencode($row['platform']) . '&arch=' . urlencode($row['arch']) . '&format=download';
}
?>
<tr>
<td><?php echo h($row['platform']); ?></td>
<td><?php echo h($row['arch']); ?></td>
<td><?php echo h($row['version']); ?></td>
<td><?php echo h(formatSize($row['size'])); ?></td>
<td>
<?php if ($downloadLink) { ?>
<a href="<?php echo h($downloadLink); ?>">Download</a>
<?php } else { ?>
<?php echo h($row['filename']); ?>
<?php } ?>
</td>
</tr>
<?php } ?>
</tbody>
</table>
<?php } ?>
<?php } else { ?>
<?php if (empty($files)) { ?>
<div class="empty">No release files available.</div>
<?php } else { ?>
<table>
<thead>
<tr>
<th>Platform</th>
<th>Arch</th>
<th>File</th>
<th>Size</th>
<th>SHA-256</th>
</tr>
</thead>
<tbody>
<?php foreach ($files as $file) {
$platform = isset($file['platform']) ? $file['platform'] : '';
$arch = isset($file['arch']) ? $file['arch'] : '';
$filename = isset($file['filename']) ? $file['filename'] : '';
$url = isset($file['url']) ? $file['url'] : '';
$size = isset($file['size']) ? $file['size'] : '';
$sha = isset($file['sha256']) ? $file['sha256'] : '';
?>
<tr>
<td><?php echo h($platform); ?></td>
<td><?php echo h($arch); ?></td>
<td>
<?php if ($url) { ?>
<a href="<?php echo h($url); ?>"><?php echo h($filename); ?></a>
<?php } else { ?>
<?php echo h($filename); ?>
<?php } ?>
</td>
<td><?php echo h(formatSize($size)); ?></td>
<td style="font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; color: var(--muted);">
<?php echo h($sha); ?>
</td>
</tr>
<?php } ?>
</tbody>
</table>
<?php } ?>
<?php } ?>
</div>
</div>
</body>
</html>