Server setup in the app
This commit is contained in:
+55
-11
@@ -1,10 +1,16 @@
|
||||
package agents
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"g.fc.run/ai/byre/internal/api"
|
||||
"g.fc.run/ai/byre/internal/mcp"
|
||||
)
|
||||
|
||||
@@ -21,16 +27,8 @@ func (m *Manager) handsDir(sessionID string) string {
|
||||
// replayd keys ScreenCaptureKit clients by executable path, so two hands
|
||||
// processes run from one path keep cancelling each other's connection.
|
||||
func (m *Manager) handsMCP(sessionID, mediaDir string) (mcp.Stdio, error) {
|
||||
src, err := exec.LookPath("byre-hands")
|
||||
if err != nil {
|
||||
return mcp.Stdio{}, err
|
||||
}
|
||||
data, err := os.ReadFile(src)
|
||||
if err != nil {
|
||||
return mcp.Stdio{}, err
|
||||
}
|
||||
dir := m.handsDir(sessionID)
|
||||
err = os.RemoveAll(dir)
|
||||
err := os.RemoveAll(dir)
|
||||
if err != nil {
|
||||
return mcp.Stdio{}, err
|
||||
}
|
||||
@@ -38,10 +36,56 @@ func (m *Manager) handsMCP(sessionID, mediaDir string) (mcp.Stdio, error) {
|
||||
if err != nil {
|
||||
return mcp.Stdio{}, err
|
||||
}
|
||||
bin := filepath.Join(dir, "byre-hands")
|
||||
err = os.WriteFile(bin, data, 0o755)
|
||||
bin, err := copyHands(dir)
|
||||
if err != nil {
|
||||
return mcp.Stdio{}, err
|
||||
}
|
||||
return mcp.Stdio{Name: "hands", Command: bin, Args: []string{"--media-dir", mediaDir}}, nil
|
||||
}
|
||||
|
||||
func copyHands(dir string) (string, error) {
|
||||
src, err := exec.LookPath("byre-hands")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
data, err := os.ReadFile(src)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
bin := filepath.Join(dir, "byre-hands")
|
||||
return bin, os.WriteFile(bin, data, 0o755)
|
||||
}
|
||||
|
||||
func (m *Manager) CheckPermissions(ctx context.Context) ([]api.Permission, error) {
|
||||
err := os.MkdirAll(m.handsRoot, 0o755)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dir, err := os.MkdirTemp(m.handsRoot, "check-")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer os.RemoveAll(dir)
|
||||
bin, err := copyHands(dir)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ctx, cancel := context.WithTimeout(ctx, 50*time.Second)
|
||||
defer cancel()
|
||||
cmd := exec.CommandContext(ctx, bin, "check")
|
||||
stderr := strings.Builder{}
|
||||
cmd.Stderr = &stderr
|
||||
out, err := cmd.Output()
|
||||
if ctx.Err() == context.DeadlineExceeded {
|
||||
return nil, fmt.Errorf("byre-hands check didn't finish within 50s; answer macOS's prompt on the server's Mac and check again")
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("byre-hands check: %w: %s", err, strings.TrimSpace(stderr.String()))
|
||||
}
|
||||
perms := []api.Permission{}
|
||||
err = json.Unmarshal(out, &perms)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("parse byre-hands check: %w", err)
|
||||
}
|
||||
return perms, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user