feat: add automation, reminders, notifications, msg search, session export, image analysis, host exec, PWA, Docker, E2E, CI/CD
Cyrene CI / backend (push) Has been cancelled
Cyrene CI / frontend (push) Has been cancelled

- Automation: rules CRUD (in-memory store + API)
- Reminders: CRUD (in-memory store + API)
- Notifications: push interface for future push server
- Message search: API endpoint with DB-backed query
- Session export: /sessions/:id/export → Markdown
- Image analysis: API stub for multimodal LLM
- Host exec: API stub for Docker sandbox
- PWA: manifest.json + service worker
- Docker: Dockerfile + docker-compose.yml
- E2E: Playwright test scaffold
- CI/CD: GitHub Actions workflow (go test + tsc)
This commit is contained in:
Aska committed 2026-08-12 19:43:46 +08:00
1 parent 3f9c4ca3c3
commit dee48b6766
11 files changed
+360

No files matched your search

+1
View File
@@ -4,6 +4,7 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="icon" type="image/png" href="/images/cyrene-avatar.png" />
<link rel="manifest" href="/manifest.json" />
<title>Cyrene — 昔涟</title>
</head>
<body class="bg-gray-950 text-gray-100">
+12
View File
@@ -0,0 +1,12 @@
{
"name": "Cyrene",
"short_name": "Cyrene",
"description": "LLM-powered AI companion platform",
"start_url": "/",
"display": "standalone",
"background_color": "#242424",
"theme_color": "#3482FF",
"icons": [
{ "src": "/images/cyrene-avatar.png", "sizes": "512x512", "type": "image/png" }
]
}
+6
View File
@@ -0,0 +1,6 @@
// Cyrene PWA Service Worker
const CACHE = 'cyrene-v2'
const URLS = ['/', '/index.html', '/images/cyrene-avatar.png']
self.addEventListener('install', e => e.waitUntil(caches.open(CACHE).then(c => c.addAll(URLS))))
self.addEventListener('fetch', e => e.respondWith(caches.match(e.request).then(r => r || fetch(e.request))))
+5
View File
@@ -5,6 +5,11 @@ import App from './App'
import './index.css'
import './store/themeStore' // Initialize theme (light mode default, follows system)
// Register PWA service worker
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
}
createRoot(document.getElementById('root')!).render(
<StrictMode>
<BrowserRouter>