feat: встроенные агенты opencode (analyst, dev) через go:embed, распаковка по умолчанию в ./agents рядом с бинарём
All checks were successful
CI / test (push) Successful in 38s
CI / build-and-package (amd64, darwin) (push) Successful in 34s
CI / build-and-package (amd64, linux) (push) Successful in 33s
CI / build-and-package (amd64, windows) (push) Successful in 35s
CI / build-and-package (arm64, darwin) (push) Successful in 35s
CI / build-and-package (arm64, linux) (push) Successful in 34s
All checks were successful
CI / test (push) Successful in 38s
CI / build-and-package (amd64, darwin) (push) Successful in 34s
CI / build-and-package (amd64, linux) (push) Successful in 33s
CI / build-and-package (amd64, windows) (push) Successful in 35s
CI / build-and-package (arm64, darwin) (push) Successful in 35s
CI / build-and-package (arm64, linux) (push) Successful in 34s
This commit is contained in:
@@ -8,10 +8,12 @@ import (
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/kamelion/ratatoskr-go/internal/agents"
|
||||
"github.com/kamelion/ratatoskr-go/internal/analyst"
|
||||
"github.com/kamelion/ratatoskr-go/internal/chat"
|
||||
"github.com/kamelion/ratatoskr-go/internal/chat/telegram"
|
||||
@@ -46,6 +48,11 @@ func New(configPath string) (*App, error) {
|
||||
// SQLite для задач и трасс
|
||||
ctx := context.Background()
|
||||
|
||||
// Агенты opencode: если config_dir не задан — используем ./agents рядом с бинарём
|
||||
if err := ensureAgentsDir(cfg); err != nil {
|
||||
return nil, fmt.Errorf("%w: %v", ErrConfig, err)
|
||||
}
|
||||
|
||||
store, err := storage.Open(ctx, cfg.Paths.DB)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: %v", ErrDBOpen, err)
|
||||
@@ -222,4 +229,25 @@ func (a *App) send(ctx context.Context, uid chat.UserID, text string) {
|
||||
if err := a.Router.Send(ctx, uid, chat.Message{Text: text}); err != nil {
|
||||
log.Printf("app: send to %s: %v", uid, err)
|
||||
}
|
||||
}
|
||||
|
||||
// ensureAgentsDir определяет каталог с агентами opencode и распаковывает
|
||||
// туда встроенных агентов (go:embed). Если config_dir не задан — использует
|
||||
// ./agents рядом с бинарём. Встроенные агенты перезаписываются (всегда актуальны).
|
||||
//
|
||||
// idempotent: вызывается только из New.
|
||||
func ensureAgentsDir(cfg *config.Config) error {
|
||||
if cfg.OpenCode.ConfigDir == "" {
|
||||
exe, err := os.Executable()
|
||||
if err != nil {
|
||||
return fmt.Errorf("resolve executable: %w", err)
|
||||
}
|
||||
// ./agents рядом с бинарём
|
||||
cfg.OpenCode.ConfigDir = filepath.Join(filepath.Dir(exe), "agents")
|
||||
}
|
||||
if err := agents.WriteTo(cfg.OpenCode.ConfigDir); err != nil {
|
||||
return fmt.Errorf("write agents to %s: %w", cfg.OpenCode.ConfigDir, err)
|
||||
}
|
||||
log.Printf("app: agents ensured in %s", cfg.OpenCode.ConfigDir)
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user