Drop the web app; the macOS app is byre's only client

This commit is contained in:
Ian Gulliver
2026-10-17 12:06:40 -07:00
parent edb59a3718
commit 63bf57e42e
116 changed files with 297 additions and 24370 deletions
+1 -1
View File
@@ -13,7 +13,7 @@ import (
"g.fc.run/misc/byre/internal/todo"
)
const guidance = `You are running inside byre. The human reads your work in byre's web UI, not a terminal.
const guidance = `You are running inside byre. The human reads your work in byre's app, not a terminal.
- Ask every question with byre's ask_human tool, never in prose.
- End every turn with a short final message for the human: what you did, anything you departed from in the plan or instructions, risks, and what's next. byre shows it as the turn's summary at the end of the transcript. State every departure from the plan.
- A turn that asks a question has no summary; put everything the human needs in the question's context.
+1 -1
View File
@@ -14,7 +14,7 @@ import (
"g.fc.run/misc/byre/internal/workflow"
)
const leadGuidance = `You are the human's lead agent in byre, shown in the left pane of byre's web UI. The human talks to you there, and you coordinate every task agent on their behalf. You don't do task work yourself: task agents work in their own worktrees, and you read, direct and report on them.
const leadGuidance = `You are the human's lead agent in byre, shown in the left pane of byre's app. The human talks to you there, and you coordinate every task agent on their behalf. You don't do task work yourself: task agents work in their own worktrees, and you read, direct and report on them.
- Signals: byre sends you, as messages from byre, what happens across tasks: questions and errors that task agents file, turns they finish with their final message, questions the human answered, tasks created, reviews started and finished, starting to merge, merged or discarded, and every change of a task's state, as "<task> state: <before> → <now>." listed first among what happened at the same moment. The states are running, idle, review_pending, reviewing, merging, discarding, merged, discarded and no_agent. A finished turn arrives with its state change: review_pending when byre is about to review the turn's work, reviewing while the review runs; neither is done, since the review can still find problems, so don't treat a task's work as finished until its state goes to idle. Several may arrive in one message, followed by the current task list (as list_tasks gives it) and what your right pane shows, so you rarely need to call list_tasks after a signal. The human doesn't see signals. Messages from the human arrive separately.
- Don't respond to what the human just did. A signal about their own action (a question they answered, a task they created, merged, started merging or discarded) tells them nothing new: don't report, confirm or comment on it. Act on it only if it changes what you are doing, and then end the turn with one short line at most. When a batch of signals needs nothing from you to the human, make your final message exactly NO_REPLY and nothing else; byre folds that turn away so the human doesn't see it.
- "Your right pane is free" means the human finished what was in the right pane. Show them the next thing that needs them, most urgent first (questions and errors, then finished turns, then tasks ready to merge), with one line saying what it is. If nothing needs them, show that project's project tab, then post a short status: one line per active task (what it's doing or waiting on), then up to three TODO items you'd start next (from list_tasks), each with a one-line reason. Write each item as a link to #/todo/<project_id>/<title, URL-encoded with parentheses as %28 and %29>, for example [Fix login redirect](#/todo/3f2a9c1b7d4e/Fix%20login%20redirect): byre draws it with a Start button the human can click, and once the task exists, its state. Start one with start_todo only when the human picks it. If that says nothing new since your last status, make your final message NO_REPLY.
+1 -1
View File
@@ -24,7 +24,7 @@ var reviewModels = map[api.AgentSessionVendor]string{api.Claude: "claude-opus-5-
var severities = []string{"critical", "high", "medium", "low", "info"}
const reviewGuidance = `You are a reviewer running inside byre. Another agent is doing a task; you review all of its work so far, and a human may read your review in byre's web UI.
const reviewGuidance = `You are a reviewer running inside byre. Another agent is doing a task; you review all of its work so far, and a human may read your review in byre's app.
- Your working directory is a detached checkout of the snapshot under review. Read, build and run whatever you need there, but don't edit, commit or push: the checkout is discarded when you finish, and the task's own worktree belongs to its agent.
- Report with byre's submit_review tool, exactly once, then end your turn with one line. A review that isn't submitted is lost.
- Start the review with ` + "`change`" + `: what the change does, in a few sentences, for someone who hasn't read it.
+171 -171
View File
@@ -849,7 +849,7 @@ type PaneFocus struct {
// Drafting True while a text box in the right pane holds unsent text.
Drafting bool `json:"drafting"`
// Focused True while the browser window has focus and the focused element is inside the right pane.
// Focused True while the app's window has focus and the focused element is inside the right pane.
Focused bool `json:"focused"`
}
@@ -3537,176 +3537,176 @@ var swaggerSpec = []string{
"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",
"HZ6xt/1n7z6/V3uPjx//XwAAAP//",
"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",
"z9jb/rN3n9+rvcfHj/8vAAD//w==",
}
// decodeSpec returns the embedded OpenAPI spec as raw JSON bytes,
+1 -5
View File
@@ -5,7 +5,6 @@ import (
"encoding/json"
"errors"
"fmt"
"io/fs"
"log/slog"
"net"
"net/http"
@@ -29,7 +28,6 @@ type Server struct {
hub *hub
terminals *terminals
startedAt time.Time
spa fs.FS
usersMu sync.Mutex
users map[string]string
@@ -37,7 +35,7 @@ type Server struct {
type ctxKey struct{}
func New(dataDir string, portFirst int, spa fs.FS) (*Server, error) {
func New(dataDir string, portFirst int) (*Server, error) {
err := os.MkdirAll(dataDir, 0o755)
if err != nil {
return nil, err
@@ -47,7 +45,6 @@ func New(dataDir string, portFirst int, spa fs.FS) (*Server, error) {
hub: newHub(),
terminals: newTerminals(),
startedAt: time.Now().UTC(),
spa: spa,
users: map[string]string{},
}
@@ -107,7 +104,6 @@ func (s *Server) Handler() http.Handler {
writeError(w, http.StatusBadRequest, err)
},
})
mux.Handle("/", http.FileServerFS(s.spa))
return mux
}