Skip to content

Commit f0bf5ed

Browse files
mios-devclaude
andcommitted
prune SurrealDB + bridges to OWUI native + Ollama embeddings
Operator directive 2026-05-18: "make sure this is all Ollama (and other OpenSource Alternatives / Local Endpoints / Self-Hosted Endpoints) and Open WebUI Native DB(s) for knowledge/memory/ context/scratch/skills/functions/tools/etc-etc". My initial SurrealDB schema duplicated OWUI native tables (memory, knowledge, doc) -- exactly the parallel-universe trap the operator was flagging. Three corrections: 1. schema-init.surql pruned. Dropped: memory -> OWUI memory table (chat-bound recall, already used) doc -> OWUI knowledge + file tables (RAG corpus via mios-owui-apply-knowledge) SurrealDB keeps ONLY what OWUI doesn't natively have: agent registry of running AI surfaces session agent sessions (cron / cli / delegate / mcp; OWUI's chat table covers OWUI sessions and we join via owui_chat_id) tool_call cross-agent structured tool history (OWUI stores text status emits; this stores typed {tool, args, success, latency_ms} rows) event observability stream (launch verifier hits, refusals, critic verdicts, nudges, cdi changes) kanban_shadow live mirror of hermes/kanban.db scratch typed shared-mutable note surface agent_metric time-series for tool latency / dispatch success 2. mios-db CLI extended with two NEW backend modes: --owui '<SQL>' queries OWUI webui.db (SQLite via host sqlite3 binary OR podman-exec python3 fallback with a CURSOR -- not the broken Connection.description my first draft had). Source of truth for: chat / message / memory / knowledge / file / tool / function / model / user / group / channel. --embed '<text>' POSTs to Ollama /v1/embeddings (OpenAI- compat shape; works for any local-endpoint backend that speaks the spec). Default model nomic-embed-text (768-dim), override via --embed-model. Source of truth for vectors. No flag = SurrealDB (cross-cutting state only). 3. Quadlet Exec= path fixed: file://var/lib/... (relative, broken) -> file:///var/lib/... (absolute, valid SurrealDB syntax). SOUL.md "Shared DB" section rewritten as a 3-row table: mios-db '<SurrealQL>' cross-cutting state mios-db --owui '<SQL>' OWUI native (chat/memory/knowledge/...) mios-db --embed '<text>' Ollama embeddings with a "source of truth per kind" cheat sheet so the agent never duplicates a query against the wrong backend. Live verified on the dev distro (all four OWUI queries return clean JSON): memory rows: 0 knowledge collections: MiOS Documentation (32 files) registered tools: openui, mios_verbs function pipes: mios_agent (pipe), mios_antimeta (filter), mios_sidecar (filter) And --embed via nomic-embed-text: model: nomic-embed-text vector dim: 768 first 5 values: [-0.0068, -0.0013, -0.1714, 0.0085, 0.0058] Day-0 / FHS / bootc: nothing new outside /usr/libexec/mios/ + /usr/share/mios/surrealdb/. All three backends MIOS_* env- overridable. Fresh clone + image build reproduces. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 8bf2c98 commit f0bf5ed

4 files changed

Lines changed: 199 additions & 109 deletions

File tree

etc/containers/systemd/mios-surrealdb.container

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ Environment=SURREAL_LOG=info
5757

5858
# Bind 0.0.0.0 so both host (operator + pipe + mios-daemon) AND
5959
# the ai-net bridge (hermes, future agents) reach the same endpoint.
60-
Exec=start --bind 0.0.0.0:8000 --user root --pass root file://var/lib/mios/surrealdb/mios.surql
60+
Exec=start --bind 0.0.0.0:8000 --user root --pass root file:///var/lib/mios/surrealdb/mios.db
6161

6262
# OCI labels for Podman Desktop browse-in-browser.
6363
Label=org.opencontainers.image.title=mios-surrealdb

usr/libexec/mios/mios-db

