diff --git a/.env.template b/.env.template deleted file mode 100644 index 251a2d1..0000000 --- a/.env.template +++ /dev/null @@ -1,80 +0,0 @@ -# ============================================================ -# 🌲 Crumbforest Mission System - Environment Configuration -# ============================================================ -# -# Philosophie: "Was kostet die Frage eines Kindes?" -# Im Wald unbezahlbar - aber Token helfen beim achtsamen Fragen. -# Jede Frage ist wertvoll, Token-Messung lehrt bewusstes Denken. -# -# ============================================================ - -# === API KEYS === - -# OpenRouter (Multi-Model Gateway) -OPENROUTER_API_KEY="" -OPENROUTER_MODEL="openai/gpt-3.5-turbo" # oder anthropic/claude-3-haiku - -# Claude API (Anthropic) -CLAUDE_API_KEY="" -CLAUDE_MODEL="claude-3-haiku-20240307" - -# OpenAI -OPENAI_API_KEY="" -OPENAI_MODEL="gpt-3.5-turbo" - -# === LOCAL AI (Optional) === - -# Ollama (Local AI - kostenlos!) -OLLAMA_URL="http://localhost:11434" -OLLAMA_MODEL="llama3.2:3b" -USE_OLLAMA="false" # true = nutze Ollama statt API - -# === VECTOR DATABASE === - -# Qdrant (fΓΌr Maya-Eule Memory) -QDRANT_URL="http://localhost:6333" -QDRANT_COLLECTION="crumbforest_memory" -QDRANT_API_KEY="" # Optional, meist leer bei local - -# === TOKEN BUDGET (Crumb Codex: Machen statt Lernen) === - -# Tages-Budget fΓΌr bewusstes Fragen (in Tokens) -# 0 = unbegrenzt, >0 = Limit (z.B. 10000 = ~20 Fragen) -DAILY_TOKEN_BUDGET="0" - -# Warnung bei hohem Token-Verbrauch -TOKEN_WARNING_THRESHOLD="1000" - -# === LOGGING === - -# Token-Log speichern? -ENABLE_TOKEN_TRACKING="true" - -# Log-Verzeichnis -LOG_DIR="${HOME}/.crumbforest_logs" - -# === CHARAKTERE (AI Assistenten) === - -# Welche Charaktere sind aktiviert? -ENABLE_MAYAEULE="true" # Maya-Eule (Weisheit) -ENABLE_DEEPBIT="true" # Deepbit (Bash-ErklΓ€rer) -ENABLE_BUGSY="true" # Bugsy (Debugging) -ENABLE_SCHNIPPSI="true" # Schnippsi (Shell-Helfer) -ENABLE_TOBI="true" # Tobi (JSON/Daten) - -# === SICHERHEIT === - -# Eltern-PIN fΓΌr Einstellungen (Optional) -PARENT_PIN="" - -# Automatische Token-Reports an Eltern? -SEND_TOKEN_REPORTS="false" -PARENT_EMAIL="" - -# ============================================================ -# HINWEISE: -# - Kopiere diese Datei zu .env und fΓΌlle deine Keys ein -# - .env wird NICHT ins Git committed (siehe .gitignore) -# - Mindestens einen API-Key ODER Ollama konfigurieren -# - Qdrant ist optional (fΓΌr Maya-Eule Memory) -# ============================================================ diff --git a/.gitignore b/.gitignore index cac6253..9b10963 100644 --- a/.gitignore +++ b/.gitignore @@ -71,6 +71,8 @@ build/ *.bak *.backup *_backup_*.zip +*.snapshot + .pp_backup/ # Personal/Secret directories diff --git a/INSTALL_DEBIAN.md b/INSTALL_DEBIAN.md new file mode 100644 index 0000000..4d8bd26 --- /dev/null +++ b/INSTALL_DEBIAN.md @@ -0,0 +1,58 @@ +# 🌲 Crumbforest Debian Setup Guide (Raspi Ready) + +This guide documents the specific setup steps for Debian-based systems (including Raspberry Pi and Ubuntu). It supplements the standard `README.md`. + +## 1. System Services (Headless / Persistent) + +On Debian/Raspi, we use Systemd User Services to keep components running in the background without needing open terminal windows. + +### Qdrant (Vector DB) +- **Service**: `~/.config/systemd/user/qdrant.service` +- **Port**: 6333 +- **Usage**: Stores the RAG knowledge (CrumbCodex). +- **Note**: The native binary often excludes the Web Dashboard (`/dashboard`) to save resources. Use API or Snapshot Export for visualization. + +### Ollama (AI Model Server) +- **Service**: `~/.config/systemd/user/ollama.service` +- **Port**: 11434 +- **Usage**: Serves local AI models (e.g. `tinyllama` or embedding models). + +**Enable Services:** +```bash +systemctl --user enable --now qdrant ollama +systemctl --user status qdrant ollama +``` + +## 2. RAG Knowledge Setup (Nullfeld) + +The "Nullfeld" (Zero Field) is the vector database containing our documentation. + +### Ingestion Sources +1. **CrumbCodex**: `~/Documents/crumbdocs/CrumbCodex` +2. **OZM-Keks-Handbuch**: `~/Documents/crumbdocs/OZM-Keks-Handbuch-v1` + +### Running Ingestion +If you add new Markdown files, run: +```bash +python3 missions/tools/terminal_dojo/scripts/ingest_knowledge.py ~/Documents/crumbdocs +``` +*Embedding Model used: `all-minilm` (384 dimensions).* + +### Data Visualization +Since the native Qdrant has no dashboard: +1. **Create Snapshot**: `curl -X POST http://localhost:6333/collections/crumbforest_knowledge/snapshots` +2. **Export**: Find file in `~/.terminal_dojo/qdrant/snapshots/`. +3. **View**: Import into a Dockerized Qdrant instance on your Desktop. + +## 3. Crew Shell Resilience + +The `crew` command (`~/.terminal_dojo/crew.sh`) is patched for robustness: + +- **Local Mode**: If `ollama` is running with a valid chat model (e.g., `tinyllama`, `llama3`), it runs locally. +- **Cloud Fallback**: If local models fail (common on low-power devices), it automatically falls back to the **OpenRouter API** (via `waldwaechter.sh`). + +**Check Status**: +```bash +crew_doctor +``` +Should return `βœ… Alle Checks bestanden! System gesund πŸ’š`. diff --git a/crumb-mission-selector.sh b/crumb-mission-selector.sh index f82ad7b..0006fac 100755 --- a/crumb-mission-selector.sh +++ b/crumb-mission-selector.sh @@ -33,20 +33,10 @@ fi # === ENVIRONMENT LOADER === function load_env() { if [[ -f "${ENV_FILE}" ]]; then - # Lade .env, aber nur nicht-kommentierte Zeilen - while IFS='=' read -r key value; do - # Skip Kommentare und leere Zeilen - [[ "$key" =~ ^#.*$ ]] && continue - [[ -z "$key" ]] && continue - - # Entferne Quotes - value="${value%\"}" - value="${value#\"}" - - # Exportiere Variable - export "$key=$value" - done < <(grep -v '^#' "${ENV_FILE}" | grep -v '^$') - + # Use set -a to automatically export variables defined in .env + set -a + source "${ENV_FILE}" + set +a return 0 else return 1 @@ -652,6 +642,10 @@ function crumbcrew_doktor() { if [ -f /etc/bashrc ]; then source /etc/bashrc; fi if [ -f ~/.bashrc ]; then source ~/.bashrc; fi +# Unalias potential user aliases that might conflict with our functions +unalias mayaeule deepbit bugsy schnippsi tobi schraubaer schnecki dumbosql funkfox taichitaube snakepy pepperphp crabbyrust spider vektor asciimonster 2>/dev/null || true + + # Farben GREEN='\033[0;32m' YELLOW='\033[1;33m' @@ -667,7 +661,13 @@ export PS1="\[\033[1;32m\](🌲 CrumbCrew) \u@\h:\w\$ \[\033[0m\]" # Pfad zu den Charakteren CREW_DIR="${CREW_DIR}" -# === WALDWΓ„CHTER FUNKTIONEN === +# Lade die WaldwΓ€chter-Library (fΓΌr crew_tokens, crew_status, etc.) +# Wir nutzen die gepatchte Library, die auch korrekte Pfade hat +source "${SCRIPT_DIR}/lib/waldwaechter.sh" + +# === WALDWΓ„CHTER FUNKTIONEN (Wrapper fΓΌr UI-Output) === +# Wir behalten diese Wrapper, weil sie schΓΆne "Erwacht..." Nachrichten ausgeben. +# Die eigentliche Logik kommt jetzt aus waldwaechter.sh function mayaeule() { if [[ -z "\$1" ]]; then @@ -818,7 +818,9 @@ function asciimonster() { } # === CREW MANAGEMENT === +# crew_tokens, crew_status etc. kommen jetzt aus der Library! +# Wir definieren nur crew_help neu fΓΌr den speziellen Kontext function crew_help() { echo -e "\${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}" echo -e "\${GREEN} 🌲 CrumbCrew Command Central 🌲 \${NC}" @@ -879,90 +881,11 @@ function crew_help() { echo -e "\${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}" } -function crew_status() { - echo -e "\${CYAN}🌲 CrumbCrew Status\${NC}" - echo "" - - CHARS=("mayaeule:πŸ¦‰:Maya-Eule" "deepbit:πŸ™:Deepbit" "bugsy:🐞:Bugsy" "schnippsi:βœ‚οΈ:Schnippsi" "tobi:πŸ€–:Tobi" "schraubaer:πŸ”§:SchraubbΓ€r" "schnecki:🐌:Schnecki" "dumbosql:🐘:DumboSQL" "funkfox:🦊:FunkFox" "taichitaube:πŸ•ŠοΈ:TaichiTaube" "snakepy:🐍:SnakePy" "pepperphp:πŸ§“:PepperPHP" "crabbyrust:πŸ¦€:CrabbyRust" "spider:πŸ•·οΈ:Spider" "vektor:🧭:Vektor" "asciimonster:πŸ‘Ύ:ASCII-Monster") - - for char_info in "\${CHARS[@]}"; do - IFS=: read -r name icon display <<< "\$char_info" - # SchraubbΓ€r has special filename - if [[ "\$name" == "schraubaer" ]]; then - script_name="\${name}_zero_final.sh" - elif [[ "\$name" == "schnecki" ]]; then - script_name="\${name}_zero.sh" - else - script_name="\${name}_zero.sh" - fi - - if [[ -x "\$CREW_DIR/\$script_name" ]]; then - echo -e " \${GREEN}βœ… \$icon \$display\${NC} - Bereit" - else - echo -e " \${RED}❌ \$icon \$display\${NC} - Nicht verfΓΌgbar" - fi - done - - echo "" - echo -e "\${YELLOW}API Status:\${NC}" - if [[ -n "\$OPENROUTER_API_KEY" ]]; then - echo -e " \${GREEN}βœ… OpenRouter API\${NC} - Konfiguriert" - else - echo -e " \${RED}❌ Kein API-Key\${NC}" - fi -} - -function crew_tokens() { - echo -e "\${CYAN}πŸ“Š CrumbCrew Token-Verbrauch\${NC}" - echo "" - - TOTAL=0 - - for logdir in ~/.{mayaeule,eule,deepbit,bugsy,schnippsi,tobi,schraubaer,schnecki,dumbosql,funkfox,taichitaube,snakepy,pepperphp,crabbyrust,spider,vektor,asciimonster}_logs; do - if [[ -d "\$logdir" ]] && [[ -f "\$logdir/token_log.json" ]]; then - char_name=\$(basename "\$logdir" | sed 's/_logs//') - char_tokens=0 - - while IFS= read -r line; do - tokens=\$(echo "\$line" | jq -r '.usage.total_tokens' 2>/dev/null) - if [[ "\$tokens" != "null" ]] && [[ -n "\$tokens" ]]; then - char_tokens=\$((char_tokens + tokens)) - fi - done < "\$logdir/token_log.json" - - if [[ \$char_tokens -gt 0 ]]; then - echo -e " \${GREEN}\$char_name:\${NC} \$char_tokens Tokens" - TOTAL=\$((TOTAL + char_tokens)) - fi - fi - done - - echo "" - echo -e "\${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}" - echo -e " \${GREEN}Gesamt: \$TOTAL Tokens\${NC}" - echo -e " \${CYAN}Jede Frage ist wertvoll 🌲\${NC}" - echo -e "\${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}" -} - -function crew_memory() { - echo -e "\${CYAN}πŸ“œ CrumbCrew Erinnerungen\${NC}" - echo "" - - for logdir in ~/.{mayaeule,eule,deepbit,bugsy,schnippsi,tobi,schraubaer,schnecki,dumbosql,funkfox,taichitaube,snakepy,pepperphp,crabbyrust,spider,vektor,asciimonster}_logs; do - if [[ -d "\$logdir" ]] && [[ -f "\$logdir/*_history.json" ]]; then - char_name=\$(basename "\$logdir" | sed 's/_logs//') - count=\$(jq '. | length' "\$logdir/*_history.json" 2>/dev/null) - if [[ "\$count" != "null" ]] && [[ \$count -gt 0 ]]; then - echo -e " \${GREEN}\$char_name:\${NC} \$count GesprΓ€che" - fi - fi - done -} - alias help="crew_help" -alias status="crew_status" -alias tokens="crew_tokens" -alias memory="crew_memory" + +# Aliases tokens/status/memory kommen jetzt von waldwaechter.sh (wenn dort definiert) +# oder Nutzer nutzt direkt crew_tokens + # Willkommensnachricht clear diff --git a/lib/waldwaechter.sh b/lib/waldwaechter.sh index 84b9e04..c9237fb 100644 --- a/lib/waldwaechter.sh +++ b/lib/waldwaechter.sh @@ -6,16 +6,16 @@ # Support both bash and zsh if [[ -n "$BASH_VERSION" ]]; then # Bash: use BASH_SOURCE - SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + __WALD_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" elif [[ -n "$ZSH_VERSION" ]]; then # Zsh: use ${(%):-%x} to get the script path - SCRIPT_DIR="$(cd "$(dirname "${(%):-%x}")" && pwd)" + __WALD_SCRIPT_DIR="$(cd "$(dirname "${(%):-%x}")" && pwd)" else # Fallback: use $0 (may not work when sourced) - SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" + __WALD_SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" fi -WALDWAECHTER_DIR="$(dirname "$SCRIPT_DIR")" +WALDWAECHTER_DIR="$(dirname "$__WALD_SCRIPT_DIR")" ROLES_DIR="${WALDWAECHTER_DIR}/crumbforest_roles" # Set logs directory in repo @@ -178,7 +178,7 @@ function crew_status() { echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - local chars=("mayaeule" "deepbit" "bugsy" "schnippsi" "templatus" "tobi" "schraubaer" "schnecki" "dumbosql" "funkfox" "taichitaube" "snakepy" "pepperphp" "crabbyrust" "spider" "vektor" "asciimonster") + local chars=("mayaeule" "deepbit" "bugsy" "schnippsi" "templatus" "tobi" "schraubaer" "schnecki" "dumbosql" "funkfox" "taichitaube" "snakepy" "pepperphp" "crabbyrust" "spider" "vektor" "asciimonster" "bashpanda") for char in "${chars[@]}"; do local token_file="${CRUMB_LOGS_DIR}/${char}/token_log.json" @@ -253,7 +253,7 @@ function crew_doctor() { echo "πŸ“‹ Checking waldwaechter.sh..." local lib_file="${WALDWAECHTER_DIR}/lib/waldwaechter.sh" if [[ -f "$lib_file" ]]; then - local lib_mtime=$(stat -f "%m" "$lib_file" 2>/dev/null || stat -c "%Y" "$lib_file" 2>/dev/null) + local lib_mtime=$(stat -c "%Y" "$lib_file" 2>/dev/null || stat -f "%m" "$lib_file" 2>/dev/null) local loaded_check_var="WALDWAECHTER_LOADED_${lib_mtime}" # Indirect variable expansion (bash: ${!var}, zsh: ${(P)var}) @@ -283,12 +283,9 @@ function crew_doctor() { echo " βœ… $CRUMB_LOGS_DIR existiert" # PrΓΌfe ob es der richtige Pfad ist (sollte im Repo sein) - if [[ "$CRUMB_LOGS_DIR" == *"CF_Zero_V1/logs"* ]]; then - echo " βœ… Pfad sieht korrekt aus" - else - echo " ⚠️ Pfad sieht ungewΓΆhnlich aus: $CRUMB_LOGS_DIR" - echo " Erwartet: .../CF_Zero_V1/logs" - issues=$((issues + 1)) + # Path check relaxed for Crumbmissions + if [[ -d "$CRUMB_LOGS_DIR" ]]; then + echo " βœ… Pfad fΓΌr Logs gefunden: $CRUMB_LOGS_DIR" fi else echo " ❌ $CRUMB_LOGS_DIR existiert nicht!" @@ -297,8 +294,8 @@ function crew_doctor() { # 3. Character Scripts Check echo "" - echo "🌲 Checking 17 WaldwΓ€chter Scripts..." - local expected_chars=("mayaeule" "deepbit" "bugsy" "schnippsi" "templatus" "tobi" "schraubaer" "schnecki" "dumbosql" "funkfox" "taichitaube" "snakepy" "pepperphp" "crabbyrust" "spider" "vektor" "asciimonster") + echo "🌲 Checking 18 WaldwΓ€chter Scripts..." + local expected_chars=("mayaeule" "deepbit" "bugsy" "schnippsi" "templatus" "tobi" "schraubaer" "schnecki" "dumbosql" "funkfox" "taichitaube" "snakepy" "pepperphp" "crabbyrust" "spider" "vektor" "asciimonster" "bashpanda") local missing_count=0 for char in "${expected_chars[@]}"; do @@ -312,7 +309,7 @@ function crew_doctor() { done if [[ $missing_count -eq 0 ]]; then - echo " βœ… Alle 17 WaldwΓ€chter Scripts vorhanden" + echo " βœ… Alle 18 WaldwΓ€chter Scripts vorhanden" else echo " ❌ $missing_count Scripts fehlen!" issues=$((issues + 1)) @@ -336,10 +333,10 @@ function crew_doctor() { echo "" echo "πŸ“Š Checking Token-Logging..." local scripts_with_logging=$(grep -l "token_log.json" "${ROLES_DIR}"/*.sh 2>/dev/null | wc -l | tr -d ' ') - if [[ $scripts_with_logging -eq 17 ]]; then - echo " βœ… Alle 17 Scripts haben Token-Logging" + if [[ $scripts_with_logging -eq 18 ]]; then + echo " βœ… Alle 18 Scripts haben Token-Logging" else - echo " ⚠️ Nur $scripts_with_logging/17 Scripts haben Token-Logging" + echo " ⚠️ Nur $scripts_with_logging/18 Scripts haben Token-Logging" issues=$((issues + 1)) fi @@ -716,6 +713,6 @@ fi # Set version marker for crew_doctor to detect reloads if [[ -f "${WALDWAECHTER_DIR}/lib/waldwaechter.sh" ]]; then - WALDWAECHTER_LIB_MTIME=$(stat -f "%m" "${WALDWAECHTER_DIR}/lib/waldwaechter.sh" 2>/dev/null || stat -c "%Y" "${WALDWAECHTER_DIR}/lib/waldwaechter.sh" 2>/dev/null) + WALDWAECHTER_LIB_MTIME=$(stat -c "%Y" "${WALDWAECHTER_DIR}/lib/waldwaechter.sh" 2>/dev/null || stat -f "%m" "${WALDWAECHTER_DIR}/lib/waldwaechter.sh" 2>/dev/null) export "WALDWAECHTER_LOADED_${WALDWAECHTER_LIB_MTIME}=1" fi diff --git a/missions/tools/terminal_dojo/02_opencode_setup.sh b/missions/tools/terminal_dojo/02_opencode_setup.sh index cd84f18..21ac684 100755 --- a/missions/tools/terminal_dojo/02_opencode_setup.sh +++ b/missions/tools/terminal_dojo/02_opencode_setup.sh @@ -129,11 +129,15 @@ echo "" # Verify Installation # ───────────────────────────────────────────────────────────────────────────── -# Reload PATH -export PATH="$HOME/.local/bin:$HOME/.npm-global/bin:$PATH" +# Reload PATH for current session +export PATH="$HOME/.opencode/bin:$HOME/.local/bin:$HOME/.npm-global/bin:$PATH" -if command -v opencode &> /dev/null; then - VERSION=$(opencode --version 2>/dev/null | head -n1 || echo "installed") +if command -v opencode &> /dev/null || [[ -f "$HOME/.opencode/bin/opencode" ]]; then + if command -v opencode &> /dev/null; then + VERSION=$(opencode --version 2>/dev/null | head -n1 || echo "installed") + else + VERSION=$("$HOME/.opencode/bin/opencode" --version 2>/dev/null | head -n1 || echo "installed") + fi echo -e "${GREEN}βœ“ OpenCode erfolgreich installiert: $VERSION${NC}" else echo -e "${RED}❌ OpenCode Installation fehlgeschlagen${NC}" diff --git a/missions/tools/terminal_dojo/05_qdrant_setup.sh b/missions/tools/terminal_dojo/05_qdrant_setup.sh index f8fe805..08c6846 100755 --- a/missions/tools/terminal_dojo/05_qdrant_setup.sh +++ b/missions/tools/terminal_dojo/05_qdrant_setup.sh @@ -206,7 +206,8 @@ case $INSTALL_METHOD in #!/bin/bash QDRANT_DIR="$HOME/.terminal_dojo/qdrant" cd "$QDRANT_DIR" -./qdrant --storage-path ./storage & +export QDRANT__STORAGE__PATH=./storage +./qdrant & echo $! > "$QDRANT_DIR/qdrant.pid" echo "Qdrant gestartet (PID: $(cat $QDRANT_DIR/qdrant.pid))" SCRIPT diff --git a/missions/tools/terminal_dojo/06_test_crew.sh b/missions/tools/terminal_dojo/06_test_crew.sh index 8aa8208..8d33b3d 100755 --- a/missions/tools/terminal_dojo/06_test_crew.sh +++ b/missions/tools/terminal_dojo/06_test_crew.sh @@ -115,6 +115,14 @@ if [[ "$OPENCODE_OK" != true ]]; then echo "" if [[ ! $REPLY =~ ^[Nn]$ ]]; then if [[ -f "${SCRIPT_DIR}/02_opencode_setup.sh" ]]; then + # Ensure system info exists + if [[ ! -f /tmp/terminal_dojo_sysinfo.json ]]; then + echo -e "${YELLOW}⚠️ System-Info fehlt. Starte Vorcheck...${NC}" + if [[ -f "${SCRIPT_DIR}/01_vorcheck.sh" ]]; then + bash "${SCRIPT_DIR}/01_vorcheck.sh" + fi + fi + bash "${SCRIPT_DIR}/02_opencode_setup.sh" # Re-Check if command -v opencode &> /dev/null; then OPENCODE_OK=true; fi diff --git a/missions/tools/terminal_dojo/scripts/ingest_knowledge.py b/missions/tools/terminal_dojo/scripts/ingest_knowledge.py index 0be2f39..0097ece 100644 --- a/missions/tools/terminal_dojo/scripts/ingest_knowledge.py +++ b/missions/tools/terminal_dojo/scripts/ingest_knowledge.py @@ -10,7 +10,7 @@ from uuid import uuid4 # Configuration OLLAMA_BASE_URL = "http://localhost:11434" QDRANT_BASE_URL = "http://localhost:6333" -EMBEDDING_MODEL = "nomic-embed-text" +EMBEDDING_MODEL = "all-minilm" COLLECTION_NAME = "crumbforest_knowledge" def get_embedding(text: str) -> List[float]: @@ -41,21 +41,21 @@ def create_collection_if_not_exists(): config = response.json().get("result", {}).get("config", {}).get("params", {}).get("vectors", {}) current_size = config.get("size") - if current_size == 768: - print(f"Collection '{COLLECTION_NAME}' exists and has correct dimension (768).") + if current_size == 384: + print(f"Collection '{COLLECTION_NAME}' exists and has correct dimension (384).") return else: - print(f"Collection '{COLLECTION_NAME}' has wrong dimension ({current_size}). Recreating for nomic-embed-text (768)...") + print(f"Collection '{COLLECTION_NAME}' has wrong dimension ({current_size}). Recreating for all-minilm (384)...") requests.delete(url) except Exception as e: print(f"Error checking collection: {e}") # Proceed to try verify/create print(f"Creating collection '{COLLECTION_NAME}'...") - # Create with 768 dimensions (Nomic Embed Text v1.5) + # Create with 384 dimensions (all-minilm) payload = { "vectors": { - "size": 768, + "size": 384, "distance": "Cosine" } } diff --git a/missions/tools/terminal_dojo/terminal_dojo.sh b/missions/tools/terminal_dojo/terminal_dojo.sh index 25536e7..b7babd8 100755 --- a/missions/tools/terminal_dojo/terminal_dojo.sh +++ b/missions/tools/terminal_dojo/terminal_dojo.sh @@ -20,6 +20,9 @@ NC='\033[0m' SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +# Ensure we can find tools in common locations +export PATH="$HOME/.opencode/bin:$HOME/.local/bin:$HOME/.npm-global/bin:/usr/local/bin:$PATH" + show_banner() { clear echo ""