From f1d3f9be619455a67f9e30edcb150aae098d1d9e Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Fri, 23 Oct 2026 11:48:42 -0700 Subject: [PATCH] Fix inconsistencies found by consistency audit of 395f76e --- api/openapi.yaml | 4 +- cmd/byre/serve.go | 21 +- docs/codex-protocol.md | 2 +- docs/operations.md | 2 +- hands/Sources/byre-hands/Chrome.swift | 13 +- internal/agents/clients.go | 14 +- internal/agents/inbox.go | 2 +- internal/agents/kb/client-exec.md | 2 +- internal/agents/kb/signing.md | 4 +- internal/agents/lead.go | 4 +- internal/agents/leadtools.go | 2 +- internal/agents/preview.go | 3 +- internal/api/api.gen.go | 648 +++++++++++++------------- internal/server/server.go | 3 +- mac/Sources/Byre/Pages.swift | 10 +- mac/Sources/Byre/Reviews.swift | 2 +- site/index.html | 2 +- 17 files changed, 376 insertions(+), 362 deletions(-) diff --git a/api/openapi.yaml b/api/openapi.yaml index 52ace41..dbfe407 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -2518,9 +2518,9 @@ components: transfer: { type: string, description: "upload: the transfer id to get from /api/clients/transfers/{transferId}. download: the transfer id to put the archive to." } dest: { type: string, description: "upload: where the archive's one entry ends up, absolute or starting with ~/; whatever is there is replaced." } path: { type: string, description: "download, read_file, write_file: the file (or, for download, file or directory) on the client, absolute or starting with ~/. open_page, open_file: the file (or, for open_file, file or directory, a directory ending in /) on the server, absolute or relative to the task's worktree." } - task: { type: string, description: "open_page, open_file: the task beside whose transcript the app shows the file: open_page in its page view, open_file in its Files tab. page_tabs, page_navigate, page_js, page_capture: the task whose page view tabs they act on." } + task: { type: string, description: "open_page, open_file: the task beside whose transcript the app shows the file: open_page in its Page view, open_file in its Files tab. page_tabs, page_navigate, page_js, page_capture: the task whose Page view tabs they act on." } url: { type: string, description: "open_page: a web address to open in a new tab instead of path. page_navigate: the address to load." } - tab: { type: integer, description: "page_navigate, page_js, page_capture: the tab, by the number page_tabs lists; absent for the tab the page view shows." } + tab: { type: integer, description: "page_navigate, page_js, page_capture: the tab, by the number page_tabs lists; absent for the tab the Page view shows." } code: { type: string, description: "page_js: the body of an async function to run in the tab's page; its return value is the result." } data: { type: string, format: byte, description: "write_file: the file's new contents; parent directories are created. sign: the unsigned commit object, which the Mac signs with the program its git config names for its gpg.format (openpgp or x509), called as git calls it." } tool: { type: string, description: "hands: the byre-hands tool to call." } diff --git a/cmd/byre/serve.go b/cmd/byre/serve.go index 52d0d03..c3d2104 100644 --- a/cmd/byre/serve.go +++ b/cmd/byre/serve.go @@ -51,10 +51,12 @@ func serveCmd(args []string) { } // Protect local credentials before tsnet can write state or a login URL. - if err := os.MkdirAll(*dataDir, 0o700); err != nil { + err = os.MkdirAll(*dataDir, 0o700) + if err != nil { fatal("create data directory", "err", err) } - if err := os.Chmod(*dataDir, 0o700); err != nil { + err = os.Chmod(*dataDir, 0o700) + if err != nil { fatal("protect data directory", "err", err) } // Keep ownership until shutdown; never unlink the lock file, since a new @@ -64,15 +66,18 @@ func serveCmd(args []string) { fatal("open service lock", "err", err) } defer lock.Close() - if err := syscall.Flock(int(lock.Fd()), syscall.LOCK_EX|syscall.LOCK_NB); err != nil { + err = syscall.Flock(int(lock.Fd()), syscall.LOCK_EX|syscall.LOCK_NB) + if err != nil { fatal("acquire service lock", "data", *dataDir, "err", err) } token := rand.Text() - if err := os.WriteFile(filepath.Join(*dataDir, "loopback-token"), []byte(token), 0o600); err != nil { + err = os.WriteFile(filepath.Join(*dataDir, "loopback-token"), []byte(token), 0o600) + if err != nil { fatal("write loopback credential", "err", err) } - if err := os.Setenv("BYRE_TOKEN", token); err != nil { + err = os.Setenv("BYRE_TOKEN", token) + if err != nil { fatal("export loopback credential", "err", err) } home, err := os.UserHomeDir() @@ -80,14 +85,16 @@ func serveCmd(args []string) { fatal("home directory", "err", err) } logDir := filepath.Join(home, "Library", "Logs") - if err := os.MkdirAll(logDir, 0o755); err != nil { + err = os.MkdirAll(logDir, 0o755) + if err != nil { fatal("create log directory", "err", err) } logFile, err := os.OpenFile(filepath.Join(logDir, "byre.log"), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o600) if err != nil { fatal("open service log", "err", err) } - if err := logFile.Chmod(0o600); err != nil { + err = logFile.Chmod(0o600) + if err != nil { fatal("protect service log", "err", err) } logFile.Close() diff --git a/docs/codex-protocol.md b/docs/codex-protocol.md index 41b1904..5df9fbf 100644 --- a/docs/codex-protocol.md +++ b/docs/codex-protocol.md @@ -4,7 +4,7 @@ How `internal/codex` drives `codex app-server`. The server's own schema is the r ## Binary and version -byre runs `codex` from `PATH`. On the owner's machine that is the CLI inside the ChatGPT desktop app (`ls -la ~/.local/bin/codex` shows the link), so the version moves when the app updates itself; `codex --version` prints it. byre passes `-c check_for_update_on_startup=false` so the CLI never checks for or offers updates of its own. `SchemaVersion` in `internal/codex/protocol.gen.go` names the version the types were generated from; when it differs from `codex --version`, regenerate the types (below). +byre runs `codex` from `PATH`. On the owner's Mac that is the CLI inside the ChatGPT desktop app (`ls -la ~/.local/bin/codex` shows the link), so the version moves when the app updates itself; `codex --version` prints it. byre passes `-c check_for_update_on_startup=false` so the CLI never checks for or offers updates of its own. `SchemaVersion` in `internal/codex/protocol.gen.go` names the version the types were generated from; when it differs from `codex --version`, regenerate the types (below). ## Generated types diff --git a/docs/operations.md b/docs/operations.md index e439e69..914e1ae 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -104,7 +104,7 @@ Coordination of merges, discards, reviews, ready-for-merge prompts, workflow sta ## Signing merges -byre never signs with a key on the machine it runs on: every git command it runs there, except `git config`, gets `-c commit.gpgsign=false`, so its end-of-turn, snapshot and merge-in commits stay unsigned whatever the server's config says. A signing program left to run under the launchd service can wait forever on a prompt nobody sees (`ac-sign` waiting on AppleConnect did), and the turn would never end. Those commits never reach the default branch anyway; the squash replaces them. When a project checkout's `commit.gpgsign` is true (`git -C config --type=bool --get commit.gpgsign` prints it), the squash commit of a merge is signed on the merging user's most recently active Mac, so a key that never leaves that Mac's Secure Enclave and needs a fingerprint works. The Mac runs its own git signing config, as git does: `gpg.format` (`openpgp` or `x509`; `ssh` is not supported), the program when it isn't `gpg`/`gpgsm`, and `user.signingkey` when the program can't find the key from the user's byre git identity (not the Mac's `user.email`). The program must print `[GNUPG:] SIG_CREATED ` on its status fd, as git requires. A Touch ID prompt left unanswered for 2 minutes fails the merge. The notes commit is not signed. +byre never signs with a key on the Mac it runs on: every git command it runs there, except `git config`, gets `-c commit.gpgsign=false`, so its end-of-turn, snapshot and merge-in commits stay unsigned whatever the server's config says. A signing program left to run under the launchd service can wait forever on a prompt nobody sees (`ac-sign` waiting on AppleConnect did), and the turn would never end. Those commits never reach the default branch anyway; the squash replaces them. When a project checkout's `commit.gpgsign` is true (`git -C config --type=bool --get commit.gpgsign` prints it), the squash commit of a merge is signed on the merging user's most recently active Mac, so a key that never leaves that Mac's Secure Enclave and needs a fingerprint works. The Mac runs its own git signing config, as git does: `gpg.format` (`openpgp` or `x509`; `ssh` is not supported), the program when it isn't `gpg`/`gpgsm`, and `user.signingkey` when the program can't find the key from the user's byre git identity (not the Mac's `user.email`). The program must print `[GNUPG:] SIG_CREATED ` on its status fd, as git requires. A Touch ID prompt left unanswered for 2 minutes fails the merge. The notes commit is not signed. `byre signing ` turns it on for a project; agents learn it from the `signing` knowledge-base article. It sets `commit.gpgsign` true in the checkout; a global `commit.gpgsign` true on the server does the same for every project. Agents' own `git commit` in a task worktree reads that config and runs the signing program on the server. No restart is needed; `git -C cat-file commit HEAD` shows the `gpgsig` header. diff --git a/hands/Sources/byre-hands/Chrome.swift b/hands/Sources/byre-hands/Chrome.swift index 8fdb370..965d301 100644 --- a/hands/Sources/byre-hands/Chrome.swift +++ b/hands/Sources/byre-hands/Chrome.swift @@ -371,16 +371,21 @@ func consoleLine(_ level: String, _ text: String, _ url: String?, _ line: Int?) // into this profile. A live port alone does not identify our browser. func chromeFromProfile() async -> Chrome? { let activePort = URL(filePath: chromeProfile).appending(path: "DevToolsActivePort") - guard let text = try? String(contentsOf: activePort, encoding: .utf8) else { return nil } + guard let text = try? String(contentsOf: activePort, encoding: .utf8) else { + return nil + } let lines = text.split(whereSeparator: \.isNewline) - guard lines.count == 2, let port = Int(lines[0]), (1...65535).contains(port), - lines[1].hasPrefix("/devtools/browser/") else { return nil } + guard lines.count == 2, let port = Int(lines[0]), (1...65535).contains(port), lines[1].hasPrefix("/devtools/browser/") else { + return nil + } var endpoint = URLComponents() endpoint.scheme = "ws" endpoint.host = "127.0.0.1" endpoint.port = port endpoint.path = String(lines[1]) - guard let url = endpoint.url else { return nil } + guard let url = endpoint.url else { + return nil + } let chrome = Chrome(url) do { _ = try await chrome.send("Browser.getVersion", timeout: 2) diff --git a/internal/agents/clients.go b/internal/agents/clients.go index aa4b785..3c5c140 100644 --- a/internal/agents/clients.go +++ b/internal/agents/clients.go @@ -96,10 +96,10 @@ func (m *Manager) clientTools(l *live) []mcp.Tool { }, { Name: "show_page", - Description: "Show the human a file from the Mac byre runs on, or a website, in byre's app on a client Mac, rendered in the page view beside this task's transcript, as a browser would show it: an HTML page (loading the stylesheets, scripts and images beside it), a PDF, an image, or (with url) a web page in a new tab. " + + Description: "Show the human a file from the Mac byre runs on, or a website, in byre's app on a client Mac, rendered in the Page view beside this task's transcript, as a browser would show it: an HTML page (loading the stylesheets, scripts and images beside it), a PDF, an image, or (with url) a web page in a new tab. " + "A page loads other files only by relative paths (style.css, ../img/cat.png); absolute paths and file:// addresses don't load. " + "Whenever you write or change a file the human should see as it looks (an HTML mockup or preview, a PDF, an image, an SVG), show it with this before your turn ends, without being asked or asking first. " + - "When work needs a website (a developer console, a dashboard, a settings page), open it with url and work in it with drive_page rather than asking the human to open it; the page view keeps its sign-ins, so ask the human only to sign in. " + + "When work needs a website (a developer console, a dashboard, a settings page), open it with url and work in it with drive_page rather than asking the human to open it; the Page view keeps its sign-ins, so ask the human only to sign in. " + "Show it on the Mac the human's latest message was sent from.", InputSchema: json.RawMessage(`{ "type": "object", @@ -116,19 +116,19 @@ func (m *Manager) clientTools(l *live) []mcp.Tool { }, { Name: "drive_page", - Description: "Work in the tabs of this task's page view in byre's app on a client Mac, which show_page opened: the human sees each step there as it happens. " + + Description: "Work in the tabs of this task's Page view in byre's app on a client Mac, which show_page opened: the human sees each step there as it happens. " + "It needs no mouse or keyboard, so it never disturbs the human. " + "ops: tabs (list the tabs: number, title, address, and which one shows), navigate (load url in the tab and wait for it), " + "js (run code in the tab's page: the body of an async function, so await works and return gives the result; strings come back as they are, other values as JSON; use it to read the DOM, click (element.click()) and fill fields (set value, then dispatch input and change events)), " + - "capture (see the tab as it's drawn; only the tab the page view shows can be captured, and only while the human has the page view open). " + - "Without tab, it acts on the tab the page view shows. Links that open a new window open as new tabs. " + + "capture (see the tab as it's drawn; only the tab the Page view shows can be captured, and only while the human has the Page view open). " + + "Without tab, it acts on the tab the Page view shows. Links that open a new window open as new tabs. " + "A page's alert, confirm or prompt asks the human, and the js call waits for the answer; while the tab isn't showing, they answer Cancel at once.", InputSchema: json.RawMessage(`{ "type": "object", "properties": { "client": {"type": "string", "description": "The client's name from list_clients, or its id when several are connected from that Mac."}, "op": {"type": "string", "enum": ["tabs", "navigate", "js", "capture"]}, - "tab": {"type": "integer", "description": "The tab's number from tabs (default: the tab the page view shows)."}, + "tab": {"type": "integer", "description": "The tab's number from tabs (default: the tab the Page view shows)."}, "url": {"type": "string", "description": "For navigate."}, "code": {"type": "string", "description": "For js."} }, @@ -520,7 +520,7 @@ func (m *Manager) show(ctx context.Context, l *live, raw json.RawMessage, tool s return "", err } if op == api.OpenPage && fi.IsDir() { - return "", fmt.Errorf("%s is a directory; the page view shows a file", args.Path) + return "", fmt.Errorf("%s is a directory; the Page view shows a file", args.Path) } shown := full diff --git a/internal/agents/inbox.go b/internal/agents/inbox.go index e6b7eea..1706eb8 100644 --- a/internal/agents/inbox.go +++ b/internal/agents/inbox.go @@ -47,7 +47,7 @@ func (m *Manager) askTool(l *live) mcp.Tool { "so the human can compare them at a glance. " + "End your turn after asking; the answer arrives as your next message. " + "An answer of \"Use your judgment for this decision and continue within the existing task instructions.\" lets you settle that one decision yourself; " + - "it never grants an authorization the owner must give explicitly, such as to deploy, push or commit: ask for that on its own. " + + "it never grants an authorization the human must give explicitly, such as to deploy, push or commit: ask for that on its own. " + "One call is one decision, answered by picking from its own choices. When you have several decisions, such as a design with several choices, " + "never bundle them into one call that asks for approval of them all: call this once per decision, each with its own context and choices; they are answered together.", InputSchema: json.RawMessage(`{ diff --git a/internal/agents/kb/client-exec.md b/internal/agents/kb/client-exec.md index f5d4b36..bfa0a97 100644 --- a/internal/agents/kb/client-exec.md +++ b/internal/agents/kb/client-exec.md @@ -2,7 +2,7 @@ How a script or plain shell runs a command on a client Mac without an agent (byr # Running commands on a client Mac from a shell -`client_bash` needs an agent. For a script or plain shell on the machine byre runs on, such as a wrapper that fetches a token from the human's Mac, use: +`client_bash` needs an agent. For a script or plain shell on the Mac byre runs on, such as a wrapper that fetches a token from the human's Mac, use: ``` byre client-exec [--client NAME] [--timeout SECS] -- CMD... diff --git a/internal/agents/kb/signing.md b/internal/agents/kb/signing.md index 9fe2920..601ccb9 100644 --- a/internal/agents/kb/signing.md +++ b/internal/agents/kb/signing.md @@ -2,11 +2,11 @@ How byre signs merge commits on the merging user's Mac, and how to turn it on fo # Signing merge commits -byre never signs with a key on the machine it runs on: its own end-of-turn and snapshot commits there are always unsigned. When a project checkout (or the server's global config) has `commit.gpgsign` true, the squash commit of a Merge or `merge_to_main` is signed on the merging user's most recently active connected Mac, so a key that never leaves that Mac (a Secure Enclave key behind Touch ID, say) works. The merge fails when that user has no app connected. +byre never signs with a key on the Mac it runs on: its own end-of-turn and snapshot commits there are always unsigned. When a project checkout (or the server's global config) has `commit.gpgsign` true, the squash commit of a Merge or `merge_to_main` is signed on the merging user's most recently active connected Mac, so a key that never leaves that Mac (a Secure Enclave key behind Touch ID, say) works. The merge fails when that user has no app connected. ## Turning it on -Run, on the machine byre runs on: +Run, on the Mac byre runs on: ``` byre signing diff --git a/internal/agents/lead.go b/internal/agents/lead.go index 05eeb75..0397b99 100644 --- a/internal/agents/lead.go +++ b/internal/agents/lead.go @@ -15,7 +15,7 @@ import ( ) 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 that task agents ask, errors and rate limits their sessions hit, turns they finish with their final message, a task's agent saying the task is ready to merge (with its overview of the whole task, which byre asks for once the review of its latest work has finished and its turn has ended) or suggesting the human discard it (with its reasoning), questions the human answered, tasks created, reviews started and finished, a merge held behind another task's or set to start after the review (and that canceled or dropped), starting to merge, merged or discarded, and every change of a task's state, as " state: → ." listed first among what happened at the same moment. State changes, reviews starting, and tasks the human created or started merging never wake you on their own; they arrive only alongside another signal. A task merged or discarded always wakes you, whoever closed it. The states are running, idle, finished (a workflow stage's task once its finish_stage has taken), 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 or finished. 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. +- Signals: byre sends you, as messages from byre, what happens across tasks: questions that task agents ask, errors and rate limits their sessions hit, turns they finish with their final message, a task's agent saying the task is ready to merge (with its overview of the whole task, which byre asks for once the review of its latest work has finished and its turn has ended) or suggesting the human discard it (with its reasoning), questions the human answered, tasks created, reviews started and finished, a merge held behind another task's or set to start after the review (and that canceled or dropped), starting to merge, merged or discarded, and every change of a task's state, as " state: → ." listed first among what happened at the same moment. State changes, reviews starting, and tasks the human created or started merging never wake you on their own; they arrive only alongside another signal. A task merged or discarded always wakes you, whoever closed it. The states are running, idle, finished (a workflow stage's task once its finish_stage has taken), review_pending, reviewing, asking (it has an open question), ready_to_merge and discard_suggested (the agent's ready_for_merge or suggest_discard still stands), merge_held (its Merge waits for another merge in the project), merge_after_review (its Merge waits for the running review), merging, pushing (byre is pushing the merge's squash commit), discarding, merged, discarded and no_agent (it has no live 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 or finished. 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. When it says the human has watched an agent work for 10 seconds, byre sends it only while another task has something waiting on them, so something does. Show them the next thing that needs them, most urgent first (questions, then errors in the task's transcript, then finished turns, then tasks ready to merge or suggested for discarding), with one line saying what it is. If nothing needs them, show that project with no task, 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//, for example [Fix login redirect](#/todo/prj3f2a9C1b7dQ/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. - Whenever you suggest new work that isn't in TODO.md (a task you think is worth doing, an improvement to byre or to your own role), write it as a link to #/suggest///<brief>, both URL-encoded with parentheses as %28 and %29, for example [Lead tool for admin status](#/suggest/prj3f2a9C1b7dQ/Lead%20tool%20for%20admin%20status/Add%20a%20lead%20tool%20that%20reads%20%2Fapi%2Fadmin%2Fstatus%20...). The brief is the new task agent's whole first message, so make it a complete brief, as for create_task. byre draws the link with two buttons: Start creates the task with that title and brief at once, without you, and Discuss sends you a message asking to talk the suggestion over. Once an active task has that title, it shows the task's state instead. Don't ask whether to start a suggestion; the buttons do that. @@ -32,7 +32,7 @@ const leadGuidance = `You are the human's lead agent in byre, shown in the left - Dig into context with list_tasks, read_transcript, read_inbox and read_status (vendor rate limits and agent health), and with your own Read, Grep and Bash on a task's worktree path (from list_tasks). Don't edit files in task worktrees; ask the task's agent with send_message. - You can create tasks, start TODO items, message, interrupt and compact task agents, and merge or discard tasks. Merge pushes to the default branch and Discard destroys work: do either only when the human asks for it. - Setup: when the human asks you to set byre up, or about the tools or macOS permissions its agents need, read the setup knowledge-base article and walk them through it, running its checks and fixes yourself with your own Bash on this Mac and with list_clients and client_bash on their Macs. Never restart byre with launchctl or tell the human to; the article says how. -- Projects: when the human asks you to add a project, create it with create_project from its name and the path of its git repository on this machine. When they only hint at where it is, find it yourself. When they ask for a new one, make a local-only repository (git init, no remote, an empty first commit) where they say, or in a sensible place if they don't, and add that. +- Projects: when the human asks you to add a project, create it with create_project from its name and the path of its git repository on this Mac. When they only hint at where it is, find it yourself. When they ask for a new one, make a local-only repository (git init, no remote, an empty first commit) where they say, or in a sensible place if they don't, and add that. - Workflows: you manage the server's workflows with list_workflows, read_workflow, save_workflow and delete_workflow, and run one by giving its name to create_task or start_todo. A workflow is a tree of steps run in order, each a stage, an order, a parallel or a random (one of its weighted steps, picked when the run starts); every stage runs as its own task on the stage's model once the step before it has finished, so stages fan out (a parallel after a stage) and fan in (a stage after a parallel); a stage's agent calls finish_stage to hand its output to the stages after it, signals tell you when a stage starts and when the workflow finishes, and the workflow finishes once every stage has; byre then discards the run's other stage tasks, leaving the task of each last stage (one per branch when it ends in a parallel) to merge. Each last stage's agent is asked whether its task is ready to merge as soon as its own stage has finished and been reviewed, without waiting for the other last stages. Whenever you show or propose a workflow, draw it as a fenced diagram block (its format is the diagrams knowledge-base article) of its stage names only, with no models: one row per step, a parallel's stages side by side in one row, and an arrow into each stage from the stages before it. For example, rows holding Build; Review and Test; Fix, with the arrows "build -> review", "build -> test", "review -> fix" and "test -> fix". - Schedules: when the human asks for work to run on a timer (every Monday, nightly), you manage it with list_schedules, save_schedule and delete_schedule; the human sees and edits the same schedules on the project's dashboard. Every schedule runs a saved workflow: for a one-agent chore, save a one-stage workflow with save_workflow first. On each run, byre starts the schedule's workflow as create_task with workflow would, created by byre, and you get its created signal; a run that fails to start reaches you as a signal. - Whenever you name a task in a message, link it as a Markdown link to #/task/<task_id>, for example [Fix login redirect](#/task/tskDa7e4K7305e). byre draws it in that task's color, and clicking it shows the task in the right pane. To also open one of its other views over the human's left pane, append it: #/task/<task_id>/<view>, where view is changes, files, terminal or board. To show a project's dashboard in the right pane, link to #/project/<project_id>. diff --git a/internal/agents/leadtools.go b/internal/agents/leadtools.go index 32a5dd1..444d2cf 100644 --- a/internal/agents/leadtools.go +++ b/internal/agents/leadtools.go @@ -313,7 +313,7 @@ func (m *Manager) leadTools(l *live) []mcp.Tool { }), tool("create_project", - "Add a project to byre for the human: name it, and give the path of a git repository on this machine. "+ + "Add a project to byre for the human: name it, and give the path of a git repository on this Mac. "+ "byre records the repository's root and default branch. Returns the project as JSON.", `{"type": "object", "properties": { "name": {"type": "string"}, diff --git a/internal/agents/preview.go b/internal/agents/preview.go index 444052d..676f27a 100644 --- a/internal/agents/preview.go +++ b/internal/agents/preview.go @@ -156,7 +156,8 @@ func (m *Manager) servePreview(port int) error { upgrade.Method = http.MethodPost check = &upgrade } - if err := protection.Check(check); err != nil { + err := protection.Check(check) + if err != nil { http.Error(w, err.Error(), http.StatusForbidden) return } diff --git a/internal/api/api.gen.go b/internal/api/api.gen.go index 7a4d2fc..fb04b1f 100644 --- a/internal/api/api.gen.go +++ b/internal/api/api.gen.go @@ -846,10 +846,10 @@ type ClientRequest struct { // Path download, read_file, write_file: the file (or, for download, file or directory) on the client, absolute or starting with ~/. open_page, open_file: the file (or, for open_file, file or directory, a directory ending in /) on the server, absolute or relative to the task's worktree. Path *string `json:"path,omitempty"` - // Tab page_navigate, page_js, page_capture: the tab, by the number page_tabs lists; absent for the tab the page view shows. + // Tab page_navigate, page_js, page_capture: the tab, by the number page_tabs lists; absent for the tab the Page view shows. Tab *int `json:"tab,omitempty"` - // Task open_page, open_file: the task beside whose transcript the app shows the file: open_page in its page view, open_file in its Files tab. page_tabs, page_navigate, page_js, page_capture: the task whose page view tabs they act on. + // Task open_page, open_file: the task beside whose transcript the app shows the file: open_page in its Page view, open_file in its Files tab. page_tabs, page_navigate, page_js, page_capture: the task whose Page view tabs they act on. Task *string `json:"task,omitempty"` // TimeoutMs bash, exec, sign: kill the process group after this long. @@ -5151,328 +5151,328 @@ var swaggerSpec = []string{ "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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 dc18b8c..e31536a 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -56,7 +56,8 @@ func New(dataDir string, ts *tsnet.Server, token string) (*Server, error) { } // Also protect existing installations: descendants include transcripts, // credentials and the bearer URLs used by local agent listeners. - if err := os.Chmod(dataDir, 0o700); err != nil { + err = os.Chmod(dataDir, 0o700) + if err != nil { return nil, err } diff --git a/mac/Sources/Byre/Pages.swift b/mac/Sources/Byre/Pages.swift index bb16129..9ee30d4 100644 --- a/mac/Sources/Byre/Pages.swift +++ b/mac/Sources/Byre/Pages.swift @@ -102,7 +102,7 @@ extension Store { func pageTabs(_ taskId: String) -> String { guard let shown = shownPages[taskId] else { - return "This task's page view has no tabs; open one with show_page." + return "This task's Page view has no tabs; open one with show_page." } return shown.pages.map { page in var line = "tab \(pages.tab(page)): \(page.title(self))" @@ -118,12 +118,12 @@ extension Store { func drivenPage(_ taskId: String, _ tab: Int?) throws -> WKWebView { guard let shown = shownPages[taskId] else { - throw ApiError(status: 0, message: "this task's page view has no tabs; open one with show_page") + throw ApiError(status: 0, message: "this task's Page view has no tabs; open one with show_page") } var page = shown.current if let tab { guard let p = shown.pages.first(where: { pages.tab($0) == tab }) else { - throw ApiError(status: 0, message: "this task's page view has no tab \(tab); drive_page tabs lists them") + throw ApiError(status: 0, message: "this task's Page view has no tab \(tab); drive_page tabs lists them") } page = p } @@ -270,7 +270,7 @@ final class Pages { #if os(macOS) func capture(_ view: WKWebView) async throws -> Data { guard unsafe view.window != nil, !view.isHiddenOrHasHiddenAncestor else { - throw ApiError(status: 0, message: "the tab isn't on screen: the human has the page view closed or another tab showing") + throw ApiError(status: 0, message: "the tab isn't on screen: the human has the Page view closed or another tab showing") } let image = try await view.takeSnapshot(configuration: nil) guard let tiff = image.tiffRepresentation, let png = NSBitmapImageRep(data: tiff)?.representation(using: .png, properties: [:]) else { @@ -281,7 +281,7 @@ final class Pages { #else func capture(_ view: WKWebView) async throws -> Data { guard view.window != nil, !view.isHidden else { - throw ApiError(status: 0, message: "the tab isn't on screen: the human has the page view closed or another tab showing") + throw ApiError(status: 0, message: "the tab isn't on screen: the human has the Page view closed or another tab showing") } let image = try await view.takeSnapshot(configuration: nil) guard let png = image.pngData() else { diff --git a/mac/Sources/Byre/Reviews.swift b/mac/Sources/Byre/Reviews.swift index 1e14940..83e2f88 100644 --- a/mac/Sources/Byre/Reviews.swift +++ b/mac/Sources/Byre/Reviews.swift @@ -288,7 +288,7 @@ struct FindingActions: View { try await mark(.fixed) } catch { busy = false - overlays.showAlert("fix sent, but not recorded: \(errorText(error))") + overlays.showAlert("Fix sent, but not recorded: \(errorText(error))") } } } diff --git a/site/index.html b/site/index.html index ca306f7..473caf0 100644 --- a/site/index.html +++ b/site/index.html @@ -1324,7 +1324,7 @@ footer { <div class="win"> <div class="bar"><i></i><i></i><i></i>website</div> <div class="body"> -<div class="msg">Two takes on the pricing page are in the page view.</div> +<div class="msg">Two takes on the pricing page are in the Page view.</div> <div class="msg you">the second one, with yearly prices</div> <div class="row"><i class="live"></i><span class="muted">working</span></div> </div>