ci / check (push) Failing after 3s
- Settings… lists the folders the agent may work in, with the system's folder dialog, remove, max mode and terminal, all through 'lembas remote … --json' (CLI 1.2.0). Turning the agent on with no folder opens it; the title bar says 'agent: no folders' instead of green. - The content webview's User-Agent carries LLeMbasDesktop/<v> (host=…), so the server can show this computer's device as Local. - The title bar menu pops up at the button (popup_menu_at): Wayland gave the pointer-less popup the middle of the window. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
63 lines
2.4 KiB
JavaScript
63 lines
2.4 KiB
JavaScript
// The title bar. Moving and double-click maximising come from `data-tauri-drag-region`; the
|
|
// buttons call the window directly; the menu and the agent pill open the app's native menu (the
|
|
// tray's items), which can reach past this 36-pixel-high page.
|
|
"use strict"
|
|
|
|
const { invoke } = window.__TAURI__.core
|
|
const { listen } = window.__TAURI__.event
|
|
const win = window.__TAURI__.window.getCurrentWindow()
|
|
|
|
const $ = (id) => document.getElementById(id)
|
|
|
|
const WORDS = {
|
|
off: "agent off",
|
|
not_linked: "not linked",
|
|
starting: "agent starting…",
|
|
running: "agent running",
|
|
elsewhere: "agent running (service)",
|
|
failed: "agent stopped",
|
|
no_folders: "agent: no folders",
|
|
}
|
|
|
|
function render(s) {
|
|
let host = ""
|
|
try {
|
|
host = s.server ? new URL(s.server).host : ""
|
|
} catch {}
|
|
$("host").textContent = host
|
|
$("host").title = s.server || ""
|
|
// Connected but allowed into no folder: a green light would say it works when it cannot.
|
|
const noFolders = s.remote && !(s.remote.enabled && s.remote.roots.length)
|
|
const state = s.agent.state === "running" && noFolders ? "no_folders" : s.agent.state
|
|
$("agent").dataset.state = state
|
|
$("agent-text").textContent = WORDS[state] ?? state
|
|
$("agent").title = state === "failed" ? `Agent stopped: ${s.agent.detail}` : "Agent"
|
|
$("update").hidden = !s.update
|
|
$("update").textContent = s.update ? `update ${s.update}` : "update"
|
|
$("update").title = s.update ? `LLeMbas ${s.update} is available (this is ${s.version})` : ""
|
|
}
|
|
|
|
function maximized(on) {
|
|
const b = $("maximize")
|
|
b.toggleAttribute("data-maximized", on)
|
|
b.setAttribute("aria-label", on ? "Restore" : "Maximise")
|
|
b.title = on ? "Restore" : "Maximise"
|
|
}
|
|
|
|
$("minimize").addEventListener("click", () => win.minimize())
|
|
$("maximize").addEventListener("click", () => win.toggleMaximize())
|
|
$("close").addEventListener("click", () => win.close())
|
|
$("update").addEventListener("click", () => invoke("update_app"))
|
|
// The menu opens under the button that was clicked: its bottom-left corner, in page pixels.
|
|
function menuAt(button) {
|
|
const r = button.getBoundingClientRect()
|
|
return invoke("titlebar_menu", { x: r.left, y: r.bottom })
|
|
}
|
|
$("menu").addEventListener("click", (e) => menuAt(e.currentTarget))
|
|
$("agent").addEventListener("click", (e) => menuAt(e.currentTarget))
|
|
|
|
listen("status", (e) => render(e.payload))
|
|
listen("maximized", (e) => maximized(!!e.payload))
|
|
invoke("get_status").then(render)
|
|
win.isMaximized().then(maximized)
|