Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 45 additions & 45 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# =============================================================================
# Sprout Backend — Local Development Environment
# Buzz Backend — Local Development Environment
# =============================================================================
# Copy this file to .env and adjust as needed:
# cp .env.example .env
Expand All @@ -18,12 +18,12 @@
# -----------------------------------------------------------------------------
# Database (Postgres 17)
# -----------------------------------------------------------------------------
DATABASE_URL=postgres://sprout:sprout_dev@localhost:5432/sprout
DATABASE_URL=postgres://buzz:buzz_dev@localhost:5432/buzz
PGHOST=localhost
PGPORT=5432
PGUSER=sprout
PGPASSWORD=sprout_dev
PGDATABASE=sprout
PGUSER=buzz
PGPASSWORD=buzz_dev
PGDATABASE=buzz

# -----------------------------------------------------------------------------
# Redis 7
Expand All @@ -33,157 +33,157 @@ REDIS_URL=redis://localhost:6379
# -----------------------------------------------------------------------------
# Typesense (search)
# -----------------------------------------------------------------------------
TYPESENSE_API_KEY=sprout_dev_key
TYPESENSE_API_KEY=buzz_dev_key
TYPESENSE_URL=http://localhost:8108

# -----------------------------------------------------------------------------
# Relay (WebSocket server)
# -----------------------------------------------------------------------------
# Bind address for the relay (host:port)
SPROUT_BIND_ADDR=0.0.0.0:3000
BUZZ_BIND_ADDR=0.0.0.0:3000
# Public WebSocket URL — used in NIP-42 auth challenges
RELAY_URL=ws://localhost:3000
# Stable relay signing key. Set this in dev if you want REST-created forum posts
# to keep resolving to the original author across relay restarts.
# SPROUT_RELAY_PRIVATE_KEY=<32-byte hex private key>
# BUZZ_RELAY_PRIVATE_KEY=<32-byte hex private key>
# Optional: path to the web UI dist directory. When set, the relay serves
# the web frontend at / for browser requests. Leave unset for local dev
# (use `just web` for Vite HMR instead).
# SPROUT_WEB_DIR=./web/dist
# BUZZ_WEB_DIR=./web/dist

# -----------------------------------------------------------------------------
# Git (NIP-34 bare repositories)
# -----------------------------------------------------------------------------
# Root directory for bare git repos. Repos are stored at
# {path}/{owner_hex}/{repo_id}.git/. Default: ./repos (relative to CWD).
# Set an absolute path to keep repos stable across worktrees.
# SPROUT_GIT_REPO_PATH=./repos
# BUZZ_GIT_REPO_PATH=./repos

# -----------------------------------------------------------------------------
# Ephemeral Channels (TTL testing)
# -----------------------------------------------------------------------------
# Override the TTL for all ephemeral channels (in seconds). When set, any
# channel created with a TTL tag will use this value instead of the
# client-provided one. Unset to use the client-provided TTL.
# SPROUT_EPHEMERAL_TTL_OVERRIDE=60
# BUZZ_EPHEMERAL_TTL_OVERRIDE=60

# How often the reaper checks for expired ephemeral channels (default: 60s).
# SPROUT_REAPER_INTERVAL_SECS=5
# BUZZ_REAPER_INTERVAL_SECS=5

# -----------------------------------------------------------------------------
# Logging / Tracing
# -----------------------------------------------------------------------------
RUST_LOG=sprout_relay=debug,sprout_db=debug,sprout_auth=debug,sprout_pubsub=debug,tower_http=debug
RUST_LOG=buzz_relay=debug,buzz_db=debug,buzz_auth=debug,buzz_pubsub=debug,tower_http=debug

# OTLP tracing endpoint (optional — leave unset to disable)
# OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317

# -----------------------------------------------------------------------------
# ACP (Agent Communication Protocol — sprout-acp harness)
# ACP (Agent Communication Protocol — buzz-acp harness)
# -----------------------------------------------------------------------------
# The ACP harness bridges Sprout events to AI agents. Each env var below maps
# The ACP harness bridges Buzz events to AI agents. Each env var below maps
# to a CLI flag of the same name (lowercase, hyphens → underscores). All values
# are optional unless noted; defaults are shown in comments.
#
# Quick start:
# SPROUT_PRIVATE_KEY=<hex> SPROUT_RELAY_URL=ws://localhost:3000 sprout-acp
# BUZZ_PRIVATE_KEY=<hex> BUZZ_RELAY_URL=ws://localhost:3000 buzz-acp