Lines changed: 115 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,46 @@
11
#!/bin/bash
22
# /usr/libexec/mios/mios-db [<surrealql>] [-f <file.surql>] [--ns <ns>] [--db <db>] [--json]
3+
# [--owui '<sql>']
4+
# [--embed '<text>'] [--embed-model <m>]
35
#
4-
# Unified MiOS shared-state DB client. Operator directive 2026-05-18:
5-
# "unify all AI Surfaces!!" + "dont we need a true db services to
6-
# host local DBs(!!?)" + "wouldn't all this just be AI fabrications
7-
# and hallucinations otherwise??!" -- exactly. Every MiOS AI
8-
# surface (OWUI pipe, hermes, mios-daemon, future OpenCode, MCP
9-
# clients) targets ONE inference endpoint (http://localhost:8080/v1
10-
# per README MIOS_AI_ENDPOINT) AND now ONE state DB at
11-
# http://localhost:8000. Shared ground truth = no fabrication.
6+
# Unified MiOS shared-state CLI -- one tool that fronts every
7+
# local backend agents need to query.
128
#
13-
# Default namespace + db = `mios` / `mios`. Each AI surface uses
14-
# the same NS/DB; tables namespaced by purpose (agent / session /
15-
# memory / event / kanban_shadow / tool_call / ...).
9+
# Operator directives 2026-05-18 stacked:
10+
# * "make sure this is all Ollama (and other OpenSource Alternatives /
11+
# Local Endpoints / Self-Hosted Endpoints) and Open WebUI Native
12+
# DB(s) for knowledge/memory/context/scratch/skills/functions/
13+
# tools/etc-etc"
14+
# * "unify all AI Surfaces!!"
1615
#
17-
# Usage:
18-
# mios-db open REPL (surreal sql)
19-
# mios-db 'SELECT * FROM agent;' one-off query
20-
# mios-db -f /var/lib/mios/scratch/q.surql run a file
21-
# mios-db --ns mios --db logs 'INFO ...' override namespace/db
22-
# mios-db --json '...' force --pretty=json
16+
# The three backends + which data lives where:
17+
#
18+
# --owui <sql> Read/write Open WebUI's webui.db (SQLite).
19+
# SOURCE OF TRUTH for: chat / message / memory /
20+
# knowledge / file / tool / function / model /
21+
# user / group / channel.
22+
#
23+
# --embed <text> Ollama /v1/embeddings via the canonical
24+
# MiOS embedding model (nomic-embed-text).
25+
# Returns the float[] vector. SOURCE OF TRUTH
26+
# for: embeddings. Switch model via --embed-model.
27+
#
28+
# (no flag) SurrealDB at MIOS_DB_URL. SOURCE OF TRUTH for:
29+
# agent / session / tool_call / event /
30+
# kanban_shadow / scratch / agent_metric.
31+
# Cross-cutting state OWUI doesn't natively have.
2332
#
2433
# Env (with defaults):
25-
# MIOS_DB_URL http://localhost:8000
26-
# MIOS_DB_USER root
27-
# MIOS_DB_PASS root
28-
# MIOS_DB_NS mios
29-
# MIOS_DB_DB mios
34+
# MIOS_DB_URL http://localhost:8000
35+
# MIOS_DB_USER root
36+
# MIOS_DB_PASS root
37+
# MIOS_DB_NS mios
38+
# MIOS_DB_DB mios
39+
# MIOS_OWUI_DB /var/lib/mios/open-webui/webui.db
40+
# MIOS_OLLAMA_URL http://localhost:11434
41+
# MIOS_EMBED_MODEL nomic-embed-text
3042
#
31-
# Exits 0 on success, 1 on DB unreachable, 2 on surreal-binary
32-
# missing (operator should `dnf install surreal` or use the
33-
# container exec fallback).
43+
# Exits 0 on success, 1 on backend unreachable, 2 on missing binary.
3444

3545
set -uo pipefail
3646

@@ -39,25 +49,89 @@ DB_USER="${MIOS_DB_USER:-root}"
3949
DB_PASS="${MIOS_DB_PASS:-root}"
4050
DB_NS="${MIOS_DB_NS:-mios}"
4151
DB_DB="${MIOS_DB_DB:-mios}"
52+
OWUI_DB="${MIOS_OWUI_DB:-/var/lib/mios/open-webui/webui.db}"
53+
OLLAMA_URL="${MIOS_OLLAMA_URL:-http://localhost:11434}"
54+
EMBED_MODEL="${MIOS_EMBED_MODEL:-nomic-embed-text}"
55+
4256
JSON=0
4357
FILE=""
4458
QUERY=""
59+
MODE="surreal"
60+
OWUI_SQL=""
61+
EMBED_TEXT=""
4562

