X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/2ad578a24f252706976cddb41bee6cc969f251cd..b1be0ee8530df5db8973bfe355f2f6d3149383a0:/daemon.go?ds=inline diff --git a/daemon.go b/daemon.go index 958d6f7..5c94a4f 100644 --- a/daemon.go +++ b/daemon.go @@ -353,6 +353,10 @@ func daemonServe(ctx context.Context, listener net.Listener, bot *TelegramBot, w return errors.Join(err, listener.Close()) } + if bot != nil { + l.tools.imageShow.bot = bot + } + loops := []*TurnLoop{l} for _, child := range children { loop, err := child.Loop(nil, func(Event) { @@ -370,11 +374,17 @@ func daemonServe(ctx context.Context, listener net.Listener, bot *TelegramBot, w } hub.snapshot = func(ctx context.Context, snapshot func() error) error { - return messages.Snapshot(func() error { - return daemonSnapshot(ctx, loops, snapshot) - }) + return messages.SnapshotAgents(ctx, snapshot) } + runtime := &DaemonChildren{ + ctx: ctx, + cancel: cancel, + root: l, + messages: messages, + } + l.tools.children = runtime + var workers sync.WaitGroup childErrors := make([]error, len(children)) @@ -449,7 +459,7 @@ func daemonServe(ctx context.Context, listener net.Listener, bot *TelegramBot, w hub.CloseAll() workers.Wait() - return errors.Join(err, whatsappErr, schedulesErr, botErr, errors.Join(childErrors...)) + return errors.Join(err, whatsappErr, schedulesErr, botErr, errors.Join(childErrors...), runtime.Close()) } // daemonRunChild runs a child's turn loop and its schedules until either stops. @@ -487,6 +497,27 @@ func daemonRunRequest(l *TurnLoop, whatsapp *WhatsApp, request SocketRequest, an _, err := l.Submit(terminalSource, request.Text) return err + case "image": + if !filepath.IsAbs(request.Path) { + return errors.New("use /image PATH [caption]") + } + + data, err := imageReadFile(request.Path) + if err != nil { + return fmt.Errorf("read terminal image: %w", err) + } + + name, err := l.agent.Images().Save(data) + if err != nil { + return fmt.Errorf("store terminal image: %w", err) + } + + _, err = l.Submit(terminalSource, imageText([]string{name}, request.Text)) + if err != nil { + return fmt.Errorf("submit terminal image: %w", err) + } + + return nil case "interrupt": if !l.Interrupt() { return errors.New("no turn runs")