# ── Identity & auth ──────────────────────────────────────────────────────────
# Nostr private key (hex or bech32). REQUIRED — identifies the agent on the relay.
# SPROUT_PRIVATE_KEY=<32-byte hex or nsec1… private key>
# BUZZ_PRIVATE_KEY=<32-byte hex or nsec1… private key>

# Relay WebSocket URL the harness connects to.
# Note: the relay itself uses RELAY_URL (above); this is the ACP harness's
# connection target — they happen to point at the same place in local dev.
# SPROUT_RELAY_URL=ws://localhost:3000
# BUZZ_RELAY_URL=ws://localhost:3000

# ── Agent subprocess ─────────────────────────────────────────────────────────
# Binary to spawn as the AI agent (e.g. "goose", "codex-acp", "claude-code").
# SPROUT_ACP_AGENT_COMMAND=goose
# BUZZ_ACP_AGENT_COMMAND=goose

# Comma-separated arguments passed to the agent binary.
# Goose default: "acp". Codex/Claude default: "" (empty).
# SPROUT_ACP_AGENT_ARGS=acp
# BUZZ_ACP_AGENT_ARGS=acp

# Binary for an optional MCP server sidecar (e.g. sprout-dev-mcp for sprout-agent).
# SPROUT_ACP_MCP_COMMAND=
# Binary for an optional MCP server sidecar (e.g. buzz-dev-mcp for buzz-agent).
# BUZZ_ACP_MCP_COMMAND=

# Number of parallel agent subprocesses (1–32).
# SPROUT_ACP_AGENTS=1
# BUZZ_ACP_AGENTS=1

# Desired LLM model ID. Applied to every new ACP session.
# Use `sprout-acp models` to discover available model IDs.
# SPROUT_ACP_MODEL=
# Use `buzz-acp models` to discover available model IDs.
# BUZZ_ACP_MODEL=

# ── Timeouts & sessions ──────────────────────────────────────────────────────
# Max seconds per agent turn before timeout (default 320 = ~5 min).
# SPROUT_ACP_TURN_TIMEOUT=320
# BUZZ_ACP_TURN_TIMEOUT=320

# Max turns per session before proactive rotation. 0 = disabled (rotate only
# on MaxTokens / MaxTurnRequests). Recommended: 50 for long-running agents.
# SPROUT_ACP_MAX_TURNS_PER_SESSION=0
# BUZZ_ACP_MAX_TURNS_PER_SESSION=0

# ── Prompts ──────────────────────────────────────────────────────────────────
# System prompt injected into every agent session (inline text).
# SPROUT_ACP_SYSTEM_PROMPT=
# BUZZ_ACP_SYSTEM_PROMPT=

# Path to a file containing the system prompt (mutually exclusive with above).
# SPROUT_ACP_SYSTEM_PROMPT_FILE=
# BUZZ_ACP_SYSTEM_PROMPT_FILE=

# Message sent to the agent immediately after session creation.
# SPROUT_ACP_INITIAL_MESSAGE=
# BUZZ_ACP_INITIAL_MESSAGE=

# ── Heartbeat ────────────────────────────────────────────────────────────────
# Seconds between heartbeat prompts. 0 = disabled. Must be 0 or ≥10.
# Recommended: 60 for long-running agents to prevent idle session timeouts.
# SPROUT_ACP_HEARTBEAT_INTERVAL=0
# BUZZ_ACP_HEARTBEAT_INTERVAL=0

# Heartbeat prompt text (inline). Mutually exclusive with file variant.
# SPROUT_ACP_HEARTBEAT_PROMPT=
# BUZZ_ACP_HEARTBEAT_PROMPT=

# Path to a file containing the heartbeat prompt.
# SPROUT_ACP_HEARTBEAT_PROMPT_FILE=
# BUZZ_ACP_HEARTBEAT_PROMPT_FILE=

# ── Subscription & filtering ─────────────────────────────────────────────────
# Subscribe mode: "mentions" (default), "all", or "config" (rule-based).
# SPROUT_ACP_SUBSCRIBE=mentions
# BUZZ_ACP_SUBSCRIBE=mentions

# Comma-separated event kind numbers to subscribe to (overrides mode defaults).
# SPROUT_ACP_KINDS=
# BUZZ_ACP_KINDS=

# Comma-separated channel UUIDs to limit subscription scope.
# SPROUT_ACP_CHANNELS=
# BUZZ_ACP_CHANNELS=

# Set to true to disable the @-mention filter in mentions mode.
# SPROUT_ACP_NO_MENTION_FILTER=false
# BUZZ_ACP_NO_MENTION_FILTER=false

# Path to TOML config file for rule-based subscriptions (config mode).
# SPROUT_ACP_CONFIG=./sprout-acp.toml
# BUZZ_ACP_CONFIG=./buzz-acp.toml

