@lobu/cli 3.0.5 → 3.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/api/context.js +2 -2
  2. package/dist/api/context.js.map +1 -1
  3. package/dist/commands/chat.js +2 -2
  4. package/dist/commands/chat.js.map +1 -1
  5. package/dist/commands/init.d.ts.map +1 -1
  6. package/dist/commands/init.js +79 -1
  7. package/dist/commands/init.js.map +1 -1
  8. package/dist/commands/login.d.ts.map +1 -1
  9. package/dist/commands/login.js +4 -4
  10. package/dist/commands/login.js.map +1 -1
  11. package/dist/commands/providers/add.d.ts.map +1 -1
  12. package/dist/commands/providers/add.js +2 -2
  13. package/dist/commands/providers/add.js.map +1 -1
  14. package/dist/commands/providers/list.js +1 -1
  15. package/dist/commands/providers/list.js.map +1 -1
  16. package/dist/commands/skills/add.d.ts.map +1 -1
  17. package/dist/commands/skills/add.js +2 -2
  18. package/dist/commands/skills/add.js.map +1 -1
  19. package/dist/commands/skills/info.js +1 -1
  20. package/dist/commands/skills/info.js.map +1 -1
  21. package/dist/commands/skills/list.js +2 -2
  22. package/dist/commands/skills/list.js.map +1 -1
  23. package/dist/commands/status.d.ts.map +1 -1
  24. package/dist/commands/status.js +1 -1
  25. package/dist/commands/status.js.map +1 -1
  26. package/dist/commands/validate.js +1 -1
  27. package/dist/commands/validate.js.map +1 -1
  28. package/dist/commands/whoami.js +1 -1
  29. package/dist/commands/whoami.js.map +1 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +0 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/mcp-servers.json +216 -0
  34. package/dist/system-skills.json +364 -0
  35. package/dist/templates/.env.tmpl +18 -0
  36. package/dist/templates/.gitignore.tmpl +33 -0
  37. package/dist/templates/AGENTS.md.tmpl +1 -0
  38. package/dist/templates/Dockerfile.worker.tmpl +29 -0
  39. package/dist/templates/README.md.tmpl +94 -0
  40. package/dist/templates/TESTING.md.tmpl +225 -0
  41. package/package.json +1 -1
