diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 4cb1f557..7c5f785e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -28,7 +28,7 @@ body: id: version attributes: label: Row-Bot version - placeholder: v4.7.0 + placeholder: v4.7.1 - type: dropdown id: os attributes: diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index a320ac6e..cf3dcda7 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -10,6 +10,7 @@ on: - "docs/**" - "docs-content/**" - "scripts/docs/**" + - "scripts/smoke_docker_server.py" - "tests/docs/**" - "README.md" - "RELEASE_NOTES.md" @@ -20,6 +21,7 @@ on: - "src/row_bot/agent_runner.py" - "src/row_bot/agent_tool_catalog.py" - "src/row_bot/access/**" + - "src/row_bot/app.py" - "src/row_bot/capability_search.py" - "src/row_bot/docs_capture.py" - "src/row_bot/goals.py" @@ -31,6 +33,7 @@ on: - "src/row_bot/designer/**" - "src/row_bot/developer/**" - "src/row_bot/tools/**" + - "src/row_bot/voice/**" - "src/row_bot/providers/**" - "src/row_bot/channels/**" - "src/row_bot/plugins/**" @@ -44,6 +47,7 @@ on: - "docs/**" - "docs-content/**" - "scripts/docs/**" + - "scripts/smoke_docker_server.py" - "tests/docs/**" - "README.md" - "RELEASE_NOTES.md" @@ -54,6 +58,7 @@ on: - "src/row_bot/agent_runner.py" - "src/row_bot/agent_tool_catalog.py" - "src/row_bot/access/**" + - "src/row_bot/app.py" - "src/row_bot/capability_search.py" - "src/row_bot/docs_capture.py" - "src/row_bot/goals.py" @@ -65,6 +70,7 @@ on: - "src/row_bot/designer/**" - "src/row_bot/developer/**" - "src/row_bot/tools/**" + - "src/row_bot/voice/**" - "src/row_bot/providers/**" - "src/row_bot/channels/**" - "src/row_bot/plugins/**" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d4cb57d0..9bdcfddf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,7 +39,7 @@ on: version: description: Version to build. Must match src/row_bot/version.py and installer/row_bot_setup.iss. type: string - default: "4.7.0" + default: "4.7.1" build_windows: description: Build the Windows installer type: boolean @@ -64,7 +64,7 @@ concurrency: # Tracks the version this workflow is currently shipping. Kept in sync with # `installer/row_bot_setup.iss` (#define MyAppVersion) and `src/row_bot/version.py`. env: - ROW_BOT_VERSION: ${{ inputs.version || '4.7.0' }} + ROW_BOT_VERSION: ${{ inputs.version || '4.7.1' }} WINDOWS_PYTHON_VERSION: "3.13.2" jobs: @@ -104,7 +104,7 @@ jobs: python - <<'PY' from pathlib import Path import re - expected = "${{ inputs.version || '4.7.0' }}" + expected = "${{ inputs.version || '4.7.1' }}" version_py = Path("src/row_bot/version.py").read_text(encoding="utf-8") setup_iss = Path("installer/row_bot_setup.iss").read_text(encoding="utf-8") py_match = re.search(r'__version__\s*=\s*"([^"]+)"', version_py) diff --git a/README.md b/README.md index 8f07c333..26fc1ca2 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,12 @@ implementation, or follow-up work. The original parent remains responsible for joining required results and answering, while durable checkpoints preserve approvals, steering, retries, stops, and recovery. Checkpoint-safe work budgets and application-wide delegation limits keep long or repetitive runs bounded and -visible. +visible. Parallel writers can be assigned to distinct existing local folders as +separate Developer workspaces; folder-scoped locks let those children work +concurrently while preserving one writer at a time inside any shared folder. +If an app restart interrupts delegation or owned shell work, Row-Bot closes +unanswered tool calls without replaying them and resumes the saved parent when +its required child results are ready. Recommended Auto capability loading keeps permitted core tools directly available and searches enabled MCP, plugin, Custom Tool, and channel @@ -81,11 +86,11 @@ Download the latest installer from [GitHub Releases](https://github.com/siddsach | Area | Details | |------|---------| -| Agent orchestration | LangGraph ReAct agent, Goal Mode, Agent Profiles, Profile Library, automatic parent-led child-agent orchestration, required and detached work, dependency ordering, multi-wave live joins, ordered steering and approvals, transient retry, explicit restart recovery, compact Agent groups and cards, exactly-once completion, checkpoint-safe work budgets, repeated-action protection, configurable nesting/concurrency/active-time limits, profile/tool allowlists, promoted Agent-run workflows, generation-scoped cancellation, complete-input context metering, capacity-aware rolling compaction, and per-thread, per-workflow, per-profile, and per-Developer model overrides. | -| Models and providers | Provider-qualified model selection, readiness routing, chat-only fallback for non-tool models, chat/agent/vision/image/video capability labels, custom endpoint profiles and probes, provider-scoped credential-backed live catalog discovery with last-known-good preservation, xAI Grok OAuth, ChatGPT / Codex and Claude Subscription providers, OpenCode providers, provider-scoped tool-schema compatibility, phased OpenAI-compatible timeouts with safe pre-stream retry, prompt-cache diagnostics, and background model cache. | +| Agent orchestration | LangGraph ReAct agent, Goal Mode, Agent Profiles, Profile Library, automatic parent-led child-agent orchestration, required and detached work, dependency ordering, multi-wave live joins, ordered steering and approvals, transient retry, folder-scoped parallel writers, orphan-only checkpoint repair, explicit parent restart recovery, compact Agent groups and cards, exactly-once completion, checkpoint-safe work budgets, repeated-action protection, configurable nesting/concurrency/active-time limits, profile/tool allowlists, promoted Agent-run workflows, generation-scoped cancellation, complete-input context metering, capacity-aware rolling compaction, and per-thread, per-workflow, per-profile, and per-Developer model overrides. | +| Models and providers | Provider-qualified model selection, readiness routing, chat-only fallback for non-tool models, chat/agent/vision/image/video capability labels, native Ollama tool-capability detection with maintained-family fallback, custom endpoint profiles and probes, provider-scoped credential-backed live catalog discovery with last-known-good preservation, xAI Grok OAuth, ChatGPT / Codex and Claude Subscription providers, OpenCode providers, provider-scoped tool-schema compatibility, phased OpenAI-compatible timeouts with safe pre-stream retry, prompt-cache diagnostics, and background model cache. | | Memory and knowledge | Personal knowledge graph, 10 entity types, 67 typed relations, bounded semantic/lexical/graph recall, a disclosed checked-by-default local embedding setup download, cache-only normal recall, explicit repair, fast lexical/graph fallback, durable bounded document batches, streamed upload hashing and deduplication, atomic sharded vectors, resumable extraction, queue controls and health repair, audit and review states, recall traces, graph visualization, Obsidian-compatible wiki export with source provenance, Dream Cycle refinement, duplicate merging, stale-confidence decay, relationship inference, self-knowledge, insights, and conversation search. | | Tools | 30+ core tool modules for web search, DuckDuckGo, Wikipedia, arXiv, YouTube transcripts, URL reading, documents, wiki vault, Gmail, Google Calendar, filesystem, shell, visible browser automation, opt-in native Computer Use, workflows, Goal Mode, child-agent delegation, tracker, channels, X, image generation/editing, video generation, MCP, Developer Studio, Designer Studio, Custom Tool Builder, status, calculator, Wolfram Alpha, weather, vision, memory, system info, and charts. Recommended Auto loading keeps core profile tools direct and searches enabled external MCP, plugin, Custom Tool, and channel schemas on demand; eager compatibility mode remains available. File tools read PDF, CSV, Excel, JSON, JSONL, TSV, and image files, with schema, stats, previews, and PDF export where supported. | -| Developer Studio | Local Git workspace linking and cloning, code threads, per-thread and child-agent worktrees, repo inspector, file tree, diffs, todos, tests, branch, commit, push and PR prep, approval modes, and optional Docker Sandbox with a shadow workspace and explicit import back into the real repo. Docker Sandbox intentionally fails closed inside the official Row-Bot server container instead of nesting or falling back silently. | +| Developer Studio | Local Git workspace linking and cloning, code threads, explicit existing-folder assignment for child Agents, folder-scoped writer locks, per-thread and child-agent worktrees, repo inspector, file tree, diffs, todos, tests, branch, commit, push and PR prep, approval modes, and optional Docker Sandbox with a shadow workspace and explicit import back into the real repo. Docker Sandbox intentionally fails closed inside the official Row-Bot server container instead of nesting or falling back silently. | | Designer Studio | Decks, documents, landing pages, app mockups, and storyboards with a sandboxed interactive runtime, templates, brand controls, critique and repair, AI image and video generation, chart insertion, Mermaid and Plotly rendering, shareable HTML, and export to PDF, HTML, PNG, and PPTX. | | Workflows | Scheduled runs, webhook triggers, task-completion triggers, step pipelines, conditions, approvals, subtasks, notification-only runs, concurrency groups, delivery defaults, profile-first workflow agents, promoted Agent-run workflows, per-workflow model/tool/skill/profile overrides, safety modes, run status, run history, upcoming runs, and a Workflow Console. | | Controlled self-evolution | Structured self-reflection, bounded change proposals, reviewable execution boundaries, persistence, Dream Cycle and memory integration, and Command Center/status visibility for improvement work that stays explicit and auditable. | @@ -126,7 +131,7 @@ curl -fsSL https://raw.githubusercontent.com/siddsachar/row-bot/main/installer/i To install a specific version: ```bash -curl -fsSL https://raw.githubusercontent.com/siddsachar/row-bot/main/installer/install-linux.sh | bash -s -- 4.7.0 +curl -fsSL https://raw.githubusercontent.com/siddsachar/row-bot/main/installer/install-linux.sh | bash -s -- 4.7.1 ``` The installer downloads the release tarball, verifies its SHA256 from the GitHub release manifest, installs under `~/.local/share/row-bot`, creates `~/.local/bin/row-bot`, and stores user data in `~/.row-bot`. The default Linux build opens in your system browser. Native window and tray support are available when the required GTK, Qt, and AppIndicator libraries are installed. @@ -151,7 +156,7 @@ arm64. From the repository root, pin the release and start the hardened loopback-only Compose profile: ```bash -export ROW_BOT_IMAGE=ghcr.io/siddsachar/row-bot:4.7.0 +export ROW_BOT_IMAGE=ghcr.io/siddsachar/row-bot:4.7.1 docker compose -f deploy/docker/compose.yaml up --detach docker compose -f deploy/docker/compose.yaml ps ``` @@ -197,6 +202,11 @@ progress and blockers stay visible, choose an Agent Profile for the role you want, and let the parent orchestrate child agents when subtasks can run separately under tighter tool and approval boundaries. Required children join the same live parent turn; detached children can continue without blocking it. +When independent children need to write in parallel, give each one a distinct +existing local folder as its Developer workspace. Changing only a shell working +directory does not partition writer ownership, and children assigned to the +same folder still serialize. Use child worktrees when the task instead needs +Git-backed branch isolation. Capability loading defaults to the recommended Auto mode. Core tools permitted by the active Agent Profile stay directly available; enabled external tools and @@ -381,10 +391,11 @@ firewall policy, log review, and recovery procedures; Row-Bot does not modify the host firewall. Remote browser voice captures the requesting browser's microphone, performs -local Whisper transcription in Row-Bot, and returns local Kokoro audio to that -same browser. Remote microphone capture requires HTTPS; plain LAN HTTP is not a -secure browser context. Voice model downloads remain explicit and OpenAI -Realtime voice remains a separate provider feature. +transcription in Row-Bot with the selected local STT engine (Whisper by default, +or SenseVoice after its explicit installation), and returns local Kokoro audio +to that same browser. Remote microphone capture requires HTTPS; plain LAN HTTP +is not a secure browser context. Voice model downloads remain explicit and +OpenAI Realtime voice remains a separate provider feature. SenseVoice installation is an explicit ~940 MB download from [ModelScope](https://modelscope.cn/models/iic/SenseVoiceSmall) under the model's @@ -425,6 +436,12 @@ auth store used by Settings. A key saved in the provider dialog can therefore refresh its catalog and populate provider-qualified rows immediately without a duplicate legacy environment-key entry. +For local Ollama models, Row-Bot uses the daemon's native capability metadata +when it is available. A new model family that advertises `tools` can therefore +enter Agent mode without waiting for a maintained family-list update or an +unnecessary live probe, while a model whose native metadata omits `tools` is not +promoted merely because its name resembles a historically tool-capable family. + | Service | Key or setup | Used for | |---------|--------------|----------| | OpenAI | `OPENAI_API_KEY` | OpenAI models and image tools. | @@ -531,6 +548,9 @@ Safety controls are built into the tool layer: - Child-agent approval requests are surfaced in the parent thread and durable channel/mobile approval surfaces instead of waiting invisibly in a background run. +- Write-capable child Agents retain one writer per assigned workspace. Distinct + registered folders may run concurrently; a shared folder stays serialized, + and changing a shell CWD does not bypass the workspace lock. - Stop propagates through the active generation to stalled provider responses, shell and Developer subprocesses, MCP and browser waits, voice turns, and generation-linked child agents without cancelling unrelated runs. @@ -573,8 +593,9 @@ with runtime-managed exact origins and full/compact browser shells, authenticated server mode, progressive capability catalogs and bridges, one complete-input context preparation and rolling-compaction pipeline, separate browser and native Computer Use engines, shared channel streaming, Designer -Studio, Developer Studio worktrees, provider runtime and cancellation, Plugin -System v2/MCP boundaries, and safety controls. +Studio, Developer Studio worktrees and folder-scoped child writers, provider +runtime and bounded subprocess cancellation, interrupted-parent checkpoint +repair, Plugin System v2/MCP boundaries, and safety controls. Explore the visual architecture gallery: [docs/architecture.html](docs/architecture.html) @@ -614,9 +635,10 @@ Review the Docusaurus docs source and local preview instructions: |-------|---------|-------------| | Local model runtime | Windows 10/11 64-bit, macOS 12+, or glibc Linux x86_64; Python 3.12+ for source installs; 8 GB RAM for 8B models; about 5 GB disk for the app and one small model; internet for install and model download. | 16 to 32 GB RAM for 14B to 30B models; NVIDIA GPU with 8+ GB VRAM or Apple Silicon for much faster inference; 20+ GB disk for multiple or larger models. | | Provider/custom models only | Windows 10/11 64-bit, macOS 12+, or glibc Linux x86_64; Python 3.12+ for source installs; 4 GB RAM; about 1 GB disk; internet for provider inference. | No GPU required. Use this path if you do not want local model downloads. | +| Optional SenseVoice STT | Windows, Linux, or Apple Silicon macOS; the voice runtime; internet for the explicit approximately 940 MB ModelScope snapshot download plus space for the matching CPU PyTorch/Torchaudio stack. | Optional and off until installed from Voice settings. Normal transcription is local and cache-only afterwards. Intel macOS is unsupported; local Whisper remains available. | | Computer Use beta | Windows 10/11 x86-64 or ARM64, or macOS 12+ on Intel/Apple Silicon; interactive local UI; internet for the explicit Cua Driver install or repair; Accessibility and Screen Recording permission on macOS. | Optional and off by default. Browser automation remains preferred for websites; Linux and unattended/background use are not supported. | | Developer Sandbox | Docker Desktop or a compatible Docker/Podman runtime. | Optional. Developer Studio also works with local execution in the selected repo. | -| Docker / headless server | Docker Engine with Compose v2 on an amd64 or arm64 Linux host; enough persistent storage for `/data`, the encryption-key volume, documents, models, and backups. | Pin `ghcr.io/siddsachar/row-bot:4.7.0`, keep the default loopback publication, and use Tailscale or an operator-managed HTTPS proxy for remote reachability. | +| Docker / headless server | Docker Engine with Compose v2 on an amd64 or arm64 Linux host; enough persistent storage for `/data`, the encryption-key volume, documents, models, and backups. | Pin `ghcr.io/siddsachar/row-bot:4.7.1`, keep the default loopback publication, and use Tailscale or an operator-managed HTTPS proxy for remote reachability. | | Public docs site | Node.js 20+ and npm. | Optional. Used only for local Docusaurus docs preview and generated-docs validation. | Your default Brain model is set by the setup wizard. If you choose the local path, Row-Bot uses one of the models already exposed by your local runtime; 14B-class models are recommended for stronger agent/tool behavior, while smaller 8B-class models are better for 8 GB machines. Hosted and custom endpoint setups can skip local model downloads entirely. @@ -686,7 +708,7 @@ uv sync --locked --all-extras --group test uv run python scripts/verify_runtime_dependencies.py all ``` -Supported optional extras are `voice`, `designer`, `browser`, `channels`, `mcp`, `developer`, `local-embeddings`, and `media`. Development and packaged app builds use `all`; lightweight source installs can choose only the extras they need. +Supported optional extras are `voice`, `designer`, `browser`, `channels`, `mcp`, `developer`, `local-embeddings`, and `media`. Development and packaged app builds use `all`; lightweight source installs can choose only the extras they need. The `voice` and `all` extras include the platform-supported FunASR, ModelScope, and matching CPU PyTorch/Torchaudio runtime, but the SenseVoice model snapshot is still downloaded only through the explicit Voice settings action. Recovery helpers: @@ -740,6 +762,12 @@ compaction is needed, Row-Bot uses the task's selected model to summarize a bounded older conversation range; a cloud-selected task therefore sends that range to the already selected cloud provider as part of normal model use. +Installing SenseVoice is a separate explicit network action to ModelScope and +discloses the model size, license, and SDK request before it begins. Row-Bot +persists only a verified contained snapshot, disables FunASR update checks, and +sends no audio, prompts, or usage data during installation or normal offline +transcription. + Developer Studio only touches repos you link, clone, or explicitly allocate as worktrees. Local execution runs in that repo or worktree. Docker Sandbox runs in a shadow copy and requires explicit import before changing the real repo. diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 66024fe3..6b218efa 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -2,6 +2,175 @@ --- +## v4.7.1 - Agent Recovery, Local Voice Options & Runtime Reliability + +This patch release builds on v4.7.0 with focused agent-orchestration, +local-voice, channel-startup, model-readiness, memory-cache, and release- +validation fixes. It lets parallel child Agents work in explicitly assigned +local folders, restores interrupted parents safely after detached shell work, +adds an explicit offline SenseVoice transcription option, makes Telegram and +remote-access startup degrade cleanly, trusts Ollama's native tool-capability +metadata, and hardens Docker smoke diagnostics without weakening local-first, +approval, or credential boundaries. + +### Agent Workspaces, Shell Completion And Restart Recovery + +- **Folder-scoped child workspaces** - adds `developer_workspace_path` to + `delegate_work`, registers an existing local folder as the child's Developer + workspace, rejects missing paths and conflicting workspace-id/path inputs, + and keeps the assignment scoped to that child run. +- **Independent parallel writers** - keys write ownership to each assigned + Developer workspace so child Agents in distinct folders can edit + concurrently while children assigned to the same folder still serialize. +- **Durable first-delegation state** - records the original parent's safe + configurable runtime fields, enabled tools, model, approval mode, and + delivery context when asynchronous orchestration begins, excluding + non-serializable internal graph callbacks. +- **Checkpoint-safe parent repair** - closes only unanswered tool calls after + an app restart, marks them as interrupted rather than replaying them, and + resumes the original parent from its saved checkpoint when retained required + child results are ready. +- **Legacy recovery compatibility** - can wake and complete an interrupted v2 + parent whose children already finished even when older orchestration rows do + not contain the newly persisted continuation snapshot. +- **Detached-process completion** - captures owned subprocess output in + temporary files so a deliberately detached descendant cannot keep inherited + stdout or stderr pipes open and indefinitely block its parent Agent or shell + workspace lock. +- **Bounded cancellation and timeout drain** - preserves partial output and + cancellation status, terminates the owned process tree, and avoids a second + unbounded `communicate()` wait after timeout. + +### Optional Local SenseVoice Transcription + +- **FunASR / SenseVoice choice** - adds SenseVoice Small as a selectable local + speech-to-text model for Talk and Dictation alongside faster-whisper, with + the selected local model applied consistently when either voice mode starts. +- **Explicit installation only** - keeps readiness checks, startup, and normal + transcription cache-only; the approximately 940 MB ModelScope snapshot is + downloaded only from the Voice settings action. +- **Verified offline snapshot** - accepts only a complete model inside + Row-Bot's SenseVoice cache, persists the verified path across restarts, runs + CPU inference against that local path, and disables FunASR update checks. +- **Recoverable status and setup** - distinguishes unsupported platforms, + missing packages, missing model data, and invalid snapshots; exposes clear + install or reinstall guidance without making the model appear ready early. +- **Transparent network boundary** - discloses the ModelScope download, model + size, license, and SDK user-agent before installation; no audio, prompts, or + usage data are sent, and regular transcription remains offline. +- **Platform guard** - keeps SenseVoice unavailable on Intel macOS, where the + matching CPU PyTorch and Torchaudio wheels are not published, while leaving + local Whisper available. + +### Telegram, Tunnel And Startup Resilience + +- **Retryable Telegram initialization** - retries one transient Telegram + network failure and gives polling one bootstrap retry without looping on an + invalid token. +- **Clean failed-start recovery** - shuts down every partially initialized + Telegram component best-effort, clears global lifecycle state, surfaces a + safe actionable invalid-token error, and permits a fresh start afterwards. +- **Non-blocking command registration** - starts polling before registering + the BotFather command menu so a registration failure cannot take a working + bot offline. +- **Responsive tunnel auto-start** - shows an explicit startup stage and moves + main-app tunnel creation off the UI event loop so slow tunnel setup does not + freeze the startup experience. +- **Reliable splash completion** - treats the `/readyz` HTTP success status as + the readiness contract instead of requiring a JSON body that the public + readiness boundary does not promise. +- **Credential-safe channel diagnostics** - records only the channel name and + exception type for manual start failures while preserving the existing + user-facing error notification. + +### Ollama Readiness And Docker Release Validation + +- **Native Ollama capabilities** - consumes the daemon-reported + `capabilities` list when available, allowing new or unknown model families + that advertise `tools` to enter Agent mode without an unnecessary live + round-trip probe. +- **Authoritative negative detection** - does not mark a familiar family as + tool-capable when Ollama explicitly omits `tools`; an explicit boolean + capability remains highest priority and the maintained family table remains + the fallback only when native metadata is absent. +- **Stable container readiness** - requires two consecutive successful + `/healthz` and `/readyz` samples and gives every functional Docker smoke + request a configurable timeout. +- **Safe transient HTTP retry** - retries short-lived transport failures only + for idempotent GET checks after restarts or recreation and never replays + invitation claims, refreshes, or other POST operations. +- **Actionable secret-safe failures** - reports the failed stage, HTTP method, + path, and exception type, then emits bounded container state and log-tail + diagnostics with exact smoke-owned invitation, session, and encryption + values redacted. + +### Memory, Dependencies And Public Documentation + +- **Consistent embedding snapshots** - applies the same GGUF, ONNX, and + OpenVINO ignore filters during cache-only local-embedding lookup as during + explicit download, preventing a valid cached snapshot from being + misidentified or resolved differently. +- **Voice runtime dependency verification** - adds FunASR, ModelScope, + matching CPU PyTorch/Torchaudio packages, lockfile coverage, installer export + coverage, and platform-aware import verification to the voice and all extras. +- **Security dependency cleanup** - updates the Python, documentation-site, + and WhatsApp bridge resolutions, upgrades the supported arXiv, + Hugging Face/Transformers, and pytest lines, pins vulnerable documentation + transitive packages where compatible, and narrows OSV exceptions to the + remaining reviewed packages without compatible fixes. +- **4.7 public-site alignment** - updates the post-tag landing, Features, and + Architecture pages and their contracts to the v4.7.0 downloads, metadata, + cache revisions, progressive capability loading, context management, and + trusted-address descriptions. +- **README voice disclosure** - documents the SenseVoice option, explicit + ModelScope download, offline inference boundary, Intel macOS limitation, and + FunASR acknowledgement. +- **4.7.1 release documentation** - updates the full README and architecture + reference, public Voice, Remote Access, Agents, Developer, Channels, Ollama, + and Docker guides, generated reference/search artifacts, installer build + notes, marketing support pages, and release-version metadata while leaving + the separately staged landing `index.html` unchanged. + +### Tests And Release Validation + +- **Agent recovery coverage** - verifies folder registration, invalid workspace + inputs, independent writer locks, first-delegation snapshots, orphan-only + checkpoint repair, terminal-child parent wakeup, detached descendants, + bounded timeout cleanup, cancellation output, and shell lock release. +- **Voice coverage** - verifies no-download startup and transcription, + explicit snapshot installation, persisted and contained model paths, + incomplete-cache recovery, package/platform status, catalog readiness, + Talk/Dictation selection, dependency metadata, and settings disclosures. +- **Telegram lifecycle coverage** - verifies one-retry success, exhausted + network cleanup, invalid-token handling, non-fatal command registration, and + a clean restart after partial initialization failure. +- **Provider and Docker coverage** - verifies Ollama native positive, negative, + and explicit-override precedence plus Docker readiness stability, GET-only + retries, POST no-replay, functional request deadlines, bounded diagnostics, + and credential redaction. +- **Documentation contracts** - verifies the staged v4.7.1 support-page + downloads and metadata alongside the unchanged v4.7.0 landing page, + evergreen feature inventory, generated references, architecture copy, + internal links, responsive fallbacks, and analytics boundaries. + +### Breaking Changes And Caveats + +- No application data migration or public CLI break is introduced by v4.7.1. +- SenseVoice requires an explicit approximately 940 MB ModelScope download and + is not supported on Intel macOS. Local Whisper remains the default and the + fallback local transcription path. +- Separate `developer_workspace_path` folders permit independent child writer + locks; changing only a shell working directory does not. Existing folders + are registered, never created implicitly, and the same folder still permits + only one child writer at a time. +- A detached command is considered complete when the directly launched process + exits. Row-Bot does not adopt or later cancel an intentionally detached + descendant that has left the owned process group. +- Docker smoke transport retries remain deliberately limited to GET requests; + non-idempotent access and session operations fail without replay. +- The remaining temporary OSV exceptions cover only reviewed dependency + versions without a compatible fixed line and expire on September 30, 2026. + ## v4.7.0 - Progressive Capabilities, Context Management & Trusted Access This release builds on v4.6.0 with a prompt-efficiency, long-conversation, diff --git a/Start Row-Bot.command b/Start Row-Bot.command index b05e43a6..d4828085 100644 --- a/Start Row-Bot.command +++ b/Start Row-Bot.command @@ -36,7 +36,7 @@ VENV_DIR="$PROJECT_DIR/.venv" ROW_BOT_HOME="$HOME/.row-bot" ROW_BOT_VERSION="$(awk -F'"' '/__version__/ { print $2; exit }' "$PROJECT_DIR/src/row_bot/version.py" 2>/dev/null || true)" if [ -z "$ROW_BOT_VERSION" ]; then - ROW_BOT_VERSION="4.7.0" + ROW_BOT_VERSION="4.7.1" fi OLLAMA_PORT=11434 diff --git a/docs-site/docs/configuration/models-and-providers.mdx b/docs-site/docs/configuration/models-and-providers.mdx index aab9b518..fbe9d743 100644 --- a/docs-site/docs/configuration/models-and-providers.mdx +++ b/docs-site/docs/configuration/models-and-providers.mdx @@ -28,8 +28,11 @@ Use local Ollama for local-first privacy and no provider billing. Use an API pro Keep at least one everyday chat model and one stronger tool-capable model pinned. For Developer, Designer, workflows, and complex tools, choose a model that can handle tool calls and enough context. +For Ollama, Row-Bot prefers explicit tool-calling metadata, then the daemon's reported capability list. A reported `tools` capability enables agent use even for a model family newer than Row-Bot's maintained fallback catalogue; an explicit capability list that omits `tools` remains authoritative. Family fallbacks are used only when the daemon provides no capability metadata. + ## Troubleshooting - If a provider connects but has no models, refresh Models. - If a model fails with tools, choose a tool-capable model. +- If an Ollama model is unexpectedly excluded from agent use, refresh the local catalogue and inspect the capabilities reported by the installed Ollama daemon. - If a custom endpoint fails, check base URL, model name, API compatibility, and context window. diff --git a/docs-site/docs/developer/index.mdx b/docs-site/docs/developer/index.mdx index 5ad403c2..ff68adb6 100644 --- a/docs-site/docs/developer/index.mdx +++ b/docs-site/docs/developer/index.mdx @@ -17,6 +17,8 @@ Developer Studio is Row-Bot's code workspace. Use it when you want Row-Bot to un Open Home -> Developer. Choose an existing folder, connect a repository already on your machine, or clone a repository into a local workspace. +The Agents tool can also assign a child directly to an existing local folder. Row-Bot validates the path and registers it as that child's Developer workspace; a folder assignment and a pre-existing workspace ID are alternative ways to select the workspace, not settings to combine. + ## End-To-End Workflow 1. Open or clone a project. @@ -38,6 +40,10 @@ Open Home -> Developer. Choose an existing folder, connect a repository already - **Command controls** run detected or requested commands through approval policy. - **Change review** summarizes edits and lets you inspect before accepting next steps. +## Parallel Child Workspaces + +Writer ownership follows the resolved workspace folder. Children working in distinct folders or worktrees can edit concurrently, while writers aimed at the same folder are serialized to prevent overlapping changes. Changing only a shell working directory does not create an independent write boundary. Use a separate worktree or folder when two children genuinely need parallel write access. + ## Sandbox Modes Local mode lets Row-Bot operate in the selected workspace with your configured file and command permissions. Docker Sandbox mode, when available on a host installation, isolates command execution in a container and requires an import step before changes affect the real workspace. It requires a supported host Docker runtime and can differ from your local environment. @@ -51,6 +57,7 @@ For a host installation, start with Local mode on a disposable branch. Use Docke ## Troubleshooting - If Developer tools are unavailable, open a Developer workspace first. +- If an Agent folder assignment is rejected, confirm that the directory already exists and pass either that folder or an existing workspace ID, not both. - If commands are missing, inspect detected commands or ask Row-Bot to identify the project tooling. - If a command asks for approval, read the exact command and workspace before approving. - If Docker sandbox import is offered, review the patch before importing it into the real project. diff --git a/docs-site/docs/index.mdx b/docs-site/docs/index.mdx index 4fc09126..668dd2da 100644 --- a/docs-site/docs/index.mdx +++ b/docs-site/docs/index.mdx @@ -9,7 +9,7 @@ import Screenshot from '@site/src/components/Screenshot'; Row-Bot is a local-first AI workbench for people who want provider-aware models, parent-led agents, durable documents, memory, tools, workflows, design, code help, integrations, and voice in one controllable system. Run it as a desktop application or a private authenticated server; this guide explains installation, Docker deployment, owner access, the main interface, settings, and every explicit external route. -These pages describe Row-Bot 4.7.0, the current stable release represented by this source tree. +These pages describe Row-Bot 4.7.1, the current stable release represented by this source tree. diff --git a/docs-site/docs/integrations/channels.mdx b/docs-site/docs/integrations/channels.mdx index c6fe97fc..31225160 100644 --- a/docs-site/docs/integrations/channels.mdx +++ b/docs-site/docs/integrations/channels.mdx @@ -40,6 +40,8 @@ When work starts from a channel and a child agent asks for approval, Row-Bot sen ## Troubleshooting -- If a channel cannot start, check required fields and tunnel state. +- If Telegram encounters one transient network failure during initialization, Row-Bot cleans up the partial runtime and retries once. Persistent network failures remain stopped with an actionable diagnostic; invalid bot tokens are not retried. +- If Telegram starts but its command menu cannot be registered, polling remains available and the menu failure is logged as non-fatal. +- If a channel cannot start, check required fields and tunnel state. Automatic tunnel startup runs outside the UI event loop, so a slow tunnel helper should report status without freezing app startup. - If inbound messages fail, verify webhook URLs and platform permissions. - If the wrong person has access, revoke them from Paired Users. diff --git a/docs-site/docs/operations/docker.mdx b/docs-site/docs/operations/docker.mdx index d197fc18..3d91754c 100644 --- a/docs-site/docs/operations/docker.mdx +++ b/docs-site/docs/operations/docker.mdx @@ -17,7 +17,7 @@ The default Compose topology publishes only `127.0.0.1:8080`, runs the applicati - Enough disk for the full image plus the `/data` volume. Models, managed runtimes, browser outputs, and caches can grow after explicit use; Row-Bot does not promise one fixed capacity figure. - For public VPS access: Linux, Docker Compose 2.24.4 or newer, DNS you control, and a host-managed HTTPS proxy or Tailscale installation. -Release images are built from tagged source in GitHub Actions with the locked dependency set. Native amd64 and arm64 jobs run the isolated authenticated-container smoke before the release manifest is created, and the registry exposes a digest for immutable pins. +Release images are built from tagged source in GitHub Actions with the locked dependency set. Native amd64 and arm64 jobs run the isolated authenticated-container smoke before the release manifest is created, and the registry exposes a digest for immutable pins. The smoke uses bounded request timeouts and requires two consecutive readiness samples; it retries only safe GET probes, never repeats a state-changing POST, and limits failure output to redacted container state and log tails. ## Download A Release-Pinned Compose File diff --git a/docs-site/docs/operations/remote-access.mdx b/docs-site/docs/operations/remote-access.mdx index 7d298923..b52426ea 100644 --- a/docs-site/docs/operations/remote-access.mdx +++ b/docs-site/docs/operations/remote-access.mdx @@ -176,11 +176,11 @@ Never mount the host Docker socket merely to satisfy a tool or MCP server. ## Voice From A Remote Browser -Local browser voice uses the requesting browser's microphone and speaker. The browser sends bounded audio to Row-Bot for local Whisper transcription; Row-Bot returns local Kokoro audio to that same browser. A headless server or container does not need access to the host microphone or speakers. +Local browser voice uses the requesting browser's microphone and speaker. The browser sends bounded audio to Row-Bot for transcription with the selected local STT engine: Whisper by default, or SenseVoice after its explicit installation. Row-Bot returns local Kokoro audio to that same browser. A headless server or container does not need access to the host microphone or speakers. Browsers permit microphone capture on `localhost` or in a secure HTTPS context. Plain HTTP on a remote LAN address is insufficient. Use Tailscale HTTPS or a correctly configured HTTPS reverse proxy for remote dictation or talk. -Whisper and Kokoro model installation remains an explicit owner action and can use several gigabytes of persistent cache. OpenAI Realtime voice is a separate provider/network feature; local browser voice does not silently fall back to it. +Whisper, SenseVoice, and Kokoro model installation remains an explicit owner action and can use several gigabytes of persistent cache. SenseVoice alone is an approximately 940 MB ModelScope download and is unavailable on Intel macOS. OpenAI Realtime voice is a separate provider/network feature; local browser voice does not silently fall back to it. ## Offline Access Management And Recovery diff --git a/docs-site/docs/profiles-goals-agents/index.mdx b/docs-site/docs/profiles-goals-agents/index.mdx index df3aafa2..7ebf0361 100644 --- a/docs-site/docs/profiles-goals-agents/index.mdx +++ b/docs-site/docs/profiles-goals-agents/index.mdx @@ -40,7 +40,11 @@ A goal is useful when work needs more than one turn. State the objective and an Parent agents coordinate. Child agents handle bounded subtasks. Open an agent row to review its prompt, profile, model, status, result, evidence, and thread. A completed child result is evidence for the parent, not automatic permission to write files, send messages, commit code, or publish. -If a run appears stuck, inspect its last update before stopping it. If several agents edit the same resource, narrow their ownership or run them sequentially. Keep consequential final actions with the parent and a human approval point. +For coding work, a parent can assign a child to an existing local folder. Row-Bot registers that folder as the child's Developer workspace and applies writer ownership to the resolved folder, not merely the process working directory. Children assigned to distinct folders or worktrees can write in parallel; writers targeting the same folder wait and run serially. + +If a run appears stuck, inspect its last update before stopping it. If several agents edit the same resource, give them distinct folders or worktrees, narrow their ownership, or run them sequentially. Keep consequential final actions with the parent and a human approval point. + +Row-Bot saves the parent's first continuation checkpoint when asynchronous delegation begins. If a child process outlives its launching shell or the app restarts, resume repairs only genuinely unanswered tool calls with an interruption marker, then wakes the parent from durable child results. It does not replay previously executed work. If a checkpoint cannot be repaired safely, the run remains stopped for review. Repeated model-and-tool states are detected before a run can loop indefinitely. The fourth identical no-progress state is blocked; a fifth ends the run cleanly with a durable reason. Reaching a configured work limit also finalizes the run instead of leaving it marked as active. diff --git a/docs-site/docs/reference/generated/channels.mdx b/docs-site/docs/reference/generated/channels.mdx index a4779e3c..b3492261 100644 --- a/docs-site/docs/reference/generated/channels.mdx +++ b/docs-site/docs/reference/generated/channels.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # Channels - + diff --git a/docs-site/docs/reference/generated/cli.mdx b/docs-site/docs/reference/generated/cli.mdx index 5207b47b..4b5bac1f 100644 --- a/docs-site/docs/reference/generated/cli.mdx +++ b/docs-site/docs/reference/generated/cli.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # CLI - + diff --git a/docs-site/docs/reference/generated/data-storage.mdx b/docs-site/docs/reference/generated/data-storage.mdx index c12c1e17..b7cbc8b4 100644 --- a/docs-site/docs/reference/generated/data-storage.mdx +++ b/docs-site/docs/reference/generated/data-storage.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # Data Storage - + diff --git a/docs-site/docs/reference/generated/environment-and-config.mdx b/docs-site/docs/reference/generated/environment-and-config.mdx index 6d0888c4..d76fc5d1 100644 --- a/docs-site/docs/reference/generated/environment-and-config.mdx +++ b/docs-site/docs/reference/generated/environment-and-config.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # Environment And Config - + diff --git a/docs-site/docs/reference/generated/home-tabs.mdx b/docs-site/docs/reference/generated/home-tabs.mdx index d9d5b61a..baa87292 100644 --- a/docs-site/docs/reference/generated/home-tabs.mdx +++ b/docs-site/docs/reference/generated/home-tabs.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # Home Tabs - + diff --git a/docs-site/docs/reference/generated/index.mdx b/docs-site/docs/reference/generated/index.mdx index 1542cc4f..e627f9c4 100644 --- a/docs-site/docs/reference/generated/index.mdx +++ b/docs-site/docs/reference/generated/index.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # Reference Tables - + diff --git a/docs-site/docs/reference/generated/mcp.mdx b/docs-site/docs/reference/generated/mcp.mdx index 343ba03c..8990c30e 100644 --- a/docs-site/docs/reference/generated/mcp.mdx +++ b/docs-site/docs/reference/generated/mcp.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # MCP - + diff --git a/docs-site/docs/reference/generated/plugins.mdx b/docs-site/docs/reference/generated/plugins.mdx index 6cef69fe..79b04f89 100644 --- a/docs-site/docs/reference/generated/plugins.mdx +++ b/docs-site/docs/reference/generated/plugins.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # Plugins - + diff --git a/docs-site/docs/reference/generated/providers.mdx b/docs-site/docs/reference/generated/providers.mdx index 7201269a..606a3509 100644 --- a/docs-site/docs/reference/generated/providers.mdx +++ b/docs-site/docs/reference/generated/providers.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # Providers - + diff --git a/docs-site/docs/reference/generated/safety-approvals.mdx b/docs-site/docs/reference/generated/safety-approvals.mdx index bdfde64d..1cef7368 100644 --- a/docs-site/docs/reference/generated/safety-approvals.mdx +++ b/docs-site/docs/reference/generated/safety-approvals.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # Safety And Approvals - + diff --git a/docs-site/docs/reference/generated/screenshots.mdx b/docs-site/docs/reference/generated/screenshots.mdx index 2cb16361..dd6c62dd 100644 --- a/docs-site/docs/reference/generated/screenshots.mdx +++ b/docs-site/docs/reference/generated/screenshots.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # Screenshots - + diff --git a/docs-site/docs/reference/generated/settings-controls.mdx b/docs-site/docs/reference/generated/settings-controls.mdx index 43792691..e2baf941 100644 --- a/docs-site/docs/reference/generated/settings-controls.mdx +++ b/docs-site/docs/reference/generated/settings-controls.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # Settings Controls - + diff --git a/docs-site/docs/reference/generated/settings.mdx b/docs-site/docs/reference/generated/settings.mdx index c44ab9ce..8efca990 100644 --- a/docs-site/docs/reference/generated/settings.mdx +++ b/docs-site/docs/reference/generated/settings.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # Settings - + diff --git a/docs-site/docs/reference/generated/skills.mdx b/docs-site/docs/reference/generated/skills.mdx index 337e1c16..a36d3e61 100644 --- a/docs-site/docs/reference/generated/skills.mdx +++ b/docs-site/docs/reference/generated/skills.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # Skills - + diff --git a/docs-site/docs/reference/generated/tools.mdx b/docs-site/docs/reference/generated/tools.mdx index 8e87e5d6..84d893a4 100644 --- a/docs-site/docs/reference/generated/tools.mdx +++ b/docs-site/docs/reference/generated/tools.mdx @@ -8,7 +8,7 @@ import GeneratedNotice from '@site/src/components/GeneratedNotice'; # Tools - + diff --git a/docs-site/docs/settings/voice.mdx b/docs-site/docs/settings/voice.mdx index 9d0c9740..90fb3612 100644 --- a/docs-site/docs/settings/voice.mdx +++ b/docs-site/docs/settings/voice.mdx @@ -20,7 +20,8 @@ Open **Settings**, then choose **Voice** from the left tab list. - Talk settings decide whether spoken input submits directly to Row-Bot. - Dictate settings decide whether speech is inserted into the composer for review before sending. - Read-aloud settings control spoken assistant responses. -- Local voice controls use local speech components where available. +- Local voice controls choose Whisper, the default local STT engine, or the optional FunASR/SenseVoice engine for Talk and Dictate. +- SenseVoice readiness shows whether the platform, packaged runtime, and verified local model snapshot are ready. Its install action is always explicit. - Realtime voice controls use provider-backed low-latency voice models. - Device controls select microphone and output devices. - Voice Models shows runtime defaults and provider voice models. @@ -30,16 +31,17 @@ Open **Settings**, then choose **Voice** from the left tab list. 1. Use Dictate first if you want to review text before sending. 2. Use Talk when you want hands-light conversation and are comfortable with immediate submission. -3. Choose local voice for privacy and offline-style behavior when supported. -4. Choose realtime voice when latency matters and you accept provider requirements, cost, and internet use. +3. Choose local Whisper for the default local path, or install and select SenseVoice Small when you want the optional FunASR engine. +4. Treat the SenseVoice install as a deliberate approximately 940 MB ModelScope download. After verification, normal transcription stays local and cache-only. +5. Choose realtime voice when latency matters and you accept provider requirements, cost, and internet use. ## What Is Saved -Voice preferences are global. Transcribed text belongs to the active thread once submitted. Provider-backed voice can send audio or transcript data to the selected provider. +Voice preferences are global. Transcribed text belongs to the active thread once submitted. The verified SenseVoice snapshot is stored under the active Row-Bot data directory. Provider-backed voice can send audio or transcript data to the selected provider. ## Privacy And Safety -Review credential, account, channel, provider, or tool settings before enabling features that can contact outside services. Local-only features stay on your machine until you ask Row-Bot to use a provider, account, channel, MCP server, plugin, or tool that sends data elsewhere. +Review credential, account, channel, provider, or tool settings before enabling features that can contact outside services. Local-only features stay on your machine until you ask Row-Bot to use a provider, account, channel, MCP server, plugin, or tool that sends data elsewhere. The explicit SenseVoice install contacts ModelScope for the model download; it does not send audio, prompts, or usage data, and ordinary inference does not check for updates. ## Control-Level Reference @@ -48,5 +50,7 @@ The [generated Settings Controls reference](/docs/reference/generated/settings-c ## Troubleshooting - If the microphone is silent, check the selected input device and browser/app permissions. +- If SenseVoice is missing or invalid, use its install or reinstall action in Voice settings. Source installs also require the `voice` extra. +- SenseVoice is unavailable on Intel macOS because the required CPU PyTorch and Torchaudio wheels are not published for that runtime; use local Whisper there. - If realtime voice is unavailable, configure a compatible provider in Providers. - If Talk submits too quickly, use Dictate mode instead. diff --git a/docs-site/docs/voice-and-buddy/index.mdx b/docs-site/docs/voice-and-buddy/index.mdx index 125aaaa1..c0cadd21 100644 --- a/docs-site/docs/voice-and-buddy/index.mdx +++ b/docs-site/docs/voice-and-buddy/index.mdx @@ -16,12 +16,16 @@ Voice and Buddy make Row-Bot feel less like a text box and more like a desktop c - **Dictate** turns speech into composer text so you can review it before sending. - **Talk** submits spoken input more directly for conversation. - **Read-aloud** speaks assistant responses when enabled. -- **Local voice** uses local speech components where available. +- **Local voice** uses Whisper by default, or the optional SenseVoice Small engine after you install it explicitly. - **Realtime voice** uses a compatible provider for lower-latency spoken conversation. ## Choosing A Mode -Use Dictate when accuracy and review matter. Use Talk when you want a faster hands-light conversation. Use local voice when privacy and offline-style behavior matter. Use realtime voice when latency matters and you accept internet access, provider requirements, and provider cost. +Use Dictate when accuracy and review matter. Use Talk when you want a faster hands-light conversation. Use local voice when privacy and offline-style behavior matter. Whisper remains the default local transcription engine. SenseVoice is an optional alternative on Windows, Linux, and Apple Silicon macOS; Intel macOS continues to use Whisper. Use realtime voice when latency matters and you accept internet access, provider requirements, and provider cost. + +## Optional SenseVoice Setup + +Open Settings -> Voice, choose **Local FunASR / SenseVoice**, and use the install action shown for **SenseVoice Small**. Installation is an explicit approximately 940 MB download from ModelScope. Row-Bot verifies the contained snapshot before saving it under the active data directory, and normal transcription then uses that local snapshot with update checks disabled. Startup, readiness checks, and ordinary transcription never download or repair the model automatically. ## Devices And Diagnostics @@ -40,11 +44,13 @@ Select the microphone and output device in Settings -> Voice. Run diagnostics wh ## Privacy And Safety -Voice input can become chat text. Realtime voice and provider-backed speech may send audio or transcript data to the selected provider. Buddy preferences and assets are local, but custom generation may call a configured media provider. +Voice input can become chat text. Realtime voice and provider-backed speech may send audio or transcript data to the selected provider. Installing SenseVoice contacts ModelScope for the requested model and standard SDK metadata, but Row-Bot does not send audio, prompts, or usage data; inference stays local after installation. Buddy preferences and assets are local, but custom generation may call a configured media provider. ## Troubleshooting - If Dictate records nothing, check microphone selection and permissions. - If Talk sends too quickly, use Dictate instead. +- If SenseVoice reports missing packages, install the `voice` extra for a source checkout or repair the packaged app. If its snapshot is missing or incomplete, reinstall it from Voice settings. +- If SenseVoice is unavailable on Intel macOS, select local Whisper instead. - If realtime voice is unavailable, check Providers and Voice Models. - If Buddy does not appear, check Buddy enable switches and overlay state. diff --git a/docs-site/src/components/Screenshot.tsx b/docs-site/src/components/Screenshot.tsx index 004bb03f..6ba29331 100644 --- a/docs-site/src/components/Screenshot.tsx +++ b/docs-site/src/components/Screenshot.tsx @@ -7,7 +7,7 @@ type ScreenshotProps = { caption?: string; }; -const SCREENSHOT_REVISION = '4.7.0'; +const SCREENSHOT_REVISION = '4.7.1'; export default function Screenshot({id, alt, caption}: ScreenshotProps): JSX.Element { const src = `/img/screenshots/real-ui/${id}.png?v=${SCREENSHOT_REVISION}`; diff --git a/docs/404.html b/docs/404.html index 3da4c43b..6398c738 100644 --- a/docs/404.html +++ b/docs/404.html @@ -12,8 +12,8 @@ - - + + @@ -53,7 +53,7 @@

Nothing here