# ── Dedup & self-ignore ──────────────────────────────────────────────────────
# How to handle duplicate events: "queue" (default) or "drop".
# SPROUT_ACP_DEDUP=queue
# BUZZ_ACP_DEDUP=queue

# Set to true to process the agent's own messages (default: ignore self).
# SPROUT_ACP_NO_IGNORE_SELF=false
# BUZZ_ACP_NO_IGNORE_SELF=false

# ── Context ──────────────────────────────────────────────────────────────────
# Max context messages fetched for thread replies and DMs (0–100). 0 = disabled.
# SPROUT_ACP_CONTEXT_MESSAGE_LIMIT=12
# BUZZ_ACP_CONTEXT_MESSAGE_LIMIT=12

# ── Presence & typing ────────────────────────────────────────────────────────
# Set to true to disable automatic online/offline presence status.
# SPROUT_ACP_NO_PRESENCE=false
# BUZZ_ACP_NO_PRESENCE=false

# Set to true to disable typing indicators while the agent is processing.
# SPROUT_ACP_NO_TYPING=false
# BUZZ_ACP_NO_TYPING=false

# ── Advanced tuning ──────────────────────────────────────────────────────────
# Event channel buffer capacity (WebSocket → harness). Increase for
# high-throughput agents. Minimum 1.
# SPROUT_ACP_EVENT_BUFFER=256
# BUZZ_ACP_EVENT_BUFFER=256

# ── Legacy aliases ───────────────────────────────────────────────────────────
# These are accepted for backward compatibility but the canonical names above
# are preferred:
# SPROUT_ACP_PRIVATE_KEYSPROUT_PRIVATE_KEY
# BUZZ_ACP_PRIVATE_KEYBUZZ_PRIVATE_KEY
28 changes: 14 additions & 14 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -169,28 +169,28 @@ jobs:
EXTRACT_DIR="${RUNNER_TEMP}/signed-app-extract"
rm -rf "$EXTRACT_DIR" && mkdir -p "$EXTRACT_DIR"
ditto -x -k "$SIGNED_APP_ZIP" "$EXTRACT_DIR"
rm -rf "${APP_DIR}/Sprout.app"
cp -R "${EXTRACT_DIR}/Sprout.app" "${APP_DIR}/Sprout.app"
rm -rf "${APP_DIR}/Buzz.app"
cp -R "${EXTRACT_DIR}/Buzz.app" "${APP_DIR}/Buzz.app"

# Rebuild the updater archive from the signed .app and re-sign it with the Tauri updater key.
rm -f "${APP_DIR}/Sprout.app.tar.gz" "${APP_DIR}/Sprout.app.tar.gz.sig"
(cd "$APP_DIR" && tar -czf Sprout.app.tar.gz Sprout.app)
TARBALL_ABS="$(pwd)/${APP_DIR}/Sprout.app.tar.gz"
rm -f "${APP_DIR}/Buzz.app.tar.gz" "${APP_DIR}/Buzz.app.tar.gz.sig"
(cd "$APP_DIR" && tar -czf Buzz.app.tar.gz Buzz.app)
TARBALL_ABS="$(pwd)/${APP_DIR}/Buzz.app.tar.gz"
(cd desktop && pnpm tauri signer sign "$TARBALL_ABS")

- name: Verify code signature
run: |
codesign --verify --deep --strict --verbose=2 \
desktop/src-tauri/target/release/bundle/macos/Sprout.app
desktop/src-tauri/target/release/bundle/macos/Buzz.app
spctl --assess --type execute --verbose=4 \
desktop/src-tauri/target/release/bundle/macos/Sprout.app
desktop/src-tauri/target/release/bundle/macos/Buzz.app

- name: Locate build artifacts
id: artifacts
run: |
BUNDLE_DIR="desktop/src-tauri/target/release/bundle"

# Find the DMG (Tauri names it Sprout_<version>_<arch>.dmg)
# Find the DMG (Tauri names it Buzz_<version>_<arch>.dmg)
DMG=$(find "$BUNDLE_DIR/dmg" -name '*.dmg' -type f | head -1)
if [[ -z "$DMG" ]]; then
echo "::error::No DMG found in $BUNDLE_DIR/dmg"
Expand Down Expand Up @@ -234,19 +234,19 @@ jobs:
NOTES=$(awk "/^## v${VERSION}$/,/^## v/" CHANGELOG.md | sed '$d')
fi
if [[ -z "$NOTES" ]]; then
NOTES="Sprout Desktop v${VERSION}"
NOTES="Buzz Desktop v${VERSION}"
fi
gh release create "v${VERSION}" \
--target "$RELEASE_SHA" \
--title "Sprout Desktop v${VERSION}" \
--title "Buzz Desktop v${VERSION}" \
--notes "$NOTES" \
"$DMG_PATH"

