Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
6003aa9
Present current agent activity in individual composer popups
Oct 1, 2026
0c3a37f
Make activity prose readable and show latest actions first
Oct 1, 2026
3c10f34
Capture expanded activity and verify disclosure state through reordering
Oct 1, 2026
b7451bd
Restore activity menu icon and report separation
Oct 5, 2026
a0b2672
Checkpoint message-linked agent activity and thread resize behavior
Oct 8, 2026
0082e63
Track local agent work from receipt to finish, with live steps
morgmart Oct 11, 2026
09ee155
Move Claude activity to an acknowledged follow-up
morgmart Oct 12, 2026
c712edf
Adapt activity browser fixture to community-owned agents
morgmart Oct 12, 2026
fde01e8
Preserve activity outcomes and regression coverage after agent integr…
morgmart Oct 12, 2026
09ab096
Move Codex activity when a follow-up is accepted
morgmart Oct 12, 2026
4fad335
Open an active message thread before its first reply
morgmart Oct 12, 2026
0f22518
Retire activity focus safely and repair browser fixture collection
morgmart Oct 12, 2026
5b6b09f
Stabilize activity browser interactions and fractional scroll correction
morgmart Oct 12, 2026
5ca228e
Match retained thread tab identities across main integration
morgmart Oct 12, 2026
25abd0e
Show public agent working reactions as quiet avatar-and-dots signals
morgmart Oct 13, 2026
af2f4cb
Keep valid video geometry and capture mute motion before painting
morgmart Oct 13, 2026
09cb05c
Let owners dismiss an agent's error on a message
morgmart Oct 13, 2026
d7607e0
Keep a dismissed error as settled evidence
morgmart Oct 13, 2026
f4db3f0
Re-render only rows with agent work on each activity step
morgmart Oct 13, 2026
f4df21e
Remove automatic public agent activity
morgmart Oct 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 10 additions & 16 deletions docs/agents.md
Original file line number Diff line number Diff line change
Expand Up @@ -358,22 +358,16 @@ HTTP broker/verified transport, including corrupted signature rejection.

## Agent Activity plugin

**Agent Activity** is an independently toggleable bundled plugin that owns capture
and the transcript panel. Conversation presentation uses a compact, floating
avatar control above the composer, without a reserved strip or permanent avatar
container. Hover, click, tap or keyboard opens **Working now**, reusing the sidebar's
working-agent row. The row opens its known thread (or channel when no unique thread
is known); a separate **View activity** action opens the agent's transcript.

The channel control includes work in threads. A thread control includes only
exact-root evidence, never unconfirmed work. Current owner-visible turns provide
brief tool status; unknown scopes fall back to channel activity. Multiple concurrent
scopes never choose an arbitrary transcript thread. Public typing for the viewer's
own `agentChoices` identities remains visible without telemetry; someone else's
self-declared agent remains ordinary typing, without this owner-activity doorway.
All projections consume existing stores and loaded profiles/channel rows, not new
capture leases, relay reads or timers. A persistent, visually hidden status region
announces working/typing transitions even when visual controls are absent.
**Agent Activity** owns live capture demand and the full Transcript/Raw panel;
host-owned saved history remains independent of plugin enablement. This branch
adds an avatar-and-dots bubble beneath the exact message that triggered current
work. Multiple turns group by agent; completing one turn does not hide another.
Hover, click, tap or keyboard opens a compact avatar-and-latest-tool popup. Its
row opens that exact agent's profile Activity tab, using the mainline transcript,
conversation filtering and saved-history controls. Escape or outside click closes
the popup. Human typing remains in the ordinary conversation indicator.

### Local plugin-agent lifecycle

The popup resets on conversation changes and when current work ends. Idle and
historical activity remain accessible from the activity panel rather
Expand Down
15 changes: 14 additions & 1 deletion src/app/pages.integration.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,20 @@ test("the app runtime exposes ready bundled pages and removes them on disable",
.find((panel) => panel.pluginId === "buzz.agent-activity");
assert.equal(activity.title, "Agent Activity");
assert.equal(activity.launcher, undefined);
assert.equal(services.conversation.accessories.snapshot().length, 0);
assert.equal(services.conversation.accessories.snapshot().length, 2);
assert.deepEqual(
services.conversation.accessories
.snapshot()
.map(({ id, placement }) => [id, placement]),
[
["activity", "message"],
["typing-presentation", undefined],
],
);
assert.equal(
services.conversation.accessories.snapshot()[0].pluginId,
"buzz.agent-activity",
);
assert.match(
renderToStaticMarkup(createElement(activity.component)),
/Connect to a community/,
Expand Down
12 changes: 11 additions & 1 deletion src/app/services.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { createLocalAgentActivity } from "../features/agents/local-activity";
// FOUNDATION: Compose the bundled distribution, plugin runtime, and services here.
import {
createIdentity,
Expand Down Expand Up @@ -45,6 +46,7 @@ export function createServices() {
bundled: bundledPlugins,
});
const localAgents = createLocalAgents();
const localActivity = createLocalAgentActivity();
const navigationHost = provideNavigation(ctx);
const navigation = navigationHost.navigation;
const browser = new BrowserService(ctx);
Expand All @@ -64,13 +66,21 @@ export function createServices() {
localAgents.agents,
identity?.ready,
identity ? connectNativeTransport : undefined,
localActivity.reader,
);
ctx.provide("communityReader", {
snapshot: communities.snapshot,
subscribe: communities.subscribe,
});
const relay = communities.relay;
const agents = new AgentsService(ctx, communities);
const agents = new AgentsService(
ctx,
communities,
undefined,
undefined,
undefined,
localActivity,
);
ctx.effect(() =>
localAgents.bind({ snapshot: agents.local, subscribe: agents.subscribe }),
);
Expand Down
43 changes: 43 additions & 0 deletions src/bundled/agent-activity/ActivityAccessory.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
.root {
margin-block-start: var(--space-2);
min-width: 0;
flex-shrink: 0;
}
.previews {
display: flex;
flex-direction: column;
}
/* Error dismissal is a sibling action, never a button nested in NavigationItem. */
.row {
display: flex;
align-items: center;
gap: var(--space-1);
}
.row > :first-child {
min-width: 0;
flex: 1;
}

/* One glanceable line each; NavigationItem's label truncation applies per line. */
.preview {
min-width: 0;
display: flex;
flex-direction: column;
align-items: stretch;
gap: var(--space-1);
}
.preview > * {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Errors explain what to do; keep their reason readable instead of clipped. */
.preview[data-error] > * {
overflow: visible;
text-overflow: clip;
white-space: normal;
overflow-wrap: anywhere;
}
.detail {
color: var(--text-subtle);
}
Loading
Loading