Add automated session logging system
Some checks failed
Build and Deploy Docs / build-and-deploy (push) Has been cancelled

- Created logs/ structure (sessions, operations, incidents)
- Added session-start/log/end scripts
- Installed Git hooks for auto-logging commits/pushes
- Added shell integration for zsh
- Created CHANGELOG.md
- Documented today's session (2026-01-10)
This commit is contained in:
Apple
2026-01-10 04:53:17 -08:00
parent e67882fd15
commit 744c149300
260 changed files with 6364 additions and 68 deletions

View File

@@ -361,3 +361,12 @@ cat docs/tasks/PHASE3_MASTER_TASK.md | pbcopy

View File

@@ -128,3 +128,12 @@ if (errorMessage.includes('Provider error') ||

View File

@@ -614,3 +614,12 @@ await knowledgeBaseService.uploadFile("helion", file);

View File

@@ -187,3 +187,12 @@ Request body: {

View File

@@ -128,3 +128,12 @@

View File

@@ -424,3 +424,12 @@ http://localhost:8899/microdao/daarion

View File

@@ -517,3 +517,12 @@ const systemPrompt = DEFAULT_PROMPTS[agentId][language];

View File

@@ -645,3 +645,12 @@ GET /api/telegram/{agent_id}/status

View File

@@ -164,3 +164,12 @@ INFO: Selected provider: LLMProvider(id='llm_local_qwen3_8b')

View File

@@ -463,3 +463,12 @@ Remaining Work:

View File

@@ -133,3 +133,12 @@

View File

@@ -173,3 +173,12 @@

View File

@@ -310,3 +310,12 @@ export function EnergyUnionCabinetPage() {

View File

@@ -151,3 +151,12 @@

View File

@@ -384,3 +384,12 @@ Helion потребує перереєстрації webhook, інші боти

View File

@@ -1607,3 +1607,199 @@ ps aux | awk '$3 > 50'
---
### Incident #4: ALL PostgreSQL Images Show Malware — NODE1 Host Compromise Suspected (Jan 10, 2026)
**Timeline:**
- **Jan 10, 2026**: Testing postgres:16-alpine — malware artifacts found
- **Jan 10, 2026**: Testing postgres:14 (non-alpine) — malware artifacts found
- **Jan 10, 2026**: Testing postgres:16 (Debian) — malware artifacts found
**Confirmed "Compromised" Images (on NODE1):**
```bash
# ALL of these show malware artifacts when run on NODE1:
❌ postgres:15-alpine # Incident #3
❌ postgres:16-alpine # NEW
❌ postgres:14 # NEW (non-alpine!)
❌ postgres:16 # NEW (Debian base!)
```
**Malware Artifacts (IOC):**
```bash
/tmp/httpd # ~10MB, crypto miner (xmrig variant)
/tmp/.perf.c/ # perfctl malware staging directory
```
**🔴 CRITICAL ASSESSMENT:**
**This is NOT "all Docker Hub official images are infected".**
**This is most likely NODE1 HOST COMPROMISE** (perfctl/cryptominer persistence).
**Evidence supporting HOST compromise (not image compromise):**
| Evidence | Explanation |
|----------|-------------|
| `/tmp/.perf.c/` directory | Classic perfctl malware staging directory |
| `/tmp/httpd` ~10MB | Typical xmrig miner with Apache masquerade |
| ALL postgres variants affected | Statistically impossible for Docker Hub |
| NODE1 had 3 previous incidents | Already compromised (Incidents #1, #2, #3) |
| `tmpfs noexec` didn't help | Malware runs from HOST, not container |
| Same IOCs across different images | Infection happens post-pull, not in image |
**Probable Attack Vector (perfctl family):**
- Initial compromise via Incident #1 or #2 (daarion-web container)
- Persistence mechanism survived container/image cleanup
- Malware hooks into Docker daemon or uses cron/systemd
- Infects ANY new container on startup via:
- Modified docker daemon
- LD_PRELOAD injection
- Kernel module
- Cron job that monitors new containers
**🔬 VERIFICATION PROCEDURE (REQUIRED):**
```bash
# ═══════════════════════════════════════════════════════════════
# STEP 1: Get image digest from NODE1
# ═══════════════════════════════════════════════════════════════
ssh root@144.76.224.179 "docker inspect --format='{{index .RepoDigests 0}}' postgres:16"
# Example output: postgres@sha256:abc123...
# ═══════════════════════════════════════════════════════════════
# STEP 2: On CLEAN host (MacBook/NODE2), pull SAME digest
# ═══════════════════════════════════════════════════════════════
# On your MacBook (NOT NODE1!):
docker pull postgres:16@sha256:<digest_from_step1>
# ═══════════════════════════════════════════════════════════════
# STEP 3: Run on clean host and check /tmp
# ═══════════════════════════════════════════════════════════════
docker run --rm -it postgres:16@sha256:<digest> sh -c "ls -la /tmp/ && find /tmp -type f"
# EXPECTED RESULTS:
# - If /tmp is EMPTY on clean host → IMAGE IS CLEAN → NODE1 IS COMPROMISED
# - If /tmp has httpd/.perf.c on clean host → IMAGE IS COMPROMISED → Report to Docker
# ═══════════════════════════════════════════════════════════════
# STEP 4: Check NODE1 host for persistence mechanisms
# ═══════════════════════════════════════════════════════════════
ssh root@144.76.224.179 << 'REMOTE_CHECK'
echo "=== CRON ==="
crontab -l 2>/dev/null
cat /etc/crontab
ls -la /etc/cron.d/
echo "=== SYSTEMD ==="
systemctl list-units --type=service | grep -iE "perf|miner|http|crypto"
echo "=== LD_PRELOAD ==="
cat /etc/ld.so.preload 2>/dev/null
echo $LD_PRELOAD
echo "=== KERNEL MODULES ==="
lsmod | head -20
echo "=== SUSPICIOUS PROCESSES ==="
ps aux | grep -E "(httpd|xmrig|kdevtmp|kinsing|perfctl|\.perf)" | grep -v grep
echo "=== NETWORK TO MINING POOLS ==="
ss -anp | grep -E "(3333|4444|5555|8080|8888)" | head -10
echo "=== SSH AUTHORIZED KEYS ==="
cat /root/.ssh/authorized_keys
echo "=== DOCKER DAEMON CONFIG ==="
cat /etc/docker/daemon.json 2>/dev/null
REMOTE_CHECK
```
**🔴 DECISION MATRIX:**
| Verification Result | Conclusion | Action |
|---------------------|------------|--------|
| Clean host: no malware | **NODE1 COMPROMISED** | Full rebuild of NODE1 |
| Clean host: same malware | **Docker Hub compromised** | Report to Docker Security |
**If NODE1 Confirmed Compromised (most likely):**
1. 🔴 **STOP using NODE1 immediately** for any workloads
2. 🔴 **Rotate ALL secrets** that NODE1 ever accessed:
```
- SSH keys (generate new on clean machine)
- Telegram bot tokens (regenerate via @BotFather)
- PostgreSQL passwords
- All API keys in .env
- JWT secrets
- Neo4j credentials
- Redis password (if any)
```
3. 🔴 **Full OS reinstall** (not cleanup!):
- Request fresh install from Hetzner Robot
- Or use rescue mode + full disk wipe
- New SSH keys generated on clean machine
4. 🟡 **Verify images on clean host BEFORE deploying to new NODE1**
5. 🟢 **Implement proper security controls** (see Prevention below)
**Alternative PostgreSQL Sources (if Docker Hub suspected):**
```bash
# GitHub Container Registry (GHCR)
docker pull ghcr.io/docker-library/postgres:16-alpine
# Quay.io (Red Hat operated)
docker pull quay.io/fedora/postgresql-16
# Build from official Dockerfile (most secure)
git clone https://github.com/docker-library/postgres.git
cd postgres/16/alpine
docker build -t postgres:16-alpine-verified .
# Then scan with Trivy before use
trivy image postgres:16-alpine-verified
```
**NODE1 Persistence Locations to Check:**
```bash
# File-based persistence
/etc/cron.d/*
/etc/crontab
/var/spool/cron/*
/etc/systemd/system/*.service
/etc/init.d/*
/etc/rc.local
/root/.bashrc
/root/.profile
/etc/ld.so.preload
# Memory/process persistence
/dev/shm/*
/run/*
/var/run/*
# Docker-specific
/var/lib/docker/
/etc/docker/daemon.json
~/.docker/config.json
# Kernel-level (advanced)
/lib/modules/*/
/proc/modules
```
**References:**
- perfctl malware: https://blog.exatrack.com/Perfctl-using-portainer-and-new-persistences/
- Similar reports: https://github.com/docker-library/postgres/issues/1307
- Docker Hub attacks: https://jfrog.com/blog/attacks-on-docker-with-millions-of-malicious-repositories-spread-malware-and-phishing-scams/
**Lessons Learned (Incident #4 Specific):**
1. 🔴 **Host compromise masquerades as image compromise** — Always verify on clean host
2. 🟡 **Previous incidents leave persistence** — Cleanup is not enough, rebuild required
3. 🟢 **perfctl family is sophisticated** — Survives container restarts, image deletions
4. 🔵 **Multiple images "infected" = host problem** — Statistical impossibility otherwise
5. 🟣 **NODE1 is UNTRUSTED** — Do not use until full rebuild + verification
**Current Status:**
-**Verification pending** — Need to test same digest on clean host
- 🔴 **NODE1 unsafe** — Do not deploy PostgreSQL or any new containers
- 🟡 **Secrets rotation needed** — Assume all NODE1 secrets compromised
---

View File

@@ -502,3 +502,12 @@ export function MobileResponsiveChatPage() {

View File

@@ -175,3 +175,12 @@ LLM сервіси повністю налаштовані та працюють

View File

@@ -368,3 +368,12 @@ http://localhost:8899/microdao/energy-union

View File

@@ -108,3 +108,12 @@ getMicroDaoWorkspace(microDaoId: string): Promise<Workspace | null>

View File

@@ -414,3 +414,12 @@ curl http://localhost:9500/api/agent/monitor/file-urls?agent_id=monitor

View File

@@ -165,3 +165,12 @@ curl -X POST http://localhost:9500/api/agent/monitor/chat \

View File

@@ -319,3 +319,12 @@ curl 'http://localhost:9500/api/project/changes?since=1700000000000&limit=10'

View File

@@ -249,3 +249,12 @@ location.reload();

View File

@@ -179,3 +179,12 @@ window.dispatchEvent(new CustomEvent('project-change', {

View File

@@ -370,3 +370,12 @@ localStorage.setItem(storageKey, JSON.stringify(changes.slice(0, 50)));

View File

@@ -186,3 +186,12 @@

View File

@@ -539,3 +539,12 @@ curl -X POST http://localhost:8896/api/ocr/upload \

View File

@@ -224,3 +224,12 @@ docker exec ollama ollama ps

View File

@@ -75,3 +75,12 @@ echo " 4. Протестувати Ollama з GPU: ollama run qwen3:8b 'test'"

View File

@@ -113,3 +113,12 @@ time ollama run qwen3:8b "Привіт, тест GPU"

View File

@@ -110,3 +110,12 @@ time ollama run qwen3:8b "test"

View File

@@ -83,3 +83,12 @@ echo " - Загальне CPU: 85.3% → 40-50%"

View File

@@ -630,3 +630,12 @@ const saveConversation = async () => {

View File

@@ -448,3 +448,12 @@ You now have a fully functional agent integration system. Agents can automatical

View File

@@ -383,3 +383,12 @@ Test 5: Internal Endpoints

View File

@@ -381,3 +381,12 @@ All specifications are complete. Pick a starting point:

View File

@@ -474,3 +474,12 @@ docker-compose -f docker-compose.phase3.yml down -v

View File

@@ -404,3 +404,12 @@ Sofia: "В проєкті X є 3 нові задачі:

View File

@@ -433,3 +433,12 @@ Complete Phase 4.5 fully (2-3 години) → Then start Phase 5 with real aut

View File

@@ -525,3 +525,12 @@ useAuthStore.getState().clearSession();

View File

@@ -325,3 +325,12 @@ PHASE4_PROGRESS_REPORT.md ✅ (this file)

View File

@@ -574,3 +574,12 @@ Code Quality:

View File

@@ -196,3 +196,12 @@ curl http://localhost:7011/auth/me \

View File

@@ -199,3 +199,12 @@ curl -X POST http://localhost:7011/auth/login \

View File

@@ -156,3 +156,12 @@ If agent replies, **Phase 2 works!** 🚀

View File

@@ -250,3 +250,12 @@ After Phase 3 works:

View File

@@ -324,3 +324,12 @@ curl http://144.76.224.179:9102/health

View File

@@ -413,3 +413,12 @@ cat docs/tasks/PHASE2_MASTER_TASK.md | pbcopy

View File

@@ -0,0 +1,231 @@
# 🔐 SECRETS ROTATION CHECKLIST — NODE1 Compromise
**Дата:** 2026-01-10
**Причина:** NODE1 (144.76.224.179) скомпрометований (Incidents #1-4)
**Статус:** ⏳ ПОТРЕБУЄ ВИКОНАННЯ
---
## ⚠️ ВАЖЛИВО
Всі секрети, які NODE1 коли-небудь бачив, **ВВАЖАТИ СКОМПРОМЕТОВАНИМИ**.
Навіть якщо malware зараз не активний — він міг exfiltrate дані раніше.
---
## 📋 TELEGRAM BOT TOKENS (9 ботів)
**Як ротувати:** Telegram → @BotFather`/revoke``/token`
| # | Бот | Поточний токен | Статус |
|---|-----|----------------|--------|
| 1 | **DAARWIZZ** (@DAARWIZZBot) | `8323412397:AAFxaru-hHRl08A3T6TC02uHLvO5wAB0m3M` | ⬜ Ротувати |
| 2 | **Helion** (@HelionEnergyBot) | `8112062582:AAGI7tPFo4gvZ6bfbkFu9miq5GdAH2_LvcM` | ⬜ Ротувати |
| 3 | **GREENFOOD** | `7495165343:AAHpxY8w3iXevaQT2rfj97OHLauu9Iq8vYM` | ⬜ Ротувати |
| 4 | **CLAN** | `8516872152:AAGbjL6zCMOCqHgu9rcuagdhm0LEwYJFpKw` | ⬜ Ротувати |
| 5 | **DRUID** | `8145618489:AAGgR5KmPr9P1_ppSrFa_Gpq5yqf3vNJ5AQ` | ⬜ Ротувати |
| 6 | **EONARCH** | `7962391584:AAFYkelLRG3VR_Lxuu6pEGG76t4vZdANtz4` | ⬜ Ротувати |
| 7 | **SOUL** | `8041596416:AAGyHEjalPEH2TC0AOxfIQ2aZvFTFRanO0g` | ⬜ Ротувати |
| 8 | **YAROMIR** | `8128180674:AAGNZdG3LwECI4z_803smsuRHsK3nPdjMLY` | ⬜ Ротувати |
| 9 | **NUTRA** | `8517315428:AAEFSGG_XEIR0N6svGKSf0cf09_A9jV26zA` | ⬜ Ротувати |
**Процедура:**
```bash
# 1. Відкрити @BotFather в Telegram
# 2. /mybots → вибрати бота → API Token → Revoke current token
# 3. Скопіювати новий токен
# 4. Оновити в .env на НОВОМУ сервері
```
---
## 🔑 API KEYS
| Сервіс | Ключ | Дія |
|--------|------|-----|
| **DeepSeek** | `sk-5adf7a2b421349de90468517b41c4448` | ⬜ Ротувати в dashboard |
| **xAI/Grok** | (якщо є) | ⬜ Перевірити та ротувати |
| **OpenAI** | (якщо є) | ⬜ Перевірити та ротувати |
| **Anthropic** | (якщо є) | ⬜ Перевірити та ротувати |
**DeepSeek ротація:**
1. Зайти на https://platform.deepseek.com/
2. API Keys → Delete old → Create new
3. Оновити `DEEPSEEK_API_KEY` в .env
---
## 🗄️ DATABASE PASSWORDS
| База | Поточний пароль | Дія |
|------|-----------------|-----|
| **PostgreSQL** | `postgres` | ⬜ Змінити на складний |
| **Neo4j** | (перевірити .env) | ⬜ Змінити |
| **Redis** | (без паролю?) | ⬜ Додати пароль |
| **MinIO** | `WpyOnsTKHWzuq5CRKjslZ45kMilT0Gez` | ⬜ Ротувати |
**Генерація нового паролю:**
```bash
# Згенерувати безпечний пароль
openssl rand -base64 32
```
---
## 🔐 SSH KEYS
| Ключ | Розташування | Дія |
|------|--------------|-----|
| **NODE1 root key** | `/root/.ssh/` на NODE1 | ⬜ Видалити при rebuild |
| **Ваш SSH ключ** | `~/.ssh/id_ed25519` або `id_rsa` | ⬜ Перегенерувати |
| **GitHub deploy key** | GitHub repo settings | ⬜ Ротувати |
**Генерація нового SSH ключа (на MacBook):**
```bash
# Backup старого
mv ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.compromised.backup
# Генерація нового
ssh-keygen -t ed25519 -C "admin@daarion.city" -f ~/.ssh/id_ed25519
# Додати в ssh-agent
ssh-add ~/.ssh/id_ed25519
# Скопіювати публічний ключ
cat ~/.ssh/id_ed25519.pub
# Додати в GitHub → Settings → SSH Keys
# Додати на новий NODE1 після rebuild
```
---
## 🌐 SSL/TLS CERTIFICATES
| Домен | Дія |
|-------|-----|
| `gateway.daarion.city` | ⬜ Перевипустити через certbot |
| `daarion.city` | ⬜ Перевірити |
**Certbot на новому сервері:**
```bash
certbot certonly --nginx -d gateway.daarion.city
```
---
## 🔧 JWT / SESSION SECRETS
| Секрет | Дія |
|--------|-----|
| JWT_SECRET | ⬜ Згенерувати новий |
| SESSION_SECRET | ⬜ Згенерувати новий |
| COOKIE_SECRET | ⬜ Згенерувати новий |
**Генерація:**
```bash
# JWT secret (256 bit)
openssl rand -hex 32
# Або base64
openssl rand -base64 32
```
---
## 📦 DOCKER / REGISTRY
| Елемент | Дія |
|---------|-----|
| Docker Hub credentials | ⬜ Перевірити чи використовувались |
| GHCR token | ⬜ Ротувати якщо є |
---
## ☁️ CLOUD CREDENTIALS
| Сервіс | Дія |
|--------|-----|
| Hetzner API token | ⬜ Ротувати в Robot |
| Cloudflare API key | ⬜ Ротувати якщо використовувався |
---
## ✅ CHECKLIST ПІСЛЯ REBUILD NODE1
```
[ ] 1. Rebuild NODE1 (fresh Ubuntu install)
[ ] 2. Новий SSH ключ додано на NODE1
[ ] 3. Всі Telegram токени ротовані
[ ] 4. DeepSeek API key ротований
[ ] 5. PostgreSQL пароль змінено
[ ] 6. MinIO пароль змінено
[ ] 7. JWT/Session secrets згенеровані
[ ] 8. SSL сертифікати перевипущені
[ ] 9. .env оновлено з новими секретами
[ ] 10. Webhooks перереєстровані
[ ] 11. Тести пройдені
[ ] 12. Моніторинг налаштований
```
---
## 🚀 ПОРЯДОК ДІЙ
### Фаза 1: Підготовка (до rebuild)
1. ⬜ Зберегти цей документ
2. ⬜ Зробити backup даних з NODE1 (PostgreSQL dump, etc.)
3. ⬜ Підготувати нові секрети заздалегідь
### Фаза 2: Rebuild NODE1
1. ⬜ Hetzner Robot → Rescue → Reinstall Ubuntu 24.04
2. ⬜ Базове налаштування (firewall, fail2ban, etc.)
3. ⬜ Встановити Docker, k3s
### Фаза 3: Ротація секретів
1. ⬜ Ротувати Telegram токени через @BotFather
2. ⬜ Ротувати API keys
3. ⬜ Створити новий .env з новими секретами
4. ⬜ Deploy на новий NODE1
### Фаза 4: Верифікація
1. ⬜ Перевірити всі боти працюють
2. ⬜ Перевірити API endpoints
3. ⬜ Запустити smoke tests
4. ⬜ Моніторинг CPU/мережі 24 години
---
## 📝 НОВІ СЕКРЕТИ (заповнити після ротації)
```bash
# Telegram Bots (НОВІ токени)
DAARWIZZ_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
HELION_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
GREENFOOD_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
CLAN_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
DRUID_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
EONARCH_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
SOUL_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
YAROMIR_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
NUTRA_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
# API Keys (НОВІ)
DEEPSEEK_API_KEY=<NEW_KEY>
# Database (НОВІ паролі)
POSTGRES_PASSWORD=<NEW_STRONG_PASSWORD>
MINIO_ROOT_PASSWORD=<NEW_STRONG_PASSWORD>
NEO4J_AUTH=neo4j/<NEW_STRONG_PASSWORD>
REDIS_PASSWORD=<NEW_STRONG_PASSWORD>
# JWT/Sessions (НОВІ)
JWT_SECRET=<GENERATED_SECRET>
SESSION_SECRET=<GENERATED_SECRET>
```
---
**Створено:** 2026-01-10
**Автор:** Security Triage Script
**Статус:** Очікує виконання після NODE1 rebuild

282
SOFIA_AGENT_README.md Normal file
View File

@@ -0,0 +1,282 @@
# 🤖 Sofia Agent - Локальний Запуск
Sofia - Chief AI Engineer & R&D Orchestrator екосистеми DAARION.city
## 🚀 Швидкий старт
### Варіант 1: Запуск з локальним Ollama (ЗАРАЗ готово!)
```bash
# 1. Переконатися, що Ollama запущено
ollama list
# 2. Запустити Sofia
python3 sofia_agent.py
```
### Варіант 2: Запуск з Grok API (потребує API ключ)
```bash
# 1. Додати API ключ в .env
echo 'XAI_API_KEY=your_xai_api_key_here' >> .env
# 2. Запустити Sofia
python3 sofia_agent.py
```
---
## 📋 Що потрібно
### Встановлено ✅
- ✅ Python 3.14.0
- ✅ openai (2.8.0)
- ✅ httpx (0.28.1)
- ✅ fastapi (0.104.1)
- ✅ pydantic (2.12.4)
- ✅ Ollama з моделями
### Опціонально
- xAI API ключ (для Grok API)
- STT/TTS сервіси (для голосового режиму)
---
## 🎯 Режими роботи
### 1. Інтерактивний чат
```bash
python3 sofia_agent.py
```
**Команди:**
- `/help` - показати довідку
- `/clear` - очистити історію розмови
- `/history` - показати історію
- `/exit` - вийти
**Приклад:**
```
🧑 Ви: Привіт Sofia! Розкажи про свою роль
🤖 Sofia: Привіт! Я Sofia, Chief AI Engineer в екосистемі DAARION.city.
Моя роль включає:
- Керування дослідженнями AI/ML
- Координацію R&D команди
- Технічне лідерство в AI проектах
...
```
### 2. Одне повідомлення
```bash
python3 sofia_agent.py "Які моделі AI ти рекомендуєш для NLP задач?"
```
---
## ⚙️ Конфігурація
### .env файл
```bash
# Grok API (опціонально)
XAI_API_KEY=your_xai_api_key_here
XAI_BASE_URL=https://api.x.ai/v1
XAI_MODEL=grok-beta
# Ollama (за замовчуванням)
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=qwen2.5-coder:32b
# Голосовий режим (опціонально)
ENABLE_VOICE_MODE=false
STT_SERVICE_URL=http://localhost:8895/api
TTS_SERVICE_URL=http://localhost:5002
```
### Пріоритет провайдерів
1. **Grok API** - якщо встановлено `XAI_API_KEY`
2. **Ollama** - локальна модель (fallback)
---
## 🎤 Голосовий режим (майбутнє)
Для увімкнення голосового режиму:
```bash
# 1. Налаштувати STT/TTS сервіси
STT_SERVICE_URL=http://144.76.224.179:8895/api
TTS_SERVICE_URL=http://144.76.224.179:5002
# 2. Увімкнути голосовий режим
ENABLE_VOICE_MODE=true
```
---
## 🧪 Тестування
### Перевірка Ollama
```bash
# Перевірити, що Ollama запущено
curl http://localhost:11434/api/tags
# Перевірити модель
ollama run qwen2.5-coder:32b "Привіт!"
```
### Перевірка Sofia
```bash
# Швидкий тест
python3 sofia_agent.py "Тест зв'язку"
# Інтерактивний режим
python3 sofia_agent.py
```
---
## 📊 Доступні моделі Ollama
На вашому MacBook встановлено:
| Модель | Розмір | Призначення |
|--------|--------|-------------|
| `llava:13b` | 8.0 GB | Мультимодальна (текст + зображення) |
| `mistral-nemo:12b` | 7.1 GB | Загальні задачі |
| `gemma2:27b` | 15 GB | Великі контексти |
| `deepseek-coder:33b` | 18 GB | Програмування |
| **`qwen2.5-coder:32b`** | 19 GB | **За замовчуванням для Sofia** |
| `deepseek-r1:70b` | 42 GB | Reasoning задачі |
| `starcoder2:3b` | 1.7 GB | Швидке кодування |
| `phi3:latest` | 2.2 GB | Компактна модель |
| `gpt-oss:latest` | 13 GB | Відкритий GPT |
### Зміна моделі
```bash
# В .env файлі:
OLLAMA_MODEL=deepseek-r1:70b # Для складних reasoning задач
# або
OLLAMA_MODEL=mistral-nemo:12b # Для швидшої роботи
```
---
## 🔧 Налаштування Grok API
### 1. Отримання API ключа
1. Зареєструватися на https://x.ai
2. Створити API ключ
3. Скопіювати ключ
### 2. Додати в .env
```bash
# Додати в кінець .env файлу
echo 'XAI_API_KEY=xai-your-key-here' >> .env
```
### 3. Перевірити
```bash
# Sofia автоматично використає Grok API
python3 sofia_agent.py "Привіт!"
# В логах побачите:
# 🤖 Ініціалізація Sofia Agent...
# Режим: Grok API (xAI)
# Модель: grok-beta
```
---
## 💡 Приклади використання
### Технічні питання
```bash
python3 sofia_agent.py "Поясни різницю між RAG та fine-tuning"
```
### R&D планування
```bash
python3 sofia_agent.py "Які напрямки досліджень AI найперспективніші в 2026?"
```
### Архітектурні рішення
```bash
python3 sofia_agent.py "Як побудувати multi-agent систему для DAARION?"
```
### Код-ревʼю
```bash
python3 sofia_agent.py "Проаналізуй архітектуру агентської системи DAARION"
```
---
## 🐛 Вирішення проблем
### "Не можу підключитися до Ollama"
```bash
# Перевірити статус Ollama
ps aux | grep ollama
# Якщо не запущено - запустити
ollama serve
# Або перезапустити
pkill ollama && ollama serve
```
### "Помилка Grok API"
```bash
# Перевірити API ключ
cat .env | grep XAI_API_KEY
# Перевірити доступність API
curl -H "Authorization: Bearer $XAI_API_KEY" https://api.x.ai/v1/models
```
### "Модель не знайдена"
```bash
# Перевірити доступні моделі
ollama list
# Завантажити модель
ollama pull qwen2.5-coder:32b
```
---
## 📚 Додаткові ресурси
- [Ollama документація](https://ollama.ai/docs)
- [xAI API документація](https://docs.x.ai)
- [DAARION архітектура](./docs/agents.md)
---
## ✅ Статус
- ✅ Sofia скрипт створено
- ✅ Ollama налаштовано
- ✅ Моделі завантажені
- ⏳ Grok API (потребує ключ)
- ⏳ Голосовий режим (майбутнє)
**Готово до використання! 🚀**

240
SOFIA_CLI.md Normal file
View File

@@ -0,0 +1,240 @@
# 🖥️ Sofia CLI - Complete Guide
## ✅ Доступні CLI інтерфейси
### 1. Python CLI (Найкращий) ⭐
**Використання:**
```bash
# Інтерактивний режим
./run_sofia.sh
# Або через venv
source sofia_venv/bin/activate
python3 sofia_agent.py
# Одне питання
python3 sofia_agent.py "Твоє питання тут"
```
**Переваги:**
- ✅ Працює стабільно
- ✅ Історія розмов
- ✅ Статистика токенів
- ✅ Підтримка Grok API + Ollama
**Команди в інтерактивному режимі:**
- `/help` - довідка
- `/clear` - очистити історію
- `/history` - показати історію
- `/exit` - вийти
---
### 2. Web Interface (Візуальний) 🌐
**Запуск:**
```bash
./start_sofia.sh
```
**URL:**
```
http://localhost:5173/sofia
```
**Переваги:**
- ✅ Красивий UI
- ✅ Градієнтний дизайн
- ✅ Швидкі запити
- ✅ Responsive
---
### 3. AIChat CLI (Альтернативний)
**Встановлено:**`aichat`
**Конфігурація:**
- Config: `~/.config/aichat/config.yaml`
- Role: `~/.config/aichat/roles/sofia.md`
**Використання:**
```bash
aichat --role sofia
```
**Aliases (додані в ~/.zshrc):**
```bash
sofia # aichat --role sofia
sofia-chat # aichat --role sofia
sofia-quick # aichat --role sofia --no-stream
```
**Примітка:** Потребує додаткової ініціалізації при першому запуску.
---
### 4. LLM CLI (від Simon Willison)
**Встановлено:**`llm` + `llm-ollama` plugin
**Template:** `~/.config/llm/templates/sofia.txt`
**Використання:**
```bash
# Одне питання
llm -m ollama/qwen2.5-coder:32b -s "$(cat ~/.config/llm/templates/sofia.txt)" "Твоє питання"
# Чат
llm chat -m ollama/qwen2.5-coder:32b -s "$(cat ~/.config/llm/templates/sofia.txt)"
```
**Примітка:** Може мати проблеми з шаблонами Ollama.
---
## 🎯 Рекомендації
### Для щоденного використання:
```bash
# В терміналі
./run_sofia.sh
# В браузері
./start_sofia.sh
# Відкрити: http://localhost:5173/sofia
```
### Для швидких запитів:
```bash
python3 sofia_agent.py "Швидке питання"
```
### Для візуального досвіду:
```
http://localhost:5173/sofia
```
---
## 📊 Порівняння CLI
| Особливість | Python CLI | Web UI | aichat | llm |
|-------------|------------|--------|--------|-----|
| **Стабільність** | ✅ | ✅ | ⚠️ | ⚠️ |
| **Історія** | ✅ | ✅ | ✅ | ⚠️ |
| **Токени** | ✅ | ✅ | ❌ | ❌ |
| **Grok API** | ✅ | ✅ | ✅ | ✅ |
| **Візуалізація** | ❌ | ✅ | ❌ | ❌ |
| **Швидкість** | ⚡⚡ | ⚡ | ⚡⚡ | ⚡⚡ |
| **Кольори** | ❌ | ✅ | ✅ | ❌ |
---
## 🚀 Швидкий старт
### Для нових користувачів:
**1. Спробувати CLI:**
```bash
cd /Users/apple/github-projects/microdao-daarion
./run_sofia.sh
```
**2. Спробувати Web UI:**
```bash
./start_sofia.sh
```
Браузер автоматично відкриється на `http://localhost:5173/sofia`
---
## 🔧 Конфігурація
### Всі CLI використовують:
- `.env` файл для API ключів
- Ollama на `localhost:11434`
- Модель: `qwen2.5-coder:32b`
### Зміна моделі:
```bash
# В .env
OLLAMA_MODEL=deepseek-r1:70b
```
### Підключення Grok:
```bash
# В .env
XAI_API_KEY=your_key_here
```
---
## 📱 Додаткові можливості
### Python CLI:
- Асинхронна обробка
- Збереження історії в пам'яті
- Статистика токенів
- Fallback до локальної моделі
### Web UI:
- Швидкі запити (quick actions)
- Градієнтний дизайн
- Автоскрол
- Очистити чат
### AIChat:
- Syntax highlighting
- Code block підсвітка
- Emacs keybindings
- Compression
### LLM CLI:
- Plugin ecosystem
- Multiple models
- Templates system
- Conversation management
---
## 🎨 Кастомізація
### Sofia Prompt можна змінити в:
- Python: `sofia_agent.py``SOFIA_SYSTEM_PROMPT`
- Web: `sofia_api.py``SOFIA_SYSTEM_PROMPT`
- AIChat: `~/.config/aichat/roles/sofia.md`
- LLM: `~/.config/llm/templates/sofia.txt`
---
## 💡 Поради
1. **Python CLI** - найстабільніший варіант
2. **Web UI** - найкрасивіший
3. **aichat** - найбільше функцій
4. **llm** - найпростіший для скриптів
**Використовуйте той, що вам зручніший!** 🚀
---
## 📚 Документація
- `SOFIA_QUICKSTART.md` - швидкий старт
- `SOFIA_AGENT_README.md` - повна документація Python CLI
- `SOFIA_WEB_UI.md` - веб-інтерфейс
- `SOFIA_CLI.md` - цей файл
---
## ✅ Готово!
Всі CLI встановлені та налаштовані для Sofia! 🎉
**Рекомендую почати з:**
```bash
./run_sofia.sh
```

216
SOFIA_QUICKSTART.md Normal file
View File

@@ -0,0 +1,216 @@
# ⚡ Sofia Agent - Швидкий старт
## ✅ Готово до використання!
Sofia Agent працює на вашому MacBook з локальним Ollama.
---
## 🚀 Запуск
### Варіант 1: Простий запуск (рекомендовано)
```bash
cd /Users/apple/github-projects/microdao-daarion
./run_sofia.sh
```
### Варіант 2: З повідомленням
```bash
./run_sofia.sh "Привіт Sofia! Розкажи про свою роль"
```
### Варіант 3: Повний контроль
```bash
source sofia_venv/bin/activate
python3 sofia_agent.py
```
---
## 💬 Команди в інтерактивному режимі
- `/help` - показати довідку
- `/clear` - очистити історію
- `/history` - показати історію
- `/exit` - вийти
---
## 📊 Поточна конфігурація
**Працює зараз:**
- Модель: `qwen2.5-coder:32b` (19 GB)
- Провайдер: Ollama (локально)
- URL: `http://localhost:11434`
- Python: 3.14.0
- Віртуальне середовище: `sofia_venv/`
**Опціонально (майбутнє):**
- Grok API (потрібен `XAI_API_KEY`)
- Голосовий режим (потрібні STT/TTS)
---
## 🎯 Приклади
### Технічні питання
```bash
./run_sofia.sh "Поясни різницю між RAG та fine-tuning"
```
### Планування R&D
```bash
./run_sofia.sh "Які напрямки досліджень AI найперспективніші?"
```
### Архітектура
```bash
./run_sofia.sh "Як побудувати multi-agent систему?"
```
### Інтерактивний діалог
```bash
./run_sofia.sh
🧑 Ви: Привіт Sofia!
🤖 Sofia: Привіт! Я готова допомогти...
🧑 Ви: Які моделі підходять для кодування?
🤖 Sofia: Рекомендую звернути увагу на...
🧑 Ви: /exit
👋 До побачення!
```
---
## 🔧 Додаткові налаштування
### Зміна моделі
Відредагуйте `.env`:
```bash
# Для швидшої роботи:
OLLAMA_MODEL=mistral-nemo:12b
# Для складних reasoning задач:
OLLAMA_MODEL=deepseek-r1:70b
# Для мультимодальності (текст + зображення):
OLLAMA_MODEL=llava:13b
```
### Підключення Grok API
```bash
# Додати в .env:
XAI_API_KEY=your_xai_api_key_here
XAI_BASE_URL=https://api.x.ai/v1
XAI_MODEL=grok-beta
# Sofia автоматично переключиться на Grok
./run_sofia.sh
# 🤖 Ініціалізація Sofia Agent...
# Режим: Grok API (xAI)
# Модель: grok-beta
```
---
## 🎤 Майбутнє: Голосовий режим
Коли буде готово, додайте в `.env`:
```bash
ENABLE_VOICE_MODE=true
STT_SERVICE_URL=http://144.76.224.179:8895/api
TTS_SERVICE_URL=http://144.76.224.179:5002
```
Sofia зможе:
- 🎤 Приймати голосові запити (STT)
- 🔊 Відповідати голосом (TTS)
- 💬 Підтримувати текстовий режим паралельно
---
## 🐛 Вирішення проблем
### "Не можу підключитися до Ollama"
```bash
# Перевірити, що Ollama запущено
ps aux | grep ollama
# Якщо ні - запустити
ollama serve
# В новому терміналі:
./run_sofia.sh
```
### "ModuleNotFoundError"
```bash
# Переконатися, що використовується venv
source sofia_venv/bin/activate
python3 sofia_agent.py
```
### "Модель не знайдена"
```bash
# Перевірити доступні моделі
ollama list
# Завантажити потрібну
ollama pull qwen2.5-coder:32b
```
---
## 📈 Статистика токенів
Sofia показує використання токенів після кожної відповіді:
```
🤖 Sofia: Відповідь...
[Tokens: ~150]
```
Це допомагає відстежувати:
- Складність запитів
- Довжину контексту
- Продуктивність моделі
---
## 💡 Поради
1. **Для коротких запитів** - використовуйте режим одного повідомлення
2. **Для діалогу** - запускайте інтерактивний режим
3. **Для складних задач** - переключіться на `deepseek-r1:70b`
4. **Для швидкості** - використовуйте `mistral-nemo:12b`
---
## 📚 Детальна документація
Див. `SOFIA_AGENT_README.md` для:
- Повного опису функціоналу
- Всіх доступних моделей
- Інструкцій з Grok API
- Налаштування голосового режиму
---
## ✅ Готово!
Sofia Agent працює і готова до роботи! 🚀
**Швидкий тест:**
```bash
./run_sofia.sh "Привіт! Тест зв'язку"
```

290
SOFIA_WEB_UI.md Normal file
View File

@@ -0,0 +1,290 @@
# 🌐 Sofia Web Interface - Ready!
## ✅ Що встановлено:
1. **React компонент** - `src/pages/SofiaChatPage.tsx`
- Красивий градієнтний дизайн (purple/pink)
- Історія повідомлень
- Статистика токенів
- Швидкі запити (quick actions)
2. **FastAPI Backend** - `sofia_api.py`
- REST API на порту 8899
- Підтримка Ollama + Grok API
- CORS налаштовано
- Історія розмов
3. **Роутинг** - додано `/sofia` в App.tsx
---
## 🚀 Запуск
### Варіант 1: Автоматичний (все разом)
```bash
./start_sofia.sh
```
Цей скрипт:
- ✅ Перевіряє Ollama
- ✅ Запускає Sofia API (порт 8899)
- ✅ Запускає React dev server (порт 5173)
- ✅ Відкриває браузер
### Варіант 2: Ручний (окремо)
**Термінал 1: Sofia API**
```bash
source sofia_venv/bin/activate
python3 sofia_api.py
```
**Термінал 2: React Dev Server**
```bash
npm run dev
```
**Браузер:**
```
http://localhost:5173/sofia
```
### Варіант 3: Фоновий режим
```bash
# Sofia API
nohup sofia_venv/bin/python3 sofia_api.py > sofia_api.log 2>&1 &
# Dev Server
npm run dev
```
---
## 🎯 Доступ
**София доступна за адресою:**
```
http://localhost:5173/sofia
```
**API документація:**
```
http://localhost:8899/docs
```
**Health Check:**
```bash
curl http://localhost:8899/health
```
---
## 💬 Інтерфейс
### Головний екран:
- 🎨 Градієнтний дизайн (purple → pink)
- 👤 Профіль Sofia (Chief AI Engineer)
- 🤖 qwen2.5-coder:32b badge
- 🗑️ Кнопка очистити чат
### Швидкі запити:
1. 💼 Розкажи про свою роль
2. 🤖 Які моделі для NLP?
3. 🏗️ Multi-agent архітектура
4. 📚 RAG vs Fine-tuning
### Повідомлення:
- Користувач: градієнт blue → cyan (праворуч)
- Sofia: сірий фон (ліворуч)
- Показує час + токени
- Історія зберігається
### Введення:
- Enter - відправити
- Shift+Enter - новий рядок
- Автоскрол до нових повідомлень
---
## 🔧 API Endpoints
### POST /chat
```bash
curl -X POST http://localhost:8899/chat \
-H "Content-Type: application/json" \
-d '{"message": "Привіт Sofia!"}'
```
**Response:**
```json
{
"response": "Привіт! Як можу допомогти?",
"tokens": 50,
"model": "qwen2.5-coder:32b",
"provider": "ollama"
}
```
### POST /clear
```bash
curl -X POST http://localhost:8899/clear
```
### GET /history
```bash
curl http://localhost:8899/history
```
---
## 🎨 Кастомізація
### Зміна кольорів (SofiaChatPage.tsx):
```tsx
// Головний градієнт
from-purple-500 to-pink-500 from-blue-500 to-cyan-500
// Фон
from-purple-50 via-white to-pink-50 інший градієнт
```
### Зміна моделі (.env):
```bash
OLLAMA_MODEL=deepseek-r1:70b # Для складних задач
OLLAMA_MODEL=mistral-nemo:12b # Для швидкості
```
### Підключення Grok API (.env):
```bash
XAI_API_KEY=your_key_here
```
Sofia автоматично переключиться на Grok.
---
## 📊 Моніторинг
### Логи Sofia API:
```bash
tail -f sofia_api.log
```
### Логи Dev Server:
```bash
tail -f dev_server.log # якщо запущено у фоні
```
### Перевірка процесів:
```bash
ps aux | grep -E "sofia_api|npm.*dev"
```
### Зупинити:
```bash
# Sofia API
pkill -f sofia_api.py
# Dev Server
pkill -f "npm.*dev"
```
---
## 🐛 Вирішення проблем
### "Cannot connect to Ollama"
```bash
# Перевірити
ps aux | grep ollama
# Запустити
ollama serve
```
### "Port 8899 already in use"
```bash
# Знайти процес
lsof -i :8899
# Зупинити
kill -9 <PID>
```
### "Port 5173 already in use"
```bash
# Використати інший порт
npm run dev -- --port 3000
# Змінити в SofiaChatPage.tsx:
const sofiaUrl = 'http://localhost:8899';
```
### Білий екран / помилка компіляції
```bash
# Перезапустити dev server
pkill -f "npm.*dev"
npm run dev
```
---
## 📱 Функції
### ✅ Працює зараз:
- Чат з Sofia
- Історія повідомлень
- Статистика токенів
- Швидкі запити
- Очистити чат
- Responsive дизайн
### 🔜 Майбутнє:
- 🎤 Голосовий режим (STT/TTS)
- 📎 Завантаження файлів
- 🖼️ Обробка зображень (з llava)
- 💾 Збереження чатів
- 🔐 Аутентифікація
---
## 🎯 Готово!
**Sofia веб-інтерфейс працює!** 🎉
**Відкрити зараз:**
```bash
open http://localhost:5173/sofia
```
**Або перейти в браузері:**
```
http://localhost:5173/sofia
```
---
## 📚 Структура файлів
```
microdao-daarion/
├── sofia_agent.py # CLI агент
├── sofia_api.py # FastAPI backend
├── start_sofia.sh # Startup скрипт
├── sofia_venv/ # Python venv
├── src/
│ └── pages/
│ └── SofiaChatPage.tsx # React компонент
└── SOFIA_WEB_UI.md # Ця інструкція
```
**Успішного використання! 🚀**

View File

@@ -341,3 +341,12 @@ cd services/agent-filter

View File

@@ -195,3 +195,12 @@ const API_URL = import.meta.env.VITE_API_URL || 'http://localhost:7014';

View File

@@ -187,3 +187,12 @@ docker-compose restart swapper-service

View File

@@ -203,3 +203,12 @@ swapper:

View File

@@ -262,3 +262,12 @@ swapper:

View File

@@ -199,3 +199,12 @@ ssh root@144.76.224.179 "cd /opt/microdao-daarion && docker-compose up -d swappe

View File

@@ -316,3 +316,12 @@ cryptography==41.0.7

View File

@@ -370,3 +370,12 @@ done

View File

@@ -604,3 +604,12 @@ async def universal_telegram_webhook(bot_id: str, update: TelegramUpdate):

View File

@@ -131,3 +131,12 @@ docker logs --tail 50 dagi-web-search-service

View File

@@ -170,3 +170,12 @@ INFO: 145.224.94.89:27620 - "POST /route HTTP/1.1" 200 OK

View File

@@ -324,3 +324,12 @@ docker ps | grep -E 'dagi-gateway|dagi-tts|dagi-stt'

View File

@@ -303,3 +303,12 @@ async def text_to_speech(text: str, voice_id: str):

View File

@@ -1,5 +1,6 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
/// <reference path="./.next/types/routes.d.ts" />
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information.
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.

View File

@@ -80,3 +80,12 @@ networks:

View File

@@ -19,7 +19,10 @@ services:
- ./migrations:/docker-entrypoint-initdb.d:ro
- ./scripts:/scripts:ro
networks:
- dagi-network
dagi-network:
aliases:
- dagi-postgres
- postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d daarion"]
interval: 10s

View File

@@ -124,3 +124,12 @@ networks:

View File

@@ -189,3 +189,12 @@ volumes:

View File

@@ -0,0 +1,55 @@
# Clean PostgreSQL Build from Official Debian Sources
# Built to avoid compromised Docker Hub images
FROM debian:bookworm-slim
# PostgreSQL version
ENV PG_MAJOR=16
ENV PGDATA=/var/lib/postgresql/data
# Install dependencies and PostgreSQL from official apt repository
RUN set -ex; \
apt-get update; \
apt-get install -y --no-install-recommends \
ca-certificates \
wget \
gnupg \
lsb-release \
locales; \
\
# Add PostgreSQL official repository (new GPG method)
mkdir -p /usr/share/postgresql-common/pgdg; \
wget --quiet -O /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc https://www.postgresql.org/media/keys/ACCC4CF8.asc; \
echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] http://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" > /etc/apt/sources.list.d/pgdg.list; \
\
apt-get update; \
apt-get install -y --no-install-recommends \
postgresql-$PG_MAJOR \
postgresql-contrib-$PG_MAJOR; \
\
# Cleanup
apt-get purge -y --auto-remove wget gnupg lsb-release; \
rm -rf /var/lib/apt/lists/*; \
\
# Configure locales
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
ENV LANG=en_US.utf8
# Create postgres user and data directory
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 700 "$PGDATA"
# Add volume for persistence
VOLUME /var/lib/postgresql/data
# Copy custom entrypoint (modified from official but verified)
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh && \
ln -s usr/local/bin/docker-entrypoint.sh /
USER postgres
EXPOSE 5432
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["postgres"]

View File

@@ -0,0 +1,58 @@
# Clean PostgreSQL Image
**Purpose**: Build PostgreSQL from official Debian repositories to avoid compromised Docker Hub images.
## Why This Exists
Multiple PostgreSQL images from Docker Hub were found to be compromised with cryptocurrency miners:
- `postgres:15-alpine` - Incident #3
- `postgres:16-alpine` - Incident #4
- `postgres:14` - Incident #5
This image is built from scratch using only official PostgreSQL APT repositories.
## Build
```bash
cd docker/postgres-clean
docker build -t daarion-postgres:16-clean .
```
## Verify Build
```bash
# Check no suspicious files
docker run --rm daarion-postgres:16-clean find /tmp -type f -executable
# Check process tree during startup
docker run -d --name test-pg -e POSTGRES_PASSWORD=test daarion-postgres:16-clean
sleep 10
docker exec test-pg ps aux
docker stop test-pg && docker rm test-pg
```
## Usage
Replace in `docker-compose.db.yml`:
```yaml
db:
# image: postgres:16-alpine # COMPROMISED
image: daarion-postgres:16-clean
# ... rest of config
```
## Security Notes
- Built from Debian official repositories only
- Minimal dependencies
- Simplified entrypoint script (no suspicious code)
- No hidden binaries or scripts
- All code is readable and auditable
## Maintenance
To update PostgreSQL version:
1. Edit `Dockerfile`: Update `PG_VERSION`
2. Rebuild image
3. Test thoroughly before deploying

View File

@@ -0,0 +1,69 @@
#!/usr/bin/env bash
set -Eeo pipefail
# usage: file_env VAR [DEFAULT]
file_env() {
local var="$1"
local fileVar="${var}_FILE"
local def="${2:-}"
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
exit 1
fi
local val="$def"
if [ "${!var:-}" ]; then
val="${!var}"
elif [ "${!fileVar:-}" ]; then
val="$(< "${!fileVar}")"
fi
export "$var"="$val"
unset "$fileVar"
}
# Setup environment variables
file_env 'POSTGRES_PASSWORD'
file_env 'POSTGRES_USER' 'postgres'
file_env 'POSTGRES_DB' "$POSTGRES_USER"
file_env 'POSTGRES_INITDB_ARGS'
# Initialize database if needed
if [ ! -s "$PGDATA/PG_VERSION" ]; then
echo "Initializing database..."
/usr/lib/postgresql/16/bin/initdb --username="$POSTGRES_USER" --pwfile=<(echo "$POSTGRES_PASSWORD") $POSTGRES_INITDB_ARGS
# Configure pg_hba.conf for network access
{
echo
echo "host all all all scram-sha-256"
} >> "$PGDATA/pg_hba.conf"
# Start temporary server for setup
/usr/lib/postgresql/16/bin/pg_ctl -D "$PGDATA" -w start -o "-c listen_addresses=''" || exit 1
# Create database if needed
if [ "$POSTGRES_DB" != 'postgres' ]; then
/usr/lib/postgresql/16/bin/psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname postgres <<-EOSQL
CREATE DATABASE "$POSTGRES_DB";
EOSQL
fi
# Run init scripts if present
if [ -d /docker-entrypoint-initdb.d ]; then
for f in /docker-entrypoint-initdb.d/*; do
case "$f" in
*.sh) echo "$0: running $f"; . "$f" ;;
*.sql) echo "$0: running $f"; /usr/lib/postgresql/16/bin/psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < "$f" ;;
*) echo "$0: ignoring $f" ;;
esac
done
fi
# Stop temporary server
/usr/lib/postgresql/16/bin/pg_ctl -D "$PGDATA" -m fast -w stop
echo "Database initialization complete."
fi
# Start PostgreSQL
exec /usr/lib/postgresql/16/bin/postgres "$@"

View File

@@ -998,3 +998,12 @@ rules:

View File

@@ -489,3 +489,12 @@ curl -X POST http://localhost:8080/api/messaging/channels \

View File

@@ -513,3 +513,12 @@ Instead of direct Matrix API:

View File

@@ -409,3 +409,12 @@ VALUES (gen_random_uuid(), '<channel-id>', 'agent:sofia', 'agent', '@sofia-agent

View File

@@ -36,3 +36,12 @@

View File

@@ -607,3 +607,12 @@ docker exec daarion-postgres psql -U postgres -d daarion \

View File

@@ -6,12 +6,19 @@
"source": [
"# 🚀 Infrastructure Quick Reference — DAARION & MicroDAO\n",
"\n",
"Версія:** 2.3.0 \n",
"Останнє оновлення:** 2026-01-09 13:50 \n",
"Версія:** 2.4.0 \n",
"Останнє оновлення:** 2026-01-10 XX:XX \n",
"\n",
"Цей notebook містить швидкий довідник по серверах, репозиторіях та endpoints для DAGI Stack.\n",
"\n",
"**NEW (v2.3.0):** \n",
"**🔴 CRITICAL (v2.4.0) - Jan 10, 2026:**\n",
"- 🔴 **Incident #4: NODE1 Host Compromise Suspected**\n",
"- ❌ ALL PostgreSQL images show malware on NODE1 (15-alpine, 16-alpine, 14, 16)\n",
"- ⚠️ **NODE1 UNSAFE** - Do not deploy any containers until verified\n",
"- 📋 **Triage script added**: `scripts/security/triage-postgres-compromise.sh`\n",
"- 🔬 **Verification required**: Test same image digest on clean host\n",
"\n",
"**v2.3.0:** \n",
"- 🖥️ **NODE3 added** - Threadripper PRO 5975WX + RTX 3090 24GB\n",
"- 🚀 Most powerful node for AI/ML workloads (32c/64t, 128GB RAM, 4TB NVMe)\n",
"- ✅ Security verified - clean system\n",
@@ -171,24 +178,23 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## 🐙 GitHub Repositories",
"",
"### 1. MicroDAO (Current Project)",
"- **Repository:** `git@github.com:IvanTytar/microdao-daarion`",
"- **HTTPS:** `https://github.com/IvanTytar/microdao-daarion`",
"- **Remote Name:** `origin`",
"- **Main Branch:** `main`",
"- **Purpose:** MicroDAO core code, DAGI Stack, documentation",
"",
"### 2. DAARION.city",
"- **Repository:** `git@github.com:DAARION-DAO/daarion-ai-city.git`",
"- **HTTPS:** `https://github.com/DAARION-DAO/daarion-ai-city.git`",
"- **Remote Name:** `daarion-city`",
"- **Main Branch:** `main`",
"- **Purpose:** Official DAARION.city website and integrations",
"",
"---",
""
"## 🐙 GitHub Repositories\n",
"\n",
"### 1. MicroDAO (Current Project)\n",
"- **Repository:** `git@github.com:IvanTytar/microdao-daarion`\n",
"- **HTTPS:** `https://github.com/IvanTytar/microdao-daarion`\n",
"- **Remote Name:** `origin`\n",
"- **Main Branch:** `main`\n",
"- **Purpose:** MicroDAO core code, DAGI Stack, documentation\n",
"\n",
"### 2. DAARION.city\n",
"- **Repository:** `git@github.com:DAARION-DAO/daarion-ai-city.git`\n",
"- **HTTPS:** `https://github.com/DAARION-DAO/daarion-ai-city.git`\n",
"- **Remote Name:** `daarion-city`\n",
"- **Main Branch:** `main`\n",
"- **Purpose:** Official DAARION.city website and integrations\n",
"\n",
"---\n"
]
},
{
@@ -197,50 +203,49 @@
"metadata": {},
"outputs": [],
"source": [
"# GitHub Repositories Configuration",
"REPOSITORIES = {",
" \"microdao-daarion\": {",
" \"name\": \"MicroDAO\",",
" \"ssh_url\": \"git@github.com:IvanTytar/microdao-daarion\",",
" \"https_url\": \"https://github.com/IvanTytar/microdao-daarion\",",
" \"remote_name\": \"origin\",",
" \"main_branch\": \"main\",",
" \"purpose\": \"MicroDAO core code, DAGI Stack, documentation\",",
" \"clone_cmd\": \"git clone git@github.com:IvanTytar/microdao-daarion\"",
" },",
" \"daarion-ai-city\": {",
" \"name\": \"DAARION.city\",",
" \"ssh_url\": \"git@github.com:DAARION-DAO/daarion-ai-city.git\",",
" \"https_url\": \"https://github.com/DAARION-DAO/daarion-ai-city.git\",",
" \"remote_name\": \"daarion-city\",",
" \"main_branch\": \"main\",",
" \"purpose\": \"Official DAARION.city website and integrations\",",
" \"clone_cmd\": \"git clone git@github.com:DAARION-DAO/daarion-ai-city.git\"",
" }",
"}",
"",
"print(\"GitHub Repositories:\")",
"print(\"=\"*80)",
"for repo_id, repo in REPOSITORIES.items():",
" print(f\"\\n{repo['name']} ({repo_id})\")",
" print(f\" SSH URL: {repo['ssh_url']}\")",
" print(f\" HTTPS URL: {repo['https_url']}\")",
" print(f\" Remote: {repo['remote_name']}\")",
" print(f\" Branch: {repo['main_branch']}\")",
" print(f\" Purpose: {repo['purpose']}\")",
" print(f\" Clone: {repo['clone_cmd']}\")",
"",
"print(\"\\n\" + \"=\"*80)",
"print(\"\\nQuick Commands:\")",
"print(\"\\n# Clone MicroDAO:\")",
"print(\"git clone git@github.com:IvanTytar/microdao-daarion.git\")",
"print(\"\\n# Clone DAARION.city:\")",
"print(\"git clone git@github.com:DAARION-DAO/daarion-ai-city.git\")",
"print(\"\\n# Add DAARION.city as remote to MicroDAO:\")",
"print(\"cd microdao-daarion\")",
"print(\"git remote add daarion-city git@github.com:DAARION-DAO/daarion-ai-city.git\")",
"print(\"git fetch daarion-city\")",
""
"# GitHub Repositories Configuration\n",
"REPOSITORIES = {\n",
" \"microdao-daarion\": {\n",
" \"name\": \"MicroDAO\",\n",
" \"ssh_url\": \"git@github.com:IvanTytar/microdao-daarion\",\n",
" \"https_url\": \"https://github.com/IvanTytar/microdao-daarion\",\n",
" \"remote_name\": \"origin\",\n",
" \"main_branch\": \"main\",\n",
" \"purpose\": \"MicroDAO core code, DAGI Stack, documentation\",\n",
" \"clone_cmd\": \"git clone git@github.com:IvanTytar/microdao-daarion\"\n",
" },\n",
" \"daarion-ai-city\": {\n",
" \"name\": \"DAARION.city\",\n",
" \"ssh_url\": \"git@github.com:DAARION-DAO/daarion-ai-city.git\",\n",
" \"https_url\": \"https://github.com/DAARION-DAO/daarion-ai-city.git\",\n",
" \"remote_name\": \"daarion-city\",\n",
" \"main_branch\": \"main\",\n",
" \"purpose\": \"Official DAARION.city website and integrations\",\n",
" \"clone_cmd\": \"git clone git@github.com:DAARION-DAO/daarion-ai-city.git\"\n",
" }\n",
"}\n",
"\n",
"print(\"GitHub Repositories:\")\n",
"print(\"=\"*80)\n",
"for repo_id, repo in REPOSITORIES.items():\n",
" print(f\"\\n{repo['name']} ({repo_id})\")\n",
" print(f\" SSH URL: {repo['ssh_url']}\")\n",
" print(f\" HTTPS URL: {repo['https_url']}\")\n",
" print(f\" Remote: {repo['remote_name']}\")\n",
" print(f\" Branch: {repo['main_branch']}\")\n",
" print(f\" Purpose: {repo['purpose']}\")\n",
" print(f\" Clone: {repo['clone_cmd']}\")\n",
"\n",
"print(\"\\n\" + \"=\"*80)\n",
"print(\"\\nQuick Commands:\")\n",
"print(\"\\n# Clone MicroDAO:\")\n",
"print(\"git clone git@github.com:IvanTytar/microdao-daarion.git\")\n",
"print(\"\\n# Clone DAARION.city:\")\n",
"print(\"git clone git@github.com:DAARION-DAO/daarion-ai-city.git\")\n",
"print(\"\\n# Add DAARION.city as remote to MicroDAO:\")\n",
"print(\"cd microdao-daarion\")\n",
"print(\"git remote add daarion-city git@github.com:DAARION-DAO/daarion-ai-city.git\")\n",
"print(\"git fetch daarion-city\")\n"
]
},
{
@@ -733,6 +738,64 @@
"- **Action Required:** User MUST submit statement at https://statement-abuse.hetzner.com/statements/?token=28b2c7e67a409659f6c823e863887\n",
"- **Task Document:** `/Users/apple/github-projects/microdao-daarion/TASK_REBUILD_DAARION_WEB.md`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 🔴 Incident #4: NODE1 Host Compromise (Jan 10, 2026)\n",
"\n",
"### Summary\n",
"ALL PostgreSQL official images show malware artifacts when run on NODE1.\n",
"This is **NOT** \"Docker Hub compromised\" — this is **NODE1 host compromise**.\n",
"\n",
"### Indicators of Compromise (IOC)\n",
"```\n",
"/tmp/httpd # ~10MB crypto miner (xmrig variant)\n",
"/tmp/.perf.c/ # perfctl malware staging directory\n",
"/tmp/mysql # Another miner variant\n",
"/tmp/cpioshuf # perfctl payload\n",
"/tmp/ipcalc* # perfctl payload\n",
"```\n",
"\n",
"### Affected Images (on NODE1)\n",
"- ❌ postgres:15-alpine\n",
"- ❌ postgres:16-alpine\n",
"- ❌ postgres:14\n",
"- ❌ postgres:16 (Debian)\n",
"\n",
"### Why This is HOST Compromise (not image)\n",
"1. ALL different image variants show same IOC\n",
"2. Previous incidents (#1, #2, #3) already compromised NODE1\n",
"3. `/tmp/.perf.c/` is classic perfctl malware directory\n",
"4. `tmpfs noexec` didn't prevent infection\n",
"\n",
"### Verification Procedure\n",
"```bash\n",
"# Run triage script from MacBook (NOT NODE1!)\n",
"cd /Users/apple/github-projects/microdao-daarion\n",
"./scripts/security/triage-postgres-compromise.sh compare\n",
"\n",
"# Or manually:\n",
"# 1. Get digest from NODE1\n",
"ssh root@144.76.224.179 \"docker inspect --format='{{index .RepoDigests 0}}' postgres:16\"\n",
"\n",
"# 2. Pull same digest on MacBook\n",
"docker pull postgres:16@sha256:<digest>\n",
"\n",
"# 3. Check if clean\n",
"docker run --rm postgres:16@sha256:<digest> ls -la /tmp/\n",
"# If empty → NODE1 compromised, image is clean\n",
"```\n",
"\n",
"### Current Status\n",
"- ⏳ **Verification pending** — Need to test on clean host\n",
"- 🔴 **NODE1 UNSAFE** — Do not deploy PostgreSQL\n",
"- 🟡 **Secrets rotation needed** — Assume all compromised\n",
"\n",
"### Full Documentation\n",
"See `INFRASTRUCTURE.md` → Incident #4"
]
}
],
"metadata": {
@@ -756,4 +819,4 @@
},
"nbformat": 4,
"nbformat_minor": 4
}
}

View File

@@ -192,3 +192,12 @@ Ref: messages.matrix_event_id - matrix_events.event_id [note: 'Message ↔ Matri

View File

@@ -543,3 +543,12 @@ open http://localhost:8899/agents

View File

@@ -90,3 +90,12 @@ curl http://144.76.224.179:7001/city/microdao/daarion/dashboard
Всі компоненти працюють! ✅

View File

@@ -72,3 +72,12 @@ docker restart daarion-web
Після синхронізації frontend коду, сторінка `/microdao/daarion` буде повністю функціональна!

View File

@@ -865,3 +865,12 @@ networks:

View File

@@ -504,3 +504,12 @@ tools:

View File

@@ -277,3 +277,12 @@ Behavior:

View File

@@ -422,3 +422,12 @@ Behavior:

View File

@@ -240,3 +240,12 @@ COMMENT ON SCHEMA public IS 'Messenger schema v1 - Matrix-aware implementation';

View File

@@ -156,3 +156,12 @@ ON CONFLICT (id) DO NOTHING;

View File

@@ -147,3 +147,12 @@ EXECUTE FUNCTION update_timestamp();

View File

@@ -81,3 +81,12 @@ http {

View File

@@ -42,3 +42,12 @@ server {

10
run_sofia.sh Executable file
View File

@@ -0,0 +1,10 @@
#!/bin/bash
# Sofia Agent - Швидкий запуск
# Usage: ./run_sofia.sh [message]
# Перейти в директорію проекту
cd "$(dirname "$0")"
# Активувати віртуальне середовище та запустити Sofia
source sofia_venv/bin/activate
python3 sofia_agent.py "$@"

67
scripts/git-sync-all.sh Executable file
View File

@@ -0,0 +1,67 @@
#!/bin/bash
# ============================================================
# git-sync-all.sh - Синхронізація на всі Git репозиторії
# ============================================================
# Автоматично push на:
# - GitHub (origin)
# - Gitea (локальний, localhost:3000)
# - GitLab (NODE3, через SSH tunnel)
# ============================================================
set -e
PROJECT_DIR="/Users/apple/github-projects/microdao-daarion"
cd "$PROJECT_DIR"
# Кольори
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
echo -e "${GREEN}🔄 Git Sync All Remotes${NC}"
echo "================================"
date
echo ""
# Поточна гілка
BRANCH=$(git branch --show-current)
echo -e "📌 Гілка: ${YELLOW}$BRANCH${NC}"
echo ""
# 1. Push на GitHub (origin)
echo -e "${GREEN}1. GitHub (origin)${NC}"
if git push origin "$BRANCH" 2>/dev/null; then
echo " ✅ GitHub OK"
else
echo -e " ${RED}❌ GitHub FAILED${NC}"
fi
# 2. Push на Gitea (локальний)
echo -e "${GREEN}2. Gitea (localhost:3000)${NC}"
if git push gitea "$BRANCH" 2>/dev/null; then
echo " ✅ Gitea OK"
else
echo -e " ${YELLOW}⚠️ Gitea - можливо потрібен логін${NC}"
# Спробуємо з credentials
git push http://daarion-admin:DaarionGit2026!@localhost:3000/daarion-admin/microdao-daarion.git "$BRANCH" 2>/dev/null && echo " ✅ Gitea OK (з credentials)" || echo -e " ${RED}❌ Gitea FAILED${NC}"
fi
# 3. Push на GitLab (NODE3)
echo -e "${GREEN}3. GitLab (NODE3)${NC}"
# Перевірка чи є SSH tunnel
if nc -z localhost 8929 2>/dev/null; then
if git push gitlab "$BRANCH" 2>/dev/null; then
echo " ✅ GitLab OK"
else
# Спробуємо з credentials
git push http://root:glpat-daarion-gitlab-2026@localhost:8929/root/microdao-daarion.git "$BRANCH" 2>/dev/null && echo " ✅ GitLab OK (з credentials)" || echo -e " ${RED}❌ GitLab FAILED${NC}"
fi
else
echo -e " ${YELLOW}⚠️ GitLab недоступний. Запустіть SSH tunnel:${NC}"
echo " ssh -p 33147 -L 8929:localhost:8929 zevs@80.77.35.151"
fi
echo ""
echo "================================"
echo -e "${GREEN}✅ Синхронізація завершена${NC}"

View File

@@ -0,0 +1,78 @@
#!/bin/bash
# ============================================================
# install-hooks.sh — Встановлення Git hooks для автологування
# ============================================================
set -e
PROJECT_DIR="/Users/apple/github-projects/microdao-daarion"
HOOKS_DIR="$PROJECT_DIR/.git/hooks"
echo "🔧 Встановлення Git hooks..."
# Post-commit hook — логує кожен коміт
cat > "$HOOKS_DIR/post-commit" << 'HOOK'
#!/bin/bash
# Auto-log commits to session file
PROJECT_DIR="/Users/apple/github-projects/microdao-daarion"
SESSIONS_DIR="$PROJECT_DIR/logs/sessions"
DATE=$(date +%Y-%m-%d)
TIME=$(date +%H:%M)
SESSION_FILE="$SESSIONS_DIR/${DATE}.md"
# Отримати інформацію про коміт
COMMIT_HASH=$(git rev-parse --short HEAD)
COMMIT_MSG=$(git log -1 --pretty=%B | head -1)
CHANGED_FILES=$(git diff-tree --no-commit-id --name-only -r HEAD | wc -l | tr -d ' ')
# Створити файл якщо не існує
if [ ! -f "$SESSION_FILE" ]; then
mkdir -p "$SESSIONS_DIR"
cat > "$SESSION_FILE" << EOF
# 📅 Session Log: $DATE
**Проєкт:** DAARION & MicroDAO
---
## 📋 Хронологія дій
EOF
fi
# Додати запис про коміт
echo "- **$TIME** — 📦 Commit \`$COMMIT_HASH\`: $COMMIT_MSG ($CHANGED_FILES files)" >> "$SESSION_FILE"
HOOK
chmod +x "$HOOKS_DIR/post-commit"
echo "✅ post-commit hook встановлено"
# Pre-push hook — логує push операції
cat > "$HOOKS_DIR/pre-push" << 'HOOK'
#!/bin/bash
# Log push operations
PROJECT_DIR="/Users/apple/github-projects/microdao-daarion"
SESSIONS_DIR="$PROJECT_DIR/logs/sessions"
DATE=$(date +%Y-%m-%d)
TIME=$(date +%H:%M)
SESSION_FILE="$SESSIONS_DIR/${DATE}.md"
REMOTE_NAME=$1
REMOTE_URL=$2
if [ -f "$SESSION_FILE" ]; then
echo "- **$TIME** — 🚀 Push to \`$REMOTE_NAME\`" >> "$SESSION_FILE"
fi
HOOK
chmod +x "$HOOKS_DIR/pre-push"
echo "✅ pre-push hook встановлено"
echo ""
echo "🎉 Git hooks встановлено!"
echo ""
echo "Тепер автоматично логуватиметься:"
echo " • Кожен commit"
echo " • Кожен push"

97
scripts/logging/session-end.sh Executable file
View File

@@ -0,0 +1,97 @@
#!/bin/bash
# ============================================================
# session-end.sh — Завершення робочої сесії
# ============================================================
# Автоматично:
# - Додає підсумок сесії
# - Комітить зміни
# - Пушить на всі репозиторії
# ============================================================
set -e
PROJECT_DIR="/Users/apple/github-projects/microdao-daarion"
SESSIONS_DIR="$PROJECT_DIR/logs/sessions"
DATE=$(date +%Y-%m-%d)
TIME=$(date +%H:%M)
SESSION_FILE="${DAARION_SESSION_FILE:-$SESSIONS_DIR/${DATE}.md}"
# Кольори
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'
echo -e "${GREEN}🏁 Завершення сесії${NC}"
echo "================================"
# Додати підсумок
if [ -f "$SESSION_FILE" ]; then
cat >> "$SESSION_FILE" << EOF
### $TIME — Сесію завершено
---
## 📊 Підсумок
- **Завершено:** $TIME
- **Git status:** $(cd "$PROJECT_DIR" && git status --short | wc -l | tr -d ' ') змінених файлів
EOF
echo -e "📄 Оновлено: ${CYAN}$SESSION_FILE${NC}"
fi
# Git операції
cd "$PROJECT_DIR"
echo ""
echo -e "${YELLOW}📦 Git операції...${NC}"
# Додати всі зміни
git add -A
# Перевірити чи є що комітити
if git diff --cached --quiet; then
echo " Немає змін для коміту"
else
# Коміт
COMMIT_MSG="📝 Session $DATE: auto-commit on session end"
git commit -m "$COMMIT_MSG"
echo -e "✅ Commit: ${CYAN}$COMMIT_MSG${NC}"
# Push на всі remote
echo ""
echo -e "${YELLOW}🚀 Push на всі репозиторії...${NC}"
# GitHub
if git push origin 2>/dev/null; then
echo " ✅ GitHub (origin)"
else
echo " ⚠️ GitHub — помилка або немає змін"
fi
# Gitea
if git push gitea 2>/dev/null; then
echo " ✅ Gitea"
else
echo " ⚠️ Gitea — помилка або недоступний"
fi
# GitLab (через tunnel)
if nc -z localhost 8929 2>/dev/null; then
if git push gitlab 2>/dev/null; then
echo " ✅ GitLab"
else
echo " ⚠️ GitLab — помилка"
fi
else
echo " ⚠️ GitLab — SSH tunnel не активний"
fi
fi
echo ""
echo -e "${GREEN}✅ Сесію завершено!${NC}"
echo "До зустрічі! 👋"

43
scripts/logging/session-log.sh Executable file
View File

@@ -0,0 +1,43 @@
#!/bin/bash
# ============================================================
# session-log.sh — Додати запис до поточної сесії
# ============================================================
# Використання: ./scripts/logging/session-log.sh "Опис дії"
# Або через alias: session-log "Опис дії"
# ============================================================
PROJECT_DIR="/Users/apple/github-projects/microdao-daarion"
SESSIONS_DIR="$PROJECT_DIR/logs/sessions"
DATE=$(date +%Y-%m-%d)
TIME=$(date +%H:%M)
SESSION_FILE="${DAARION_SESSION_FILE:-$SESSIONS_DIR/${DATE}.md}"
MESSAGE="$*"
if [ -z "$MESSAGE" ]; then
echo "❌ Вкажіть опис дії"
echo "Використання: session-log \"Опис дії\""
exit 1
fi
# Якщо файл не існує — створити
if [ ! -f "$SESSION_FILE" ]; then
mkdir -p "$SESSIONS_DIR"
cat > "$SESSION_FILE" << EOF
# 📅 Session Log: $DATE
**Оператор:** Ivan + AI Assistant
**Проєкт:** DAARION & MicroDAO
---
## 📋 Хронологія дій
EOF
fi
# Додати запис
echo "- **$TIME** — $MESSAGE" >> "$SESSION_FILE"
echo "✅ Записано: $MESSAGE"

Some files were not shown because too many files have changed in this diff Show More