@lobu/cli 3.0.4 → 3.0.5

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 (78) hide show
  1. package/README.md +17 -221
  2. package/dist/api/context.d.ts +0 -2
  3. package/dist/api/context.d.ts.map +1 -1
  4. package/dist/api/context.js +2 -2
  5. package/dist/api/context.js.map +1 -1
  6. package/dist/commands/chat.d.ts +7 -2
  7. package/dist/commands/chat.d.ts.map +1 -1
  8. package/dist/commands/chat.js +111 -25
  9. package/dist/commands/chat.js.map +1 -1
  10. package/dist/commands/dev.d.ts +3 -2
  11. package/dist/commands/dev.d.ts.map +1 -1
  12. package/dist/commands/dev.js +17 -165
  13. package/dist/commands/dev.js.map +1 -1
  14. package/dist/commands/init.d.ts.map +1 -1
  15. package/dist/commands/init.js +132 -59
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/skills/info.d.ts.map +1 -1
  18. package/dist/commands/skills/info.js +0 -9
  19. package/dist/commands/skills/info.js.map +1 -1
  20. package/dist/commands/skills/list.d.ts.map +1 -1
  21. package/dist/commands/skills/list.js +5 -6
  22. package/dist/commands/skills/list.js.map +1 -1
  23. package/dist/commands/skills/registry.d.ts +1 -11
  24. package/dist/commands/skills/registry.d.ts.map +1 -1
  25. package/dist/commands/skills/registry.js +0 -3
  26. package/dist/commands/skills/registry.js.map +1 -1
  27. package/dist/commands/status.js +1 -1
  28. package/dist/config/loader.d.ts +0 -18
  29. package/dist/config/loader.d.ts.map +1 -1
  30. package/dist/config/loader.js +2 -62
  31. package/dist/config/loader.js.map +1 -1
  32. package/dist/index.js +8 -15
  33. package/dist/index.js.map +1 -1
  34. package/package.json +1 -2
  35. package/dist/__tests__/login.test.d.ts +0 -2
  36. package/dist/__tests__/login.test.d.ts.map +0 -1
  37. package/dist/__tests__/login.test.js +0 -173
  38. package/dist/__tests__/login.test.js.map +0 -1
  39. package/dist/api/client.d.ts +0 -11
  40. package/dist/api/client.d.ts.map +0 -1
  41. package/dist/api/client.js +0 -33
  42. package/dist/api/client.js.map +0 -1
  43. package/dist/commands/launch.d.ts +0 -6
  44. package/dist/commands/launch.d.ts.map +0 -1
  45. package/dist/commands/launch.js +0 -26
  46. package/dist/commands/launch.js.map +0 -1
  47. package/dist/config/agents-manifest.d.ts +0 -92
  48. package/dist/config/agents-manifest.d.ts.map +0 -1
  49. package/dist/config/agents-manifest.js +0 -7
  50. package/dist/config/agents-manifest.js.map +0 -1
  51. package/dist/config/platform-schemas.d.ts +0 -120
  52. package/dist/config/platform-schemas.d.ts.map +0 -1
  53. package/dist/config/platform-schemas.js +0 -97
  54. package/dist/config/platform-schemas.js.map +0 -1
  55. package/dist/config/transformer.d.ts +0 -14
  56. package/dist/config/transformer.d.ts.map +0 -1
  57. package/dist/config/transformer.js +0 -46
  58. package/dist/config/transformer.js.map +0 -1
  59. package/dist/mcp-servers.d.ts +0 -11
  60. package/dist/mcp-servers.d.ts.map +0 -1
  61. package/dist/mcp-servers.js +0 -27
  62. package/dist/mcp-servers.js.map +0 -1
  63. package/dist/mcp-servers.json +0 -216
  64. package/dist/system-skills.json +0 -621
  65. package/dist/templates/.env.tmpl +0 -18
  66. package/dist/templates/.gitignore.tmpl +0 -33
  67. package/dist/templates/AGENTS.md.tmpl +0 -1
  68. package/dist/templates/Dockerfile.worker.tmpl +0 -29
  69. package/dist/templates/README.md.tmpl +0 -94
  70. package/dist/templates/TESTING.md.tmpl +0 -225
  71. package/dist/types.d.ts +0 -76
  72. package/dist/types.d.ts.map +0 -1
  73. package/dist/types.js +0 -2
  74. package/dist/types.js.map +0 -1
  75. package/dist/utils/config.d.ts +0 -2
  76. package/dist/utils/config.d.ts.map +0 -1
  77. package/dist/utils/config.js +0 -13
  78. package/dist/utils/config.js.map +0 -1