@@ -0,0 +1,364 @@
1
+ {
2
+ "skills": [
3
+ {
4
+ "id": "owletto",
5
+ "name": "Owletto Memory",
6
+ "description": "Long-term memory across conversations. Use when you need to remember user preferences, recall past context, or store important facts.",
7
+ "instructions": "Check Owletto memory at the start of each conversation for relevant context. Store important user preferences, facts, and decisions.",
8
+ "hidden": true,
9
+ "mcpServers": [
10
+ {
11
+ "id": "owletto",
12
+ "name": "Owletto",
13
+ "url": "${env:MEMORY_URL}",
14
+ "type": "sse"
15
+ }
16
+ ]
17
+ },
18
+ {
19
+ "id": "github",
20
+ "name": "GitHub",
21
+ "description": "Repos, issues, pull requests, and code access",
22
+ "instructions": "Use Owletto MCP tools for GitHub API access (issues, PRs, repos). For git operations, use the CLI directly — network permissions are granted for github.com.",
23
+ "permissions": ["github.com", ".github.com", ".githubusercontent.com"]
24
+ },
25
+ {
26
+ "id": "google-workspace",
27
+ "name": "Google Workspace",
28
+ "description": "Gmail, Calendar, and Drive integration",
29
+ "instructions": "Use Owletto MCP tools for Google Workspace API access (Gmail, Calendar, Drive)."
30
+ },
31
+ {
32
+ "id": "linear",
33
+ "name": "Linear",
34
+ "description": "Issue tracking and project management",
35
+ "instructions": "Use Owletto MCP tools for Linear API access (issues, projects, cycles)."
36
+ },
37
+ {
38
+ "id": "notion",
39
+ "name": "Notion",
40
+ "description": "Workspace pages, databases, and content",
41
+ "instructions": "Use Owletto MCP tools for Notion API access (pages, databases, blocks)."
42
+ },
43
+ {
44
+ "id": "jira",
45
+ "name": "Jira",
46
+ "description": "Atlassian Jira project and issue management",
47
+ "instructions": "Use Owletto MCP tools for Jira API access (issues, projects, boards)."
48
+ },
49
+ {
50
+ "id": "sentry",
51
+ "name": "Sentry",
52
+ "description": "Error tracking and performance monitoring",
53
+ "instructions": "Use Owletto MCP tools for Sentry API access (issues, events, releases)."
54
+ },
55
+ {
56
+ "id": "microsoft-365",
57
+ "name": "Microsoft 365",
58
+ "description": "Outlook, OneDrive, and Teams integration",
59
+ "instructions": "Use Owletto MCP tools for Microsoft 365 API access (Mail, Calendar, Files, Teams)."
60
+ },
61
+ {
62
+ "id": "spotify",
63
+ "name": "Spotify",
64
+ "description": "Music playback, playlists, and library",
65
+ "instructions": "Use Owletto MCP tools for Spotify API access (player, playlists, library, search)."
66
+ },
67
+ {
68
+ "id": "groq",
69
+ "name": "Groq",
70
+ "description": "Fast LLM inference via Groq",
71
+ "providers": [
72
+ {
73
+ "displayName": "Groq",
74
+ "iconUrl": "https://www.google.com/s2/favicons?domain=groq.com&sz=128",
75
+ "envVarName": "GROQ_API_KEY",
76
+ "upstreamBaseUrl": "https://api.groq.com/openai",
77
+ "apiKeyInstructions": "Get your API key from <a href=\"https://console.groq.com/keys\" target=\"_blank\" class=\"text-blue-600 hover:underline\">Groq Console</a>",
78
+ "apiKeyPlaceholder": "gsk_...",
79
+ "sdkCompat": "openai",
80
+ "defaultModel": "llama-3.3-70b-versatile",
81
+ "modelsEndpoint": "/v1/models",
82
+ "stt": {
83
+ "enabled": true,
84
+ "sdkCompat": "openai",
85
+ "transcriptionPath": "/v1/audio/transcriptions",
86
+ "model": "whisper-large-v3-turbo"
87
+ }
88
+ }
89
+ ]
90
+ },
91
+ {
92
+ "id": "gemini",
93
+ "name": "Gemini",
94
+ "description": "Google Gemini models",
95
+ "providers": [
96
+ {
97
+ "displayName": "Gemini",
98
+ "iconUrl": "https://www.google.com/s2/favicons?domain=gemini.google.com&sz=128",
99
+ "envVarName": "GEMINI_API_KEY",
100
+ "upstreamBaseUrl": "https://generativelanguage.googleapis.com/v1beta/openai",
101
+ "apiKeyInstructions": "Get your API key from <a href=\"https://aistudio.google.com/apikey\" target=\"_blank\" class=\"text-blue-600 hover:underline\">Google AI Studio</a>",
102
+ "apiKeyPlaceholder": "AIza...",
103
+ "sdkCompat": "openai",
104
+ "defaultModel": "gemini-2.0-flash",
105
+ "modelsEndpoint": "/v1/models"
106
+ }
107
+ ]
108
+ },
109
+ {
110
+ "id": "together-ai",
111
+ "name": "Together AI",
112
+ "description": "Open-source models hosted by Together",
113
+ "providers": [
114
+ {
115
+ "displayName": "Together AI",
116
+ "iconUrl": "https://www.google.com/s2/favicons?domain=together.ai&sz=128",
117
+ "envVarName": "TOGETHER_API_KEY",
118
+ "upstreamBaseUrl": "https://api.together.xyz/v1",
119
+ "apiKeyInstructions": "Get your API key from <a href=\"https://api.together.ai/settings/api-keys\" target=\"_blank\" class=\"text-blue-600 hover:underline\">Together AI Dashboard</a>",
120
+ "apiKeyPlaceholder": "tok_...",
121
+ "sdkCompat": "openai",
122
+ "defaultModel": "meta-llama/Llama-3.3-70B-Instruct-Turbo",
123
+ "modelsEndpoint": "/v1/models"
124
+ }
125
+ ]
126
+ },
127
+ {
128
+ "id": "nvidia",
129
+ "name": "NVIDIA NIM",
130
+ "description": "NVIDIA-hosted models and inference APIs",
131
+ "providers": [
132
+ {
133
+ "displayName": "NVIDIA NIM (free)",
134
+ "iconUrl": "https://www.google.com/s2/favicons?domain=nvidia.com&sz=128",
135
+ "envVarName": "NVIDIA_API_KEY",
136
+ "upstreamBaseUrl": "https://integrate.api.nvidia.com/v1",
137
+ "apiKeyInstructions": "Get your API key from <a href=\"https://build.nvidia.com/settings/api-keys\" target=\"_blank\" class=\"text-blue-600 hover:underline\">NVIDIA Build</a>",
138
+ "apiKeyPlaceholder": "nvapi-...",
139
+ "sdkCompat": "openai",
140
+ "modelsEndpoint": "/v1/models",
141
+ "defaultModel": "nvidia/moonshotai/kimi-k2.5"
142
+ }
143
+ ]
144
+ },
145
+ {
146
+ "id": "z-ai",
147
+ "name": "z.ai",
148
+ "description": "z.ai coding and reasoning models",
149
+ "providers": [
150
+ {
151
+ "displayName": "z.ai",
152
+ "iconUrl": "https://www.google.com/s2/favicons?domain=z.ai&sz=128",
153
+ "envVarName": "Z_AI_API_KEY",
154
+ "upstreamBaseUrl": "https://api.z.ai/api/coding/paas/v4",
155
+ "apiKeyInstructions": "Get your API key from <a href=\"https://z.ai/manage-apikey/apikey-list\" target=\"_blank\" class=\"text-blue-600 hover:underline\">z.ai</a>",
156
+ "apiKeyPlaceholder": "zai-...",
157
+ "sdkCompat": "openai"
158
+ }
159
+ ]
160
+ },
161
+ {
162
+ "id": "elevenlabs",
163
+ "name": "ElevenLabs",
164
+ "description": "Voice and speech models",
165
+ "providers": [
166
+ {
167
+ "displayName": "ElevenLabs",
168
+ "iconUrl": "https://www.google.com/s2/favicons?domain=elevenlabs.io&sz=128",
169
+ "envVarName": "ELEVENLABS_API_KEY",
170
+ "upstreamBaseUrl": "https://api.elevenlabs.io",
171
+ "apiKeyInstructions": "Get your API key from <a href=\"https://elevenlabs.io/app/api-keys\" target=\"_blank\" class=\"text-blue-600 hover:underline\">ElevenLabs</a>",
172
+ "apiKeyPlaceholder": "sk_...",
173
+ "sdkCompat": "openai"
174
+ }
175
+ ]
176
+ },
177
+ {
178
+ "id": "fireworks",
179
+ "name": "Fireworks AI",
180
+ "description": "Fast inference for open-source models",
181
+ "providers": [
182
+ {
183
+ "displayName": "Fireworks AI",
184
+ "iconUrl": "https://www.google.com/s2/favicons?domain=fireworks.ai&sz=128",
185
+ "envVarName": "FIREWORKS_API_KEY",
186
+ "upstreamBaseUrl": "https://api.fireworks.ai/inference/v1",
187
+ "apiKeyInstructions": "Get your API key from <a href=\"https://fireworks.ai/account/api-keys\" target=\"_blank\" class=\"text-blue-600 hover:underline\">Fireworks Dashboard</a>",
188
+ "apiKeyPlaceholder": "fw_...",
189
+ "sdkCompat": "openai",
190
+ "defaultModel": "accounts/fireworks/models/llama-v3p3-70b-instruct",
191
+ "modelsEndpoint": "/v1/models"
192
+ }
193
+ ]
194
+ },
195
+ {
196
+ "id": "mistral",
197
+ "name": "Mistral",
198
+ "description": "Mistral AI models",
199
+ "providers": [
200
+ {
201
+ "displayName": "Mistral",
202
+ "iconUrl": "https://www.google.com/s2/favicons?domain=mistral.ai&sz=128",
203
+ "envVarName": "MISTRAL_API_KEY",
204
+ "upstreamBaseUrl": "https://api.mistral.ai/v1",
205
+ "apiKeyInstructions": "Get your API key from <a href=\"https://console.mistral.ai/api-keys\" target=\"_blank\" class=\"text-blue-600 hover:underline\">Mistral Console</a>",
206
+ "apiKeyPlaceholder": "sk-...",
207
+ "sdkCompat": "openai",
208
+ "defaultModel": "mistral-large-latest",
209
+ "modelsEndpoint": "/v1/models"
210
+ }
211
+ ]
212
+ },
213
+ {
214
+ "id": "deepseek",
215
+ "name": "DeepSeek",
216
+ "description": "DeepSeek reasoning and coding models",
217
+ "providers": [
218
+ {
219
+ "displayName": "DeepSeek",
220
+ "iconUrl": "https://www.google.com/s2/favicons?domain=deepseek.com&sz=128",
221
+ "envVarName": "DEEPSEEK_API_KEY",
222
+ "upstreamBaseUrl": "https://api.deepseek.com",
223
+ "apiKeyInstructions": "Get your API key from <a href=\"https://platform.deepseek.com/api_keys\" target=\"_blank\" class=\"text-blue-600 hover:underline\">DeepSeek Platform</a>",
224
+ "apiKeyPlaceholder": "sk-...",
225
+ "sdkCompat": "openai",
226
+ "defaultModel": "deepseek-chat",
227
+ "modelsEndpoint": "/v1/models"
228
+ }
229
+ ]
230
+ },
231
+ {
232
+ "id": "openrouter",
233
+ "name": "OpenRouter",
234
+ "description": "Multi-provider model router with per-user billing",
235
+ "providers": [
236
+ {
237
+ "displayName": "OpenRouter",
238
+ "iconUrl": "https://www.google.com/s2/favicons?domain=openrouter.ai&sz=128",
239
+ "envVarName": "OPENROUTER_API_KEY",
240
+ "upstreamBaseUrl": "https://openrouter.ai/api/v1",
241
+ "apiKeyInstructions": "Get your API key from <a href=\"https://openrouter.ai/keys\" target=\"_blank\" class=\"text-blue-600 hover:underline\">OpenRouter</a>, or connect via OAuth for per-user billing",
242
+ "apiKeyPlaceholder": "sk-or-...",
243
+ "sdkCompat": "openai",
244
+ "defaultModel": "anthropic/claude-sonnet-4",
245
+ "modelsEndpoint": "/v1/models",
246
+ "stt": {
247
+ "enabled": true,
248
+ "sdkCompat": "openai",
249
+ "transcriptionPath": "/audio/transcriptions",
250
+ "model": "whisper-1"
251
+ }
252
+ }
253
+ ]
254
+ },
255
+ {
256
+ "id": "cerebras",
257
+ "name": "Cerebras",
258
+ "description": "Ultra-fast inference on Cerebras hardware",
259
+ "providers": [
260
+ {
261
+ "displayName": "Cerebras",
262
+ "iconUrl": "https://www.google.com/s2/favicons?domain=cerebras.ai&sz=128",
263
+ "envVarName": "CEREBRAS_API_KEY",
264
+ "upstreamBaseUrl": "https://api.cerebras.ai/v1",
265
+ "apiKeyInstructions": "Get your API key from <a href=\"https://cloud.cerebras.ai/\" target=\"_blank\" class=\"text-blue-600 hover:underline\">Cerebras Cloud</a>",
266
+ "apiKeyPlaceholder": "csk-...",
267
+ "sdkCompat": "openai",
268
+ "defaultModel": "llama-3.3-70b",
269
+ "modelsEndpoint": "/v1/models"
270
+ }
271
+ ]
272
+ },
273
+ {
274
+ "id": "opencode-zen",
275
+ "name": "OpenCode Zen",
276
+ "description": "Curated AI gateway with 40+ coding-optimized models",
277
+ "providers": [
278
+ {
279
+ "displayName": "OpenCode Zen",
280
+ "iconUrl": "https://www.google.com/s2/favicons?domain=opencode.ai&sz=128",
281
+ "envVarName": "OPENCODE_ZEN_API_KEY",
282
+ "upstreamBaseUrl": "https://opencode.ai/zen/v1",
283
+ "apiKeyInstructions": "Get your API key from <a href=\"https://opencode.ai/auth\" target=\"_blank\" class=\"text-blue-600 hover:underline\">OpenCode Zen</a>",
284
+ "apiKeyPlaceholder": "zen-...",
285
+ "sdkCompat": "openai",
286
+ "defaultModel": "anthropic/claude-sonnet-4",
287
+ "modelsEndpoint": "/v1/models"
288
+ }
289
+ ]
290
+ },
291
+ {
292
+ "id": "xai",
293
+ "name": "xAI",
294
+ "description": "Grok models by xAI",
295
+ "providers": [
296
+ {
297
+ "displayName": "xAI",
298
+ "iconUrl": "https://www.google.com/s2/favicons?domain=x.ai&sz=128",
299
+ "envVarName": "XAI_API_KEY",
300
+ "upstreamBaseUrl": "https://api.x.ai/v1",
301
+ "apiKeyInstructions": "Get your API key from <a href=\"https://console.x.ai/\" target=\"_blank\" class=\"text-blue-600 hover:underline\">xAI Console</a>",
302
+ "apiKeyPlaceholder": "xai-...",
303
+ "sdkCompat": "openai",
304
+ "defaultModel": "grok-3",
305
+ "modelsEndpoint": "/v1/models"
306
+ }
307
+ ]
308
+ },
309
+ {
310
+ "id": "perplexity",
311
+ "name": "Perplexity",
312
+ "description": "Search-augmented AI models",
313
+ "providers": [
314
+ {
315
+ "displayName": "Perplexity",
316
+ "iconUrl": "https://www.google.com/s2/favicons?domain=perplexity.ai&sz=128",
317
+ "envVarName": "PERPLEXITY_API_KEY",
318
+ "upstreamBaseUrl": "https://api.perplexity.ai",
319
+ "apiKeyInstructions": "Get your API key from <a href=\"https://www.perplexity.ai/settings/api\" target=\"_blank\" class=\"text-blue-600 hover:underline\">Perplexity Settings</a>",
320
+ "apiKeyPlaceholder": "pplx-...",
321
+ "sdkCompat": "openai",
322
+ "defaultModel": "sonar-pro",
323
+ "modelsEndpoint": "/v1/models"
324
+ }
325
+ ]
326
+ },
327
+ {
328
+ "id": "cohere",
329
+ "name": "Cohere",
330
+ "description": "Enterprise AI with Command and Embed models",
331
+ "providers": [
332
+ {
333
+ "displayName": "Cohere",
334
+ "iconUrl": "https://www.google.com/s2/favicons?domain=cohere.com&sz=128",
335
+ "envVarName": "COHERE_API_KEY",
336
+ "upstreamBaseUrl": "https://api.cohere.com/compatibility/v1",
337
+ "apiKeyInstructions": "Get your API key from <a href=\"https://dashboard.cohere.com/api-keys\" target=\"_blank\" class=\"text-blue-600 hover:underline\">Cohere Dashboard</a>",
338
+ "apiKeyPlaceholder": "co-...",
339
+ "sdkCompat": "openai",
340
+ "defaultModel": "command-r-plus",
341
+ "modelsEndpoint": "/v1/models"
342
+ }
343
+ ]
344
+ },
345
+ {
346
+ "id": "openai",
347
+ "name": "OpenAI",
348
+ "description": "OpenAI Models",
349
+ "providers": [
350
+ {
351
+ "displayName": "OpenAI",
352
+ "iconUrl": "https://www.google.com/s2/favicons?domain=openai.com&sz=128",
353
+ "envVarName": "OPENAI_API_KEY",
354
+ "upstreamBaseUrl": "https://api.openai.com",
355
+ "apiKeyInstructions": "Get your API key from <a href=\"https://platform.openai.com/api-keys\" target=\"_blank\" class=\"text-blue-600 hover:underline\">OpenAI Dashboard</a>",
356
+ "apiKeyPlaceholder": "sk-...",
357
+ "sdkCompat": "openai",
358
+ "defaultModel": "gpt-4o",
359
+ "modelsEndpoint": "/v1/models"
360
+ }
361
+ ]
362
+ }
363
+ ]
364
+ }
@@ -0,0 +1,18 @@
1
+ # Gateway Configuration
2
+ GATEWAY_PORT={{GATEWAY_PORT}}
3
+ DEPLOYMENT_MODE={{DEPLOYMENT_MODE}}
4
+
5
+ # Security
6
+ ADMIN_PASSWORD={{ADMIN_PASSWORD}}
7
+ ENCRYPTION_KEY={{ENCRYPTION_KEY}}
8
+
9
+ # Worker Network Access Control
10
+ # Empty/unset: Complete isolation (deny all)
11
+ # WORKER_ALLOWED_DOMAINS=*: Unrestricted access
12
+ # WORKER_ALLOWED_DOMAINS=domains: Allowlist mode (deny by default, allow only these)
13
+ # WORKER_DISALLOWED_DOMAINS=domains: Blocklist mode (use with WORKER_ALLOWED_DOMAINS=*)
14
+ WORKER_ALLOWED_DOMAINS={{WORKER_ALLOWED_DOMAINS}}
15
+ WORKER_DISALLOWED_DOMAINS={{WORKER_DISALLOWED_DOMAINS}}
16
+
17
+ # CLI Version (used for image tags)
18
+ CLI_VERSION={{CLI_VERSION}}
@@ -0,0 +1,33 @@
1
+ # Environment variables
2
+ .env
3
+ .env.local
4
+ .env.*.local
5
+
6
+ # Generated files
7
+ .lobu/
8
+ data/
9
+
10
+ # Workspace data
11
+ workspaces/
12
+
13
+ # Logs
14
+ *.log
15
+ npm-debug.log*
16
+ yarn-debug.log*
17
+ yarn-error.log*
18
+ pnpm-debug.log*
19
+ lerna-debug.log*
20
+
21
+ # OS files
22
+ .DS_Store
23
+ Thumbs.db
24
+
25
+ # Editor directories
26
+ .vscode/
27
+ .idea/
28
+ *.swp
29
+ *.swo
30
+ *~
31
+
32
+ # Node modules (if you add custom scripts)
33
+ node_modules/
@@ -0,0 +1 @@
1
+ @TESTING.md
@@ -0,0 +1,29 @@
1
+ FROM ghcr.io/lobu-ai/lobu-worker-base:latest
2
+
3
+ # === CUSTOMIZE BELOW THIS LINE ===
4
+ # This Dockerfile extends the lobu worker base image with your custom tools and dependencies.
5
+ # The same Dockerfile works for local Docker development.
6
+
7
+ # Example: Add system packages
8
+ # RUN apt-get update && apt-get install -y \
9
+ # postgresql-client \
10
+ # && rm -rf /var/lib/apt/lists/*
11
+
12
+ # Example: Add Python packages
13
+ # RUN pip install --no-cache-dir \
14
+ # pandas \
15
+ # matplotlib \
16
+ # requests
17
+
18
+ # Example: Add Node.js packages
19
+ # RUN bun add @octokit/rest lodash
20
+
21
+ # Example: Copy custom scripts
22
+ # COPY ./scripts /workspace/scripts
23
+ # RUN chmod +x /workspace/scripts/*.sh
24
+
25
+ # Example: Set custom environment variables
26
+ # ENV MY_CUSTOM_VAR=value
27
+
28
+ # Example: Install language runtimes
29
+ # RUN curl -fsSL https://deno.land/install.sh | sh
@@ -0,0 +1,94 @@
1
+ # {{PROJECT_NAME}}
2
+
3
+ Lobu instance created with `@lobu/cli` v{{CLI_VERSION}}
4
+
5
+ ## Quick Start
6
+
7
+ Make sure you have Docker CLI installed.
8
+
9
+ ```bash
10
+ # Start the services
11
+ npx @lobu/cli run -d
12
+
13
+ # View logs
14
+ docker compose logs -f
15
+
16
+ # Stop the services
17
+ docker compose down
18
+ ```
19
+
20
+ ## Upgrading to Latest Version
21
+
22
+ ### Update Gateway and Pre-built Images
23
+ Pull the latest images and restart services:
24
+ ```bash
25
+ docker compose pull
26
+ docker compose up -d
27
+ ```
28
+
29
+ ### Rebuild Worker (when Dockerfile.worker changes)
30
+ If you modified your `Dockerfile.worker` or want to use the latest base image:
31
+ ```bash
32
+ docker compose build worker
33
+ docker compose restart gateway
34
+ ```
35
+
36
+ ### Update Environment Variables
37
+ Check for new environment variables in release notes or the [Lobu documentation](https://github.com/lobu-ai/lobu):
38
+ 1. Compare your `.env` with the latest `.env.example` from the repository
39
+ 2. Add any new required variables
40
+ 3. Restart services: `docker compose restart`
41
+
42
+ **Tip**: Always use `latest` tags to ensure gateway and worker versions stay in sync.
43
+
44
+ ## Configuration
45
+
46
+ ### Environment Variables
47
+
48
+ Edit `.env` to configure:
49
+ - `PUBLIC_GATEWAY_URL` - Public URL for OAuth callbacks
50
+ - `WORKER_ALLOWED_DOMAINS` - Allowed domains for worker network access
51
+
52
+ ### Platform Connections
53
+
54
+ Platforms (Slack, Telegram, Discord, WhatsApp, Teams) are configured through the gateway APIs. No platform-specific env vars are required in `docker-compose.yml`; manage connections against `{PUBLIC_GATEWAY_URL}/api/v1/connections` and related auth/config endpoints.
55
+
56
+ ### Worker Customization
57
+
58
+ Edit `Dockerfile.worker` to add custom tools and dependencies.
59
+
60
+ Example customizations:
61
+ ```dockerfile
62
+ # Add system packages
63
+ RUN apt-get update && apt-get install -y postgresql-client
64
+
65
+ # Add Python packages
66
+ RUN pip install pandas matplotlib
67
+
68
+ # Add Node.js packages
69
+ RUN bun add @octokit/rest
70
+ ```
71
+
72
+ When you modify `Dockerfile.worker` or context files, rebuild the worker image:
73
+ ```bash
74
+ docker compose build worker
75
+ ```
76
+
77
+ The gateway will automatically pick up the latest worker image.
78
+
79
+ ## Services
80
+
81
+ The docker-compose.yml defines these services:
82
+ - **redis** - Redis cache and queue
83
+ - **gateway** - Platform connections and worker orchestration
84
+ - **worker** - Agent worker (build-only, spawned dynamically)
85
+
86
+ ## Learn More
87
+
88
+ - [Lobu Documentation](https://github.com/lobu-ai/lobu)
89
+ - [CLI Reference](https://github.com/lobu-ai/lobu/tree/main/packages/cli)
90
+ - [Examples](https://github.com/lobu-ai/lobu/tree/main/examples)
91
+
92
+ ## Support
93
+
94
+ - [GitHub Issues](https://github.com/lobu-ai/lobu/issues)