@owloops/browserbird 1.1.1 → 1.1.3

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/README.md CHANGED
@@ -8,7 +8,7 @@ Self-hosted AI agent for Slack with a real browser, a scheduler, and a web dashb
8
8
 
9
9
  [![License: FSL-1.1-MIT](https://img.shields.io/badge/license-FSL--1.1--MIT-blue?style=flat-square)](LICENSE)
10
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)
11
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D22.21-brightgreen?style=flat-square&logo=node.js&logoColor=white)](https://nodejs.org)
12
12
 
13
13
  </div>
14
14
 
@@ -16,7 +16,7 @@ Self-hosted AI agent for Slack with a real browser, a scheduler, and a web dashb
16
16
 
17
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
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.
19
+ Built by [Owloops](https://github.com/Owloops), building browser automation tools since 2020.
20
20
 
21
21
  ## Installation
22
22
 
@@ -37,20 +37,11 @@ The browser runs in **persistent** mode by default: logins and cookies are saved
37
37
 
38
38
  [![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/browserbird)
39
39
 
40
- ### npm
41
-
42
- ```bash
43
- npm install -g @owloops/browserbird
44
- browserbird
45
- ```
46
-
47
- 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.
48
-
49
40
  ## Slack
50
41
 
51
- 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
52
- 2. Go to OAuth & Permissions, install the app to your workspace, copy the **Bot User OAuth Token** (`xoxb-...`)
53
- 3. Go to Basic Information, create an app-level token with the `connections:write` scope, copy the token (`xapp-...`)
42
+ [![Create Slack App](https://img.shields.io/badge/Slack-Create_App-4A154B?style=for-the-badge&logo=slack&logoColor=white)](https://api.slack.com/apps?new_app=1&manifest_json=%7B%22display_information%22%3A%7B%22name%22%3A%22BrowserBird%22%2C%22description%22%3A%22A%20self-hosted%20AI%20assistant%20in%20Slack%2C%20with%20a%20real%20browser%20and%20a%20scheduler.%22%2C%22background_color%22%3A%22%231a1a2e%22%7D%2C%22features%22%3A%7B%22assistant_view%22%3A%7B%22assistant_description%22%3A%22A%20self-hosted%20AI%20assistant%20in%20Slack%2C%20with%20a%20real%20browser%20and%20a%20scheduler.%22%7D%2C%22app_home%22%3A%7B%22home_tab_enabled%22%3Atrue%2C%22messages_tab_enabled%22%3Atrue%2C%22messages_tab_read_only_enabled%22%3Afalse%7D%2C%22bot_user%22%3A%7B%22display_name%22%3A%22BrowserBird%22%2C%22always_online%22%3Atrue%7D%2C%22slash_commands%22%3A%5B%7B%22command%22%3A%22%2Fbird%22%2C%22description%22%3A%22Manage%20BrowserBird%20birds%22%2C%22usage_hint%22%3A%22list%20%7C%20fly%20%7C%20logs%20%7C%20enable%20%7C%20disable%20%7C%20create%20%7C%20status%22%2C%22should_escape%22%3Afalse%7D%5D%7D%2C%22oauth_config%22%3A%7B%22scopes%22%3A%7B%22bot%22%3A%5B%22app_mentions%3Aread%22%2C%22assistant%3Awrite%22%2C%22channels%3Ahistory%22%2C%22channels%3Aread%22%2C%22chat%3Awrite%22%2C%22files%3Aread%22%2C%22files%3Awrite%22%2C%22groups%3Ahistory%22%2C%22groups%3Aread%22%2C%22im%3Ahistory%22%2C%22im%3Aread%22%2C%22im%3Awrite%22%2C%22mpim%3Ahistory%22%2C%22mpim%3Aread%22%2C%22reactions%3Aread%22%2C%22reactions%3Awrite%22%2C%22users%3Aread%22%2C%22commands%22%5D%7D%7D%2C%22settings%22%3A%7B%22event_subscriptions%22%3A%7B%22bot_events%22%3A%5B%22app_mention%22%2C%22assistant_thread_context_changed%22%2C%22assistant_thread_started%22%2C%22message.channels%22%2C%22message.groups%22%2C%22message.im%22%2C%22message.mpim%22%5D%7D%2C%22interactivity%22%3A%7B%22is_enabled%22%3Atrue%7D%2C%22org_deploy_enabled%22%3Afalse%2C%22socket_mode_enabled%22%3Atrue%2C%22token_rotation_enabled%22%3Afalse%7D%7D)
43
+
44
+ The manifest pre-configures all scopes, events, and slash commands. After creating the app, install it to your workspace and grab two tokens: the **Bot User OAuth Token** (`xoxb-...`) from OAuth & Permissions, and an **app-level token** (`xapp-...`) with `connections:write` scope from Basic Information.
54
45
 
55
46
  ### Slash Commands
56
47
 
@@ -66,6 +57,9 @@ Once the app is installed, `/bird` is available in any channel:
66
57
  /bird status Show daemon status
67
58
  ```
68
59
 
60
+ > [!TIP]
61
+ > If `/bird` fails or routes to the wrong app, you may have another Slack app in the workspace with the same slash command. Remove or rename the duplicate from [api.slack.com/apps](https://api.slack.com/apps).
62
+
69
63
  ## Configuration
70
64
 
71
65
  The onboarding wizard handles initial setup. For manual configuration, copy the example config:
@@ -243,6 +237,8 @@ The **opencode** provider inherits standard env vars per model provider: `OPENAI
243
237
 
244
238
  ## CLI
245
239
 
240
+ Available on npm: `npx @owloops/browserbird`
241
+
246
242
  ```
247
243
  $ browserbird --help
248
244
 
package/dist/index.mjs CHANGED
@@ -122,8 +122,8 @@ function unknownSubcommand(subcommand, command, validCommands) {
122
122
  /** @fileoverview ASCII banner displayed on daemon startup and in help text. */
123
123
  const pkg = createRequire(import.meta.url)("../package.json");
124
124
  const buildInfo = [];
125
- buildInfo.push(`commit: ${"6073adb05cd2e7b877031d51b2b49c66615ce5ab".substring(0, 7)}`);
126
- buildInfo.push(`built: 2026-03-02T12:32:53+04:00`);
125
+ buildInfo.push(`commit: ${"f081ab626328b4a00907de0601e2a81929c35567".substring(0, 7)}`);
126
+ buildInfo.push(`built: 2026-03-03T02:06:41+04:00`);
127
127
  const buildString = buildInfo.length > 0 ? ` (${buildInfo.join(", ")})` : "";
128
128
  const VERSION = `browserbird ${pkg.version}${buildString}`;
129
129
  const BIRD = [
@@ -2894,6 +2894,7 @@ function startScheduler(config, signal, deps) {
2894
2894
  agent,
2895
2895
  mcpConfigPath: config.browser.mcpConfigPath
2896
2896
  }, signal);
2897
+ if (payload.channelId) logMessage(payload.channelId, null, agent.id, "in", payload.prompt);
2897
2898
  let result = "";
2898
2899
  let completion;
2899
2900
  for await (const event of events) if (event.type === "text_delta") result += redact(event.delta);
@@ -2907,17 +2908,18 @@ function startScheduler(config, signal, deps) {
2907
2908
  }
2908
2909
  throw new Error(safeError);
2909
2910
  }
2911
+ if (completion && payload.channelId) logMessage(payload.channelId, null, agent.id, "out", result || void 0, completion.tokensIn, completion.tokensOut);
2910
2912
  if (!result) {
2911
2913
  logger.info(`bird ${shortUid(payload.cronJobUid)} completed (no output)`);
2912
2914
  return "completed (no output)";
2913
2915
  }
2914
2916
  if (payload.channelId && deps?.postToSlack) {
2917
+ await deps.postToSlack(payload.channelId, result);
2915
2918
  if (completion) {
2916
- const summary = result.length > 2800 ? result.slice(0, 2800) + "..." : result;
2917
- const blocks = sessionCompleteBlocks(completion, summary, agent.name);
2919
+ const blocks = sessionCompleteBlocks(completion, void 0, agent.name);
2918
2920
  const fallback = `Bird ${agent.name} completed: ${completion.numTurns} turns`;
2919
2921
  await deps.postToSlack(payload.channelId, fallback, { blocks });
2920
- } else await deps.postToSlack(payload.channelId, result);
2922
+ }
2921
2923
  logger.info(`bird ${shortUid(payload.cronJobUid)} result posted to ${payload.channelId}`);
2922
2924
  } else logger.info(`bird ${shortUid(payload.cronJobUid)} completed (${result.length} chars)`);
2923
2925
  return result;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owloops/browserbird",
3
- "version": "1.1.1",
3
+ "version": "1.1.3",
4
4
  "description": "Self-hosted AI agent for Slack with a real browser, a scheduler, and a web dashboard",
5
5
  "type": "module",
6
6
  "bin": {