sipeed/picoclaw · error

seahorse context manager is unavailable on this platform

Error message

seahorse context manager is unavailable on this platform

What it means

The seahorse context manager depends on modernc.org/sqlite, which has no stable build path on some platforms; on those targets a stub is compiled instead (build tags: mipsle, netbsd, freebsd/arm — pkg/agent/context_seahorse_unsupported.go). Selecting agents.defaults.context_manager="seahorse" on such a build makes the factory return this error. resolveContextManager then logs a warning and falls back to the legacy manager, so the process keeps running without seahorse features.

Source

Thrown at pkg/agent/context_seahorse_unsupported.go:13

//go:build mipsle || netbsd || (freebsd && arm)

package agent

import (
	"encoding/json"
	"fmt"
)

// newSeahorseContextManager is unavailable on platforms where modernc sqlite/libc
// currently has no stable build path for this project.
func newSeahorseContextManager(_ json.RawMessage, _ *AgentLoop) (ContextManager, error) {
	return nil, fmt.Errorf("seahorse context manager is unavailable on this platform")
}

func init() {
	if err := RegisterContextManager("seahorse", newSeahorseContextManager); err != nil {
		panic(fmt.Sprintf("register seahorse context manager: %v", err))
	}
}

View on GitHub (pinned to 49183d7e8d)

Solutions

  1. Switch agents.defaults.context_manager to "legacy" (or remove it — legacy is the default) on that host
  2. Move the workload to a supported platform (linux/mac/windows on amd64/arm64) if seahorse retrieval is required
  3. Verify with: go version GOOS/GOARCH or check the build tags before choosing seahorse in shared configs
  4. Watch startup logs for the 'Failed to create context manager, falling back to legacy' warning to catch the silent downgrade

Example fix

// config — before
"agents": { "defaults": { "context_manager": "seahorse" } }

// after (on mipsle/netbsd/freebsd-arm)
"agents": { "defaults": { "context_manager": "legacy" } }
Defensive patterns

Strategy: validation

Validate before calling

func seahorseSupported() bool {
    if runtime.GOARCH == "mipsle" {
        return false
    }
    switch runtime.GOOS {
    case "netbsd":
        return false
    case "freebsd":
        return runtime.GOARCH != "arm"
    }
    return true
}

if cfg.Agents.Defaults.ContextManager == "seahorse" && !seahorseSupported() {
    return fmt.Errorf("seahorse not available on %s/%s; use legacy", runtime.GOOS, runtime.GOARCH)
}

Prevention

When it happens

Trigger: Config sets context_manager to seahorse while the binary was built for mipsle, netbsd, or freebsd/arm — e.g. self-hosted NAS/router devices or BSD SBCs.

Common situations: Copying a working config from an amd64 machine to a mipsle router; running on NetBSD/FreeBSD-ARM where the sqlite build tags exclude the engine; CI cross-compile checks that load the full config.

Related errors


AI-assisted analysis of sipeed/picoclaw@49183d7e8d (2026-08-15). Data as JSON: /api/errors/39ade2ce2cc030cf. Report an issue: GitHub.