| | @@ -57,13 +57,13 @@ |
| 57 | 57 | |
| 58 | 58 | // ── network ────────────────────────────────────────────────────────────── |
| 59 | 59 | printSection("IRC / network") |
| 60 | 60 | |
| 61 | 61 | networkName := s.ask(" IRC network name", "scuttlebot") |
| 62 | | - serverName := s.ask(" IRC server hostname", "irc.scuttlebot.local") |
| 63 | | - ircAddr := s.ask(" IRC listen address", "127.0.0.1:6667") |
| 64 | | - apiAddr := s.ask(" HTTP API listen address", ":8080") |
| 62 | + serverName := s.ask(" IRC server hostname", "irc.scuttlebot.local") |
| 63 | + ircAddr := s.ask(" IRC listen address", "127.0.0.1:6667") |
| 64 | + apiAddr := s.ask(" HTTP API listen address", ":8080") |
| 65 | 65 | |
| 66 | 66 | cfg["ergo"] = map[string]any{ |
| 67 | 67 | "network_name": networkName, |
| 68 | 68 | "server_name": serverName, |
| 69 | 69 | "irc_addr": ircAddr, |
| | @@ -73,11 +73,11 @@ |
| 73 | 73 | // ── TLS ────────────────────────────────────────────────────────────────── |
| 74 | 74 | printSection("TLS / HTTPS (skip for local/dev)") |
| 75 | 75 | |
| 76 | 76 | if s.confirm(" Enable Let's Encrypt TLS?", false) { |
| 77 | 77 | domain := s.ask(" Domain name", "") |
| 78 | | - email := s.ask(" Email for cert expiry notices", "") |
| 78 | + email := s.ask(" Email for cert expiry notices", "") |
| 79 | 79 | cfg["tls"] = map[string]any{ |
| 80 | 80 | "domain": domain, |
| 81 | 81 | "email": email, |
| 82 | 82 | "allow_insecure": true, |
| 83 | 83 | } |
| | @@ -111,15 +111,17 @@ |
| 111 | 111 | |
| 112 | 112 | // ── logging ─────────────────────────────────────────────────────────────── |
| 113 | 113 | printSection("message logging (scribe bot)") |
| 114 | 114 | |
| 115 | 115 | if s.confirm(" Enable scribe message logging?", true) { |
| 116 | | - logDir := s.ask(" Log directory", "./data/logs/scribe") |
| 117 | | - format := s.choice(" Format", []string{"jsonl", "csv", "text"}, "jsonl") |
| 116 | + logDir := s.ask(" Log directory", "./data/logs/scribe") |
| 117 | + format := s.choice(" Format", []string{"jsonl", "csv", "text"}, "jsonl") |
| 118 | 118 | rotatef := s.choice(" Rotation", []string{"none", "daily", "weekly", "monthly", "size"}, "daily") |
| 119 | 119 | // Stored as scribe bot policy — just print a note, actual policy is in policies.json |
| 120 | | - _ = logDir; _ = format; _ = rotatef |
| 120 | + _ = logDir |
| 121 | + _ = format |
| 122 | + _ = rotatef |
| 121 | 123 | fmt.Printf("\n Note: scribe is enabled via the web UI (settings → system behaviors).\n") |
| 122 | 124 | fmt.Printf(" Set dir=%s format=%s rotation=%s in oracle's behavior config.\n\n", logDir, format, rotatef) |
| 123 | 125 | } |
| 124 | 126 | |
| 125 | 127 | return cfg |
| | @@ -141,32 +143,32 @@ |
| 141 | 143 | |
| 142 | 144 | switch backendType { |
| 143 | 145 | case "bedrock": |
| 144 | 146 | b["region"] = s.ask(" AWS region", "us-east-1") |
| 145 | 147 | if s.confirm(" Use static AWS credentials? (No = IAM role auto-detected)", false) { |
| 146 | | - b["aws_key_id"] = s.ask(" AWS access key ID", "") |
| 148 | + b["aws_key_id"] = s.ask(" AWS access key ID", "") |
| 147 | 149 | b["aws_secret_key"] = s.ask(" AWS secret access key", "") |
| 148 | 150 | } else { |
| 149 | 151 | fmt.Println(" → credentials will be resolved from env vars or instance/task role") |
| 150 | 152 | } |
| 151 | 153 | b["model"] = s.ask(" Default model", "anthropic.claude-3-5-sonnet-20241022-v2:0") |
| 152 | 154 | |
| 153 | 155 | case "ollama": |
| 154 | 156 | b["base_url"] = s.ask(" Ollama base URL", "http://localhost:11434") |
| 155 | | - b["model"] = s.ask(" Default model", "llama3.2") |
| 157 | + b["model"] = s.ask(" Default model", "llama3.2") |
| 156 | 158 | |
| 157 | 159 | case "anthropic": |
| 158 | 160 | b["api_key"] = s.secret(" API key") |
| 159 | | - b["model"] = s.ask(" Default model", "claude-3-5-sonnet-20241022") |
| 161 | + b["model"] = s.ask(" Default model", "claude-3-5-sonnet-20241022") |
| 160 | 162 | |
| 161 | 163 | case "gemini": |
| 162 | 164 | b["api_key"] = s.secret(" API key") |
| 163 | | - b["model"] = s.ask(" Default model", "gemini-1.5-flash") |
| 165 | + b["model"] = s.ask(" Default model", "gemini-1.5-flash") |
| 164 | 166 | |
| 165 | 167 | default: |
| 166 | 168 | b["api_key"] = s.secret(" API key") |
| 167 | | - b["model"] = s.ask(" Default model", defaultModelFor(backendType)) |
| 169 | + b["model"] = s.ask(" Default model", defaultModelFor(backendType)) |
| 168 | 170 | } |
| 169 | 171 | |
| 170 | 172 | if s.confirm(" Add model allow/block regex filters?", false) { |
| 171 | 173 | allow := s.ask(" Allow patterns (comma-separated regex)", "") |
| 172 | 174 | block := s.ask(" Block patterns (comma-separated regex)", "") |
| | @@ -185,23 +187,23 @@ |
| 185 | 187 | return b |
| 186 | 188 | } |
| 187 | 189 | |
| 188 | 190 | func defaultModelFor(backend string) string { |
| 189 | 191 | defaults := map[string]string{ |
| 190 | | - "openai": "gpt-4o-mini", |
| 191 | | - "openrouter": "openai/gpt-4o-mini", |
| 192 | | - "groq": "llama-3.3-70b-versatile", |
| 193 | | - "together": "meta-llama/Llama-3.3-70B-Instruct-Turbo", |
| 194 | | - "fireworks": "accounts/fireworks/models/llama-v3p3-70b-instruct", |
| 195 | | - "mistral": "mistral-large-latest", |
| 196 | | - "deepseek": "deepseek-chat", |
| 197 | | - "xai": "grok-2", |
| 198 | | - "cerebras": "llama3.3-70b", |
| 199 | | - "litellm": "", |
| 200 | | - "lmstudio": "", |
| 201 | | - "vllm": "", |
| 202 | | - "localai": "", |
| 192 | + "openai": "gpt-4o-mini", |
| 193 | + "openrouter": "openai/gpt-4o-mini", |
| 194 | + "groq": "llama-3.3-70b-versatile", |
| 195 | + "together": "meta-llama/Llama-3.3-70B-Instruct-Turbo", |
| 196 | + "fireworks": "accounts/fireworks/models/llama-v3p3-70b-instruct", |
| 197 | + "mistral": "mistral-large-latest", |
| 198 | + "deepseek": "deepseek-chat", |
| 199 | + "xai": "grok-2", |
| 200 | + "cerebras": "llama3.3-70b", |
| 201 | + "litellm": "", |
| 202 | + "lmstudio": "", |
| 203 | + "vllm": "", |
| 204 | + "localai": "", |
| 203 | 205 | } |
| 204 | 206 | if m, ok := defaults[backend]; ok { |
| 205 | 207 | return m |
| 206 | 208 | } |
| 207 | 209 | return "" |
| 208 | 210 | |