From 57d660c57f62da0e4964b3072a4878318f74fd00 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Wed, 21 Oct 2026 21:34:26 -0700 Subject: [PATCH] Open websites in the Page view and let agents drive them --- api/openapi.yaml | 11 +- docs/macos.md | 5 +- internal/agents/clients.go | 126 +++++- internal/api/api.gen.go | 737 ++++++++++++++++++---------------- mac/Info.plist | 2 + mac/Sources/Byre/Pages.swift | 272 +++++++++++-- mac/Sources/Byre/Remote.swift | 20 + mac/Sources/Byre/Store.swift | 3 + 8 files changed, 786 insertions(+), 390 deletions(-) diff --git a/api/openapi.yaml b/api/openapi.yaml index 4a48ed0..c20f6c1 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -2337,14 +2337,17 @@ components: description: Work a task agent, or a merge, asks a connected Mac to do, sent over /api/clients/connect. properties: id: { type: string } - op: { type: string, enum: [bash, exec, upload, download, read_file, write_file, hands, sign, open_page, open_file] } + op: { type: string, enum: [bash, exec, upload, download, read_file, write_file, hands, sign, open_page, open_file, page_tabs, page_navigate, page_js, page_capture] } command: { type: string, description: "bash, exec: run with zsh as a login shell in the home directory, in its own process group." } timeout_ms: { type: integer, description: "bash, exec, sign: kill the process group after this long." } ident: { type: string, description: "sign: the committer, as \"Name \", to sign as when the Mac's git config has no user.signingkey." } 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." } + 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." } + 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." } arguments: @@ -2363,10 +2366,10 @@ components: accepted: { type: boolean, description: "Set only on the first reply, which says the app received the request and started on it." } error: { type: string, description: Set when the request couldn't be carried out. } exit_code: { type: integer, description: "bash, exec, sign: the exit status, -1 when it was killed by its timeout." } - output: { type: string, description: "bash: stdout and stderr together, at most their last 64 KiB. sign: the signing program's stderr, where it writes its GnuPG status lines, and the login shell's output." } + output: { type: string, description: "bash: stdout and stderr together, at most their last 64 KiB. sign: the signing program's stderr, where it writes its GnuPG status lines, and the login shell's output. open_page, page_tabs, page_navigate, page_js: what the app did, for the agent." } stdout: { type: string, format: byte, description: "exec: everything the command wrote to stdout." } stderr: { type: string, format: byte, description: "exec: everything the command wrote to stderr." } - data: { type: string, format: byte, description: "read_file: the file's contents. sign: the detached signature." } + data: { type: string, format: byte, description: "read_file: the file's contents. sign: the detached signature. page_capture: a PNG of the tab." } result: type: object additionalProperties: true diff --git a/docs/macos.md b/docs/macos.md index a486d1b..40ab074 100644 --- a/docs/macos.md +++ b/docs/macos.md @@ -4,7 +4,7 @@ Platform constraints, build requirements and SwiftUI behavior observed live. ## Decision -**One web view only**: a task's Page view, which shows an HTML file from the task's worktree or one of its exposed previews in a `WKWebView`, in the attached sheet over the lead pane. Nothing else renders HTML: no `WKWebView` or `WebView` in the window, a dialog, Markdown, diagrams or the terminal. Any other link to a web page opens in the default browser. Mermaid needs a browser DOM, and its automatic layout can't give the banded, nested look of a hand-drawn architecture picture, so byre has its own ```` ```diagram ```` block (rows, nested boxes, a side column, routed arrows, named highlights), laid out on a grid by the app; its syntax is the `diagrams` knowledge-base article. It is byre's only diagram format: a ```` ```mermaid ```` block shows as code, and the workflow stage graphs are drawn by generating its source. Agents see their diagrams through the `render_diagram` tool, which runs the installed app's own binary as `Byre render-diagram` (source on stdin, PNG on stdout), so the picture is exactly what the transcript draws; that mode opens no window and never touches the app's iCloud-synced store, so it uses the default text size. byre's Markdown dialect (choice markers, `
` sections, `#/task/` links, worktree image paths, `NO_REPLY`) matches no library, so the app parses it itself. +**One web view only**: a task's Page view, which shows an HTML file from the task's worktree, one of its exposed previews, or a website an agent opened with `show_page`'s `url`, in a `WKWebView`, in the attached sheet over the lead pane. Nothing else renders HTML: no `WKWebView` or `WebView` in the window, a dialog, Markdown, diagrams or the terminal. Any other link to a web page opens in the default browser. Mermaid needs a browser DOM, and its automatic layout can't give the banded, nested look of a hand-drawn architecture picture, so byre has its own ```` ```diagram ```` block (rows, nested boxes, a side column, routed arrows, named highlights), laid out on a grid by the app; its syntax is the `diagrams` knowledge-base article. It is byre's only diagram format: a ```` ```mermaid ```` block shows as code, and the workflow stage graphs are drawn by generating its source. Agents see their diagrams through the `render_diagram` tool, which runs the installed app's own binary as `Byre render-diagram` (source on stdin, PNG on stdout), so the picture is exactly what the transcript draws; that mode opens no window and never touches the app's iCloud-synced store, so it uses the default text size. byre's Markdown dialect (choice markers, `
` sections, `#/task/` links, worktree image paths, `NO_REPLY`) matches no library, so the app parses it itself. The app joins the tailnet as its own node with libtailscale and reaches byre's HTTPS origin on byre's node, so byre knows who is calling from the node itself. It never sends identity headers, and certificate validation is never relaxed. @@ -35,7 +35,8 @@ Every build is signed for distribution outside the App Store: the team's Develop - The transcript is a plain `VStack` in a `ScrollView`, not lazy: a `LazyVStack` estimates the height of rows it hasn't shown yet and corrects it when they scroll into view, without moving the scroll offset, so scrolling up through rows not yet shown jumped by each correction; SwiftUI can't move the offset mid-scroll without stopping its momentum. - The terminal cursor is a steady block: SwiftTerm's blinking cursor restarts its Core Animation fade on every keypress, scheduled 0.7 s out, and on a ProMotion display macOS then holds the window's screen update until that fade starts, so each typed letter appears about 0.7 s late. SwiftTerm redraws the whole screen whenever a terminal color is set, even when its value hasn't changed. -- The Page view loads a worktree page from a plain-HTTP server the app runs on a loopback port (`http://127.0.0.1://`), which fetches each file through the server's `getTaskRaw` endpoint. The page's relative links to its stylesheets, scripts and images resolve to files beside it, and "↗ Browser" opens the same address. Previews load from their loopback forwards at `-.localhost`. App Transport Security blocks plain HTTP to `*.localhost` even with `NSAllowsLocalNetworking`; the `localhost` exception domain with subdomains in `Info.plist` allows it (loopback IP addresses need no exception). +- The Page view loads a worktree page from a plain-HTTP server the app runs on a loopback port (`http://127.0.0.1://`), which fetches each file through the server's `getTaskRaw` endpoint. The page's relative links to its stylesheets, scripts and images resolve to files beside it, and "↗ Browser" opens the same address. Previews load from their loopback forwards at `-.localhost`. App Transport Security blocks plain HTTP to `*.localhost` even with `NSAllowsLocalNetworking`; the `localhost` exception domain with subdomains in `Info.plist` allows it (loopback IP addresses need no exception). `NSAllowsArbitraryLoadsInWebContent` lets the Page view load plain-HTTP websites without lifting ATS for the app's own requests. +- Each Page view tab's `WKWebView` belongs to `Pages`, not to the SwiftUI view, so it keeps its page while the sheet is closed and agents can drive it with `drive_page` (navigate, JavaScript, capture) from the client connection. All tabs share WebKit's default persistent data store, so a site the human signs into stays signed in across launches. A link that opens a new window becomes a new tab of the same task. Capture refuses a tab that isn't on screen (sheet closed, or another tab showing), since its snapshot would show nothing the human sees. Passkey sign-in may fail, because WebKit allows WebAuthn in an embedded view only for apps with Apple's web browser entitlement; a password with a 2FA code works. ## Updates diff --git a/internal/agents/clients.go b/internal/agents/clients.go index f863211..f1f83f8 100644 --- a/internal/agents/clients.go +++ b/internal/agents/clients.go @@ -3,8 +3,10 @@ package agents import ( "context" "crypto/rand" + "encoding/base64" "encoding/json" "fmt" + "net/url" "os" "os/exec" "path/filepath" @@ -94,19 +96,45 @@ func (m *Manager) clientTools(l *live) []mcp.Tool { }, { Name: "show_page", - Description: "Show the human a file from the Mac byre runs on 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. " + + 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. " + "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. " + "Show it on the Mac the human's latest message was sent from.", 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."}, - "path": {"type": "string", "description": "The file, relative to your worktree, absolute, or starting with ~/."} + "path": {"type": "string", "description": "The file, relative to your worktree, absolute, or starting with ~/."}, + "url": {"type": "string", "description": "Instead of path: an http or https address to open in a new tab."} }, - "required": ["client", "path"] + "required": ["client"] }`), Handler: func(ctx context.Context, raw json.RawMessage) (string, error) { - return m.show(ctx, l, raw, "show_page", api.OpenPage) + return m.showPage(ctx, l, raw) + }, + }, + { + 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. " + + "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. " + + "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)."}, + "url": {"type": "string", "description": "For navigate."}, + "code": {"type": "string", "description": "For js."} + }, + "required": ["client", "op"] + }`), + Rich: func(ctx context.Context, raw json.RawMessage) mcp.Result { + return m.drivePage(ctx, l, raw) }, }, { @@ -391,6 +419,96 @@ func (m *Manager) clientOpen(ctx context.Context, l *live, raw json.RawMessage) return fmt.Sprintf("Opened %s on %s, copied to %s.", clean, args.Client, dest), nil } +type showPageArgs struct { + Client string `json:"client"` + Path string `json:"path"` + URL string `json:"url"` +} + +func (m *Manager) showPage(ctx context.Context, l *live, raw json.RawMessage) (string, error) { + args := showPageArgs{} + err := json.Unmarshal(raw, &args) + if err != nil { + return "", fmt.Errorf("malformed show_page call: %w", err) + } + if (args.Path == "") == (args.URL == "") { + return "", fmt.Errorf("show_page takes path or url, not both or neither") + } + if args.Path != "" { + return m.show(ctx, l, raw, "show_page", api.OpenPage) + } + u, err := url.Parse(args.URL) + if err != nil { + return "", fmt.Errorf("url %q: %w", args.URL, err) + } + if u.Scheme != "http" && u.Scheme != "https" { + return "", fmt.Errorf("url %q isn't http or https", args.URL) + } + cctx, cancel := context.WithTimeout(ctx, fileTimeout) + defer cancel() + reply, err := m.clients.Call(cctx, args.Client, api.ClientRequest{Op: api.OpenPage, Task: &l.taskID, Url: &args.URL}) + if err != nil { + return "", err + } + if reply.Output == nil { + return "", fmt.Errorf("%s's reply has no output", args.Client) + } + return fmt.Sprintf("Showing %s on %s: %s", args.URL, args.Client, *reply.Output), nil +} + +type drivePageArgs struct { + Client string `json:"client"` + Op string `json:"op"` + Tab *int `json:"tab"` + URL string `json:"url"` + Code string `json:"code"` +} + +func (m *Manager) drivePage(ctx context.Context, l *live, raw json.RawMessage) mcp.Result { + args := drivePageArgs{} + err := json.Unmarshal(raw, &args) + if err != nil { + return mcp.TextResult(fmt.Sprintf("malformed drive_page call: %s", err), true) + } + req := api.ClientRequest{Task: &l.taskID, Tab: args.Tab} + switch args.Op { + case "tabs": + req.Op = api.PageTabs + case "navigate": + if args.URL == "" { + return mcp.TextResult("navigate needs url", true) + } + req.Op = api.PageNavigate + req.Url = &args.URL + case "js": + if args.Code == "" { + return mcp.TextResult("js needs code", true) + } + req.Op = api.PageJs + req.Code = &args.Code + case "capture": + req.Op = api.PageCapture + default: + return mcp.TextResult(fmt.Sprintf("unknown op %q", args.Op), true) + } + cctx, cancel := context.WithTimeout(ctx, handsTimeout) + defer cancel() + reply, err := m.clients.Call(cctx, args.Client, req) + if err != nil { + return mcp.TextResult(err.Error(), true) + } + if req.Op == api.PageCapture { + if reply.Data == nil { + return mcp.TextResult(fmt.Sprintf("%s's reply has no data", args.Client), true) + } + return mcp.Result{Content: []mcp.Content{{Type: "image", Data: base64.StdEncoding.EncodeToString(*reply.Data), MimeType: "image/png"}}} + } + if reply.Output == nil { + return mcp.TextResult(fmt.Sprintf("%s's reply has no output", args.Client), true) + } + return mcp.TextResult(*reply.Output, false) +} + func (m *Manager) show(ctx context.Context, l *live, raw json.RawMessage, tool string, op api.ClientRequestOp) (string, error) { args := clientOpenArgs{} err := json.Unmarshal(raw, &args) diff --git a/internal/api/api.gen.go b/internal/api/api.gen.go index bec68a7..5d37f02 100644 --- a/internal/api/api.gen.go +++ b/internal/api/api.gen.go @@ -140,16 +140,20 @@ func (e AttachmentKind) Valid() bool { // Defines values for ClientRequestOp. const ( - Bash ClientRequestOp = "bash" - Download ClientRequestOp = "download" - Exec ClientRequestOp = "exec" - Hands ClientRequestOp = "hands" - OpenFile ClientRequestOp = "open_file" - OpenPage ClientRequestOp = "open_page" - ReadFile ClientRequestOp = "read_file" - Sign ClientRequestOp = "sign" - Upload ClientRequestOp = "upload" - WriteFile ClientRequestOp = "write_file" + Bash ClientRequestOp = "bash" + Download ClientRequestOp = "download" + Exec ClientRequestOp = "exec" + Hands ClientRequestOp = "hands" + OpenFile ClientRequestOp = "open_file" + OpenPage ClientRequestOp = "open_page" + PageCapture ClientRequestOp = "page_capture" + PageJs ClientRequestOp = "page_js" + PageNavigate ClientRequestOp = "page_navigate" + PageTabs ClientRequestOp = "page_tabs" + ReadFile ClientRequestOp = "read_file" + Sign ClientRequestOp = "sign" + Upload ClientRequestOp = "upload" + WriteFile ClientRequestOp = "write_file" ) // Valid indicates whether the value is a known member of the ClientRequestOp enum. @@ -167,6 +171,14 @@ func (e ClientRequestOp) Valid() bool { return true case OpenPage: return true + case PageCapture: + return true + case PageJs: + return true + case PageNavigate: + return true + case PageTabs: + return true case ReadFile: return true case Sign: @@ -778,7 +790,7 @@ type ClientReply struct { // Accepted Set only on the first reply, which says the app received the request and started on it. Accepted *bool `json:"accepted,omitempty"` - // Data read_file: the file's contents. sign: the detached signature. + // Data read_file: the file's contents. sign: the detached signature. page_capture: a PNG of the tab. Data *[]byte `json:"data,omitempty"` // Error Set when the request couldn't be carried out. @@ -790,7 +802,7 @@ type ClientReply struct { // Id The request's id. Id string `json:"id"` - // Output bash: stdout and stderr together, at most their last 64 KiB. sign: the signing program's stderr, where it writes its GnuPG status lines, and the login shell's output. + // Output bash: stdout and stderr together, at most their last 64 KiB. sign: the signing program's stderr, where it writes its GnuPG status lines, and the login shell's output. open_page, page_tabs, page_navigate, page_js: what the app did, for the agent. Output *string `json:"output,omitempty"` // Result hands: the tool's MCP CallToolResult. @@ -808,6 +820,9 @@ type ClientRequest struct { // Arguments hands: the tool's arguments. Arguments *map[string]interface{} `json:"arguments,omitempty"` + // Code page_js: the body of an async function to run in the tab's page; its return value is the result. + Code *string `json:"code,omitempty"` + // Command bash, exec: run with zsh as a login shell in the home directory, in its own process group. Command *string `json:"command,omitempty"` @@ -825,7 +840,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"` - // 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. + // 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 *string `json:"task,omitempty"` // TimeoutMs bash, exec, sign: kill the process group after this long. @@ -836,6 +854,9 @@ type ClientRequest struct { // Transfer upload: the transfer id to get from /api/clients/transfers/{transferId}. download: the transfer id to put the archive to. Transfer *string `json:"transfer,omitempty"` + + // Url open_page: a web address to open in a new tab instead of path. page_navigate: the address to load. + Url *string `json:"url,omitempty"` } // ClientRequestOp defines model for ClientRequest.Op. @@ -4769,349 +4790,353 @@ 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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", + "hbafr0zNiMRNmIgCBvgOmMmvRkn94cP/NwA=", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/mac/Info.plist b/mac/Info.plist index bbba5e3..bba3d31 100644 --- a/mac/Info.plist +++ b/mac/Info.plist @@ -26,6 +26,8 @@ NSAppTransportSecurity + NSAllowsArbitraryLoadsInWebContent + NSExceptionDomains localhost diff --git a/mac/Sources/Byre/Pages.swift b/mac/Sources/Byre/Pages.swift index 59d5a30..2fc0c27 100644 --- a/mac/Sources/Byre/Pages.swift +++ b/mac/Sources/Byre/Pages.swift @@ -8,10 +8,11 @@ import WebKit enum Page: Hashable { case file(taskId: String, path: String) case preview(taskId: String, port: Int) + case web(taskId: String, id: Int) var taskId: String { switch self { - case .file(let taskId, _), .preview(let taskId, _): taskId + case .file(let taskId, _), .preview(let taskId, _), .web(let taskId, _): taskId } } @@ -27,6 +28,7 @@ enum Page: Hashable { switch self { case .file(_, let path): (path as NSString).lastPathComponent case .preview(let taskId, let port): store.forwards.name(taskId, port) ?? "port \(port)" + case .web: store.pages.title(self) } } @@ -35,6 +37,7 @@ enum Page: Hashable { switch self { case .file(let taskId, let path): store.pages.url(taskId, path) case .preview(let taskId, let port): store.forwards.url(taskId, port) + case .web: store.pages.existing(self)?.url } } } @@ -61,10 +64,18 @@ extension Store { sheet = Sheet(owner: .task(page.taskId), view: .tab(.page)) } + func openWeb(_ taskId: String, _ url: URL) -> Int { + route("#/task/\(taskId)") + let page = pages.web(taskId, url) + openPage(page) + return pages.tab(page) + } + func closePage(_ page: Page) { guard var shown = shownPages[page.taskId], let i = shown.pages.firstIndex(of: page) else { return } + pages.drop(page) shown.pages.remove(at: i) if shown.pages.isEmpty { shownPages[page.taskId] = nil @@ -82,16 +93,67 @@ extension Store { func currentPage() -> Page? { selectedTaskId.flatMap { shownPages[$0]?.current } } + + func pageView(_ page: Page) -> WKWebView? { + if case .web = page { + return pages.existing(page) + } + return page.url(self).map { pages.view(page, $0) } + } + + 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 shown.pages.map { page in + var line = "tab \(pages.tab(page)): \(page.title(self))" + if let url = pages.existing(page)?.url ?? page.url(self) { + line += " — \(url.absoluteString)" + } + if page == shown.current { + line += " (showing)" + } + return line + }.joined(separator: "\n") + } + + 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") + } + 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") + } + page = p + } + guard let view = pageView(page) else { + throw ApiError(status: 0, message: "tab \(pages.tab(page)) isn't ready yet") + } + return view + } } @MainActor @Observable final class Pages { private(set) var port: Int? + private(set) var titles: [Page: String] = [:] @ObservationIgnored var served: [String: [String: Data]] = [:] + @ObservationIgnored var popup: ((Page) -> Void)? @ObservationIgnored private var listener: PageListener? + @ObservationIgnored private var views: [Page: WKWebView] = [:] + @ObservationIgnored private var sources: [Page: URL] = [:] + @ObservationIgnored private var titleWatches: [Page: NSKeyValueObservation] = [:] + @ObservationIgnored private var tabs: [Page: Int] = [:] + @ObservationIgnored private var lastTab = 0 + @ObservationIgnored private let delegate = PageDelegate() init(api: API) { + delegate.popup = { [weak self] opener, config in + self?.adopt(opener, config) + } listener = PageListener(api: api, ready: { [weak self] port in Task { @MainActor in self?.port = port @@ -115,6 +177,108 @@ final class Pages { return c.url } + func existing(_ page: Page) -> WKWebView? { + views[page] + } + + func view(_ page: Page, _ url: URL) -> WKWebView { + let view = views[page] ?? make(page, WKWebViewConfiguration()) + if sources[page] != url { + sources[page] = url + view.load(URLRequest(url: url)) + } + return view + } + + func web(_ taskId: String, _ url: URL) -> Page { + lastTab += 1 + let page = Page.web(taskId: taskId, id: lastTab) + make(page, WKWebViewConfiguration()).load(URLRequest(url: url)) + return page + } + + private func adopt(_ opener: WKWebView, _ config: WKWebViewConfiguration) -> WKWebView? { + guard let from = views.first(where: { $0.value === opener })?.key else { + return nil + } + lastTab += 1 + let page = Page.web(taskId: from.taskId, id: lastTab) + let view = make(page, config) + popup?(page) + return view + } + + private func make(_ page: Page, _ config: WKWebViewConfiguration) -> WKWebView { + config.websiteDataStore = .default() + let view = WKWebView(frame: .zero, configuration: config) + view.uiDelegate = delegate + view.navigationDelegate = delegate + views[page] = view + if case .web(_, let id) = page { + tabs[page] = id + titleWatches[page] = view.observe(\.title) { [weak self] view, _ in + Task { @MainActor in + self?.titles[page] = view.title + } + } + } + return view + } + + func drop(_ page: Page) { + views[page] = nil + sources[page] = nil + titleWatches[page] = nil + titles[page] = nil + tabs[page] = nil + } + + func tab(_ page: Page) -> Int { + if let tab = tabs[page] { + return tab + } + lastTab += 1 + tabs[page] = lastTab + return lastTab + } + + func title(_ page: Page) -> String { + if let title = titles[page], !title.isEmpty { + return title + } + return views[page]?.url?.host() ?? "page" + } + + func navigate(_ view: WKWebView, _ url: URL) async throws -> String { + try await delegate.wait(view.load(URLRequest(url: url))) + return "Loaded \(view.url?.absoluteString ?? url.absoluteString): \(view.title ?? "")" + } + + func js(_ view: WKWebView, _ code: String) async throws -> String { + let value = try await view.callAsyncJavaScript(code, contentWorld: .page) + guard let value, !(value is NSNull) else { + return value == nil ? "undefined" : "null" + } + if let s = value as? String { + return s + } + if let data = try? JSONSerialization.data(withJSONObject: value, options: [.fragmentsAllowed, .sortedKeys]) { + return String(decoding: data, as: UTF8.self) + } + return String(describing: value) + } + + 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") + } + let image = try await view.takeSnapshot(configuration: nil) + guard let tiff = image.tiffRepresentation, let png = NSBitmapImageRep(data: tiff)?.representation(using: .png, properties: [:]) else { + throw ApiError(status: 0, message: "couldn't encode the capture as PNG") + } + return png + } + func close() { listener?.close() listener = nil @@ -299,8 +463,8 @@ struct PageTabs: View { } ZStack { ForEach(shown.pages, id: \.self) { page in - if let url = page.url(store) { - WebPage(url: url, reloads: page.isFile ? watch.reloads : 0, shown: page == shown.current) + if let view = store.pageView(page) { + WebPage(view: view, reloads: page.isFile ? watch.reloads : 0, shown: page == shown.current, refresh: page.isFile) } else if page == shown.current { EmptyText(text: "Loading…") } @@ -352,21 +516,87 @@ private struct PageTabButton: View { } } -private struct WebPage: NSViewRepresentable { - let url: URL - let reloads: Int - let shown: Bool +@MainActor +private final class PageDelegate: NSObject, WKUIDelegate, WKNavigationDelegate { + var popup: ((WKWebView, WKWebViewConfiguration) -> WKWebView?)? + private var waits: [ObjectIdentifier: CheckedContinuation] = [:] - final class Coordinator: NSObject, WKUIDelegate { - var url: URL? - var reloads = 0 + func wait(_ navigation: WKNavigation?) async throws { + guard let navigation else { + return + } + try await withCheckedThrowingContinuation { c in + waits[ObjectIdentifier(navigation)] = c + } + } - func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for action: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { - if let url = action.request.url { - NSWorkspace.shared.open(url) - } + private func finish(_ navigation: WKNavigation?, _ error: (any Error)?) { + guard let navigation, let c = waits.removeValue(forKey: ObjectIdentifier(navigation)) else { + return + } + if let error { + c.resume(throwing: error) + } else { + c.resume() + } + } + + func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for action: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { + popup?(webView, configuration) + } + + func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo) async { + _ = await ask(webView, frame, message, buttons: ["OK"], field: nil) + } + + func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo) async -> Bool { + await ask(webView, frame, message, buttons: ["OK", "Cancel"], field: nil) == .alertFirstButtonReturn + } + + func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo) async -> String? { + let field = NSTextField(frame: NSRect(x: 0, y: 0, width: 300, height: 24)) + field.stringValue = defaultText ?? "" + guard await ask(webView, frame, prompt, buttons: ["OK", "Cancel"], field: field) == .alertFirstButtonReturn else { return nil } + return field.stringValue + } + + private func ask(_ webView: WKWebView, _ frame: WKFrameInfo, _ message: String, buttons: [String], field: NSTextField?) async -> NSApplication.ModalResponse { + guard let window = unsafe webView.window, !webView.isHiddenOrHasHiddenAncestor else { + return .cancel + } + let alert = NSAlert() + alert.messageText = frame.securityOrigin.host.isEmpty ? "This page says" : "\(frame.securityOrigin.host) says" + alert.informativeText = message + for title in buttons { + alert.addButton(withTitle: title) + } + alert.accessoryView = field + return await alert.beginSheetModal(for: window) + } + + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { + finish(navigation, nil) + } + + func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: any Error) { + finish(navigation, error) + } + + func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: any Error) { + finish(navigation, error) + } +} + +private struct WebPage: NSViewRepresentable { + let view: WKWebView + let reloads: Int + let shown: Bool + let refresh: Bool + + final class Coordinator { + var reloads = 0 } func makeCoordinator() -> Coordinator { @@ -374,22 +604,16 @@ private struct WebPage: NSViewRepresentable { } func makeNSView(context: Context) -> WKWebView { - let config = WKWebViewConfiguration() - config.websiteDataStore = .nonPersistent() - let view = WKWebView(frame: .zero, configuration: config) - view.uiDelegate = context.coordinator + context.coordinator.reloads = reloads + if refresh, !view.isLoading { + view.reload() + } return view } func updateNSView(_ view: WKWebView, context: Context) { view.isHidden = !shown let c = context.coordinator - if c.url != url { - c.url = url - c.reloads = reloads - view.load(URLRequest(url: url)) - return - } if c.reloads != reloads { c.reloads = reloads view.reload() diff --git a/mac/Sources/Byre/Remote.swift b/mac/Sources/Byre/Remote.swift index acfb0b2..c7f612d 100644 --- a/mac/Sources/Byre/Remote.swift +++ b/mac/Sources/Byre/Remote.swift @@ -190,11 +190,31 @@ final class Remote { let (code, status, signature) = try await sign(Data(req.data?.data ?? []), as: req.ident ?? "", timeoutMs: req.timeoutMs ?? 120_000) return ClientReply(id: req.id, exitCode: code, output: status, data: Base64EncodedData(signature)) case .openPage: + if let address = req.url { + guard let url = URL(string: address) else { + throw ApiError(status: 0, message: "\(address) isn't a URL") + } + return ClientReply(id: req.id, output: "tab \(store!.openWeb(req.task ?? "", url))") + } store!.showPage(req.task ?? "", req.path ?? "") return ClientReply(id: req.id) case .openFile: store!.showInFiles(req.task ?? "", req.path ?? "") return ClientReply(id: req.id) + case .pageTabs: + return ClientReply(id: req.id, output: store!.pageTabs(req.task ?? "")) + case .pageNavigate: + let view = try store!.drivenPage(req.task ?? "", req.tab) + guard let url = URL(string: req.url ?? "") else { + throw ApiError(status: 0, message: "\(req.url ?? "") isn't a URL") + } + return ClientReply(id: req.id, output: try await store!.pages.navigate(view, url)) + case .pageJs: + let view = try store!.drivenPage(req.task ?? "", req.tab) + return ClientReply(id: req.id, output: try await store!.pages.js(view, req.code ?? "")) + case .pageCapture: + let view = try store!.drivenPage(req.task ?? "", req.tab) + return ClientReply(id: req.id, data: Base64EncodedData(try await store!.pages.capture(view))) } } diff --git a/mac/Sources/Byre/Store.swift b/mac/Sources/Byre/Store.swift index bde9e6a..f216b0a 100644 --- a/mac/Sources/Byre/Store.swift +++ b/mac/Sources/Byre/Store.swift @@ -114,6 +114,9 @@ final class Store { paneFocus = PaneFocus(api: api) remote = Remote(api: api) remote.store = self + pages.popup = { [weak self] page in + self?.openPage(page) + } } func sends(_ key: String) -> LocalSends {