@owloops/browserbird 1.1.2 → 1.1.4
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 +15 -1
- package/dist/index.mjs +7 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,7 +12,18 @@ Self-hosted AI agent for Slack with a real browser, a scheduler, and a web dashb
|
|
|
12
12
|
|
|
13
13
|
</div>
|
|
14
14
|
|
|
15
|
-
<
|
|
15
|
+
<table>
|
|
16
|
+
<tr>
|
|
17
|
+
<td width="50%" align="center">
|
|
18
|
+
<h4>Overview</h4>
|
|
19
|
+
<video src="https://github.com/user-attachments/assets/ff9bfe81-dde8-4bd2-acf5-47b48f43be9b" autoplay loop muted playsinline style="width:100%; max-width:400px;">
|
|
20
|
+
</td>
|
|
21
|
+
<td width="50%" align="center">
|
|
22
|
+
<h4>Demo</h4>
|
|
23
|
+
<video src="https://github.com/user-attachments/assets/c71791c3-ba1c-4590-8931-f3adc2dcac2d" controls style="width:100%; max-width:400px;">
|
|
24
|
+
</td>
|
|
25
|
+
</tr>
|
|
26
|
+
</table>
|
|
16
27
|
|
|
17
28
|
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
29
|
|
|
@@ -57,6 +68,9 @@ Once the app is installed, `/bird` is available in any channel:
|
|
|
57
68
|
/bird status Show daemon status
|
|
58
69
|
```
|
|
59
70
|
|
|
71
|
+
> [!TIP]
|
|
72
|
+
> 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).
|
|
73
|
+
|
|
60
74
|
## Configuration
|
|
61
75
|
|
|
62
76
|
The onboarding wizard handles initial setup. For manual configuration, copy the example config:
|
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: ${"
|
|
126
|
-
buildInfo.push(`built: 2026-03-
|
|
125
|
+
buildInfo.push(`commit: ${"9a26d64771305792754153472ab1739d842aa17c".substring(0, 7)}`);
|
|
126
|
+
buildInfo.push(`built: 2026-03-03T02:18: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
|
|
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
|
-
}
|
|
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;
|