The agent's status is the CLI's word, not whether a process runs
Desktop said "running" as soon as `lembas service run` was started, while the CLI was still dialling, waiting for a terminal that holds the link, or refused by the server -- the reason went only to agent.log. Now the supervisor reads what the CLI itself writes: `service.json` in its state directory (connecting, linked, waiting + why, stopped + why) for the pid it started, the line it printed before that, and its last line when it ends. A service the app did not start is described the same way. A run the CLI ends with 0 because trying again will not help (a refused token, no login) is no longer restarted every second: it waits five minutes, or until linking again starts it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
4 files changed
+323
-20
No files matched your search
+13
-3
@@ -9,8 +9,10 @@ const AGENT = {
|
||||
off: () => [t("The agent is off."), ""],
|
||||
not_linked: () => [t("This computer is not linked to the server yet."), ""],
|
||||
starting: () => [t("The agent is starting…"), ""],
|
||||
connecting: () => [t("The agent is connecting to the server…"), ""],
|
||||
running: () => [t("The agent is running: agent chats can use this computer."), "is-ok"],
|
||||
elsewhere: (pid) => [t("A LLeMbas CLI service already runs here (pid %(pid)s); it is this computer's agent.", { pid }), "is-ok"],
|
||||
waiting: (why) => [t("The agent is not connected: %(why)s. It keeps trying.", { why }), "is-error"],
|
||||
refused: (why) => [t("The agent will not connect: %(why)s. Link this computer again.", { why }), "is-error"],
|
||||
failed: (why) => [t("The agent stopped: %(why)s. Trying again shortly.", { why }), "is-error"],
|
||||
}
|
||||
|
||||
@@ -18,10 +20,18 @@ let folderError = ""
|
||||
let linking = null // { user_code, uri } while the computer is being linked
|
||||
let linkError = ""
|
||||
|
||||
/** The agent's state in a sentence, and its class: the CLI's word for its link. */
|
||||
export function agentWords(s) {
|
||||
const a = s.agent
|
||||
const noFolders = s.remote && !(s.remote.enabled && s.remote.roots.length)
|
||||
if (s.agent.state === "running" && noFolders) return [t("The agent is connected, but may open no folder yet: add one below."), "is-error"]
|
||||
return (AGENT[s.agent.state] ?? AGENT.off)(s.agent.detail)
|
||||
if (a.state === "elsewhere") {
|
||||
const pid = a.detail?.pid
|
||||
if (!a.detail?.linked) return [t("A LLeMbas CLI service already runs here (pid %(pid)s), but is not connected: %(why)s", { pid, why: a.detail?.why || "…" }), "is-error"]
|
||||
if (noFolders) return [t("The agent is connected, but may open no folder yet: add one below."), "is-error"]
|
||||
return [t("A LLeMbas CLI service already runs here (pid %(pid)s); it is this computer's agent.", { pid }), "is-ok"]
|
||||
}
|
||||
if (a.state === "running" && noFolders) return [t("The agent is connected, but may open no folder yet: add one below."), "is-error"]
|
||||
return (AGENT[a.state] ?? AGENT.off)(a.detail || "…")
|
||||
}
|
||||
|
||||
function section(id, title, ...body) {
|
||||
|
||||
Reference in new issue
Block a user