4663
while [ "$#" -gt 0 ]; do
4764
case "$1" in
48-
--ns) DB_NS="$2"; shift 2 ;;
49-
--db) DB_DB="$2"; shift 2 ;;
50-
--json) JSON=1; shift ;;
51-
-f) FILE="$2"; shift 2 ;;
65+
--ns) DB_NS="$2"; shift 2 ;;
66+
--db) DB_DB="$2"; shift 2 ;;
67+
--json) JSON=1; shift ;;
68+
-f) FILE="$2"; shift 2 ;;
69+
--owui) MODE="owui"; OWUI_SQL="$2"; shift 2 ;;
70+
--embed) MODE="embed"; EMBED_TEXT="$2"; shift 2 ;;
71+
--embed-model) EMBED_MODEL="$2"; shift 2 ;;
5272
-h|--help)
53-
sed -n '2,28p' "$0" | sed 's/^# \?//'
73+
sed -n '2,46p' "$0" | sed 's/^# \?//'
5474
exit 0 ;;
55-
--) shift; QUERY="$*"; break ;;
56-
*) QUERY="$1"; shift; if [ -n "${1:-}" ]; then QUERY="$QUERY $*"; fi
57-
break ;;
75+
--) shift; QUERY="$*"; break ;;
76+
*) QUERY="$1"; shift
77+
[ "$#" -gt 0 ] && QUERY="$QUERY $*"
78+
break ;;
5879
esac
5980
done
6081

