@owloops/browserbird 1.0.0
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.
- package/LICENSE +106 -0
- package/README.md +329 -0
- package/bin/browserbird +11 -0
- package/package.json +68 -0
- package/src/channel/blocks.ts +485 -0
- package/src/channel/coalesce.ts +79 -0
- package/src/channel/commands.ts +216 -0
- package/src/channel/handler.ts +272 -0
- package/src/channel/slack.ts +573 -0
- package/src/channel/types.ts +59 -0
- package/src/cli/banner.ts +10 -0
- package/src/cli/birds.ts +396 -0
- package/src/cli/config.ts +77 -0
- package/src/cli/doctor.ts +63 -0
- package/src/cli/index.ts +5 -0
- package/src/cli/jobs.ts +166 -0
- package/src/cli/logs.ts +67 -0
- package/src/cli/run.ts +148 -0
- package/src/cli/sessions.ts +158 -0
- package/src/cli/style.ts +19 -0
- package/src/config.ts +291 -0
- package/src/core/logger.ts +78 -0
- package/src/core/redact.ts +75 -0
- package/src/core/types.ts +83 -0
- package/src/core/uid.ts +26 -0
- package/src/core/utils.ts +137 -0
- package/src/cron/parse.ts +146 -0
- package/src/cron/scheduler.ts +242 -0
- package/src/daemon.ts +169 -0
- package/src/db/auth.ts +49 -0
- package/src/db/birds.ts +357 -0
- package/src/db/core.ts +377 -0
- package/src/db/index.ts +10 -0
- package/src/db/jobs.ts +289 -0
- package/src/db/logs.ts +64 -0
- package/src/db/messages.ts +79 -0
- package/src/db/path.ts +30 -0
- package/src/db/sessions.ts +165 -0
- package/src/jobs.ts +140 -0
- package/src/provider/claude.test.ts +95 -0
- package/src/provider/claude.ts +196 -0
- package/src/provider/opencode.test.ts +169 -0
- package/src/provider/opencode.ts +248 -0
- package/src/provider/session.ts +65 -0
- package/src/provider/spawn.ts +173 -0
- package/src/provider/stream.ts +67 -0
- package/src/provider/types.ts +24 -0
- package/src/server/auth.ts +135 -0
- package/src/server/health.ts +87 -0
- package/src/server/http.ts +132 -0
- package/src/server/index.ts +6 -0
- package/src/server/lifecycle.ts +135 -0
- package/src/server/routes.ts +1199 -0
- package/src/server/sse.ts +54 -0
- package/src/server/static.ts +45 -0
- package/src/server/vnc-proxy.ts +75 -0
- package/web/dist/assets/index-C6MBAUmO.js +7 -0
- package/web/dist/assets/index-JMPJCJ2F.css +1 -0
- package/web/dist/favicon.svg +5 -0
- package/web/dist/index.html +20 -0
- package/web/dist/logo-icon.png +0 -0
- package/web/dist/logo-icon.svg +5 -0
- package/web/dist/logo.svg +7 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
Functional Source License, Version 1.1, MIT Future License
|
|
2
|
+
|
|
3
|
+
Abbreviation: FSL-1.1-MIT
|
|
4
|
+
|
|
5
|
+
Copyright 2026 Owloops
|
|
6
|
+
|
|
7
|
+
Terms and Conditions
|
|
8
|
+
|
|
9
|
+
Licensor ("We")
|
|
10
|
+
|
|
11
|
+
The party offering the Software under these Terms and Conditions.
|
|
12
|
+
|
|
13
|
+
The Software
|
|
14
|
+
|
|
15
|
+
The "Software" is each version of the software that we make available under
|
|
16
|
+
these Terms and Conditions, as indicated by our inclusion of these Terms and
|
|
17
|
+
Conditions with the Software.
|
|
18
|
+
|
|
19
|
+
License Grant
|
|
20
|
+
|
|
21
|
+
Subject to your compliance with this License Grant and the Patents,
|
|
22
|
+
Redistribution and Trademark clauses below, we hereby grant you the right to
|
|
23
|
+
use, copy, modify, create derivative works, publicly perform, publicly display
|
|
24
|
+
and redistribute the Software for any Permitted Purpose identified below.
|
|
25
|
+
|
|
26
|
+
Permitted Purpose
|
|
27
|
+
|
|
28
|
+
A Permitted Purpose is any purpose other than a Competing Use. A Competing Use
|
|
29
|
+
means making the Software available to others in a commercial product or
|
|
30
|
+
service that:
|
|
31
|
+
|
|
32
|
+
1. substitutes for the Software;
|
|
33
|
+
|
|
34
|
+
2. substitutes for any other product or service we offer using the Software
|
|
35
|
+
that exists as of the date we make the Software available; or
|
|
36
|
+
|
|
37
|
+
3. offers the same or substantially similar functionality as the Software.
|
|
38
|
+
|
|
39
|
+
Permitted Purposes specifically include using the Software:
|
|
40
|
+
|
|
41
|
+
1. for your internal use and access;
|
|
42
|
+
|
|
43
|
+
2. for non-commercial education;
|
|
44
|
+
|
|
45
|
+
3. for non-commercial research; and
|
|
46
|
+
|
|
47
|
+
4. in connection with professional services that you provide to a licensee
|
|
48
|
+
using the Software in accordance with these Terms and Conditions.
|
|
49
|
+
|
|
50
|
+
Patents
|
|
51
|
+
|
|
52
|
+
To the extent your use for a Permitted Purpose would necessarily infringe our
|
|
53
|
+
patents, the license grant above includes a license under our patents. If you
|
|
54
|
+
make a claim against any party that the Software infringes or contributes to
|
|
55
|
+
the infringement of any patent, then your patent license to the Software ends
|
|
56
|
+
immediately.
|
|
57
|
+
|
|
58
|
+
Redistribution
|
|
59
|
+
|
|
60
|
+
The Terms and Conditions apply to all copies, modifications and derivatives of
|
|
61
|
+
the Software.
|
|
62
|
+
|
|
63
|
+
If you redistribute any copies, modifications or derivatives of the Software,
|
|
64
|
+
you must include a copy of or a link to these Terms and Conditions and not
|
|
65
|
+
remove any copyright notices provided in or with the Software.
|
|
66
|
+
|
|
67
|
+
Disclaimer
|
|
68
|
+
|
|
69
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR
|
|
70
|
+
IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR
|
|
71
|
+
PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.
|
|
72
|
+
|
|
73
|
+
IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE
|
|
74
|
+
SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
|
|
75
|
+
EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.
|
|
76
|
+
|
|
77
|
+
Trademarks
|
|
78
|
+
|
|
79
|
+
Except for displaying the License Details and identifying us as the origin of
|
|
80
|
+
the Software, you have no right under these Terms and Conditions to use our
|
|
81
|
+
trademarks, trade names, service marks or product names.
|
|
82
|
+
|
|
83
|
+
Grant of Future License
|
|
84
|
+
|
|
85
|
+
We hereby irrevocably grant you an additional license to use the Software under
|
|
86
|
+
the MIT license that is effective on the second anniversary of the date we make
|
|
87
|
+
the Software available. On or after that date, you may use the Software under
|
|
88
|
+
the MIT license, in which case the following will apply:
|
|
89
|
+
|
|
90
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
91
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
92
|
+
the Software without restriction, including without limitation the rights to
|
|
93
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
94
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
|
95
|
+
so, subject to the following conditions:
|
|
96
|
+
|
|
97
|
+
The above copyright notice and this permission notice shall be included in all
|
|
98
|
+
copies or substantial portions of the Software.
|
|
99
|
+
|
|
100
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
101
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
102
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
103
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
104
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
105
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
106
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<img src="web/public/logo-icon.svg" alt="BrowserBird" width="80"/>
|
|
4
|
+
|
|
5
|
+
# BrowserBird
|
|
6
|
+
|
|
7
|
+
Self-hosted AI agent for Slack with a real browser, a scheduler, and a web dashboard.
|
|
8
|
+
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](https://www.npmjs.com/package/@owloops/browserbird)
|
|
11
|
+
[](https://packagephobia.com/result?p=@owloops/browserbird)
|
|
12
|
+
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<video src="https://github.com/user-attachments/assets/c71791c3-ba1c-4590-8931-f3adc2dcac2d" autoplay loop muted playsinline></video>
|
|
16
|
+
|
|
17
|
+
Talk to an AI agent in Slack threads. It can browse the web with a real Chromium browser you can watch live through VNC, run scheduled tasks on a cron, and keep persistent sessions across conversations. BrowserBird is the orchestration layer; the agent CLI ([claude](https://docs.anthropic.com/en/docs/claude-code/overview), [opencode](https://github.com/anomalyco/opencode)) handles reasoning, memory, tools, and sub-agents.
|
|
18
|
+
|
|
19
|
+
Built by [Owloops](https://github.com/Owloops), who have been building browser automation tools since 2020 ([flybird](https://github.com/Owloops/flybird), [chrome-recorder](https://github.com/Owloops/owloops-chrome-recorder), [extension](https://github.com/Owloops/owloops-extension)). BrowserBird is written from scratch with lessons learned from those projects.
|
|
20
|
+
|
|
21
|
+
## Installation
|
|
22
|
+
|
|
23
|
+
On first run, open the web UI and complete the onboarding wizard. It walks through Slack tokens, agent config, and API keys.
|
|
24
|
+
|
|
25
|
+
### Docker (recommended)
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
curl -fsSL https://raw.githubusercontent.com/Owloops/browserbird/main/compose.yml -o compose.yml
|
|
29
|
+
docker compose up -d
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Everything is included: agent CLI, Chromium browser, VNC, and Playwright MCP. Open `http://<host>:18800` to begin onboarding.
|
|
33
|
+
|
|
34
|
+
The browser runs in **persistent** mode by default: logins and cookies are saved across sessions, one agent at a time. Set `BROWSER_MODE=isolated` in `.env` for parallel sessions with fresh contexts (requires container restart). `shm_size: 2g` is required for Chromium stability.
|
|
35
|
+
|
|
36
|
+
### npm
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm install -g @owloops/browserbird
|
|
40
|
+
browserbird
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Requires Node.js 22.21+ and at least one agent CLI installed ([claude](https://docs.anthropic.com/en/docs/claude-code/overview) or [opencode](https://github.com/anomalyco/opencode)). Open `http://localhost:18800` to begin onboarding.
|
|
44
|
+
|
|
45
|
+
## Slack
|
|
46
|
+
|
|
47
|
+
1. Create a new Slack app at [api.slack.com/apps](https://api.slack.com/apps) using the [manifest.json](https://raw.githubusercontent.com/Owloops/browserbird/main/manifest.json) from this repo
|
|
48
|
+
2. Go to OAuth & Permissions, install the app to your workspace, copy the **Bot User OAuth Token** (`xoxb-...`)
|
|
49
|
+
3. Go to Basic Information, create an app-level token with the `connections:write` scope, copy the token (`xapp-...`)
|
|
50
|
+
|
|
51
|
+
### Slash Commands
|
|
52
|
+
|
|
53
|
+
Once the app is installed, `/bird` is available in any channel:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
/bird list Show all configured birds
|
|
57
|
+
/bird fly <name> Trigger a bird immediately
|
|
58
|
+
/bird logs <name> Show recent flights
|
|
59
|
+
/bird enable <name> Enable a bird
|
|
60
|
+
/bird disable <name> Disable a bird
|
|
61
|
+
/bird create Create a new bird (opens modal form)
|
|
62
|
+
/bird status Show daemon status
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Configuration
|
|
66
|
+
|
|
67
|
+
The onboarding wizard handles initial setup. For manual configuration, copy the example config:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
cp browserbird.example.json browserbird.json
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
See [browserbird.example.json](browserbird.example.json) for the full config with defaults.
|
|
74
|
+
|
|
75
|
+
Any string value can reference an environment variable with `"env:VAR_NAME"` syntax (e.g. `"env:SLACK_BOT_TOKEN"`).
|
|
76
|
+
|
|
77
|
+
The top-level `timezone` field (IANA format, default `"UTC"`) is used for cron scheduling and quiet hours.
|
|
78
|
+
|
|
79
|
+
<details>
|
|
80
|
+
<summary><strong>slack</strong> - Slack connection and behavior</summary>
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
"slack": {
|
|
84
|
+
"botToken": "env:SLACK_BOT_TOKEN",
|
|
85
|
+
"appToken": "env:SLACK_APP_TOKEN",
|
|
86
|
+
"requireMention": true,
|
|
87
|
+
"coalesce": { "debounceMs": 3000, "bypassDms": true },
|
|
88
|
+
"channels": ["*"],
|
|
89
|
+
"quietHours": { "enabled": false, "start": "23:00", "end": "08:00", "timezone": "UTC" }
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
- `botToken`, `appToken`: Required. Bot user OAuth token and app-level token for Socket Mode
|
|
94
|
+
- `requireMention`: Only respond in channels when `@mentioned`; DMs always respond
|
|
95
|
+
- `coalesce.debounceMs`: Wait N ms after last message before dispatching (groups rapid messages)
|
|
96
|
+
- `coalesce.bypassDms`: Skip debouncing for DMs
|
|
97
|
+
- `channels`: Channel names or IDs to listen in, or `"*"` for all
|
|
98
|
+
- `quietHours`: Silence the bot during specified hours. Start/end in HH:MM format, can wrap midnight
|
|
99
|
+
|
|
100
|
+
</details>
|
|
101
|
+
|
|
102
|
+
<details>
|
|
103
|
+
<summary><strong>agents</strong> - Agent routing and model config</summary>
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
"agents": [
|
|
107
|
+
{
|
|
108
|
+
"id": "default",
|
|
109
|
+
"name": "BrowserBird",
|
|
110
|
+
"provider": "claude",
|
|
111
|
+
"model": "sonnet",
|
|
112
|
+
"fallbackModel": "haiku",
|
|
113
|
+
"maxTurns": 50,
|
|
114
|
+
"systemPrompt": "You are responding in a Slack workspace. Be concise, helpful, and natural.",
|
|
115
|
+
"channels": ["*"]
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Each agent is scoped to specific channels. Multiple agents are matched in order, first match wins.
|
|
121
|
+
|
|
122
|
+
- `id`, `name`: Required. Unique identifier and display name
|
|
123
|
+
- `provider`: `"claude"` or `"opencode"`
|
|
124
|
+
- `model`: Claude uses short names (`sonnet`, `haiku`). OpenCode uses `provider/model` format (`anthropic/claude-sonnet-4-20250514`)
|
|
125
|
+
- `fallbackModel`: Fallback when primary is unavailable (claude only)
|
|
126
|
+
- `maxTurns`: Max conversation turns per session
|
|
127
|
+
- `systemPrompt`: Instructions prepended to every session
|
|
128
|
+
- `channels`: Channel names or IDs this agent handles, or `"*"` for all
|
|
129
|
+
- `processTimeoutMs`: Per-agent subprocess timeout override (inherits from `sessions` if not set)
|
|
130
|
+
|
|
131
|
+
</details>
|
|
132
|
+
|
|
133
|
+
<details>
|
|
134
|
+
<summary><strong>sessions</strong> - Session lifecycle</summary>
|
|
135
|
+
|
|
136
|
+
```json
|
|
137
|
+
"sessions": {
|
|
138
|
+
"ttlHours": 24,
|
|
139
|
+
"maxConcurrent": 5,
|
|
140
|
+
"processTimeoutMs": 300000
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
- `ttlHours`: Session lifetime in hours (resets on each message)
|
|
145
|
+
- `maxConcurrent`: Max simultaneous agent processes
|
|
146
|
+
- `processTimeoutMs`: Per-request timeout in milliseconds
|
|
147
|
+
|
|
148
|
+
</details>
|
|
149
|
+
|
|
150
|
+
<details>
|
|
151
|
+
<summary><strong>browser</strong> - Playwright MCP and VNC</summary>
|
|
152
|
+
|
|
153
|
+
```json
|
|
154
|
+
"browser": {
|
|
155
|
+
"enabled": false,
|
|
156
|
+
"mcpConfigPath": null,
|
|
157
|
+
"vncPort": 5900,
|
|
158
|
+
"novncPort": 6080,
|
|
159
|
+
"novncHost": "localhost"
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
- `enabled`: Enable Playwright MCP for the agent
|
|
164
|
+
- `mcpConfigPath`: Path to your MCP config (relative or absolute)
|
|
165
|
+
- `vncPort`: VNC server port
|
|
166
|
+
- `novncPort`: Upstream noVNC WebSocket port
|
|
167
|
+
- `novncHost`: Upstream noVNC host (e.g. `"vm"` in Docker)
|
|
168
|
+
|
|
169
|
+
Browser mode (`persistent` or `isolated`) is controlled by the `BROWSER_MODE` environment variable, not the config file.
|
|
170
|
+
|
|
171
|
+
</details>
|
|
172
|
+
|
|
173
|
+
<details>
|
|
174
|
+
<summary><strong>birds</strong> - Scheduled task settings</summary>
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
"birds": {
|
|
178
|
+
"maxAttempts": 3
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
- `maxAttempts`: Max job attempts before a bird stops retrying
|
|
183
|
+
|
|
184
|
+
Each bird supports per-bird active hours set via CLI `--active-hours 09:00-17:00` or the API. Wrap-around windows (e.g. `22:00-06:00`) are supported.
|
|
185
|
+
|
|
186
|
+
</details>
|
|
187
|
+
|
|
188
|
+
<details>
|
|
189
|
+
<summary><strong>database</strong> - Retention policy</summary>
|
|
190
|
+
|
|
191
|
+
```json
|
|
192
|
+
"database": {
|
|
193
|
+
"retentionDays": 30
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
- `retentionDays`: How long to keep messages, flight logs, jobs, and logs
|
|
198
|
+
|
|
199
|
+
</details>
|
|
200
|
+
|
|
201
|
+
<details>
|
|
202
|
+
<summary><strong>web</strong> - Dashboard and API server</summary>
|
|
203
|
+
|
|
204
|
+
```json
|
|
205
|
+
"web": {
|
|
206
|
+
"enabled": true,
|
|
207
|
+
"host": "127.0.0.1",
|
|
208
|
+
"port": 18800,
|
|
209
|
+
"corsOrigin": ""
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
- `enabled`: Enable the web dashboard and API
|
|
214
|
+
- `host`: Bind address (`0.0.0.0` for Docker/remote)
|
|
215
|
+
- `port`: Web UI and REST API port
|
|
216
|
+
- `corsOrigin`: Allowed origin for CORS headers (for cross-origin SPA hosting)
|
|
217
|
+
|
|
218
|
+
Authentication is handled via the web UI. On first visit, you create an account. All subsequent visits require login.
|
|
219
|
+
|
|
220
|
+
</details>
|
|
221
|
+
|
|
222
|
+
### Environment Variables
|
|
223
|
+
|
|
224
|
+
| Variable | Description |
|
|
225
|
+
| ------------------------- | ------------------------------------------------------------------------------------------------ |
|
|
226
|
+
| `SLACK_BOT_TOKEN` | Bot user OAuth token |
|
|
227
|
+
| `SLACK_APP_TOKEN` | App-level token for Socket Mode |
|
|
228
|
+
| `ANTHROPIC_API_KEY` | Anthropic API key (pay-per-token). Used by both claude and opencode providers |
|
|
229
|
+
| `CLAUDE_CODE_OAUTH_TOKEN` | OAuth token for claude provider only (uses your Claude Pro/Max subscription) |
|
|
230
|
+
| `BROWSER_MODE` | `persistent` (default) or `isolated`. Requires container restart |
|
|
231
|
+
| `BROWSERBIRD_CONFIG` | Path to `browserbird.json`. Overridden by `--config` flag |
|
|
232
|
+
| `BROWSERBIRD_DB` | Path to SQLite database file. Overridden by `--db` flag |
|
|
233
|
+
| `NO_COLOR` | Disable colored output |
|
|
234
|
+
|
|
235
|
+
The **opencode** provider inherits standard env vars per model provider: `OPENAI_API_KEY`, `GEMINI_API_KEY`, `OPENROUTER_API_KEY`, etc. See the full list at [models.dev](https://models.dev).
|
|
236
|
+
|
|
237
|
+
> [!NOTE]
|
|
238
|
+
> **Agent authentication:** `ANTHROPIC_API_KEY` (pay-per-token) is required for shared or commercial deployments per Anthropic's Consumer ToS. `CLAUDE_CODE_OAUTH_TOKEN` is fine for personal self-hosted use (claude provider only). When both are set, the claude provider uses OAuth and the opencode provider uses the API key.
|
|
239
|
+
|
|
240
|
+
## CLI
|
|
241
|
+
|
|
242
|
+
```
|
|
243
|
+
$ browserbird --help
|
|
244
|
+
|
|
245
|
+
.__.
|
|
246
|
+
( ^>
|
|
247
|
+
/ )\
|
|
248
|
+
<_/_/
|
|
249
|
+
" "
|
|
250
|
+
usage: browserbird [command] [options]
|
|
251
|
+
|
|
252
|
+
commands:
|
|
253
|
+
|
|
254
|
+
sessions manage sessions
|
|
255
|
+
birds manage scheduled birds
|
|
256
|
+
config view configuration
|
|
257
|
+
logs show recent log entries
|
|
258
|
+
jobs inspect and manage the job queue
|
|
259
|
+
doctor check system dependencies
|
|
260
|
+
|
|
261
|
+
options:
|
|
262
|
+
|
|
263
|
+
-h, --help show this help
|
|
264
|
+
-v, --version show version
|
|
265
|
+
--verbose enable debug logging
|
|
266
|
+
--config config file path (env: BROWSERBIRD_CONFIG)
|
|
267
|
+
--db database file path (env: BROWSERBIRD_DB)
|
|
268
|
+
|
|
269
|
+
run 'browserbird <command> --help' for command-specific options.
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
## Web UI
|
|
273
|
+
|
|
274
|
+
Runs at `http://localhost:18800` by default.
|
|
275
|
+
|
|
276
|
+
<img src="assets/webui-demo.png" alt="BrowserBird web UI" />
|
|
277
|
+
|
|
278
|
+
| Page | Description |
|
|
279
|
+
| ------------ | ---------------------------------------------------------------------------------- |
|
|
280
|
+
| **Status** | System overview, failing birds, upcoming runs, active sessions |
|
|
281
|
+
| **Sessions** | Session list with message history, token usage, and conversation detail |
|
|
282
|
+
| **Birds** | Scheduled birds: create, edit, enable/disable, trigger, inline flight history |
|
|
283
|
+
| **Browser** | Live noVNC viewer (Docker only) |
|
|
284
|
+
| **Settings** | Config editor, agent management, secrets, system birds, job queue, and log viewer |
|
|
285
|
+
|
|
286
|
+
## Development
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
git clone https://github.com/Owloops/browserbird.git
|
|
290
|
+
cd browserbird
|
|
291
|
+
npm ci
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### Run locally
|
|
295
|
+
|
|
296
|
+
```bash
|
|
297
|
+
cd web && npm ci && npm run build && cd ..
|
|
298
|
+
./bin/browserbird
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### Docker (build locally)
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
cp .env.example .env
|
|
305
|
+
docker compose -f oci/compose.yml up -d --build
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Checks
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
npm run typecheck # tsc --noEmit
|
|
312
|
+
npm run lint # eslint
|
|
313
|
+
npm run format:check # prettier
|
|
314
|
+
npm test # node --test
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
Web UI (from `web/`):
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
npm run check # svelte-check
|
|
321
|
+
npm run format:check # prettier
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
## License
|
|
325
|
+
|
|
326
|
+
[FSL-1.1-MIT](LICENSE), source available, converts to MIT after two years.
|
|
327
|
+
|
|
328
|
+
> [!NOTE]
|
|
329
|
+
> This project was built with assistance from LLMs. Human review and guidance provided throughout.
|
package/bin/browserbird
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env -S node --disable-warning=ExperimentalWarning
|
|
2
|
+
|
|
3
|
+
import { run } from '../src/cli/index.ts';
|
|
4
|
+
|
|
5
|
+
try {
|
|
6
|
+
await run(process.argv.slice(2));
|
|
7
|
+
} catch (err) {
|
|
8
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
9
|
+
process.stderr.write(`Error: ${message}\n`);
|
|
10
|
+
process.exitCode = 1;
|
|
11
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@owloops/browserbird",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Self-hosted AI agent for Slack with a real browser, a scheduler, and a web dashboard",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"browserbird": "./bin/browserbird"
|
|
8
|
+
},
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=22.21.0"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"src",
|
|
14
|
+
"bin",
|
|
15
|
+
"web/dist",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"typecheck": "tsc --noEmit",
|
|
20
|
+
"lint": "eslint src/",
|
|
21
|
+
"lint:fix": "eslint src/ --fix",
|
|
22
|
+
"format": "prettier --write src/",
|
|
23
|
+
"format:check": "prettier --check src/",
|
|
24
|
+
"test": "node --test src/**/*.test.ts",
|
|
25
|
+
"start": "./bin/browserbird",
|
|
26
|
+
"prepublishOnly": "npm run lint && npm run format:check && npm run typecheck && cd web && npm ci && npm run build"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"slack",
|
|
30
|
+
"claude",
|
|
31
|
+
"claude-code",
|
|
32
|
+
"orchestrator",
|
|
33
|
+
"cli",
|
|
34
|
+
"bot"
|
|
35
|
+
],
|
|
36
|
+
"author": "Owloops",
|
|
37
|
+
"license": "FSL-1.1-MIT",
|
|
38
|
+
"homepage": "https://github.com/Owloops/browserbird#readme",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/Owloops/browserbird.git"
|
|
42
|
+
},
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/Owloops/browserbird/issues"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@eslint/js": "^10.0.1",
|
|
48
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
49
|
+
"@semantic-release/git": "^10.0.1",
|
|
50
|
+
"@types/node": "^24.0.0",
|
|
51
|
+
"@typescript-eslint/eslint-plugin": "^8.56.0",
|
|
52
|
+
"@typescript-eslint/parser": "^8.56.0",
|
|
53
|
+
"eslint": "^10.0.0",
|
|
54
|
+
"eslint-config-prettier": "^10.1.8",
|
|
55
|
+
"eslint-plugin-prettier": "^5.5.5",
|
|
56
|
+
"prettier": "^3.8.1",
|
|
57
|
+
"prettier-plugin-svelte": "^3.5.0",
|
|
58
|
+
"semantic-release": "^25.0.3",
|
|
59
|
+
"typescript": "^5.8.0"
|
|
60
|
+
},
|
|
61
|
+
"publishConfig": {
|
|
62
|
+
"access": "public",
|
|
63
|
+
"provenance": true
|
|
64
|
+
},
|
|
65
|
+
"dependencies": {
|
|
66
|
+
"@slack/socket-mode": "^2.0.5"
|
|
67
|
+
}
|
|
68
|
+
}
|