fix: make beads mount work with lazy initialization

- Changed NewServer to accept *BeadsFS instead of bd.Storage
- BeadsFS is always created but with no initial mounts
- Each mount opens its own store on-demand
- Added nil check in supervisor to handle missing beads gracefully
This commit is contained in:
Levi Neely 2026-03-01 00:47:13 +01:00
parent 33dbc312b0
commit ba5fd04025
5 changed files with 9 additions and 28 deletions

View File

@ -211,8 +211,9 @@ func start(daemonize bool) {
}
}()
// Start 9P server
srv, err := p9.NewServer(mgr, nil)
// Start 9P server with empty beads filesystem (mounts created on-demand)
beadsFS := p9.NewBeadsFS(nil, context.Background())
srv, err := p9.NewServer(mgr, beadsFS)
if err != nil {
logging.Logger().Fatal("failed to start 9P server", zap.Error(err))
}

View File

@ -670,7 +670,6 @@ func (s *Session) Restart(ctx context.Context) error {
backendName := s.backendName
backendCommand := s.backendCommand
role := s.role
tasks := s.tasks
hadCrash := s.hadCrash
model := s.model
modelResolver := s.modelResolver
@ -720,14 +719,6 @@ func (s *Session) Restart(ctx context.Context) error {
}
layers = append(layers, roleLayer)
for _, taskName := range tasks {
taskLayer, err := sandbox.LoadTask(taskName)
if err != nil {
return fmt.Errorf("failed to load task %q: %w", taskName, err)
}
layers = append(layers, taskLayer)
}
general := sandbox.GeneralConfig{BestEffort: false, LogLevel: "error"}
advanced := sandbox.AdvancedConfig{LDD: false, AddExec: true}
sandboxCfg := sandbox.Merge(general, advanced, layers...)

View File

@ -159,15 +159,6 @@ func (b *Backend) CreateSession(ctx context.Context, opts backend.SessionOptions
}
layers = append(layers, roleLayer)
// Add task layers
for _, taskName := range opts.Tasks {
taskLayer, err := sandbox.LoadTask(taskName)
if err != nil {
return nil, fmt.Errorf("failed to load task %q: %w", taskName, err)
}
layers = append(layers, taskLayer)
}
// Merge layers into final config
general := sandbox.GeneralConfig{
BestEffort: false,

View File

@ -24,7 +24,6 @@ import (
"sync"
"github.com/google/uuid"
bd "github.com/steveyegge/beads"
"go.uber.org/zap"
"9fans.net/go/plan9"
@ -150,7 +149,7 @@ type fid struct {
}
// NewServer creates and starts the 9P server.
func NewServer(mgr *session.Manager, beadsStore bd.Storage) (*Server, error) {
func NewServer(mgr *session.Manager, beadsFS *BeadsFS) (*Server, error) {
ns := client.Namespace()
if ns == "" {
return nil, fmt.Errorf("no namespace")
@ -173,12 +172,6 @@ func NewServer(mgr *session.Manager, beadsStore bd.Storage) (*Server, error) {
return nil, err
}
// Create BeadsFS (shared across all namespaces)
var beadsFS *BeadsFS
if beadsStore != nil {
beadsFS = NewBeadsFS(beadsStore, context.Background())
}
// Load tools from anvilmcp
tools := loadMCPTools()
toolsFS := NewToolsFS(tools)

View File

@ -27,6 +27,11 @@ func New(s *session.Manager, b *p9.BeadsFS, m *mailbox.Manager, e *eventbus.Bus)
}
func (s *Supervisor) assignWork() {
// Skip if beads not available
if s.beads == nil {
return
}
// Get all claimable tasks from all projects
ready, err := s.beads.Read("ready")
if err != nil || len(ready) == 0 {