- name: Update rolling release for auto-updater
run: |
gh release create buzz-desktop-latest \
--prerelease \
--title "Sprout Desktop Auto-Update" \
--title "Buzz Desktop Auto-Update" \
--notes "Rolling release for the Tauri auto-updater. Do not download manually — use the versioned release instead." \
2>/dev/null || true
gh release upload buzz-desktop-latest \
Expand Down Expand Up @@ -349,12 +349,12 @@ jobs:
EXTRACT_DIR="${RUNNER_TEMP}/signed-app-extract-x64"
rm -rf "$EXTRACT_DIR" && mkdir -p "$EXTRACT_DIR"
ditto -x -k "$SIGNED_APP_ZIP" "$EXTRACT_DIR"
rm -rf "${APP_DIR}/Sprout.app"
cp -R "${EXTRACT_DIR}/Sprout.app" "${APP_DIR}/Sprout.app"
rm -rf "${APP_DIR}/Buzz.app"
cp -R "${EXTRACT_DIR}/Buzz.app" "${APP_DIR}/Buzz.app"

- name: Verify code signature
run: |
APP_DIR="desktop/src-tauri/target/${TARGET}/release/bundle/macos/Sprout.app"
APP_DIR="desktop/src-tauri/target/${TARGET}/release/bundle/macos/Buzz.app"
codesign --verify --deep --strict --verbose=2 "$APP_DIR"
spctl --assess --type execute --verbose=4 "$APP_DIR"

Expand Down
2 changes: 1 addition & 1 deletion RELEASING.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Releasing Sprout Desktop
# Releasing Buzz Desktop

## Quick Start

Expand Down
2 changes: 1 addition & 1 deletion desktop/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Sprout
# Buzz

Desktop chat shell with:

Expand Down
2 changes: 1 addition & 1 deletion desktop/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/sprout.svg?v=20260310" />
<link rel="icon" type="image/svg+xml" href="/buzz.svg?v=20260610" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title></title>
</head>
Expand Down
2 changes: 1 addition & 1 deletion desktop/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "sprout",
"name": "buzz",
"private": true,
"version": "0.3.16",
"type": "module",
Expand Down
10 changes: 10 additions & 0 deletions desktop/public/buzz.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 0 additions & 9 deletions desktop/public/sprout.svg

This file was deleted.

10 changes: 5 additions & 5 deletions desktop/scripts/build-release-config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { resolve } from "node:path";
// 2. bundle.createUpdaterArtifacts = true so Tauri produces the .tar.gz
// archive and .sig signature during the build.
// 3. plugins.updater with the public key and endpoint from env vars.
// Both SPROUT_UPDATER_PUBLIC_KEY and SPROUT_UPDATER_ENDPOINT are required -
// Both BUZZ_UPDATER_PUBLIC_KEY and BUZZ_UPDATER_ENDPOINT are required -
// the script fails if either is missing (OSS builds always ship with updater).
//
// Apple code signing and notarization happen post-build via
Expand All @@ -24,12 +24,12 @@ const outputConfigPath = resolve(
"src-tauri/tauri.release.conf.json",
);

const updaterPubkey = process.env.SPROUT_UPDATER_PUBLIC_KEY;
const updaterEndpoint = process.env.SPROUT_UPDATER_ENDPOINT;
const updaterPubkey = process.env.BUZZ_UPDATER_PUBLIC_KEY;
const updaterEndpoint = process.env.BUZZ_UPDATER_ENDPOINT;

const missing = [];
if (!updaterPubkey) missing.push("SPROUT_UPDATER_PUBLIC_KEY");
if (!updaterEndpoint) missing.push("SPROUT_UPDATER_ENDPOINT");
if (!updaterPubkey) missing.push("BUZZ_UPDATER_PUBLIC_KEY");
if (!updaterEndpoint) missing.push("BUZZ_UPDATER_ENDPOINT");
if (missing.length > 0) {
console.error(
`Error: required environment variable(s) missing: ${missing.join(", ")}`,
Expand Down
2 changes: 1 addition & 1 deletion desktop/scripts/generate-oss-latest-json.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ ARCHIVE_URL="$3"
# only. Supporting Intel Macs (darwin-x86_64) would require a matrix build.
jq -n \
--arg version "$VERSION" \
--arg notes "Sprout v$VERSION" \
--arg notes "Buzz v$VERSION" \
--arg pub_date "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
--arg signature "$(cat "$SIG_FILE")" \
--arg url "$ARCHIVE_URL" \
Expand Down
Loading