Skip to content

wip: add a built-in agent with personas, behind the harness experiment - #141

Draft
hkonsti wants to merge 5 commits into
mainfrom
hkonsti/agent-harness-proxy-integration
Draft

hkonsti wants to merge 5 commits into
mainfrom
hkonsti/agent-harness-proxy-integration

Conversation

@hkonsti

@hkonsti hkonsti commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

Work in progress: a first cut of an agent Personal Agent Proxy runs itself, to get a feel for the harness design before building further on it.

A Chat page, behind the harness experiment, talks to a built-in agent login. It has grants and an activity log like any agent, and every call it makes goes through the same MCP tool dispatch as Claude's, for the conversation's task. The model is Claude Sonnet 5.5 over OpenRouter.

Everything lives in the database: a thread per conversation, an append-only log of entries, and a job per unit of work (inference on a log, or one tool call). A worker in each api instance claims jobs with a lease and finishes them in the same transaction as what they write, so an instance that dies mid-job loses nothing: the next worker picks the job up, and an interrupted write is never made twice. One tool beyond the connections, sleep_until, is a job due later.

The page is built on shadcn's chat pieces (Message, Bubble, Message Scroller, Trace, Input Group), added to the ui package with the shadcn CLI. Threads are shown as personas: a name and an avatar (four shapes, eight colors), listed in a second sidebar with the last thing said in each. The login, the grants and the system prompt are the same for every persona for now.

Still to do before this leaves the experiment: compaction for long-lived conversations, an "ask" grant state with approvals, event triggers, and markdown rendering of replies.


Open workspace in Conductor

hkonsti and others added 5 commits October 22, 2026 01:22
…s own gate

A Chat page, behind the `harness` experiment, talks to an agent login Personal Agent Proxy
runs itself. It has grants and an activity log like any agent, and every call it makes goes
through the same MCP tool dispatch as Claude's, for the conversation's task. The model is
Claude Sonnet 5.5 over OpenRouter.

Everything lives in the database: a thread per conversation, an append-only log of entries
(the person, the model with its tool calls, each call's result), and a job per unit of work,
inference on a log or one tool call. A worker in each api instance claims jobs with a lease
and finishes them in the same transaction as what they write, fenced by the lease, so an
instance that dies mid-job loses nothing: the next worker picks the job up. A write that was
interrupted is never made again; the model is told its outcome is unknown. One tool beyond
the connections, sleep_until, is a job due later.

The web app gets a second sidebar beside the icon rail for the conversations, and a page
mode that scrolls a part of itself so the header, sidebars and input stay put.
Message and Bubble for the turns, a Message Scroller that anchors the person's newest message
and follows the reply, Trace lines for the agent's calls that open to their details, and an
Input Group for the message field, added to the ui package with the shadcn CLI.
…y the person

A thread is a persona now: a name and an avatar, one of four shapes in one of eight colors,
made and changed in a dialog from the "+ New" row and the conversation's header. The sidebar
lists them with the last thing said in each, as a chat app does. The migration for the
threads, never deployed, is rewritten in place with the three columns.

The login, the grants and the system prompt stay the same for every persona.
… summary in place of what it covers

Once a request to the model has passed a size, the next inference first asks the model for a
summary of the log before the person's last two turns, written as a summary entry with how far
it reaches. The model reads the last summary, then what came since, with the tool results of
the kept turns before the current one cleared. The page shows the conversation as before: the
summaries are the model's, not the person's.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…h a conversation per member

Main made organizations of people, with connections and agents a member's own or shared, and
everything under the organization's slug. The built-in agents follow: each is an agent shared with
every member, named and given a face on the Chat page, where anyone makes one and whoever made it or
the organization's owner changes or deletes it. A member's conversation with an agent is theirs
alone, as a direct message: in it the agent acts as them, reaching the shared connections and their
own, both vaults included, and its task and activity are theirs. Leaving an organization takes a
member's conversations with it. The chat routes move under the organization, the migration becomes
v032 with the face on the agent and the member on the thread, and the Agents page shows the
built-in agents as shared, without a login to set up.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant