diff --git a/Dockerfile b/Dockerfile index d5205a2..d238dfe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,6 +48,12 @@ COPY build.sh /opt/neuros/ COPY Makefile /opt/neuros/ COPY validate-build.sh /opt/neuros/ +# COPY carries the mode from the build context, so this is a no-op on a normal +# checkout. It is here because the entrypoint is one of these files: if the +# execute bit is ever lost upstream, the failure is "exec format"/"permission +# denied" at docker run time rather than anything visible during the build. +RUN chmod +x /opt/neuros/build.sh /opt/neuros/validate-build.sh + # Install Python dependencies RUN pip3 install --break-system-packages requests || true diff --git a/build.sh b/build.sh index e405841..530463a 100755 --- a/build.sh +++ b/build.sh @@ -26,7 +26,7 @@ log() { } success() { - echo -e "${GREEN}[✓]${NC} $1" + echo -e "${GREEN}[OK]${NC} $1" } warn() { @@ -34,7 +34,7 @@ warn() { } error() { - echo -e "${RED}[✗]${NC} $1" + echo -e "${RED}[FAIL]${NC} $1" exit 1 } diff --git a/config/hooks/live/0700-install-neuros-tools.hook.chroot b/config/hooks/live/0700-install-neuros-tools.hook.chroot index ddb7c50..4cbed98 100755 --- a/config/hooks/live/0700-install-neuros-tools.hook.chroot +++ b/config/hooks/live/0700-install-neuros-tools.hook.chroot @@ -93,9 +93,9 @@ NEUROS_TOOLS=( for tool in "${NEUROS_TOOLS[@]}"; do if [ -f "$tool" ]; then chmod +x "$tool" - echo " ✅ $(basename "$tool")" + echo " [ok] $(basename "$tool")" else - echo " ⚠️ $(basename "$tool") not found" + echo " [warn] $(basename "$tool") not found" fi done @@ -107,17 +107,17 @@ if [ -f /etc/neuros-completions.bash ]; then echo "# NeurOS completions" >> /etc/skel/.bashrc echo "source /etc/neuros-completions.bash 2>/dev/null" >> /etc/skel/.bashrc fi - echo " ✅ bash completions" + echo " [ok] bash completions" fi # Install zsh completions if [ -d /usr/share/zsh/site-functions ]; then - echo " ✅ zsh completions" + echo " [ok] zsh completions" fi # Install fish completions (if fish is installed) if [ -d /etc/skel/.config/fish/completions ]; then - echo " ✅ fish completions" + echo " [ok] fish completions" fi # Create symlinks for convenience @@ -152,15 +152,15 @@ DESKTOP if [ -f /etc/systemd/system/neuros-autofix.service ]; then systemctl daemon-reload 2>/dev/null || true systemctl enable neuros-autofix.service 2>/dev/null && \ - echo " ✅ neuros-autofix service enabled" || \ - echo " ⚠️ neuros-autofix service enable skipped (no systemd)" + echo " [ok] neuros-autofix service enabled" || \ + echo " [warn] neuros-autofix service enable skipped (no systemd)" fi # Refresh the hicolor icon theme cache so the tray icon (neuros-symbolic) is found if command -v gtk-update-icon-cache >/dev/null 2>&1; then gtk-update-icon-cache -f -t /usr/share/icons/hicolor 2>/dev/null && \ - echo " ✅ icon cache updated" || \ - echo " ⚠️ icon cache update skipped" + echo " [ok] icon cache updated" || \ + echo " [warn] icon cache update skipped" fi echo "[NeurOS] Tools installation complete." diff --git a/config/includes.chroot/etc/skel/.zshrc b/config/includes.chroot/etc/skel/.zshrc index c9937f3..d1cbe0f 100644 --- a/config/includes.chroot/etc/skel/.zshrc +++ b/config/includes.chroot/etc/skel/.zshrc @@ -162,7 +162,7 @@ bindkey '^@' nn-widget # === Prompt customization === # Add NeurOS indicator to prompt -NEUROS_INDICATOR="🧠" +NEUROS_INDICATOR="" # === Environment === export EDITOR="nvim" @@ -186,7 +186,7 @@ zstyle ':completion:*' matcher-list 'm:{a-z}={A-Za-z}' # === Welcome (first run) === if [ ! -f "$HOME/.config/neuros/.welcome-shown" ]; then echo "" - echo " 🧠 Welcome to NeurOS!" + echo " Welcome to NeurOS!" echo " Type 'nn \"your question\"' to ask the local AI." echo " Type 'nn -i' for interactive mode." echo "" diff --git a/config/includes.chroot/usr/local/bin/neuros-agent b/config/includes.chroot/usr/local/bin/neuros-agent index 66d3b2d..f3a44dc 100755 --- a/config/includes.chroot/usr/local/bin/neuros-agent +++ b/config/includes.chroot/usr/local/bin/neuros-agent @@ -377,7 +377,7 @@ def system_status(): info = get_system_info() ollama = get_ollama_status() - print("🧠 NeurOS System Status") + print("NeurOS System Status") print("=" * 40) if "uptime" in info: @@ -393,7 +393,7 @@ def system_status(): if "local_ip" in info: print(f" Local IP: {info['local_ip']}") - print(f" LLM: {'🟢 Running' if ollama['running'] else '🔴 Stopped'}") + print(f" LLM: {'[green] Running' if ollama['running'] else '[red] Stopped'}") if ollama.get("models"): print(f" Models: {', '.join(ollama['models'])}") diff --git a/config/includes.chroot/usr/local/bin/neuros-alert b/config/includes.chroot/usr/local/bin/neuros-alert index ada80b8..40b879a 100755 --- a/config/includes.chroot/usr/local/bin/neuros-alert +++ b/config/includes.chroot/usr/local/bin/neuros-alert @@ -92,14 +92,14 @@ def run_script(script_path, message): def listen_stdin(): - print("👂 Alert listener active (Ctrl+C to stop)") + print("Alert listener active (Ctrl+C to stop)") try: for line in sys.stdin: line = line.strip() if not line: continue send_desktop("NeurOS Alert", line) - print(f" 🔔 {line}") + print(f" {line}") except KeyboardInterrupt: pass @@ -132,22 +132,22 @@ def main(): if args.webhook: ok = send_webhook(args.webhook, args.message) log_alert("webhook", args.message, ok) - results.append(f"{'✅' if ok else '❌'} webhook") + results.append(f"{'[ok]' if ok else '[fail]'} webhook") if args.email: ok = send_email(args.email, args.title, args.message) log_alert("email", args.message, ok) - results.append(f"{'✅' if ok else '❌'} email") + results.append(f"{'[ok]' if ok else '[fail]'} email") if args.script: ok = run_script(args.script, args.message) log_alert("script", args.message, ok) - results.append(f"{'✅' if ok else '❌'} script") + results.append(f"{'[ok]' if ok else '[fail]'} script") if not (args.webhook or args.email or args.script): ok = send_desktop(args.title, args.message, args.urgency) log_alert("desktop", args.message, ok) - results.append(f"{'✅' if ok else '❌'} desktop") + results.append(f"{'[ok]' if ok else '[fail]'} desktop") if results: print(f" Alert: {' '.join(results)}") diff --git a/config/includes.chroot/usr/local/bin/neuros-analyze b/config/includes.chroot/usr/local/bin/neuros-analyze index 506da4d..fd2ac9e 100755 --- a/config/includes.chroot/usr/local/bin/neuros-analyze +++ b/config/includes.chroot/usr/local/bin/neuros-analyze @@ -86,17 +86,17 @@ def analyze_data(filepath): print(f"Error: Could not read {filepath}") return - print(f"\n📊 Analyzing {fname}") + print(f"\nAnalyzing {fname}") print(f" {len(headers)} columns, {len(rows)} rows sampled\n") # Show column stats for col, info in stats.items(): if isinstance(info, dict): if info.get("type") == "numeric": - print(f" 📈 {col}: avg={info['avg']:.2f}, min={info['min']}, max={info['max']}") + print(f" {col}: avg={info['avg']:.2f}, min={info['min']}, max={info['max']}") else: samples = ', '.join(str(v) for v in info.get('sample_values', [])[:5]) - print(f" 🏷️ {col}: {info['unique_count']} unique values ({samples}...)") + print(f" {col}: {info['unique_count']} unique values ({samples}...)") # AI analysis sample_data = json.dumps([dict(r) for r in rows[:15]], indent=2) @@ -104,7 +104,7 @@ def analyze_data(filepath): elif ext == '.json': content = read_json(filepath) - print(f"\n📊 Analyzing {fname}") + print(f"\nAnalyzing {fname}") stats_json = "(see sample below)" sample_data = content else: @@ -127,7 +127,7 @@ Provide: Be specific and data-driven.""" - print(f"\n🤖 AI Analysis\n{'─'*50}") + print(f"\nAI Analysis\n{'─'*50}") print(query_ollama(prompt)) def natural_sql(db_path, question): @@ -165,7 +165,7 @@ Return ONLY the SQL query. No explanation.""" if sql.startswith('sql'): sql = sql[3:].strip() - print(f"\n💡 SQL:\n{sql}\n") + print(f"\nSQL:\n{sql}\n") choice = input("Execute? [y/N]: ") if choice.lower() == 'y': diff --git a/config/includes.chroot/usr/local/bin/neuros-autofix b/config/includes.chroot/usr/local/bin/neuros-autofix index 71d47c9..eb68062 100755 --- a/config/includes.chroot/usr/local/bin/neuros-autofix +++ b/config/includes.chroot/usr/local/bin/neuros-autofix @@ -311,7 +311,7 @@ def fix_disk_full(issue): out, err, rc = run_cmd(cmd, sudo=True, timeout=30) success = rc == 0 log_action("fix_disk", desc, cmd, out or err, success) - results.append(f"{'✅' if success else '❌'} {desc}") + results.append(f"{'[ok]' if success else '[fail]'} {desc}") return "\n".join(results) @@ -326,7 +326,7 @@ def fix_disk_low(issue): out, err, rc = run_cmd(cmd, sudo=True, timeout=30) success = rc == 0 log_action("fix_disk_low", desc, cmd, out or err, success) - results.append(f"{'✅' if success else '❌'} {desc}") + results.append(f"{'[ok]' if success else '[fail]'} {desc}") return "\n".join(results) @@ -344,7 +344,7 @@ def fix_broken_package(issue): ) log_action("fix_broken_pkg", "apt-fix", ["apt-get", "install", "-f", "-y"], out2 or err2, rc2 == 0) - return f"{'✅' if success else '❌'} dpkg --configure -a" + return f"{'[ok]' if success else '[fail]'} dpkg --configure -a" def fix_failed_service(issue): @@ -355,7 +355,7 @@ def fix_failed_service(issue): log_action("fix_failed_svc", svc, ["systemctl", "reset-failed", svc, "&&", "systemctl", "restart", svc], out2 or err2, success) - return f"{'✅' if success else '❌'} Reset + restart {svc}" + return f"{'[ok]' if success else '[fail]'} Reset + restart {svc}" def fix_wrong_owner(issue): @@ -372,7 +372,7 @@ def fix_wrong_owner(issue): success = rc == 0 log_action("fix_owner", path, ["chown", "-R", f"{user}:{user}", path], out or err, success) - results.append(f"{'✅' if success else '❌'} {f}") + results.append(f"{'[ok]' if success else '[fail]'} {f}") return "\n".join(results) @@ -386,7 +386,7 @@ def fix_memory_low(issue): success = rc == 0 log_action("fix_memory", "drop_caches", ["sysctl", "-w", "vm.drop_caches=3"], out or err, success) - results.append(f"{'✅' if success else '❌'} Dropped page cache") + results.append(f"{'[ok]' if success else '[fail]'} Dropped page cache") return "\n".join(results) @@ -398,23 +398,23 @@ def fix_swap_high(issue): out, err, rc = run_cmd(["sysctl", "-w", "vm.drop_caches=3"], sudo=True, timeout=10) if rc == 0: - results.append("✅ Dropped page cache") + results.append("[ok] Dropped page cache") else: - results.append(f"❌ drop_caches failed: {err}") + results.append(f"[fail] drop_caches failed: {err}") out, err, rc = run_cmd(["swapoff", "-a"], sudo=True, timeout=30) if rc == 0: out2, err2, rc2 = run_cmd(["swapon", "-a"], sudo=True, timeout=30) if rc2 == 0: - results.append("✅ Swap cycled (swapped out memory is being reclaimed)") + results.append("[ok] Swap cycled (swapped out memory is being reclaimed)") log_action("fix_swap", "cycle", ["swapoff", "-a", "&&", "swapon", "-a"], "Swap cycled successfully", True) else: - results.append(f"❌ swapon failed: {err2}") + results.append(f"[fail] swapon failed: {err2}") log_action("fix_swap", "cycle", ["swapoff", "-a"], "swapoff ok, swapon failed", False) else: - results.append(f"⚠ swapoff skipped (busy): {err[:80]}") + results.append(f"[warn] swapoff skipped (busy): {err[:80]}") return "\n".join(results) @@ -453,7 +453,7 @@ def ai_generate_fix(issue, context): # ─── MAIN LOGIC ───────────────────────────────────────────── def collect_all_checks(): - print("🔍 Running system diagnostics...\n") + print("Running system diagnostics...\n") checks = [ ("Services", check_services()), ("Disk Space", check_disk_space()), @@ -467,20 +467,20 @@ def collect_all_checks(): all_issues = [] for name, issues in checks: if issues: - print(f" ⚠ {name}: {len(issues)} issue(s)") + print(f" [warn] {name}: {len(issues)} issue(s)") for issue in issues: sev = issue.get("severity", "low") - icon = {"critical": "🔴", "high": "🟠", "medium": "🟡", "low": "🟢"}.get(sev, "⚪") + icon = {"critical": "[red]", "high": "[orange]", "medium": "[yellow]", "low": "[green]"}.get(sev, "[white]") print(f" {icon} [{sev.upper()}] {issue.get('type', '?')} {issue.get('service', issue.get('detail', ''))}") all_issues.append(issue) else: - print(f" ✅ {name}: OK") + print(f" [ok] {name}: OK") return all_issues def run_fixes(issues, dry_run=False): if not issues: - print("\n✅ Nothing to fix. System is healthy.") + print("\n[ok] Nothing to fix. System is healthy.") return fix_map = { @@ -495,18 +495,18 @@ def run_fixes(issues, dry_run=False): } if dry_run: - print("\n🔮 DRY RUN — would fix these issues:\n") + print("\nDRY RUN — would fix these issues:\n") for issue in issues: fixer = fix_map.get(issue["type"]) if fixer: print(f" Would fix: {issue['type']} - {issue.get('service', issue.get('detail', ''))}") else: - print(f" ⚠ No automated fix for: {issue['type']} - needs AI") + print(f" [warn] No automated fix for: {issue['type']} - needs AI") print(f"\n{len(issues)} issue(s) would be addressed.") return if not check_sudo(): - print("\n⚠️ Passwordless sudo not available. Some fixes may fail.") + print("\n[warn] Passwordless sudo not available. Some fixes may fail.") print(" Set up: sudo visudo -f /etc/sudoers.d/neuros-autofix") print(" Add: %sudo ALL=(ALL) NOPASSWD: ALL\n") @@ -519,10 +519,10 @@ def run_fixes(issues, dry_run=False): }.get(x.get("severity", "low"), 4)): fixer = fix_map.get(issue["type"]) if fixer: - print(f"\n 🔧 Fixing: {issue['type']}...") + print(f"\n Fixing: {issue['type']}...") result = fixer(issue) print(f" {result}") - if "❌" in result: + if "[fail]" in result: failed += 1 else: fixed += 1 @@ -530,7 +530,7 @@ def run_fixes(issues, dry_run=False): ai_needed.append(issue) for i, issue in enumerate(ai_needed): - print(f"\n 🤖 AI fix attempt {i+1}/{len(ai_needed)} for: {issue['type']}...") + print(f"\n AI fix attempt {i+1}/{len(ai_needed)} for: {issue['type']}...") cmd = ai_generate_fix(issue, {"hostname": os.uname().nodename if hasattr(os, "uname") else "neurOS"}) if cmd: print(f" AI suggests: {cmd}") @@ -542,27 +542,27 @@ def run_fixes(issues, dry_run=False): out, err, rc = run_cmd(args, sudo="sudo" in line, timeout=60) success = rc == 0 log_action("ai_fix", issue["type"], line, out or err, success) - icon = "✅" if success else "❌" + icon = "[ok]" if success else "[fail]" print(f" {icon} {line}") if success: fixed += 1 else: failed += 1 except Exception as e: - print(f" ❌ Error: {e}") + print(f" [fail] Error: {e}") failed += 1 - print(f"\n📊 Fix summary: {fixed} fixed, {failed} failed, {len(ai_needed)} required AI") + print(f"\nFix summary: {fixed} fixed, {failed} failed, {len(ai_needed)} required AI") def daemon_mode(interval=300): - print(f"🔄 Neuros Autofix Daemon (checking every {interval}s)") + print(f"Neuros Autofix Daemon (checking every {interval}s)") print(f" PID: {os.getpid()}") with open(PID_FILE, "w") as f: f.write(str(os.getpid())) def handle_signal(signum, frame): - print("\n🛑 Daemon stopping...") + print("\nDaemon stopping...") if os.path.exists(PID_FILE): os.unlink(PID_FILE) sys.exit(0) @@ -584,12 +584,12 @@ def daemon_mode(interval=300): except KeyboardInterrupt: handle_signal(None, None) except Exception as e: - print(f" ⚠️ Daemon error: {e}") + print(f" [warn] Daemon error: {e}") time.sleep(interval) def interactive_mode(): - print("🧠 NeurOS Autonomous Sysadmin — Interactive Mode") + print("NeurOS Autonomous Sysadmin — Interactive Mode") print(" I can navigate your system, run sudo commands, and fix problems.") print(" Commands: 'scan', 'fix ', 'cd ', 'ls', 'sudo ',") print(" 'cat ', 'find ', 'explain ', 'logs', 'exit'") @@ -598,7 +598,7 @@ def interactive_mode(): cwd = os.getcwd() while True: try: - user_input = input(f"🧠 {cwd}> ").strip() + user_input = input(f"{cwd}> ").strip() if not user_input: continue if user_input.lower() == "exit": @@ -606,16 +606,16 @@ def interactive_mode(): if user_input.lower() == "scan": issues = collect_all_checks() if issues: - print(f"\n ⚠ {len(issues)} issue(s) found. Type 'fix-all' to fix them.") + print(f"\n [warn] {len(issues)} issue(s) found. Type 'fix-all' to fix them.") else: - print(" ✅ All checks passed.") + print(" [ok] All checks passed.") continue if user_input.lower() == "fix-all": issues = collect_all_checks() if issues: run_fixes(issues) else: - print(" ✅ Nothing to fix.") + print(" [ok] Nothing to fix.") continue if user_input.lower() == "logs": if os.path.exists(LOG_FILE): @@ -623,7 +623,7 @@ def interactive_mode(): history = json.load(f) for h in history[-20:]: ts = h["timestamp"][:16].replace("T", " ") - icon = "✅" if h["success"] else "❌" + icon = "[ok]" if h["success"] else "[fail]" print(f" {icon} [{ts}] {h['action']}: {h.get('target', h['command'][:40])}") else: print(" No fix history yet.") @@ -649,7 +649,7 @@ def interactive_mode(): items = os.listdir(path) for item in sorted(items): full = os.path.join(path, item) - prefix = "📁" if os.path.isdir(full) else "📄" + prefix = "" if os.path.isdir(full) else "" try: size = os.path.getsize(full) size_str = f" ({_format_size(size)})" @@ -712,7 +712,7 @@ def interactive_mode(): ) explanation = ollama_generate(prompt, max_tokens=800) if explanation: - print(f"\n🤖 AI Analysis:\n{explanation}\n") + print(f"\nAI Analysis:\n{explanation}\n") action = input(" Apply fix? [y/N]: ").lower() if action == "y": run_fixes(issues) @@ -740,7 +740,7 @@ def show_logs(n=50): print("-" * 80) for h in history[-n:]: ts = h["timestamp"][:16].replace("T", " ") - icon = "✅" if h["success"] else "❌" + icon = "[ok]" if h["success"] else "[fail]" target = h.get("target", h.get("command", ""))[:40] print(f"{ts:<18} {h['action']:<12} {icon:<8} {target}") @@ -788,9 +788,9 @@ def main(): if args.check: if not issues: - print("\n✅ All checks passed.") + print("\n[ok] All checks passed.") else: - print(f"\n⚠ {len(issues)} issue(s) found. Run 'neuros-autofix' to fix.") + print(f"\n[warn] {len(issues)} issue(s) found. Run 'neuros-autofix' to fix.") return if args.fix: @@ -809,13 +809,13 @@ def main(): "shell": os.environ.get("SHELL", ""), } analysis = ai_diagnose(issues, context) - print("\n🤖 AI Root Cause Analysis:\n") + print("\nAI Root Cause Analysis:\n") print(analysis) if issues: run_fixes(issues, dry_run=args.dry_run) elif not args.ai and not args.check: - print("\n✅ System is healthy — no issues detected.") + print("\n[ok] System is healthy — no issues detected.") print(" Run 'neuros-autofix --daemon' for continuous monitoring.") diff --git a/config/includes.chroot/usr/local/bin/neuros-batch b/config/includes.chroot/usr/local/bin/neuros-batch index d56e458..d67821b 100755 --- a/config/includes.chroot/usr/local/bin/neuros-batch +++ b/config/includes.chroot/usr/local/bin/neuros-batch @@ -33,7 +33,7 @@ def process_file(filepath, instruction, output_dir=None, dry_run=False): with open(filepath, 'r', errors='replace') as f: content = f.read()[:5000] except Exception as e: - print(f"❌ Read error: {e}") + print(f"[fail] Read error: {e}") return {"file": filepath, "status": "error", "error": str(e)} prompt = f"""Process this file according to the instruction. @@ -49,7 +49,7 @@ Return ONLY the processed result.""" try: result = query_ollama(prompt) if result.startswith("Error:"): - print("❌ LLM error") + print("[fail] LLM error") return {"file": filepath, "status": "error", "error": result} if output_dir and not dry_run: @@ -60,13 +60,13 @@ Return ONLY the processed result.""" clean = result if clean.startswith("```"): clean = '\n'.join(l for l in clean.split('\n') if not l.startswith("```")) with open(outpath, 'w') as f: f.write(clean) - print(f"✅ → {outname}") + print(f"[ok] -> {outname}") return {"file": filepath, "status": "done", "output": outpath} else: - print("✅") + print("[ok]") return {"file": filepath, "status": "done", "result": result[:200]} except Exception as e: - print(f"❌ {e}") + print(f"[fail] {e}") return {"file": filepath, "status": "error", "error": str(e)} def main(): @@ -99,7 +99,7 @@ def main(): print("No files found matching the pattern(s).") return - print(f"\n📦 Batch Processing: {len(all_files)} files") + print(f"\nBatch Processing: {len(all_files)} files") print(f" Instruction: {args.instruction}") if args.output: print(f" Output: {args.output}/") @@ -125,7 +125,7 @@ def main(): errors = sum(1 for r in results if r['status'] == 'error') print(f"\n{'─'*50}") - print(f"✅ {done} processed | ❌ {errors} errors | ⏱️ {elapsed:.1f}s") + print(f"[ok] {done} processed | [fail] {errors} errors | {elapsed:.1f}s") if __name__ == "__main__": main() diff --git a/config/includes.chroot/usr/local/bin/neuros-brief b/config/includes.chroot/usr/local/bin/neuros-brief index 3768f2b..8b17830 100755 --- a/config/includes.chroot/usr/local/bin/neuros-brief +++ b/config/includes.chroot/usr/local/bin/neuros-brief @@ -115,13 +115,13 @@ def show_full_briefing(weather=False, news=False): print(f""" ╔══════════════════════════════════════════════════════╗ -║ 🧠 NeurOS Daily Briefing ║ +║ NeurOS Daily Briefing ║ ║ {now.strftime('%A, %B %d %Y'):<40}║ ╚══════════════════════════════════════════════════════╝ """) # System health - print("🖥️ System Health") + print("System Health") print(" ──────────────") for k, v in sys_info.items(): print(f" {k:<10} {v}") @@ -129,25 +129,25 @@ def show_full_briefing(weather=False, news=False): # Git activity if repos: - print("📦 Git Repositories") + print("Git Repositories") print(" ────────────────") for r in repos: status = f"{r['commits_today']} commits today" if r['commits_today'] else "no commits today" - dirty = " ⚠️ uncommitted" if r['dirty'] else "" + dirty = " [warn] uncommitted" if r['dirty'] else "" print(f" {r['name']:<20} [{r['branch']}] {status}{dirty}") print() # TODOs if todos: - print("📋 Today's Tasks") + print("Today's Tasks") print(" ─────────────") for todo in todos[:5]: - print(f" ☐ {todo}") + print(f" [ ] {todo}") print() # Memories if memories: - print("🧠 Remembered") + print("Remembered") print(" ───────────") for m in memories: print(f" • {m}") @@ -164,7 +164,7 @@ Be encouraging and concise. Mention if there's anything interesting to work on." insight = query_ollama(prompt) if insight: - print("🤖 AI Insight") + print("AI Insight") print(" ──────────") print(f" {insight}") print() @@ -181,7 +181,7 @@ Be friendly and concise. Include any system warnings if relevant.""" insight = query_ollama(prompt) if insight: - print(f"\n🧠 {insight}\n") + print(f"\n{insight}\n") def main(): parser = argparse.ArgumentParser(description="NeurOS Daily Briefing") diff --git a/config/includes.chroot/usr/local/bin/neuros-chat b/config/includes.chroot/usr/local/bin/neuros-chat index 25d14a5..d454b43 100755 --- a/config/includes.chroot/usr/local/bin/neuros-chat +++ b/config/includes.chroot/usr/local/bin/neuros-chat @@ -577,7 +577,7 @@ body {