The activity panel beside a chat, from /api/v2's activity routes: Context
(used share, tokens against the window, a segmented bar and a row per
category), Outputs (the files written, lines added and removed, each opening
in the viewer), Background tasks (a team's members as a tree, helpers and
commands: state, elapsed time counting on between reads, model, latest step,
what it is writing, its whole conversation read-only, Stop -- a member after
a confirmation, as it takes those under it), the team's room (who to whom,
reports marked, the words through the page's own markdown) and the plan.
The chat follows GET /chats/{chat}/activity/events while it is open: the strip
above the message box sums the agents up and opens the panel; a new version
reads the panel again while it is open, the costly context part on opening,
after a reply and at most every 15 s. The stream is reopened when the server
closes it, and more slowly while it fails. Beside the chat on a wide window
(the viewer then goes over the chat), over it below --bp-wide, a full-height
sheet at --bp-narrow. The header's Activity button, the palette and Escape
open and close it.
An agent chat with a device session (device_session_id) can be continued in a
terminal: the chat's menu and a header button show 'cd <folder> && lembas -s
<id>' to copy, with lembas the CLI as it starts here (on PATH, else the app's
own copy by its path). Shown rather than run: no terminal opens the same way
on every desktop.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
136 lines
7.2 KiB
HTML
136 lines
7.2 KiB
HTML
<!doctype html>
|
|
<html lang="en" data-theme="moria" data-base="moria">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<meta name="color-scheme" content="dark light">
|
|
<title>LLeMbas</title>
|
|
<link rel="stylesheet" href="tokens.css">
|
|
<link rel="stylesheet" href="app.css">
|
|
<script src="i18n.js"></script>
|
|
<script type="module" src="js/main.js"></script>
|
|
</head>
|
|
<body>
|
|
<div class="app">
|
|
<header class="bar" data-tauri-drag-region>
|
|
<button class="bar__btn bar__side" id="side-toggle" type="button" aria-label="Chats" title="Chats" aria-expanded="false" aria-controls="side" data-i18n-aria-label data-i18n-title></button>
|
|
<img class="bar__leaf" src="logo-mark.svg" alt="" width="18" height="18" data-tauri-drag-region>
|
|
<span class="bar__name" data-tauri-drag-region><b>LL</b>e<b>M</b>bas</span>
|
|
<span class="bar__host" id="host" data-tauri-drag-region></span>
|
|
<button class="bar__update" id="update" type="button" hidden>update</button>
|
|
<button class="bar__agent" id="agent" type="button" title="Agent">
|
|
<span class="dot" aria-hidden="true"></span><span id="agent-text">agent off</span>
|
|
</button>
|
|
<button class="bar__btn" id="menu" type="button" aria-label="Menu" title="Menu" data-i18n-aria-label data-i18n-title></button>
|
|
<span class="bar__sep" aria-hidden="true"></span>
|
|
<button class="bar__btn" id="minimize" type="button" aria-label="Minimise" title="Minimise" data-i18n-aria-label data-i18n-title></button>
|
|
<button class="bar__btn" id="maximize" type="button" aria-label="Maximise" title="Maximise" data-i18n-aria-label data-i18n-title></button>
|
|
<button class="bar__btn bar__btn--close" id="close" type="button" aria-label="Close" title="Close (LLeMbas stays in the tray)" data-i18n-aria-label data-i18n-title></button>
|
|
</header>
|
|
|
|
<div class="setup" id="setup" hidden>
|
|
<main class="card" aria-labelledby="setup-title">
|
|
<header class="brand">
|
|
<img src="logo-mark.svg" alt="" width="40" height="40">
|
|
<div>
|
|
<h1 id="setup-title"><b>LL</b>e<b>M</b>bas</h1>
|
|
<p class="muted">Desktop <span id="setup-version"></span></p>
|
|
</div>
|
|
</header>
|
|
<div class="setup__body" id="setup-body"></div>
|
|
</main>
|
|
</div>
|
|
|
|
<div class="shell" id="shell" hidden data-side="false" data-viewer="false">
|
|
<nav class="side" id="side" aria-label="Chats" data-i18n-aria-label data-local="true" data-server="false">
|
|
<div class="switch" role="tablist">
|
|
<button type="button" role="tab" data-kind="agent" aria-selected="true" data-i18n>Agent</button>
|
|
<button type="button" role="tab" data-kind="chat" aria-selected="false" data-i18n>Chats</button>
|
|
</div>
|
|
<button type="button" class="btn btn--primary side__new" id="new-chat-btn"><span data-i18n>New agent chat</span></button>
|
|
<ul class="list" id="chat-list"></ul>
|
|
|
|
<section class="pane" id="pane-local" data-open="true" aria-labelledby="pane-local-h">
|
|
<div class="pane__head">
|
|
<button type="button" class="pane__toggle" aria-expanded="true" id="pane-local-h"><span data-i18n>This computer</span></button>
|
|
<button type="button" class="pane__btn" id="local-refresh" aria-label="Read again" title="Read again" data-i18n-aria-label data-i18n-title></button>
|
|
</div>
|
|
<div class="pane__body">
|
|
<div class="pane__where" id="local-where"></div>
|
|
<div class="pane__tree" id="local-tree"></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="pane" id="pane-server" data-open="false" aria-labelledby="pane-server-h">
|
|
<div class="pane__head">
|
|
<button type="button" class="pane__toggle" aria-expanded="false" id="pane-server-h"><span data-i18n>Server files</span></button>
|
|
<button type="button" class="pane__btn" id="server-refresh" aria-label="Read again" title="Read again" data-i18n-aria-label data-i18n-title></button>
|
|
</div>
|
|
<div class="pane__body">
|
|
<div class="pane__tree" id="server-tree"></div>
|
|
</div>
|
|
</section>
|
|
|
|
<button type="button" class="side__settings" id="settings-btn"></button>
|
|
</nav>
|
|
<div class="scrim" id="scrim" aria-hidden="true"></div>
|
|
|
|
<main class="main" id="main" aria-labelledby="chat-title">
|
|
<header class="head">
|
|
<h1 class="head__title" id="chat-title"></h1>
|
|
<div class="head__place" id="chat-place"></div>
|
|
<div class="head__tools" id="chat-tools"></div>
|
|
</header>
|
|
<div class="thread" id="thread">
|
|
<p class="thread__note is-error" id="thread-note" hidden></p>
|
|
<div class="new" id="new-chat" hidden></div>
|
|
<div class="messages" id="messages"></div>
|
|
</div>
|
|
<div class="cards" id="cards" hidden></div>
|
|
<div class="strip" id="activity-strip" hidden aria-live="polite"></div>
|
|
<form class="composer" id="composer" hidden data-running="false" data-drag="false">
|
|
<ul class="composer__files" id="composer-files" hidden></ul>
|
|
<button type="button" class="btn composer__attach" id="attach" aria-label="Attach files" title="Attach files" data-i18n-aria-label data-i18n-title></button>
|
|
<textarea id="composer-text" rows="1" placeholder="Message" aria-label="Message" data-i18n-placeholder data-i18n-aria-label></textarea>
|
|
<p class="composer__drop" aria-hidden="true" data-i18n>Drop the files to attach them</p>
|
|
<div class="composer__actions">
|
|
<button type="button" class="btn" id="stop" hidden data-i18n>Stop</button>
|
|
<button type="submit" class="btn btn--primary" id="send" data-i18n>Send</button>
|
|
</div>
|
|
</form>
|
|
</main>
|
|
|
|
<section class="settings" id="settings" hidden aria-labelledby="settings-title">
|
|
<header class="head">
|
|
<h1 class="head__title" id="settings-title" data-i18n>Settings</h1>
|
|
<div class="head__place"></div>
|
|
<div class="head__tools"><button type="button" class="pane__btn" id="settings-close" aria-label="Close" title="Close" data-i18n-aria-label data-i18n-title></button></div>
|
|
</header>
|
|
<div class="settings__body" id="settings-body"></div>
|
|
</section>
|
|
|
|
<aside class="activity" id="activity" hidden aria-labelledby="activity-title">
|
|
<header class="viewer__head activity__head">
|
|
<button type="button" class="pane__btn" id="activity-back" hidden aria-label="Back" title="Back" data-i18n-aria-label data-i18n-title></button>
|
|
<h2 class="viewer__name" id="activity-title"></h2>
|
|
<button type="button" class="pane__btn" id="activity-close" aria-label="Close the activity panel" title="Close the activity panel" data-i18n-aria-label data-i18n-title></button>
|
|
</header>
|
|
<div class="activity__body" id="activity-body"></div>
|
|
</aside>
|
|
|
|
<aside class="viewer" id="viewer" hidden aria-labelledby="viewer-name">
|
|
<header class="viewer__head">
|
|
<div class="viewer__id">
|
|
<h2 class="viewer__name" id="viewer-name"></h2>
|
|
<p class="viewer__where" id="viewer-where"></p>
|
|
</div>
|
|
<div class="viewer__modes" id="viewer-modes"></div>
|
|
<button type="button" class="pane__btn" id="viewer-close" aria-label="Close" title="Close" data-i18n-aria-label data-i18n-title></button>
|
|
</header>
|
|
<div class="viewer__body" id="viewer-body"></div>
|
|
</aside>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|