@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.
Files changed (63) hide show
  1. package/LICENSE +106 -0
  2. package/README.md +329 -0
  3. package/bin/browserbird +11 -0
  4. package/package.json +68 -0
  5. package/src/channel/blocks.ts +485 -0
  6. package/src/channel/coalesce.ts +79 -0
  7. package/src/channel/commands.ts +216 -0
  8. package/src/channel/handler.ts +272 -0
  9. package/src/channel/slack.ts +573 -0
  10. package/src/channel/types.ts +59 -0
  11. package/src/cli/banner.ts +10 -0
  12. package/src/cli/birds.ts +396 -0
  13. package/src/cli/config.ts +77 -0
  14. package/src/cli/doctor.ts +63 -0
  15. package/src/cli/index.ts +5 -0
  16. package/src/cli/jobs.ts +166 -0
  17. package/src/cli/logs.ts +67 -0
  18. package/src/cli/run.ts +148 -0
  19. package/src/cli/sessions.ts +158 -0
  20. package/src/cli/style.ts +19 -0
  21. package/src/config.ts +291 -0
  22. package/src/core/logger.ts +78 -0
  23. package/src/core/redact.ts +75 -0
  24. package/src/core/types.ts +83 -0
  25. package/src/core/uid.ts +26 -0
  26. package/src/core/utils.ts +137 -0
  27. package/src/cron/parse.ts +146 -0
  28. package/src/cron/scheduler.ts +242 -0
  29. package/src/daemon.ts +169 -0
  30. package/src/db/auth.ts +49 -0
  31. package/src/db/birds.ts +357 -0
  32. package/src/db/core.ts +377 -0
  33. package/src/db/index.ts +10 -0
  34. package/src/db/jobs.ts +289 -0
  35. package/src/db/logs.ts +64 -0
  36. package/src/db/messages.ts +79 -0
  37. package/src/db/path.ts +30 -0
  38. package/src/db/sessions.ts +165 -0
  39. package/src/jobs.ts +140 -0
  40. package/src/provider/claude.test.ts +95 -0
  41. package/src/provider/claude.ts +196 -0
  42. package/src/provider/opencode.test.ts +169 -0
  43. package/src/provider/opencode.ts +248 -0
  44. package/src/provider/session.ts +65 -0
  45. package/src/provider/spawn.ts +173 -0
  46. package/src/provider/stream.ts +67 -0
  47. package/src/provider/types.ts +24 -0
  48. package/src/server/auth.ts +135 -0
  49. package/src/server/health.ts +87 -0
  50. package/src/server/http.ts +132 -0
  51. package/src/server/index.ts +6 -0
  52. package/src/server/lifecycle.ts +135 -0
  53. package/src/server/routes.ts +1199 -0
  54. package/src/server/sse.ts +54 -0
  55. package/src/server/static.ts +45 -0
  56. package/src/server/vnc-proxy.ts +75 -0
  57. package/web/dist/assets/index-C6MBAUmO.js +7 -0
  58. package/web/dist/assets/index-JMPJCJ2F.css +1 -0
  59. package/web/dist/favicon.svg +5 -0
  60. package/web/dist/index.html +20 -0
  61. package/web/dist/logo-icon.png +0 -0
  62. package/web/dist/logo-icon.svg +5 -0
  63. 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: FSL-1.1-MIT](https://img.shields.io/badge/license-FSL--1.1--MIT-blue?style=flat-square)](LICENSE)
10
+ [![npm version](https://img.shields.io/npm/v/@owloops/browserbird?style=flat-square)](https://www.npmjs.com/package/@owloops/browserbird)
11
+ [![Install size](https://packagephobia.com/badge?p=@owloops/browserbird)](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.
@@ -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
+ }