@@ -1,621 +0,0 @@
1
- {
2
- "skills": [
3
- {
4
- "id": "google-workspace",
5
- "name": "Google Workspace",
6
- "description": "Gmail, Calendar, Drive integration",
7
- "integrations": [
8
- {
9
- "id": "google",
10
- "label": "Google",
11
- "authType": "oauth",
12
- "oauth": {
13
- "authUrl": "https://accounts.google.com/o/oauth2/v2/auth",
14
- "tokenUrl": "https://oauth2.googleapis.com/token",
15
- "incrementalAuth": true,
16
- "extraAuthParams": {
17
- "access_type": "offline",
18
- "prompt": "consent"
19
- }
20
- },
21
- "scopesConfig": {
22
- "default": ["openid", "profile", "email"],
23
- "available": [
24
- "https://www.googleapis.com/auth/gmail.readonly",
25
- "https://www.googleapis.com/auth/gmail.send",
26
- "https://www.googleapis.com/auth/calendar.readonly",
27
- "https://www.googleapis.com/auth/calendar.events",
28
- "https://www.googleapis.com/auth/drive.readonly"
29
- ]
30
- },
31
- "apiDomains": [
32
- "gmail.googleapis.com",
33
- "www.googleapis.com",
34
- "calendar.googleapis.com"
35
- ],
36
- "apiBase": "https://www.googleapis.com",
37
- "apiHints": "Calendar: /calendar/v3/calendars/primary/events; Gmail: /gmail/v1/users/me/messages, /gmail/v1/users/me/messages/send; Drive: /drive/v3/files"
38
- }
39
- ]
40
- },
41
- {
42
- "id": "github",
43
- "name": "GitHub",
44
- "description": "Repos, issues, pull requests, and code access",
45
- "integrations": [
46
- {
47
- "id": "github",
48
- "label": "GitHub",
49
- "authType": "oauth",
50
- "oauth": {
51
- "authUrl": "https://github.com/login/oauth/authorize",
52
- "tokenUrl": "https://github.com/login/oauth/access_token"
53
- },
54
- "scopesConfig": {
55
- "default": ["read:user", "user:email"],
56
- "available": [
57
- "repo",
58
- "read:org",
59
- "read:project",
60
- "gist",
61
- "notifications"
62
- ]
63
- },
64
- "apiDomains": ["api.github.com", "raw.githubusercontent.com"],
65
- "apiBase": "https://api.github.com",
66
- "apiHints": "Repos: /repos/{owner}/{repo}; Issues: /repos/{owner}/{repo}/issues; Pulls: /repos/{owner}/{repo}/pulls; User: /user"
67
- }
68
- ]
69
- },
70
- {
71
- "id": "microsoft-365",
72
- "name": "Microsoft 365",
73
- "description": "Outlook, OneDrive, and Teams integration",
74
- "integrations": [
75
- {
76
- "id": "microsoft",
77
- "label": "Microsoft",
78
- "authType": "oauth",
79
- "oauth": {
80
- "authUrl": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
81
- "tokenUrl": "https://login.microsoftonline.com/common/oauth2/v2.0/token"
82
- },
83
- "scopesConfig": {
84
- "default": ["openid", "profile", "email", "offline_access"],
85
- "available": [
86
- "Mail.Read",
87
- "Mail.Send",
88
- "Calendars.Read",
89
- "Calendars.ReadWrite",
90
- "Files.Read",
91
- "Files.ReadWrite",
92
- "Chat.Read",
93
- "Team.ReadBasic.All"
94
- ]
95
- },
96
- "apiDomains": ["graph.microsoft.com"],
97
- "apiBase": "https://graph.microsoft.com/v1.0",
98
- "apiHints": "Mail: /me/messages; Calendar: /me/events; Files: /me/drive/root/children; Teams chats: /me/chats"
99
- }
100
- ]
101
- },
102
- {
103
- "id": "notion",
104
- "name": "Notion",
105
- "description": "Workspace pages, databases, and content",
106
- "integrations": [
107
- {
108
- "id": "notion",
109
- "label": "Notion",
110
- "authType": "oauth",
111
- "oauth": {
112
- "authUrl": "https://api.notion.com/v1/oauth/authorize",
113
- "tokenUrl": "https://api.notion.com/v1/oauth/token",
114
- "tokenEndpointAuthMethod": "client_secret_basic"
115
- },
116
- "apiDomains": ["api.notion.com"],
117
- "apiBase": "https://api.notion.com/v1",
118
- "apiHints": "Requires Notion-Version: 2022-06-28 header. Pages: /pages/{id}; Databases: /databases/{id}/query; Search: /search; Blocks: /blocks/{id}/children"
119
- }
120
- ]
121
- },
122
- {
123
- "id": "spotify",
124
- "name": "Spotify",
125
- "description": "Music playback, playlists, and library management",
126
- "integrations": [
127
- {
128
- "id": "spotify",
129
- "label": "Spotify",
130
- "authType": "oauth",
131
- "oauth": {
132
- "authUrl": "https://accounts.spotify.com/authorize",
133
- "tokenUrl": "https://accounts.spotify.com/api/token",
134
- "tokenEndpointAuthMethod": "client_secret_basic"
135
- },
136
- "scopesConfig": {
137
- "default": ["user-read-private", "user-read-email"],
138
- "available": [
139
- "user-read-playback-state",
140
- "user-modify-playback-state",
141
- "user-read-currently-playing",
142
- "playlist-read-private",
143
- "playlist-modify-public",
144
- "playlist-modify-private",
145
- "user-library-read",
146
- "user-library-modify",
147
- "user-top-read",
148
- "user-read-recently-played"
149
- ]
150
- },
151
- "apiDomains": ["api.spotify.com"],
152
- "apiBase": "https://api.spotify.com/v1",
153
- "apiHints": "Player: /me/player, /me/player/currently-playing; Playlists: /me/playlists, /playlists/{id}/tracks; Library: /me/tracks, /me/albums; Search: /search?q={query}&type=track,artist,album"
154
- }
155
- ]
156
- },
157
- {
158
- "id": "linear",
159
- "name": "Linear",
160
- "description": "Issue tracking and project management",
161
- "integrations": [
162
- {
163
- "id": "linear",
164
- "label": "Linear",
165
- "authType": "oauth",
166
- "oauth": {
167
- "authUrl": "https://linear.app/oauth/authorize",
168
- "tokenUrl": "https://api.linear.app/oauth/token"
169
- },
170
- "scopesConfig": {
171
- "default": ["read"],
172
- "available": ["read", "write", "issues:create", "comments:create"]
173
- },
174
- "apiDomains": ["api.linear.app"],
175
- "apiBase": "https://api.linear.app",
176
- "apiHints": "GraphQL API only. POST /graphql with query body. Example: { \"query\": \"{ issues { nodes { id title } } }\" }"
177
- }
178
- ]
179
- },
180
- {
181
- "id": "jira",
182
- "name": "Jira",
183
- "description": "Atlassian Jira project and issue management",
184
- "integrations": [
185
- {
186
- "id": "jira",
187
- "label": "Atlassian",
188
- "authType": "oauth",
189
- "oauth": {
190
- "authUrl": "https://auth.atlassian.com/authorize",
191
- "tokenUrl": "https://auth.atlassian.com/oauth/token"
192
- },
193
- "scopesConfig": {
194
- "default": ["read:me"],
195
- "available": [
196
- "read:jira-work",
197
- "write:jira-work",
198
- "read:jira-user",
199
- "read:confluence-content.all"
200
- ]
201
- },
202
- "apiDomains": ["api.atlassian.com", "auth.atlassian.com"],
203
- "apiBase": "https://api.atlassian.com",
204
- "apiHints": "REST v3. First get cloudId: /oauth/token/accessible-resources, then /ex/jira/{cloudId}/rest/api/3/search for issues, /ex/jira/{cloudId}/rest/api/3/issue/{key} for details"
205
- }
206
- ]
207
- },
208
- {
209
- "id": "sentry",
210
- "name": "Sentry",
211
- "description": "Error tracking, performance monitoring, and issue management",
212
- "integrations": [
213
- {
214
- "id": "sentry",
215
- "label": "Sentry",
216
- "authType": "oauth",
217
- "oauth": {
218
- "authUrl": "https://sentry.io/oauth/authorize/",
219
- "tokenUrl": "https://sentry.io/oauth/token/"
220
- },
221
- "scopesConfig": {
222
- "default": ["org:read", "project:read", "event:read"],
223
- "available": [
224
- "org:read",
225
- "org:write",
226
- "project:read",
227
- "project:write",
228
- "project:releases",
229
- "team:read",
230
- "team:write",
231
- "member:read",
232
- "event:read",
233
- "event:write"
234
- ]
235
- },
236
- "apiDomains": ["sentry.io"],
237
- "apiBase": "https://sentry.io/api/0",
238
- "apiHints": "Organizations: /organizations/; Projects: /organizations/{org}/projects/; Issues: /organizations/{org}/issues/"
239
- }
240
- ]
241
- },
242
- {
243
- "id": "reddit",
244
- "name": "Reddit",
245
- "description": "Reddit posts, comments, subreddits, and user data",
246
- "integrations": [
247
- {
248
- "id": "reddit",
249
- "label": "Reddit",
250
- "authType": "oauth",
251
- "oauth": {
252
- "authUrl": "https://www.reddit.com/api/v1/authorize?duration=permanent",
253
- "tokenUrl": "https://www.reddit.com/api/v1/access_token",
254
- "tokenEndpointAuthMethod": "client_secret_basic"
255
- },
256
- "scopesConfig": {
257
- "default": ["identity", "read"],
258
- "available": [
259
- "submit",
260
- "vote",
261
- "edit",
262
- "save",
263
- "history",
264
- "mysubreddits",
265
- "subscribe",
266
- "flair"
267
- ]
268
- },
269
- "apiDomains": ["oauth.reddit.com"],
270
- "apiBase": "https://oauth.reddit.com",
271
- "apiHints": "User: /api/v1/me; Subreddit posts: /r/{subreddit}/hot; Submit: /api/submit; Vote: /api/vote; Comments: /r/{subreddit}/comments/{article}"
272
- }
273
- ]
274
- },
275
- {
276
- "id": "twitter",
277
- "name": "X (Twitter)",
278
- "description": "Tweets, timelines, users, and direct messages",
279
- "integrations": [
280
- {
281
- "id": "twitter",
282
- "label": "X (Twitter)",
283
- "authType": "oauth",
284
- "oauth": {
285
- "authUrl": "https://twitter.com/i/oauth2/authorize",
286
- "tokenUrl": "https://api.twitter.com/2/oauth2/token",
287
- "tokenEndpointAuthMethod": "client_secret_basic"
288
- },
289
- "scopesConfig": {
290
- "default": ["tweet.read", "users.read", "offline.access"],
291
- "available": [
292
- "tweet.write",
293
- "follows.read",
294
- "follows.write",
295
- "like.read",
296
- "like.write",
297
- "dm.read",
298
- "dm.write"
299
- ]
300
- },
301
- "apiDomains": ["api.twitter.com"],
302
- "apiBase": "https://api.twitter.com/2",
303
- "apiHints": "User: /users/me; Tweets: /tweets/{id}; Timeline: /users/{id}/tweets; Post tweet: /tweets; Search: /tweets/search/recent?query={q}"
304
- }
305
- ]
306
- },
307
- {
308
- "id": "owletto",
309
- "name": "Owletto Memory",
310
- "description": "Long-term memory across conversations",
311
- "hidden": true,
312
- "mcpServers": [
313
- {
314
- "id": "owletto",
315
- "name": "Owletto",
316
- "url": "${env:OWLETTO_MCP_URL}",
317
- "type": "sse",
318
- "oauth": {
319
- "authUrl": "${env:OWLETTO_OAUTH_AUTH_URL}",
320
- "tokenUrl": "${env:OWLETTO_OAUTH_TOKEN_URL}",
321
- "clientId": "${env:OWLETTO_OAUTH_CLIENT_ID}",
322
- "scopes": ["mcp:read", "mcp:write"],
323
- "tokenEndpointAuthMethod": "none"
324
- }
325
- }
326
- ]
327
- },
328
- {
329
- "id": "groq",
330
- "name": "Groq",
331
- "description": "Fast LLM inference via Groq",
332
- "providers": [
333
- {
334
- "displayName": "Groq",
335
- "iconUrl": "https://www.google.com/s2/favicons?domain=groq.com&sz=128",
336
- "envVarName": "GROQ_API_KEY",
337
- "upstreamBaseUrl": "https://api.groq.com/openai",
338
- "apiKeyInstructions": "Get your API key from <a href=\"https://console.groq.com/keys\" target=\"_blank\" class=\"text-blue-600 hover:underline\">Groq Console</a>",
339
- "apiKeyPlaceholder": "gsk_...",
340
- "sdkCompat": "openai",
341
- "defaultModel": "llama-3.3-70b-versatile",
342
- "modelsEndpoint": "/v1/models",
343
- "stt": {
344
- "enabled": true,
345
- "sdkCompat": "openai",
346
- "transcriptionPath": "/v1/audio/transcriptions",
347
- "model": "whisper-large-v3-turbo"
348
- }
349
- }
350
- ]
351
- },
352
- {
353
- "id": "gemini",
354
- "name": "Gemini",
355
- "description": "Google Gemini models",
356
- "providers": [
357
- {
358
- "displayName": "Gemini",
359
- "iconUrl": "https://www.google.com/s2/favicons?domain=gemini.google.com&sz=128",
360
- "envVarName": "GEMINI_API_KEY",
361
- "upstreamBaseUrl": "https://generativelanguage.googleapis.com/v1beta/openai",
362
- "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>",
363
- "apiKeyPlaceholder": "AIza...",
364
- "sdkCompat": "openai",
365
- "defaultModel": "gemini-2.0-flash",
366
- "modelsEndpoint": "/v1/models"
367
- }
368
- ]
369
- },
370
- {
371
- "id": "together-ai",
372
- "name": "Together AI",
373
- "description": "Open-source models hosted by Together",
374
- "providers": [
375
- {
376
- "displayName": "Together AI",
377
- "iconUrl": "https://www.google.com/s2/favicons?domain=together.ai&sz=128",
378
- "envVarName": "TOGETHER_API_KEY",
379
- "upstreamBaseUrl": "https://api.together.xyz/v1",
380
- "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>",
381
- "apiKeyPlaceholder": "tok_...",
382
- "sdkCompat": "openai",
383
- "defaultModel": "meta-llama/Llama-3.3-70B-Instruct-Turbo",
384
- "modelsEndpoint": "/v1/models"
385
- }
386
- ]
387
- },
388
- {
389
- "id": "nvidia",
390
- "name": "NVIDIA NIM",
391
- "description": "NVIDIA-hosted models and inference APIs",
392
- "providers": [
393
- {
394
- "displayName": "NVIDIA NIM (free)",
395
- "iconUrl": "https://www.google.com/s2/favicons?domain=nvidia.com&sz=128",
396
- "envVarName": "NVIDIA_API_KEY",
397
- "upstreamBaseUrl": "https://integrate.api.nvidia.com/v1",
398
- "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>",
399
- "apiKeyPlaceholder": "nvapi-...",
400
- "sdkCompat": "openai",
401
- "modelsEndpoint": "/v1/models",
402
- "defaultModel": "nvidia/moonshotai/kimi-k2.5"
403
- }
404
- ]
405
- },
406
- {
407
- "id": "z-ai",
408
- "name": "z.ai",
409
- "description": "z.ai coding and reasoning models",
410
- "providers": [
411
- {
412
- "displayName": "z.ai",
413
- "iconUrl": "https://www.google.com/s2/favicons?domain=z.ai&sz=128",
414
- "envVarName": "Z_AI_API_KEY",
415
- "upstreamBaseUrl": "https://api.z.ai/api/coding/paas/v4",
416
- "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>",
417
- "apiKeyPlaceholder": "zai-...",
418
- "sdkCompat": "openai"
419
- }
420
- ]
421
- },
422
- {
423
- "id": "elevenlabs",
424
- "name": "ElevenLabs",
425
- "description": "Voice and speech models",
426
- "providers": [
427
- {
428
- "displayName": "ElevenLabs",
429
- "iconUrl": "https://www.google.com/s2/favicons?domain=elevenlabs.io&sz=128",
430
- "envVarName": "ELEVENLABS_API_KEY",
431
- "upstreamBaseUrl": "https://api.elevenlabs.io",
432
- "apiKeyInstructions": "Get your API key from <a href=\"https://elevenlabs.io/app/api-keys\" target=\"_blank\" class=\"text-blue-600 hover:underline\">ElevenLabs</a>",
433
- "apiKeyPlaceholder": "sk_...",
434
- "sdkCompat": "openai"
435
- }
436
- ]
437
- },
438
- {
439
- "id": "fireworks",
440
- "name": "Fireworks AI",
441
- "description": "Fast inference for open-source models",
442
- "providers": [
443
- {
444
- "displayName": "Fireworks AI",
445
- "iconUrl": "https://www.google.com/s2/favicons?domain=fireworks.ai&sz=128",
446
- "envVarName": "FIREWORKS_API_KEY",
447
- "upstreamBaseUrl": "https://api.fireworks.ai/inference/v1",
448
- "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>",
449
- "apiKeyPlaceholder": "fw_...",
450
- "sdkCompat": "openai",
451
- "defaultModel": "accounts/fireworks/models/llama-v3p3-70b-instruct",
452
- "modelsEndpoint": "/v1/models"
453
- }
454
- ]
455
- },
456
- {
457
- "id": "mistral",
458
- "name": "Mistral",
459
- "description": "Mistral AI models",
460
- "providers": [
461
- {
462
- "displayName": "Mistral",
463
- "iconUrl": "https://www.google.com/s2/favicons?domain=mistral.ai&sz=128",
464
- "envVarName": "MISTRAL_API_KEY",
465
- "upstreamBaseUrl": "https://api.mistral.ai/v1",
466
- "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>",
467
- "apiKeyPlaceholder": "sk-...",
468
- "sdkCompat": "openai",
469
- "defaultModel": "mistral-large-latest",
470
- "modelsEndpoint": "/v1/models"
471
- }
472
- ]
473
- },
474
- {
475
- "id": "deepseek",
476
- "name": "DeepSeek",
477
- "description": "DeepSeek reasoning and coding models",
478
- "providers": [
479
- {
480
- "displayName": "DeepSeek",
481
- "iconUrl": "https://www.google.com/s2/favicons?domain=deepseek.com&sz=128",
482
- "envVarName": "DEEPSEEK_API_KEY",
483
- "upstreamBaseUrl": "https://api.deepseek.com",
484
- "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>",
485
- "apiKeyPlaceholder": "sk-...",
486
- "sdkCompat": "openai",
487
- "defaultModel": "deepseek-chat",
488
- "modelsEndpoint": "/v1/models"
489
- }
490
- ]
491
- },
492
- {
493
- "id": "openrouter",
494
- "name": "OpenRouter",
495
- "description": "Multi-provider model router with per-user billing",
496
- "integrations": [
497
- {
498
- "id": "openrouter",
499
- "label": "OpenRouter",
500
- "authType": "oauth",
501
- "oauth": {
502
- "authUrl": "https://openrouter.ai/auth",
503
- "tokenUrl": "https://openrouter.ai/api/v1/auth/keys"
504
- },
505
- "apiDomains": ["openrouter.ai"],
506
- "apiBase": "https://openrouter.ai/api/v1",
507
- "apiHints": "OpenAI-compatible API. Chat completions: /chat/completions; Models: /models"
508
- }
509
- ],
510
- "providers": [
511
- {
512
- "displayName": "OpenRouter",
513
- "iconUrl": "https://www.google.com/s2/favicons?domain=openrouter.ai&sz=128",
514
- "envVarName": "OPENROUTER_API_KEY",
515
- "upstreamBaseUrl": "https://openrouter.ai/api/v1",
516
- "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",
517
- "apiKeyPlaceholder": "sk-or-...",
518
- "sdkCompat": "openai",
519
- "defaultModel": "anthropic/claude-sonnet-4",
520
- "modelsEndpoint": "/v1/models",
521
- "stt": {
522
- "enabled": true,
523
- "sdkCompat": "openai",
524
- "transcriptionPath": "/audio/transcriptions",
525
- "model": "whisper-1"
526
- }
527
- }
528
- ]
529
- },
530
- {
531
- "id": "cerebras",
532
- "name": "Cerebras",
533
- "description": "Ultra-fast inference on Cerebras hardware",
534
- "providers": [
535
- {
536
- "displayName": "Cerebras",
537
- "iconUrl": "https://www.google.com/s2/favicons?domain=cerebras.ai&sz=128",
538
- "envVarName": "CEREBRAS_API_KEY",
539
- "upstreamBaseUrl": "https://api.cerebras.ai/v1",
540
- "apiKeyInstructions": "Get your API key from <a href=\"https://cloud.cerebras.ai/\" target=\"_blank\" class=\"text-blue-600 hover:underline\">Cerebras Cloud</a>",
541
- "apiKeyPlaceholder": "csk-...",
542
- "sdkCompat": "openai",
543
- "defaultModel": "llama-3.3-70b",
544
- "modelsEndpoint": "/v1/models"
545
- }
546
- ]
547
- },
548
- {
549
- "id": "opencode-zen",
550
- "name": "OpenCode Zen",
551
- "description": "Curated AI gateway with 40+ coding-optimized models",
552
- "providers": [
553
- {
554
- "displayName": "OpenCode Zen",
555
- "iconUrl": "https://www.google.com/s2/favicons?domain=opencode.ai&sz=128",
556
- "envVarName": "OPENCODE_ZEN_API_KEY",
557
- "upstreamBaseUrl": "https://opencode.ai/zen/v1",
558
- "apiKeyInstructions": "Get your API key from <a href=\"https://opencode.ai/auth\" target=\"_blank\" class=\"text-blue-600 hover:underline\">OpenCode Zen</a>",
559
- "apiKeyPlaceholder": "zen-...",
560
- "sdkCompat": "openai",
561
- "defaultModel": "anthropic/claude-sonnet-4",
562
- "modelsEndpoint": "/v1/models"
563
- }
564
- ]
565
- },
566
- {
567
- "id": "xai",
568
- "name": "xAI",
569
- "description": "Grok models by xAI",
570
- "providers": [
571
- {
572
- "displayName": "xAI",
573
- "iconUrl": "https://www.google.com/s2/favicons?domain=x.ai&sz=128",
574
- "envVarName": "XAI_API_KEY",
575
- "upstreamBaseUrl": "https://api.x.ai/v1",
576
- "apiKeyInstructions": "Get your API key from <a href=\"https://console.x.ai/\" target=\"_blank\" class=\"text-blue-600 hover:underline\">xAI Console</a>",
577
- "apiKeyPlaceholder": "xai-...",
578
- "sdkCompat": "openai",
579
- "defaultModel": "grok-3",
580
- "modelsEndpoint": "/v1/models"
581
- }
582
- ]
583
- },
584
- {
585
- "id": "perplexity",
586
- "name": "Perplexity",
587
- "description": "Search-augmented AI models",
588
- "providers": [
589
- {
590
- "displayName": "Perplexity",
591
- "iconUrl": "https://www.google.com/s2/favicons?domain=perplexity.ai&sz=128",
592
- "envVarName": "PERPLEXITY_API_KEY",
593
- "upstreamBaseUrl": "https://api.perplexity.ai",
594
- "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>",
595
- "apiKeyPlaceholder": "pplx-...",
596
- "sdkCompat": "openai",
597
- "defaultModel": "sonar-pro",
598
- "modelsEndpoint": "/v1/models"
599
- }
600
- ]
601
- },
602
- {
603
- "id": "cohere",
604
- "name": "Cohere",
605
- "description": "Enterprise AI with Command and Embed models",
606
- "providers": [
607
- {
608
- "displayName": "Cohere",
609
- "iconUrl": "https://www.google.com/s2/favicons?domain=cohere.com&sz=128",
610
- "envVarName": "COHERE_API_KEY",
611
- "upstreamBaseUrl": "https://api.cohere.com/compatibility/v1",
612
- "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>",
613
- "apiKeyPlaceholder": "co-...",
614
- "sdkCompat": "openai",
615
- "defaultModel": "command-r-plus",
616
- "modelsEndpoint": "/v1/models"
617
- }
618
- ]
619
- }
620
- ]
621
- }
@@ -1,18 +0,0 @@
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}}
@@ -1,33 +0,0 @@
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/
@@ -1 +0,0 @@
1
- @TESTING.md