From f0213e2aed7c00bcb770647679585b1b16228ecb Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Wed, 21 Oct 2026 20:49:00 -0700 Subject: [PATCH] Drop per-task port blocks; previews use any free loopback port --- README.md | 2 +- TODO.md | 3 - api/openapi.yaml | 5 +- cmd/byre/serve.go | 6 +- internal/agents/bash.go | 7 +- internal/agents/guidance.go | 5 +- internal/agents/hands.go | 2 +- internal/agents/manager.go | 6 +- internal/agents/preview.go | 52 +- internal/api/api.gen.go | 694 +++++++++--------- internal/server/server.go | 4 +- .../migrations/098-drop-task-port-base.sql | 1 + internal/store/preview.go | 30 + internal/store/store.go | 40 +- internal/terminal/terminal.go | 2 +- mac/Sources/Byre/Panes.swift | 2 +- mac/Sources/Byre/Store.swift | 2 +- mac/Sources/Byre/TranscriptBuilder.swift | 3 + 18 files changed, 441 insertions(+), 425 deletions(-) create mode 100644 internal/store/migrations/098-drop-task-port-base.sql diff --git a/README.md b/README.md index 495b4c5..98aa099 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A server and macOS app for running many coding agents (Claude Code, Codex and An ## Features -- **Tasks.** Each task gets its own git worktree, branch and port block. Talk to its agent in a live transcript; messages sent mid-turn reach it after its next tool call. +- **Tasks.** Each task gets its own git worktree and branch. Talk to its agent in a live transcript; messages sent mid-turn reach it after its next tool call. - **Lead agent.** One long-running agent per user watches every task, tells you what needs you, points the right pane at it, and starts, messages, merges or discards tasks when you ask. It keeps notes on how you work and passes them to task agents. - **Questions.** Agents ask structured questions with a recommended answer; you answer by clicking. Each question shows in the transcript where it was asked, and clicking it shows it again with your answer. macOS notifications for questions, turn summaries and errors. - **Reviews.** Choose a review workflow for each project. Its reviewers check the task's work after each turn that changes files. Findings go back to the agent, and you can fix or ignore each one. diff --git a/TODO.md b/TODO.md index e486c4e..ae63ce7 100644 --- a/TODO.md +++ b/TODO.md @@ -12,9 +12,6 @@ # M6 — Fan-out -- Loopback address per task instead of port blocks - Give each task its own loopback address (127.0.0.10, 127.0.0.11, …) where it runs servers on their usual ports, in place of the ten-port block it gets now. On macOS only 127.0.0.1 is configured on lo0: binding 127.0.0.10 fails with "Can't assign requested address" (errno 49) until an alias is added (`sudo ifconfig lo0 alias 127.0.0.10 up`), and aliases are gone after a reboot. So byre needs a root step that adds the aliases at every boot (a LaunchDaemon installed with the app, or the server's install step), and a check that they're there. Test it first: add an alias, bind a server to it on a common port while another task holds the same port on another address, and confirm the preview forwards and `expose_port` work with it. - # M7 — Inbox triage diff --git a/api/openapi.yaml b/api/openapi.yaml index 1bb4390..8215109 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -1519,7 +1519,7 @@ components: Task: type: object - required: [id, project_id, title, merge_title, branch, worktree_path, base_ref, port_base, color, status, created_by, created_at, state, merging, discarding, merging_into_parent, merge_after_review, summary_seq, background, merge_facts] + required: [id, project_id, title, merge_title, branch, worktree_path, base_ref, color, status, created_by, created_at, state, merging, discarding, merging_into_parent, merge_after_review, summary_seq, background, merge_facts] properties: id: { type: string } project_id: { type: string } @@ -1528,7 +1528,6 @@ components: branch: { type: string } worktree_path: { type: string } base_ref: { type: string } - port_base: { type: integer, description: "The first of the task's block of ports (port_base to port_base+9), passed to its agent and terminal as PORT." } color: { type: integer, description: "Index into the UI's task palette, assigned at creation: a color no active task holds, the one given out longest ago." } status: type: string @@ -1864,7 +1863,7 @@ components: properties: task_id: { type: string } name: { type: string } - port: { type: integer, description: "A port in the task's block, served at http://:/." } + port: { type: integer, description: "The loopback port the task's server listens on, served at http://:/. One active task holds a port at a time: exposing it from another task moves it there." } created_at: { type: string, format: date-time } Tailnet: diff --git a/cmd/byre/serve.go b/cmd/byre/serve.go index 6aaeee9..05155e2 100644 --- a/cmd/byre/serve.go +++ b/cmd/byre/serve.go @@ -20,7 +20,6 @@ import ( "time" "g.fc.run/ai/byre/internal/server" - "g.fc.run/ai/byre/internal/store" "tailscale.com/tsnet" ) @@ -38,7 +37,6 @@ func serveCmd(args []string) { flags := flag.NewFlagSet("serve", flag.ExitOnError) dataDir := flags.String("data", filepath.Join(configDir, "byre"), "directory holding byre's database, worktrees, leads and blobs") listenAddr := flags.String("listen", defaultListen, "loopback address for server status and client commands") - ports := flags.Int("ports", store.DefaultPortFirst, "first port of the tasks' port blocks") hostname := flags.String("ts-hostname", "byre-"+macSlug(), "hostname of byre's tailnet node") flags.Parse(args) @@ -104,7 +102,7 @@ func serveCmd(args []string) { } defer ts.Close() - srv, err := server.New(*dataDir, *ports, ts, token) + srv, err := server.New(*dataDir, ts, token) if err != nil { fatal("start server", "err", err) } @@ -131,7 +129,7 @@ func serveCmd(args []string) { go serveTailnet(ctx, ts, tailnet) - slog.Info("listening", "addr", *listenAddr, "hostname", *hostname, "data", *dataDir, "ports", *ports) + slog.Info("listening", "addr", *listenAddr, "hostname", *hostname, "data", *dataDir) err = loopback.ListenAndServe() if !errors.Is(err, http.ErrServerClosed) { fatal("serve", "err", err) diff --git a/internal/agents/bash.go b/internal/agents/bash.go index 81ba709..fadceed 100644 --- a/internal/agents/bash.go +++ b/internal/agents/bash.go @@ -39,7 +39,7 @@ func (m *Manager) bashTool(l *live) mcp.Tool { return mcp.Tool{ Name: "bash", Description: "Run a shell command on the Mac byre runs on, in your task's worktree, with $SHELL as a login shell, and get its exit status and output (stdout and stderr together, the last 64 KiB). " + - "byre runs it itself, outside any sandbox your own shell tool has, with byre's environment and $PORT set to this task's first port. " + + "byre runs it itself, outside any sandbox your own shell tool has, with byre's environment. " + "Stdin is empty. The command runs in its own process group, which is killed at the timeout.", InputSchema: json.RawMessage(`{ "type": "object", @@ -65,10 +65,6 @@ func (m *Manager) bash(ctx context.Context, l *live, raw json.RawMessage) (strin if err != nil { return "", err } - task, err := m.store.GetTask(ctx, l.taskID) - if err != nil { - return "", err - } shell := os.Getenv("SHELL") if shell == "" { return "", errors.New("SHELL is not set in byre's environment") @@ -78,7 +74,6 @@ func (m *Manager) bash(ctx context.Context, l *live, raw json.RawMessage) (strin defer cancel() cmd := procgroup.CommandContext(cctx, shell, "-l", "-c", args.Command) cmd.Dir = l.dir - cmd.Env = append(os.Environ(), portEnv(task)...) cmd.WaitDelay = 5 * time.Second out := &tailWriter{} cmd.Stdout = out diff --git a/internal/agents/guidance.go b/internal/agents/guidance.go index 922a52b..890272f 100644 --- a/internal/agents/guidance.go +++ b/internal/agents/guidance.go @@ -98,9 +98,8 @@ func (m *Manager) takeBounce(ctx context.Context, l *live, final string) (bool, } func (m *Manager) taskGuidance(ctx context.Context, task api.Task) (string, error) { - g := guidance + fmt.Sprintf("\n- This task's ports are %d to %d; $PORT holds the first. Run dev servers and anything else that listens on these, so parallel tasks don't collide, and listen on 127.0.0.1. To show the human a running server, call byre's expose_port tool."+ - "\n- This worktree starts with only what git tracks. Before other work in a new worktree, do any setup the project's AGENTS.md describes.", - task.PortBase, task.PortBase+store.PortBlock-1) + g := guidance + "\n- Run dev servers and anything else that listens on 127.0.0.1, on any free port. Other tasks' servers run on this Mac too, so when a port is taken, use another. To show the human a running server, call byre's expose_port tool." + + "\n- This worktree starts with only what git tracks. Before other work in a new worktree, do any setup the project's AGENTS.md describes." if task.Title == "" { g += "\n- This task has no title yet. First thing, before any other work, call set_titles with a very short, distinct, to-the-point task title (two to four words) and a merge commit title that describes the work, and call it again whenever the work moves on." } else { diff --git a/internal/agents/hands.go b/internal/agents/hands.go index 995bb19..3cc761b 100644 --- a/internal/agents/hands.go +++ b/internal/agents/hands.go @@ -14,7 +14,7 @@ import ( "g.fc.run/ai/byre/internal/mcp" ) -const screenshotGuidance = "\n- When a turn changes something you can see, you can show it in your final message: save screenshots with the Playwright tools (pages you serve on this task's ports) or hands' capture with save (apps on this Mac), and embed each as a Markdown image, ![what it shows](), with the path the tool returned. They go to the task's media folder, outside the worktree, so they are never committed, and are deleted when the task closes. Leave out a screenshot that adds nothing to the text." +const screenshotGuidance = "\n- When a turn changes something you can see, you can show it in your final message: save screenshots with the Playwright tools (pages this task serves) or hands' capture with save (apps on this Mac), and embed each as a Markdown image, ![what it shows](), with the path the tool returned. They go to the task's media folder, outside the worktree, so they are never committed, and are deleted when the task closes. Leave out a screenshot that adds nothing to the text." func MediaDir(worktreePath string) string { return worktreePath + "-media" diff --git a/internal/agents/manager.go b/internal/agents/manager.go index 61706c5..73685c1 100644 --- a/internal/agents/manager.go +++ b/internal/agents/manager.go @@ -88,6 +88,7 @@ type Manager struct { auditMu sync.Mutex + exposeMu sync.Mutex previewMu sync.Mutex previewListeners map[int]*previewListener @@ -880,7 +881,6 @@ func (m *Manager) startLive(ctx context.Context, sess api.AgentSession, task api g += stageGuidance(frozen, l.stage) tools = append(tools, m.finishStageTool(l)) } - env := portEnv(task) stdio := []mcp.Stdio{} if sess.Role == api.Implementer { media := MediaDir(task.WorktreePath) @@ -904,7 +904,6 @@ func (m *Manager) startLive(ctx context.Context, sess api.AgentSession, task api l.dir = m.reviewDir(task.ProjectId, r.Id) g = reviewGuidance tools = []mcp.Tool{m.submitReviewTool(l)} - env = nil stdio = []mcp.Stdio{playwrightMCP(m.reviewMediaDir(task.ProjectId, r.Id))} } if l.owner != "" { @@ -920,9 +919,8 @@ func (m *Manager) startLive(ctx context.Context, sess api.AgentSession, task api } l.notes = "\n\n" + notes tools = append(m.leadTools(l), m.readKnowledgeTool(), m.renderDiagramTool()) - env = nil } - env = append(git.IdentityEnv(l.gitName, l.gitEmail), env...) + env := git.IdentityEnv(l.gitName, l.gitEmail) servers := []*mcp.Server{{Name: "byre", Version: "0.0.0", Tools: tools}} sctx, cancel := context.WithTimeout(ctx, 60*time.Second) diff --git a/internal/agents/preview.go b/internal/agents/preview.go index 741a8d8..8b810ba 100644 --- a/internal/agents/preview.go +++ b/internal/agents/preview.go @@ -22,10 +22,6 @@ import ( const maxPreviewName = 40 -func portEnv(t api.Task) []string { - return []string{"PORT=" + strconv.Itoa(t.PortBase)} -} - type exposePortArgs struct { Name string `json:"name"` Port int `json:"port"` @@ -35,7 +31,7 @@ func (m *Manager) exposePortTool(l *live) mcp.Tool { return mcp.Tool{ Name: "expose_port", Description: "Show the human a server you are running, such as a dev server, as a link above the task's tabs that opens it in a new window. " + - "Start the server yourself first (in the background), listening on 127.0.0.1 (not 0.0.0.0 or localhost) on a port in this task's block. " + + "Start the server yourself first (in the background), listening on 127.0.0.1 (not 0.0.0.0 or localhost) on any free port. " + "byre then serves it on the same port of byre's tailnet node, and the human's app opens it through a local link. " + "name labels it in the tab (\"web\", \"storybook\"); exposing a name or port again replaces the earlier one. " + "The server stops when your process does (a byre restart, compaction, the task closing); the human sees it as unreachable until you start it again.", @@ -43,7 +39,7 @@ func (m *Manager) exposePortTool(l *live) mcp.Tool { "type": "object", "properties": { "name": {"type": "string", "description": "Short label, shown as the link's text."}, - "port": {"type": "integer", "description": "The port the server listens on, at 127.0.0.1, within this task's block."} + "port": {"type": "integer", "description": "The port the server listens on, at 127.0.0.1."} }, "required": ["name", "port"] }`), @@ -65,13 +61,8 @@ func (m *Manager) exposePort(ctx context.Context, l *live, raw json.RawMessage) return "", fmt.Errorf("name must be one non-empty line of at most %d characters", maxPreviewName) } - task, err := m.store.GetTask(ctx, l.taskID) - if err != nil { - return "", err - } - last := task.PortBase + store.PortBlock - 1 - if args.Port < task.PortBase || args.Port > last { - return "", fmt.Errorf("port %d is outside this task's block, %d to %d", args.Port, task.PortBase, last) + if args.Port < 1 || args.Port > 65535 { + return "", fmt.Errorf("port %d is not a TCP port", args.Port) } addr := net.JoinHostPort("127.0.0.1", strconv.Itoa(args.Port)) @@ -81,14 +72,23 @@ func (m *Manager) exposePort(ctx context.Context, l *live, raw json.RawMessage) } conn.Close() - err = m.servePreview(args.Port) - if err != nil { - return "", err + m.exposeMu.Lock() + defer m.exposeMu.Unlock() + m.previewMu.Lock() + serving := m.previewListeners[args.Port] != nil + m.previewMu.Unlock() + if !serving { + err = m.servePreview(args.Port) + if err != nil { + return "", err + } } - dropped, err := m.store.SetPreview(ctx, api.Preview{TaskId: task.Id, Name: name, Port: args.Port, CreatedAt: time.Now().UTC()}, agentActor) + dropped, err := m.store.SetPreview(ctx, api.Preview{TaskId: l.taskID, Name: name, Port: args.Port, CreatedAt: time.Now().UTC()}, agentActor) if errors.Is(err, store.ErrNotFound) { - m.stopPreview(args.Port) + if !serving { + m.stopPreview(args.Port) + } return "", errors.New("this task is no longer active") } if err != nil { @@ -263,12 +263,28 @@ func (m *Manager) recoverPreviews(ctx context.Context) error { } func (m *Manager) Unexpose(ctx context.Context, taskID string) { + m.exposeMu.Lock() + defer m.exposeMu.Unlock() previews, err := m.store.ListPreviews(ctx, taskID) if err != nil { slog.Error("list previews", "task", taskID, "err", err) return } + active, err := m.store.ActivePreviews(ctx) + if err != nil { + slog.Error("list active previews", "err", err) + return + } + held := map[int]bool{} + for _, p := range active { + if p.TaskId != taskID { + held[p.Port] = true + } + } for _, p := range previews { + if held[p.Port] { + continue + } m.stopPreview(p.Port) slog.Info("stopped serving preview", "task", taskID, "name", p.Name, "port", p.Port) } diff --git a/internal/api/api.gen.go b/internal/api/api.gen.go index 553e1b1..1efa3e9 100644 --- a/internal/api/api.gen.go +++ b/internal/api/api.gen.go @@ -1190,7 +1190,7 @@ type Preview struct { CreatedAt time.Time `json:"created_at"` Name string `json:"name"` - // Port A port in the task's block, served at http://:/. + // Port The loopback port the task's server listens on, served at http://:/. One active task holds a port at a time: exposing it from another task moves it there. Port int `json:"port"` TaskId string `json:"task_id"` } @@ -1529,10 +1529,7 @@ type Task struct { // ParentTaskId The task whose agent created this one as its subtask, or for a stage task its workflow run's task; absent for other tasks. ParentTaskId *string `json:"parent_task_id,omitempty"` - - // PortBase The first of the task's block of ports (port_base to port_base+9), passed to its agent and terminal as PORT. - PortBase int `json:"port_base"` - ProjectId string `json:"project_id"` + ProjectId string `json:"project_id"` // ReadyMerge The merge the agent's standing ready_for_merge offers as the default: complete lands the work and closes the task, continue lands it and keeps the task open. Absent while no ready_for_merge stands. It changes only with a task.ready, task.discard_suggested, task.ready_cleared, snapshot.created or inbox.created event. ReadyMerge *TaskReadyMerge `json:"ready_merge,omitempty"` @@ -4772,350 +4769,349 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H // const string: with thousands of chunks the chained `+` fold is several // times slower for the Go compiler than parsing a slice literal. var swaggerSpec = []string{ - "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", - "9vOVqRmRuAkTUcAA3wEz+dUoqT98+F8DAA==", + "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", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/internal/server/server.go b/internal/server/server.go index 5aa78fe..fceb711 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -48,7 +48,7 @@ type Server struct { type ctxKey struct{} -func New(dataDir string, portFirst int, ts *tsnet.Server, token string) (*Server, error) { +func New(dataDir string, ts *tsnet.Server, token string) (*Server, error) { err := os.MkdirAll(dataDir, 0o700) if err != nil { return nil, err @@ -79,7 +79,7 @@ func New(dataDir string, portFirst int, ts *tsnet.Server, token string) (*Server } s.clients = clients.New(s.clientsChanged) - s.store, err = store.Open(filepath.Join(dataDir, "byre.db"), portFirst, s.publish) + s.store, err = store.Open(filepath.Join(dataDir, "byre.db"), s.publish) if err != nil { return nil, err } diff --git a/internal/store/migrations/098-drop-task-port-base.sql b/internal/store/migrations/098-drop-task-port-base.sql new file mode 100644 index 0000000..830800c --- /dev/null +++ b/internal/store/migrations/098-drop-task-port-base.sql @@ -0,0 +1 @@ +ALTER TABLE tasks DROP COLUMN port_base; diff --git a/internal/store/preview.go b/internal/store/preview.go index 0ffb265..da0573b 100644 --- a/internal/store/preview.go +++ b/internal/store/preview.go @@ -43,6 +43,36 @@ func (s *Store) SetPreview(ctx context.Context, p api.Preview, actor string) ([] return err } + rows, err = tx.QueryContext(ctx, ` + DELETE FROM previews WHERE port = ? AND task_id != ? AND task_id IN (SELECT id FROM tasks WHERE status = ?) + RETURNING task_id, name, (SELECT project_id FROM tasks WHERE id = previews.task_id) + `, p.Port, p.TaskId, string(api.TaskStatusActive)) + if err != nil { + return err + } + taken := []api.Event{} + for rows.Next() { + taskID, name, project := "", "", "" + err = rows.Scan(&taskID, &name, &project) + if err != nil { + rows.Close() + return err + } + taken = append(taken, api.Event{Kind: "preview.taken", ProjectId: &project, TaskId: &taskID, Actor: actor, + Payload: map[string]any{"name": name, "port": p.Port, "by_task_id": p.TaskId}}) + } + rows.Close() + err = rows.Err() + if err != nil { + return err + } + for _, ev := range taken { + err = emit(ev) + if err != nil { + return err + } + } + _, err = tx.ExecContext(ctx, `INSERT INTO previews (`+previewColumns+`) VALUES (?, ?, ?, ?)`, p.TaskId, p.Name, p.Port, formatTime(p.CreatedAt)) if err != nil { return err diff --git a/internal/store/store.go b/internal/store/store.go index 3770fbf..976e9c3 100644 --- a/internal/store/store.go +++ b/internal/store/store.go @@ -68,21 +68,16 @@ func loadMigrations() ([]migration, error) { return migrations, nil } -const ( - DefaultPortFirst = 41000 - PortBlock = 10 - TaskColors = 11 -) +const TaskColors = 11 type Store struct { - db *sql.DB - path string - portFirst int - writeMu sync.Mutex - onEvent func([]api.Event) + db *sql.DB + path string + writeMu sync.Mutex + onEvent func([]api.Event) } -func Open(path string, portFirst int, onEvent func([]api.Event)) (*Store, error) { +func Open(path string, onEvent func([]api.Event)) (*Store, error) { dsn := "file:" + path + "?_pragma=journal_mode(WAL)&_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)&_txlock=immediate" connector, err := newTracedConnector(dsn) if err != nil { @@ -96,7 +91,7 @@ func Open(path string, portFirst int, onEvent func([]api.Event)) (*Store, error) return nil, err } - return &Store{db: db, path: path, portFirst: portFirst, onEvent: onEvent}, nil + return &Store{db: db, path: path, onEvent: onEvent}, nil } func migrate(db *sql.DB, dataDir string) error { @@ -383,17 +378,6 @@ func (s *Store) CreateTask(ctx context.Context, t api.Task, frozen *FrozenWorkfl return ErrParentNotOpen } } - if t.WorktreePath != "" { - err := tx.QueryRowContext(ctx, ` - SELECT min(candidate) FROM ( - SELECT ? AS candidate - UNION ALL SELECT port_base + ? FROM tasks WHERE status = ? AND port_base != 0 - ) WHERE candidate NOT IN (SELECT port_base FROM tasks WHERE status = ?) - `, s.portFirst, PortBlock, string(api.TaskStatusActive), string(api.TaskStatusActive)).Scan(&t.PortBase) - if err != nil { - return err - } - } err := tx.QueryRowContext(ctx, ` WITH RECURSIVE palette(c) AS (SELECT 0 UNION ALL SELECT c + 1 FROM palette WHERE c + 1 < ?) SELECT c FROM palette @@ -404,9 +388,9 @@ func (s *Store) CreateTask(ctx context.Context, t api.Task, frozen *FrozenWorkfl return err } _, err = tx.ExecContext(ctx, ` - INSERT INTO tasks (id, project_id, title, merge_title, branch, worktree_path, base_ref, port_base, color, status, created_by, created_at, todo_item, forked_from, forked_at, workflow_name, workflow_definition_id, workflow_brief, workflow_title, workflow_stage, parent_task_id, audit) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - `, t.Id, t.ProjectId, t.Title, mergeTitle, t.Branch, t.WorktreePath, t.BaseRef, t.PortBase, t.Color, string(t.Status), t.CreatedBy, formatTime(t.CreatedAt), todoItem, forkedFrom, forkedAt, workflowName, workflowDefinitionID, workflowBrief, workflowTitle, workflowStage, parentTaskID, audit) + INSERT INTO tasks (id, project_id, title, merge_title, branch, worktree_path, base_ref, color, status, created_by, created_at, todo_item, forked_from, forked_at, workflow_name, workflow_definition_id, workflow_brief, workflow_title, workflow_stage, parent_task_id, audit) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + `, t.Id, t.ProjectId, t.Title, mergeTitle, t.Branch, t.WorktreePath, t.BaseRef, t.Color, string(t.Status), t.CreatedBy, formatTime(t.CreatedAt), todoItem, forkedFrom, forkedAt, workflowName, workflowDefinitionID, workflowBrief, workflowTitle, workflowStage, parentTaskID, audit) if err != nil { return err } @@ -1673,7 +1657,7 @@ func (s *Store) ClearReviewRequests(ctx context.Context) error { const projectColumns = `id, name, repo_path, default_branch, remote, created_by, created_at, review_workflow, audit_workflow` -const taskColumns = `id, project_id, title, merge_title, branch, worktree_path, base_ref, port_base, color, status, created_by, created_at, closed_at, merge_commit, todo_item, forked_from, forked_at, merge_queued_at, workflow_name, workflow_stage, parent_task_id, parent_merge_by, merge_after_review_by != '', state, merging_by != '' OR finalizing != '', discard_state != '' AND status = 'active', (SELECT coalesce(max(seq), 0) FROM events WHERE events.task_id = tasks.id AND kind = 'turn.ended' AND json_extract(payload, '$.summary') = 1), audit, ready, ` + backgroundExpr + `, ` + mergeFactsColumns +const taskColumns = `id, project_id, title, merge_title, branch, worktree_path, base_ref, color, status, created_by, created_at, closed_at, merge_commit, todo_item, forked_from, forked_at, merge_queued_at, workflow_name, workflow_stage, parent_task_id, parent_merge_by, merge_after_review_by != '', state, merging_by != '' OR finalizing != '', discard_state != '' AND status = 'active', (SELECT coalesce(max(seq), 0) FROM events WHERE events.task_id = tasks.id AND kind = 'turn.ended' AND json_extract(payload, '$.summary') = 1), audit, ready, ` + backgroundExpr + `, ` + mergeFactsColumns // Keep the child lookup separate from the task itself so SQLite can use tasks_parent. const backgroundExpr = `(audit != '' OR EXISTS (SELECT 1 FROM tasks r WHERE r.id = tasks.parent_task_id AND tasks.workflow_stage != '' AND r.audit != '')) @@ -1716,7 +1700,7 @@ func scanTask(row scanner) (api.Task, error) { ready := "" participants := "" f := &t.MergeFacts - err := row.Scan(&t.Id, &t.ProjectId, &t.Title, &t.MergeTitle, &t.Branch, &t.WorktreePath, &t.BaseRef, &t.PortBase, &t.Color, &status, &t.CreatedBy, &createdAt, &closedAt, &mergeCommit, &todoItem, &forkedFrom, &forkedAt, &mergeQueuedAt, &workflowName, &workflowStage, &parentTaskID, &parentMergeBy, &t.MergeAfterReview, &taskState, &t.Merging, &t.Discarding, &t.SummarySeq, &audit, &ready, &t.Background, + err := row.Scan(&t.Id, &t.ProjectId, &t.Title, &t.MergeTitle, &t.Branch, &t.WorktreePath, &t.BaseRef, &t.Color, &status, &t.CreatedBy, &createdAt, &closedAt, &mergeCommit, &todoItem, &forkedFrom, &forkedAt, &mergeQueuedAt, &workflowName, &workflowStage, &parentTaskID, &parentMergeBy, &t.MergeAfterReview, &taskState, &t.Merging, &t.Discarding, &t.SummarySeq, &audit, &ready, &t.Background, &f.UnmergedCommits, &f.UnmergedFiles, &f.UnreviewedChanges, &f.ReviewSnapshot, &f.ReviewCount, &f.ReviewRunning, &f.ReviewFailed, &f.ReviewFindings, &participants) if err != nil { return t, err diff --git a/internal/terminal/terminal.go b/internal/terminal/terminal.go index 50adbe7..905b056 100644 --- a/internal/terminal/terminal.go +++ b/internal/terminal/terminal.go @@ -161,7 +161,7 @@ func (ts *Terminals) start(t api.Task, name string, size api.TerminalSize) (*Ter } cmd := exec.Command(shell, "-l") cmd.Dir = t.WorktreePath - cmd.Env = append(os.Environ(), "TERM=xterm-256color", "COLORTERM=truecolor", fmt.Sprintf("PORT=%d", t.PortBase)) + cmd.Env = append(os.Environ(), "TERM=xterm-256color", "COLORTERM=truecolor") prompts := filepath.Base(shell) == "zsh" if prompts { cmd.Env = append(cmd.Env, "BYRE_ZDOTDIR="+os.Getenv("ZDOTDIR"), "ZDOTDIR="+ts.zdotdir) diff --git a/mac/Sources/Byre/Panes.swift b/mac/Sources/Byre/Panes.swift index 71f6b3d..1fd3794 100644 --- a/mac/Sources/Byre/Panes.swift +++ b/mac/Sources/Byre/Panes.swift @@ -305,7 +305,7 @@ private struct TaskBar: View { } .onAppear { off = store.events.add { ev in - if ev.kind == "preview.exposed" && ev.taskId == store.selectedTaskId { + if (ev.kind == "preview.exposed" || ev.kind == "preview.taken") && ev.taskId == store.selectedTaskId { Task { await load() } diff --git a/mac/Sources/Byre/Store.swift b/mac/Sources/Byre/Store.swift index 855bce6..32093c2 100644 --- a/mac/Sources/Byre/Store.swift +++ b/mac/Sources/Byre/Store.swift @@ -824,7 +824,7 @@ final class Store { spawn("load inbox") { try await self.loadInbox() } - case "preview.exposed": + case "preview.exposed", "preview.taken": if let taskId = ev.taskId { Task { await forwards.load(api, taskId) diff --git a/mac/Sources/Byre/TranscriptBuilder.swift b/mac/Sources/Byre/TranscriptBuilder.swift index b29db85..ddb116d 100644 --- a/mac/Sources/Byre/TranscriptBuilder.swift +++ b/mac/Sources/Byre/TranscriptBuilder.swift @@ -957,6 +957,9 @@ final class TranscriptBuilder { case "preview.exposed": return note([.text("\(ev.actor) exposed \"\(jsString(p["name"]))\" at "), .preview(taskId: ev.taskId ?? "", port: int(p, "port") ?? 0)]) + case "preview.taken": + return note([.text("\"\(jsString(p["name"]))\" stopped: "), .task(str(p, "by_task_id") ?? ""), .text(" now serves port \(int(p, "port") ?? 0)")]) + case "task.merged": let commit = str(p, "commit") ?? "" if let parentTask = str(p, "parent_task_id") {