diff --git a/IDENTITY.md b/IDENTITY.md index 12d076d..cf452c7 100644 --- a/IDENTITY.md +++ b/IDENTITY.md @@ -1,6 +1,6 @@ # IDENTITY.md - Who Am I -- **Name:** Klavdija +- **Name:** Clawdie - **Creature:** AI assistant - **Vibe:** Practical, direct, warm when it matters - **Emoji:** 🦞 diff --git a/MEMORY.md b/MEMORY.md index c786107..9f3b215 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -4,7 +4,7 @@ ## Current System (as of 28.Mar.2026) - **Host:** FreeBSD 15.0 bare-metal, ZFS, Bastille jails -- **Brain:** PostgreSQL 17 + pgvector in `db` jail (192.168.100.3), DB: `klavdija_brain` +- **Brain:** PostgreSQL 17 + pgvector in `db` jail (192.168.100.3), DB: `{agent}_brain` - **Embeddings:** bge-m3 Q4_K_M via llama-server at 192.168.100.5:8080 - **Chat model:** Phi-4-mini-instruct Q4_K_M at 192.168.100.5:8081 (stepping stone; target: Qwen3-14B at 32 GB RAM) - **Heartbeat:** cron every 30 min, writes HEARTBEAT.md, optional Telegram alert @@ -34,9 +34,9 @@ using Docker, OpenClaw v1/v2, and cloud LLMs (GLM, OpenRouter). That infrastruct is retired. These memories are kept for continuity β€” treat infra references in them as historical, not current. -- [24.02.] Major session: 3 skills created, cost optimisation, name Klavdija β†’ Clawdie, Telegram integration +- [24.02.] Major session: 3 skills created, cost optimisation, assistant renamed to Clawdie, Telegram integration - [14.02.] PRD updates v0.3: SSH, Tailscale VPN, user 'clawdie', GLM-5 model configured - [11.02.] Collaborative tmux + Claude Code workflow established - [10.02.] Strapi CMS deployment planning for cms.domedog.pro - [09.02.] Memory persistence explained β€” context files are the persistent layer -- [06.02.] Initial setup: Sam configured Klavdija as AI assistant, sudo access, fail2ban, cron +- [06.02.] Initial setup: Sam configured Clawdie as AI assistant, sudo access, fail2ban, cron diff --git a/USER.md b/USER.md index 18f37a9..899803b 100644 --- a/USER.md +++ b/USER.md @@ -14,7 +14,7 @@ - Has a dog that needs live attention (busy with caregiving) - Exploring AWS free tier for cloud infrastructure -- Wants Klavdija to be resilient and long-term companion +- Wants the agent to be resilient and a long-term companion - Uses SSH keys for authentication - Values security but doesn't have time for manual maintenance - Learning Python and experimenting with AI/LLM development diff --git a/docs/CONTROLPLANE-INSTALL.md b/docs/CONTROLPLANE-INSTALL.md index 2ec272e..d0a9743 100644 --- a/docs/CONTROLPLANE-INSTALL.md +++ b/docs/CONTROLPLANE-INSTALL.md @@ -5,7 +5,7 @@ running domedog host. Written after a live session so all snags are documented. > **Script:** `docs/scripts/setup-controlplane-jail.sh` automates steps 1–3. > The remaining steps (npm prefix, pi, service) must be run manually for now β€” -> the script's step 5 is stale (hardcoded `klavdija`, wrong rc.d path). Use +> the script's step 5 is stale (hardcoded service name, wrong rc.d path). Use > the manual commands below. --- @@ -17,7 +17,7 @@ running domedog host. Written after a live session so all snags are documented. - `.env` populated β€” especially `AGENT_NAME`, `WORKER_JAIL_IP`, `ZAI_API_KEY` - ZFS pool `zroot` with prefix `clawdie-runtime` (set in `bastille.conf`) - `warden0` bridge interface exists (`ifconfig warden0` to verify) -- `db` jail running with `clawdie_brain` database already created +- `db` jail running with `{agent}_brain` database already created (see `docs/scripts/setup-db-jail.sh` β€” run that first) --- @@ -278,4 +278,4 @@ points at the old jail path. | 6 | `node dist/setup/index.js` not found | Setup is not compiled to dist | Use `npx tsx setup/index.ts` | | 7 | `bastille destroy` fails | Mounts still active | Unmount nullfs + ZFS dataset manually first | | 8 | ZFS npm-global not visible in new jail | Mountpoint still points at old jail | `zfs set mountpoint=...` to new path | -| 9 | Service script references `klavdija` | `setup-controlplane-jail.sh` step 5 is stale | Use `--step service` via tsx (step 10 above) | +| 9 | Service script references a hardcoded name | `setup-controlplane-jail.sh` step 5 is stale | Use `--step service` via tsx (step 10 above) | diff --git a/docs/DB-DISASTER-RECOVERY.md b/docs/DB-DISASTER-RECOVERY.md index 599a059..32bb8d1 100644 --- a/docs/DB-DISASTER-RECOVERY.md +++ b/docs/DB-DISASTER-RECOVERY.md @@ -20,11 +20,11 @@ enters through the CMS. attacker β†’ crafted HTTP POST to cms.clawdie.si (Strapi API or contact form) β†’ strapi_cms database (cms β†’ db jail, port 5432) - β€” jail isolation holds: strapi_cms user has no SELECT on klavdija_brain + β€” jail isolation holds: strapi_cms user has no SELECT on {agent}_brain β€” BUT: agent reads published CMS content as part of normal site-check β†’ agent reads the page, scores it as interesting, stores summary β†’ memory-pg: INSERT INTO memories (summary, key_facts, importance ...) - β†’ poisoned record is now in klavdija_brain + β†’ poisoned record is now in {agent}_brain β†’ next startup: memory hydration injects poisoned instructions into context β†’ agent acts on them on the first matching query ``` @@ -37,7 +37,7 @@ access controls entirely β€” the agent cooperates willingly. ### What "partial success" looks like - Jail isolation held. No shell. No host escape. -- `klavdija_brain` schema is intact. PostgreSQL is healthy. +- `{agent}_brain` schema is intact. PostgreSQL is healthy. - `memories` contains 1–5 crafted rows with plausible metadata: - `topics = ARRAY['system', 'instructions', 'safety']` - `importance = 3` (below threshold that triggers operator alert) @@ -68,7 +68,7 @@ Anomalous agent behaviour detected β”‚ β–Ό Stop agent immediately - sudo service klavdija stop + sudo service {agent} stop β”‚ β–Ό Run memory audit queries (see above) @@ -161,7 +161,7 @@ a clean proven state. ### Step 1: Stop everything touching the db jail ```sh -sudo service klavdija stop +sudo service {agent} stop sudo bastille stop ${AGENT_NAME}-cms # Strapi writes stop ``` @@ -214,9 +214,9 @@ The `max(created_at)` should match the snapshot timestamp. ### Step 6: Restart agent and audit hydration output ```sh -sudo service klavdija start +sudo service {agent} start # Monitor hydration output -tail -f /home/clawdie/clawdie-ai/logs/klavdija.log | grep -i "hydrat\|memory\|brain" +tail -f /home/clawdie/clawdie-ai/logs/{agent}.log | grep -i "hydrat\|memory\|brain" ``` Verify the hydrated MEMORY.md does not contain the poisoned content. @@ -299,7 +299,7 @@ psql "$MEMORY_DB_URL" -c " " # 5. Stop agent (simulates operator response) -sudo service klavdija stop +sudo service {agent} stop # 6. Option A path β€” surgical delete psql "$MEMORY_DB_URL" -c " @@ -327,9 +327,9 @@ fi # psql "$MEMORY_DB_URL" -tAc "SELECT count(*) FROM memories;" # 9. Restart agent -sudo service klavdija start +sudo service {agent} start -echo "Drill complete. Check logs/klavdija.log for clean memory hydration." +echo "Drill complete. Check logs/{agent}.log for clean memory hydration." ``` ### Pass criteria diff --git a/docs/DEPLOYMENT-MODELS.md b/docs/DEPLOYMENT-MODELS.md index 6b1ae8e..7014a74 100644 --- a/docs/DEPLOYMENT-MODELS.md +++ b/docs/DEPLOYMENT-MODELS.md @@ -21,7 +21,7 @@ VPS / cloud host (FreeBSD 15) **Setup path:** ``` -git clone β†’ npm run install-all β†’ configure .env β†’ service klavdija start +git clone β†’ npm run install-all β†’ configure .env β†’ service {agent} start ``` See [`docs/INSTALL.md`](./INSTALL.md) and the `ansible-freebsd` skill for diff --git a/docs/FRESH-INSTALL-CHECKLIST.md b/docs/FRESH-INSTALL-CHECKLIST.md index ee429b2..7cdebec 100644 --- a/docs/FRESH-INSTALL-CHECKLIST.md +++ b/docs/FRESH-INSTALL-CHECKLIST.md @@ -23,30 +23,30 @@ shows boot messages with timestamps. Check firstboot log for exact timestamps: ```sh -head -5 /var/log/clawdie-firstboot.log -tail -5 /var/log/clawdie-firstboot.log +head -5 /var/log/${AGENT_NAME}-firstboot.log +tail -5 /var/log/${AGENT_NAME}-firstboot.log ``` ## 1. Jails running ```sh -jls -N +sudo bastille list ``` Expected (agent name may vary): ``` - JID IP Address Hostname Name - 1 10.0.X.2 {agent}-controlplane {agent}-controlplane - 2 10.0.X.3 db db - 3 10.0.X.4 cms cms - 4 10.0.X.5 llamacpp llamacpp + JID IP Address Hostname Path + {agent}-cont.. 10.0.X.2 {agent}-controlplane /usr/local/bastille/jails/... + db 10.0.X.3 db /usr/local/bastille/jails/... + cms 10.0.X.4 cms /usr/local/bastille/jails/... + llamacpp 10.0.X.5 llamacpp /usr/local/bastille/jails/... ``` All four jails must be present and running. If any are missing: ```sh -cat /var/log/clawdie-firstboot.log | grep -i 'fail\|error' +grep -i 'fail\|error' /var/log/${AGENT_NAME}-firstboot.log ``` ## 2. .env correctness @@ -61,8 +61,8 @@ Verify: |-----|----------| | `AGENT_NAME` | Lowercase, no spaces (e.g. `clawdie`, `mevy`) | | `AGENT_GENDER` | `f`, `m`, or `n` | -| `AGENT_DOMAIN` | Valid domain or `.internal` | -| `AGENT_INTERNAL_DOMAIN` | `{agent}.home.arpa` | +| `AGENT_DOMAIN` | Public domain (e.g. `clawdie.si`) or `{agent}.internal` for VMs | +| `AGENT_INTERNAL_DOMAIN` | `{agent}.home.arpa` (Tailscale / local DNS) | | `AGENT_TMP_DIR` | Writable path, not `/tmp` | | `PI_TUI_PROVIDER` | `zai`, `openrouter`, `anthropic`, etc. | | `PI_TUI_MODEL` | Valid model for the provider | @@ -84,7 +84,7 @@ Expected: JSON response with `mode`, `throttle`, `memory`, `activeJails`. If socket is missing, check if the agent process is running: ```sh -pgrep -f 'node.*dist/index.js' +sudo bastille cmd "${AGENT_NAME}-controlplane" service clawdie status ``` ## 4. Database connectivity @@ -132,13 +132,12 @@ If Lumina fails to start, check: ```sh # X11 log -cat /var/log/Xorg.0.log | tail -30 +tail -30 /var/log/Xorg.0.log # LightDM log -cat /var/log/lightdm/lightdm.log | tail -30 +tail -30 /var/log/lightdm/lightdm.log # GPU driver loaded? -sysctl kern.conftxt | grep -i gpu pciconf -lv | grep -B3 'VGA' ``` @@ -148,8 +147,8 @@ pciconf -lv | grep -B3 'VGA' # PF rules loaded sudo pfctl -sr | head -10 -# NAT working (from inside a jail) -sudo bastille cmd db ping -c1 1.1.1.1 +# NAT working (from inside the db jail) +sudo bastille cmd db ping -c 1 1.1.1.1 # Bridge healthy ifconfig warden0 | grep 'inet ' @@ -178,16 +177,16 @@ python3 .agent/skills/tmux-screenshot/tmux-screenshot.py \ Verify the capture landed: ```sh -ls -la /usr/local/www/clawdie/screenshots/*.png | tail -3 +ls -la /usr/local/www/${AGENT_NAME}/screenshots/*.png | tail -3 ``` ## Log paths reference | Log | Path | |-----|------| -| Firstboot orchestrator | `/var/log/clawdie-firstboot.log` | -| Firstboot progress | `/var/log/clawdie-firstboot.progress` | -| Agent (production) | `logs/klavdija.log` (relative to project) | +| Firstboot orchestrator | `/var/log/${AGENT_NAME}-firstboot.log` | +| Firstboot progress | `/var/log/${AGENT_NAME}-firstboot.progress` | +| Agent (production) | `logs/${AGENT_NAME}.log` (relative to project) | | Watchdog | Same as agent log (pino structured) | | Preflight run | `logs/preflight-{runstamp}/` | | LightDM | `/var/log/lightdm/lightdm.log` | diff --git a/docs/HEARTBEAT.md b/docs/HEARTBEAT.md index 5864d04..b27b366 100644 --- a/docs/HEARTBEAT.md +++ b/docs/HEARTBEAT.md @@ -29,8 +29,8 @@ Each run (default: every 30 minutes): 3. **LLM interpretation** β€” local model at `:8081` - Feed health + memory snapshot to chat model - - Prompt: "You are Klavdija's system monitor. Summarise current state - in 3 sentences. Flag anything that needs operator attention." + - Prompt: "You are the system monitor for ${AGENT_NAME}. Summarise + current state in 3 sentences. Flag anything that needs operator attention." - If LLM unavailable: skip interpretation, log raw data only 4. **Write `HEARTBEAT.md`** β€” live state file in project root @@ -111,11 +111,11 @@ HEARTBEAT runs β”‚ β”œβ”€β”€ WARN (jail down, disk >80%, memory pipeline stale >2h) β”‚ β†’ write HEARTBEAT.md with flag - β”‚ β†’ Telegram: "⚠️ Klavdija heartbeat: " + β”‚ β†’ Telegram: "⚠️ ${AGENT_NAME} heartbeat: " β”‚ └── CRIT (DB unreachable, all jails down, disk >95%) β†’ write HEARTBEAT.md with flag - β†’ Telegram: "🚨 Klavdija heartbeat CRITICAL: " + β†’ Telegram: "🚨 ${AGENT_NAME} heartbeat CRITICAL: " β†’ do NOT attempt auto-repair (operator decides) ``` @@ -127,7 +127,7 @@ Repair actions go through `clawdie-hostd` on explicit operator request. ## Memory integration The heartbeat optionally writes a low-importance memory entry after each -run so Klavdija has context about recent system state: +run so the agent has context about recent system state: ```sql INSERT INTO memories (session_id, summary, importance, topics) diff --git a/docs/scripts/setup-controlplane-jail.sh b/docs/scripts/setup-controlplane-jail.sh index cb9ec50..8ff1495 100755 --- a/docs/scripts/setup-controlplane-jail.sh +++ b/docs/scripts/setup-controlplane-jail.sh @@ -94,18 +94,18 @@ echo "==> npm-global: auto-mounted via ZFS mountpoint (no fstab entry needed)" # ── 5. rc.d service ─────────────────────────────────────────────────────────── -RC_SRC="/usr/local/etc/rc.d/klavdija" -RC_DST="${JAIL_ROOT}/usr/local/etc/rc.d/klavdija" +RC_SRC="/usr/local/etc/rc.d/${AGENT_NAME}" +RC_DST="${JAIL_ROOT}/usr/local/etc/rc.d/${AGENT_NAME}" if [ -f "${RC_SRC}" ]; then - echo "==> Installing rc.d/klavdija into jail" + echo "==> Installing rc.d/${AGENT_NAME} into jail" cp "${RC_SRC}" "${RC_DST}" chmod +x "${RC_DST}" - bastille sysrc "${JAIL}" klavdija_enable=YES + bastille sysrc "${JAIL}" "${AGENT_NAME}_enable=YES" else echo "WARN: ${RC_SRC} not found β€” install manually after npm run build" fi echo "" -echo "==> Done. Start with: bastille cmd ${JAIL} service klavdija start" +echo "==> Done. Start with: bastille cmd ${JAIL} service ${AGENT_NAME} start" echo " Verify: bastille cmd ${JAIL} pgrep -la node" diff --git a/html/clawdie/screenshots/manifest.json b/html/clawdie/screenshots/manifest.json index e8be14d..3e2cbd6 100644 --- a/html/clawdie/screenshots/manifest.json +++ b/html/clawdie/screenshots/manifest.json @@ -1,24 +1,25 @@ { - "generated_at": "2026-03-08T21:48:15.396932", - "count": 6, + "generated_at": "2026-04-01T20:27:52.411135", + "count": 5, "screenshots": [ { - "uuid": "bd96a82b194c", + "uuid": "f5bc5ba1885b", "session": "0", - "captured_at": "2026-03-08T21:48:14.941197", - "captured_at_display": "08.mar.2026 21:48:14", + "capture_target": "0:codex", + "captured_at": "2026-04-01T20:27:51.941350", + "captured_at_display": "01.apr.2026 20:27:51", "host": "osa.smilepowered.org", "window_index": "0", - "window_name": "node", + "window_name": "codex", "pane_id": "%0", - "pane_title": "\u2810 Claude Code", - "pane_current_command": "node", - "pane_current_path": "/home/clawdie/clawdie-ai", - "txt_hash": "bd96a82b194c293366e5dd47e0e8be99114b719dd64249889102461245d7de22", - "text_path": "bd96a82b194c.txt", - "png_path": "bd96a82b194c.png", - "json_path": "bd96a82b194c.json", - "line_count": 40, + "pane_title": "osa.smilepowered.org", + "pane_current_command": "codex", + "pane_current_path": "/home/clawdie/clawdie-iso", + "txt_hash": "f5bc5ba1885b67c1f7914d2b641024c7f478ec7156e5b5caa3ca9fa6381e63a6", + "text_path": "f5bc5ba1885b.txt", + "png_path": "f5bc5ba1885b.png", + "json_path": "f5bc5ba1885b.json", + "line_count": 39, "tags": [ "tmux", "terminal", @@ -26,27 +27,28 @@ ], "detected_signatures": [], "dimensions": { - "width": 1579, - "height": 788 + "width": 1561, + "height": 848 } }, { - "uuid": "ee55b51741f1", + "uuid": "cd9afb8e7f0a", "session": "0", - "captured_at": "2026-03-08T21:47:32.228071", - "captured_at_display": "08.mar.2026 21:47:32", + "capture_target": "%0", + "captured_at": "2026-04-01T20:14:11.120766", + "captured_at_display": "01.apr.2026 20:14:11", "host": "osa.smilepowered.org", "window_index": "0", - "window_name": "node", + "window_name": "codex", "pane_id": "%0", - "pane_title": "\u2802 Claude Code", - "pane_current_command": "node", - "pane_current_path": "/home/clawdie/clawdie-ai", - "txt_hash": "ee55b51741f100899182655eac822190e620dd5bf80d1407f582b327518a6ff0", - "text_path": "ee55b51741f1.txt", - "png_path": "ee55b51741f1.png", - "json_path": "ee55b51741f1.json", - "line_count": 40, + "pane_title": "osa.smilepowered.org", + "pane_current_command": "codex", + "pane_current_path": "/home/clawdie/clawdie-iso", + "txt_hash": "cd9afb8e7f0a6dc1afc40264adcdecd55415eb60a6cec182c346ea7533d46259", + "text_path": "cd9afb8e7f0a.txt", + "png_path": "cd9afb8e7f0a.png", + "json_path": "cd9afb8e7f0a.json", + "line_count": 39, "tags": [ "tmux", "terminal", @@ -59,10 +61,68 @@ } }, { - "uuid": "10a7cd4c4a6e", + "uuid": "803a5a96c890", "session": "0", - "captured_at": "2026-03-08T21:33:02.396651", - "captured_at_display": "08.mar.2026 21:33:02", + "capture_target": "%0", + "captured_at": "2026-04-01T18:07:33.878786", + "captured_at_display": "01.apr.2026 18:07:33", + "host": "osa.smilepowered.org", + "window_index": "0", + "window_name": "codex", + "pane_id": "%0", + "pane_title": "osa.smilepowered.org", + "pane_current_command": "codex", + "pane_current_path": "/home/clawdie/clawdie-iso", + "txt_hash": "803a5a96c89019b68fc565be51d0ba98d24a43969b4079033179a7547f8df652", + "text_path": "803a5a96c890.txt", + "png_path": "803a5a96c890.png", + "json_path": "803a5a96c890.json", + "line_count": 39, + "tags": [ + "tmux", + "terminal", + "diagnostic" + ], + "detected_signatures": [], + "dimensions": { + "width": 1579, + "height": 688 + } + }, + { + "uuid": "8c358e1aa9d8", + "session": "clawdie", + "capture_target": "clawdie:main", + "captured_at": "2026-03-14T23:07:04.863267", + "captured_at_display": "14.mar.2026 23:07:04", + "host": "osa.smilepowered.org", + "window_index": "1", + "window_name": "main", + "pane_id": "%2", + "pane_title": "", + "pane_current_command": "bash", + "pane_current_path": "/home/clawdie/clawdie-ai", + "txt_hash": "8c358e1aa9d87ebf75a724fe3bc05d5cf7a86e7906e222f79f7065dd672ef84e", + "text_path": "8c358e1aa9d8.txt", + "png_path": "8c358e1aa9d8.png", + "json_path": "8c358e1aa9d8.json", + "line_count": 35, + "tags": [ + "tmux", + "terminal", + "diagnostic" + ], + "detected_signatures": [], + "dimensions": { + "width": 481, + "height": 768 + } + }, + { + "uuid": "e71e3f2434cc", + "session": "0", + "captured_at": "2026-03-08T21:11:33.339789", + "captured_at_display": "08.03.2026 21:11:33", "host": "osa.smilepowered.org", "window_index": "0", "window_name": "node", @@ -70,104 +130,28 @@ "pane_title": "\u2810 Claude Code", "pane_current_command": "node", "pane_current_path": "/home/clawdie/clawdie-ai", - "txt_hash": "10a7cd4c4a6ead934858ec588dc71c7aa24fbb9ee60a447d9779661835d64811", - "text_path": "10a7cd4c4a6e.txt", - "png_path": "10a7cd4c4a6e.png", - "json_path": "10a7cd4c4a6e.json", + "txt_hash": "e71e3f2434cccf734c12424d77ec995203b670dbed79a4726fd0e481ae10c922", + "text_path": "e71e3f2434cc.txt", + "png_path": "e71e3f2434cc.png", + "json_path": "e71e3f2434cc.json", "line_count": 40, "tags": [ "tmux", "terminal", "diagnostic" ], - "detected_signatures": [], - "dimensions": { - "width": 1579, - "height": 848 - } - }, - { - "uuid": "881a4ffb1ec7", - "session": "0", - "captured_at": "2026-03-08T21:31:44.445800", - "captured_at_display": "08.mar.2026 21:31:44", - "host": "osa.smilepowered.org", - "window_index": "0", - "window_name": "node", - "pane_id": "%0", - "pane_title": "\u2810 Claude Code", - "pane_current_command": "node", - "pane_current_path": "/home/clawdie/clawdie-ai", - "txt_hash": "881a4ffb1ec703357e8da90cb859c09f1259f4a282f439eb8d9d844f42cf9aa6", - "text_path": "881a4ffb1ec7.txt", - "png_path": "881a4ffb1ec7.png", - "json_path": "881a4ffb1ec7.json", - "line_count": 40, - "tags": [ - "tmux", - "terminal", - "diagnostic" + "detected_signatures": [ + { + "id": "controlplane_hostname_ok", + "severity": "ok", + "source_skill": "warden-bootstrap", + "matched_text": "controlplane.clawdie.local", + "next_action": "Controlplane hostname is correctly set." + } ], - "detected_signatures": [], "dimensions": { "width": 1579, - "height": 848 - } - }, - { - "uuid": "b45b2398a656", - "session": "0", - "captured_at": "2026-03-08T21:27:11.222631", - "captured_at_display": "08.mar.2026 21:27:11", - "host": "osa.smilepowered.org", - "window_index": "0", - "window_name": "node", - "pane_id": "%0", - "pane_title": "\u2802 Claude Code", - "pane_current_command": "node", - "pane_current_path": "/home/clawdie/clawdie-ai", - "txt_hash": "b45b2398a656dd10c8c439e8ced701a845c68889bf46b5593cdfe46172b49158", - "text_path": "b45b2398a656.txt", - "png_path": "b45b2398a656.png", - "json_path": "b45b2398a656.json", - "line_count": 40, - "tags": [ - "tmux", - "terminal", - "diagnostic" - ], - "detected_signatures": [], - "dimensions": { - "width": 1579, - "height": 828 - } - }, - { - "uuid": "33625d1cad23", - "session": "0", - "captured_at": "2026-03-08T21:18:48.415910", - "captured_at_display": "08.mar.2026 21:18:48", - "host": "osa.smilepowered.org", - "window_index": "0", - "window_name": "node", - "pane_id": "%0", - "pane_title": "\u2810 Claude Code", - "pane_current_command": "node", - "pane_current_path": "/home/clawdie/clawdie-ai", - "txt_hash": "33625d1cad23782a50071ec4ce0f7f9d483b3032d028cb2e7c34a0b364705e19", - "text_path": "33625d1cad23.txt", - "png_path": "33625d1cad23.png", - "json_path": "33625d1cad23.json", - "line_count": 40, - "tags": [ - "tmux", - "terminal", - "diagnostic" - ], - "detected_signatures": [], - "dimensions": { - "width": 1579, - "height": 848 + "height": 648 } } ] diff --git a/scripts/heartbeat.sh b/scripts/heartbeat.sh index 6cbea7a..dccf1d2 100755 --- a/scripts/heartbeat.sh +++ b/scripts/heartbeat.sh @@ -43,7 +43,7 @@ _flag() { } # Jails β€” try prefixed name first, fall back to short name -# Handles both klavdija-db and db conventions; llama-cpp β†’ llamacpp variant +# Handles legacy prefixed naming; llama-cpp β†’ llamacpp variant JAIL_STATUS="" BASTILLE_LIST="$(sudo timeout 10 bastille list 2>/dev/null || true)" _jail_up() { @@ -113,7 +113,7 @@ fi SUMMARY="LLM unavailable β€” raw data only." if [ "$CHAT_STATUS" = "βœ“" ]; then HEALTH_SNAPSHOT="Jails: $(printf '%b' "$JAIL_STATUS" | tr '\n' '|') | Memories: ${MEM_COUNT} (latest: ${MEM_LATEST}) | Embed: ${EMBED_STATUS} | Disk: ${ZFS_USED}" - PROMPT="You are Klavdija's system monitor. Current state: ${HEALTH_SNAPSHOT}. Flags: ${FLAGS:-none}. Summarise in 2 sentences, mention any concerns." + PROMPT="You are ${AGENT_NAME}'s system monitor. Current state: ${HEALTH_SNAPSHOT}. Flags: ${FLAGS:-none}. Summarise in 2 sentences, mention any concerns." SUMMARY=$(curl -sf --max-time 15 "${CHAT_BASE_URL}/chat/completions" \ -H "Content-Type: application/json" \ @@ -159,7 +159,7 @@ NOTIFY="${HEARTBEAT_NOTIFY_TELEGRAM:-false}" if [ "$NOTIFY" = "true" ] && [ "$STATUS" != "OK" ]; then ICON="⚠️" [ "$STATUS" = "CRIT" ] && ICON="🚨" - MSG="${ICON} Klavdija heartbeat ${STATUS} β€” ${NOW} + MSG="${ICON} ${AGENT_NAME} heartbeat ${STATUS} β€” ${NOW} ${SUMMARY} Flags: $(printf '%b' "$FLAGS")" diff --git a/scripts/memory/embed-docs.py b/scripts/memory/embed-docs.py index adb23cd..2c98db8 100755 --- a/scripts/memory/embed-docs.py +++ b/scripts/memory/embed-docs.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -scripts/memory/embed-docs.py β€” Embed project docs into klavdija_brain. +scripts/memory/embed-docs.py β€” Embed project docs into {agent}_brain. Reads markdown files, splits by heading sections, embeds via bge-m3, and inserts into the memories/memory_chunks/memory_embeddings tables. @@ -38,7 +38,7 @@ def load_env(path: Path) -> dict[str, str]: return env ENV = load_env(PROJECT_ROOT / '.env') -AGENT_NAME = ENV.get('AGENT_NAME', 'klavdija') +AGENT_NAME = ENV.get('AGENT_NAME', 'clawdie') DB_HOST = ENV.get('WARDEN_DB_IP', '10.0.1.3') DB_PORT = ENV.get('DB_PORT', '5432') DB_NAME = f'{AGENT_NAME}_brain' diff --git a/scripts/memory/import-memories.py b/scripts/memory/import-memories.py index 56d67c5..44e89ee 100755 --- a/scripts/memory/import-memories.py +++ b/scripts/memory/import-memories.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ scripts/memory/import-memories.py -Import session memories from a transfer JSON into klavdija_brain. +Import session memories from a transfer JSON into {agent}_brain. Usage: python3 scripts/memory/import-memories.py @@ -39,7 +39,7 @@ def load_env(path: Path) -> dict[str, str]: ENV = load_env(PROJECT_ROOT / '.env') -AGENT_NAME = ENV.get('AGENT_NAME', 'klavdija') +AGENT_NAME = ENV.get('AGENT_NAME', 'clawdie') DB_HOST = ENV.get('WARDEN_DB_IP', '10.0.1.3') DB_PORT = int(ENV.get('DB_PORT', '5432')) DB_NAME = f'{AGENT_NAME}_brain' diff --git a/scripts/test-memory-pipeline.ts b/scripts/test-memory-pipeline.ts index 8012fa6..09afcc5 100644 --- a/scripts/test-memory-pipeline.ts +++ b/scripts/test-memory-pipeline.ts @@ -6,11 +6,14 @@ import { initMemoryPool, shutdownMemoryPool } from '../src/memory-lifecycle.js'; import { storeMemory, searchMemories, getMemoryStats } from '../src/memory-pg.js'; +import { AGENT_NAME } from '../src/config.js'; + +const AGENT_DISPLAY_NAME = AGENT_NAME.charAt(0).toUpperCase() + AGENT_NAME.slice(1); const TEST_SUMMARY = ` -Klavdija je pomagala uporabniku nastaviti lokalni embedding streΕΎnik bge-m3 na FreeBSD gostitelju. +${AGENT_DISPLAY_NAME} je pomagala uporabniku nastaviti lokalni embedding streΕΎnik bge-m3 na FreeBSD gostitelju. Namestili smo llama-cpp z bastille jail za PostgreSQL s pgvector razΕ‘iritvijo. -Vektorska baza podatkov klavdija_brain je zdaj aktivna na 192.168.100.3. +Vektorska baza podatkov ${AGENT_NAME}_brain je zdaj aktivna na 192.168.100.3. Embedding model bge-m3 deluje na 127.0.0.1:8080 z 1024 dimenzijami. `.trim(); diff --git a/src/skills.test.ts b/src/skills.test.ts index 396e075..d61c660 100644 --- a/src/skills.test.ts +++ b/src/skills.test.ts @@ -3,7 +3,7 @@ * * These tests protect SKILL.md files from common regressions: * - missing or broken frontmatter - * - stale agent name "klavdija" (renamed to clawdie) + * - stale legacy agent name from previous experiments * - Docker/macOS commands leaking into FreeBSD-native skills * - broken references to files in this repo */ @@ -166,7 +166,7 @@ describe('SKILL.md frontmatter', () => { }); // --------------------------------------------------------------------------- -// 2. No stale agent name "klavdija" β€” every skill +// 2. No stale legacy agent name β€” every skill // --------------------------------------------------------------------------- describe('No stale "klavdija" agent name', () => { for (const { skill, filePath } of all) {