82+
# ── MODE: --owui (OWUI webui.db via sqlite3 over the bind-mount) ──
83+
if [ "$MODE" = "owui" ]; then
84+
if [ ! -r "$OWUI_DB" ]; then
85+
echo "mios-db: OWUI webui.db not readable at $OWUI_DB" >&2
86+
exit 1
87+
fi
88+
if command -v sqlite3 >/dev/null 2>&1; then
89+
if [ "$JSON" = "1" ]; then
90+
exec sqlite3 -json "$OWUI_DB" "$OWUI_SQL"
91+
else
92+
exec sqlite3 -header -column "$OWUI_DB" "$OWUI_SQL"
93+
fi
94+
fi
95+
# Container-exec fallback: OWUI image ships python3 + sqlite.
96+
# Pass SQL via stdin (sys.argv[1] = SQL); use a CURSOR for
97+
# .description (Connection.execute returns a cursor but the
98+
# description attr lives on the cursor, not the connection).
99+
if command -v podman >/dev/null 2>&1 \
100+
&& podman ps --format '{{.Names}}' 2>/dev/null | grep -q '^mios-open-webui$'; then
101+
exec podman exec -i mios-open-webui python3 -c '
102+
import sqlite3, json, sys
103+
sql = sys.stdin.read()
104+
c = sqlite3.connect("/app/backend/data/webui.db")
105+
cur = c.execute(sql)
106+
cols = [d[0] for d in cur.description] if cur.description else []
107+
rows = cur.fetchall()
108+
out = [dict(zip(cols, r)) for r in rows]
109+
print(json.dumps(out, default=str, indent=2))
110+
' <<<"$OWUI_SQL"
111+
fi
112+
echo "mios-db: no sqlite3 + no mios-open-webui container" >&2
113+
exit 2
114+
fi
115+
116+
# ── MODE: --embed (Ollama /v1/embeddings via OpenAI-compat) ──
117+
if [ "$MODE" = "embed" ]; then
118+
if ! command -v curl >/dev/null 2>&1; then
119+
echo "mios-db: curl required for --embed" >&2
120+
exit 2
121+
fi
122+
# OpenAI-compat shape -- Ollama implements identical schema.
123+
PAYLOAD=$(python3 -c "
124+
import json, sys
125+
print(json.dumps({'model': '$EMBED_MODEL', 'input': sys.argv[1]}))
126+
" "$EMBED_TEXT")
127+
exec curl -sS --max-time 15 \
128+
-X POST "$OLLAMA_URL/v1/embeddings" \
129+
-H "Content-Type: application/json" \
130+
--data "$PAYLOAD"
131+
fi
132+
133+
# ── MODE: surreal (cross-cutting state) ──
134+
61135
# 1. Prefer the local surreal CLI if installed (faster, REPL-friendly).
62136
if command -v surreal >/dev/null 2>&1; then
63137
args=(sql --conn "$DB_URL" --user "$DB_USER" --pass "$DB_PASS"
@@ -84,25 +158,24 @@ if command -v podman >/dev/null 2>&1 \
84158
elif [ -n "$QUERY" ]; then
85159
printf '%s\n' "$QUERY" | exec podman "${args[@]}"
86160
else
87-
# Without stdin the exec hangs; redirect /dev/null.
88161
echo "mios-db: no query + no -f; pass a query string or run with -f" >&2
89162
exit 64
90163
fi
91164
fi
92165

93-
# 3. Pure HTTP fallback: SurrealDB REST API via curl. Limited (no
94-
# REPL) but works on a stripped image with no surreal CLI.
166+
# 3. Pure HTTP fallback: SurrealDB REST API via curl.
95167
if [ -n "$QUERY" ] && command -v curl >/dev/null 2>&1; then
96-
AUTH="$DB_USER:$DB_PASS"
97168
exec curl -sS -X POST "$DB_URL/sql" \
98-
-u "$AUTH" \
169+
-u "$DB_USER:$DB_PASS" \
99170
-H "NS: $DB_NS" -H "DB: $DB_DB" \
100171
-H "Accept: application/json" \
101172
--data-binary "$QUERY"
102173
fi
103174

104-
echo "mios-db: no surreal CLI, no mios-surrealdb container, no curl fallback usable" >&2
105-
echo " install: bootc image already includes mios-surrealdb.container; run:" >&2
106-
echo " systemctl --user start mios-surrealdb.service" >&2
107-
echo " or check: podman ps | grep mios-surrealdb" >&2
175+
echo "mios-db: no SurrealDB backend reachable + no --owui/--embed flag set" >&2
176+
echo " options:" >&2
177+
echo " mios-db '<surrealql>' -- cross-cutting state" >&2
178+
echo " mios-db --owui '<sql>' -- OWUI webui.db" >&2
179+
echo " mios-db --embed '<text>' -- Ollama embeddings" >&2
180+
echo " check: systemctl start mios-surrealdb.service" >&2
108181
exit 2

usr/share/mios/ai/hermes-soul.md

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -234,14 +234,23 @@ State paths (read freely):
234234
(skills / system prompts / cookbooks / scratchpads / session
235235
digests). `--grep <pattern>` filters. Then `terminal: cat <path>`.
236236

237-
## Shared DB (unified AI surfaces)
238-
239-
`terminal: mios-db '<SurrealQL>'` — single shared state for every
240-
MiOS AI surface (this agent, the OWUI pipe, mios-daemon, future
241-
OpenCode). Tables: `agent` / `session` / `tool_call` / `memory` /
242-
`event` / `kanban_shadow` / `scratch` / `doc`. Endpoint:
243-
`http://localhost:8000`, ns=`mios`, db=`mios`. Read here for
244-
ground truth instead of fabricating from context.
237+
## Shared state — `mios-db` (three backends, one CLI)
238+
239+
```
240+
mios-db '<SurrealQL>' cross-cutting state
241+
mios-db --owui '<SQL>' OWUI webui.db (chat/memory/knowledge/file/tool/function)
242+
mios-db --embed '<text>' Ollama embeddings (nomic-embed-text)
243+
```
244+
245+
Source of truth per kind:
246+
- **OWUI native** (`--owui`): chat / message / memory / knowledge /
247+
file / tool / function / model / user
248+
- **Ollama native** (`--embed` or `/v1/embeddings`): vectors
249+
- **SurrealDB** (no flag): agent / session / tool_call / event /
250+
kanban_shadow / scratch / agent_metric — only what OWUI doesn't
251+
natively have
252+
253+
Read ground truth here BEFORE fabricating from context window.
245254
- `/var/lib/mios/daemon/state.json` — unified daemon state
246255
(classify, refusal, cron, suggestions, launch_verifier sections)
247256

0 commit comments

Comments
 (0)