Repository navigation
[Feature]: Pi-style extension API for lifecycle hooks, UI contributions, and settings #6837
Replies: 10 comments
|
A Pi status line and a plugin system, opened as a stack of ready PRs. This is a concrete answer to this request (and #6714, #14557), finished so you can judge real code instead of a sketch. No maintainer has agreed to the direction yet. If the answer is no, we close the plugin PRs; the Pi status PRs stand on their own. Each PR was tested at its own head, reviewed, and has real-client evidence: web and desktop, Android where mobile changes, live agent turns where a provider is involved, and a remote Pi extension statuses
Plugin system (local plugins, explicit consent, each in a supervised child process)
Out of scope: plugin administration from mobile, and a mobile view host for plugin views. Both are named in the PR bodies as follow-ups. |
|
Adding a concrete use case for the plugin stack above, from running the We supervise many threads with an external judge service and need:
Is plugin-initiated dispatch in scope for the plugin host, or is a |
|
A use case from Paseo: client-side behavior that the proposed stack does not cover. I use a private Paseo client plugin (11 features, about 2,000 lines). I moved to T3 Code and had to port each feature into a fork, because T3 Code has no plugin system. The stack in #16047–#16065 covers server-side work: finished runs, MCP tools, settings, palette actions and right-panel views. Most of my plugin is client-side behavior, and the stack has no place for it. What the plugin does, and what extension point each feature needs:
Paseo gives plugins a client context ( Request: add a small, versioned client extension surface next to the server plugin host:
Web and desktop are enough to start. Mobile can show "not supported". Written with Claude Opus 5.5 in Claude Code. |
|
I've been trying out plugins for T3 Code myself. The goal was to make it as extensible as possible, so a plugin can add almost anything to T3 (views, sidebars, actions, settings, tools for agents) without breaking the official app. If a T3 update breaks a plugin, the worst case is that the plugin goes unavailable: T3 keeps working and your plugin data is kept. Plugins install on the server, so they work on web, desktop and mobile. (Claude made the video but you get the idea) plugins-intro.mp4Realms is the one I use daily. Each agent gets its own screen, either a Linux desktop or a full Omarchy VM, so it can run and test apps without touching my desktop. I can watch it live next to the thread and take control whenever I want. Project Coordinator was a test of how far it goes: Claude Code Projects–style, where each project is one conversation that hands work to threads nested under it. Try it: plugin-system branch. The plugin guide is here. |
|
Thanks for the proposal, and for the work in the PR stack. A concrete use case: I run several agents (Codex and Claude Code) through T3 Code and want those agents to extend T3 for me. Examples are an action list of things waiting on me, a coordinator dashboard across threads, read-aloud of replies, and small status widgets. I'd back the scope in the original post: a versioned, declarative extension API with host-rendered contributions (settings, command-palette actions, status badges, one constrained panel) and observe-only lifecycle hooks, loaded from explicitly configured local paths. That seems easier to review and keeps remote, mobile and version-skew behavior manageable. A stack of roughly 50k lines is hard to assess as a single unit, so a small first slice may be easier for maintainers to agree on. A smaller ask that would already help: a documented theming contract, or stable |
|
I would be glad to contribute to a best-in-class markdown edition surface with https://github.com/gsemet/markdown-okf-schema-studio |
|
A use case from running the Pi agent inside T3 Code daily. We cover these today with Pi-side extensions, which work but add prompt tokens to every request and cannot touch T3's UI:
A small surface (status items, a sidebar panel, thread and turn lifecycle hooks) would cover all three without a fork. |
|
Adding my public fork, Alb11747/t3code, as a living source of concrete use cases for the extension API. I'd like to move its optional features into plugins where practical, so I can follow upstream without maintaining those patches. The maintained references are:
Representative requirements include provider request/launch and compaction hooks (proxy keep-warm controls and cache behavior); run failure/retry and quota-reset handling; durable issue watches and delegation completion policies; scheduling options; composer predictions, thread status/actions and file-link downloads; and desktop close-to-tray behavior. Please treat these as use cases to check the proposed extension boundaries against, including web/desktop/mobile and remote environments where applicable. Some are core bug fixes or release tooling and may appropriately remain core/fork changes. The goal is to make the optional behavior expressible through supported APIs, rather than assume every patch belongs in a plugin. For future contributors and agents: read the latest |
|
a use case from moving to T3 from the claude desktop app, where i had built a few claude code mods (usage bars, progress for background jobs, quick prompt buttons, a pane of open questions). none of them carry over to T3, and they only ever worked for one harness anyway what i would hope this API gets right:
happy to test a nightly against this |
Uh oh!
There was an error while loading. Please reload this page.
Before submitting
Area
packages/contracts or packages/shared
Problem or use case
I would like to make T3 Code extensible in a similar spirit to the Pi agent: extensions should be able to react to application and agent lifecycle events, expose their own settings, and contribute small pieces of UI without requiring every integration to be added to T3 Code itself.
A concrete example is an extension that reacts when a user-visible turn settles, performs a user-configured integration, exposes its configuration under Settings, and adds a status indicator or action to the thread UI. Today this requires modifying T3 Code and maintaining a fork.
There are related issues, but they cover separate parts of this problem:
What is missing is one small, coherent extension boundary connecting lifecycle hooks, extension-owned settings, and safe UI contributions.
Proposed solution
Introduce a versioned extension API with two sides:
A manifest could declare an extension ID, version, API version, required capabilities, settings fields, commands, lifecycle subscriptions, and UI contributions.
Initial lifecycle hooks could include:
Initial settings fields could include text, password/secret, boolean, number, textarea, and select. Values should be namespaced by extension ID, validated on the server, preserve disabled/unknown extension configuration, and keep secrets out of client-visible settings.
Initial UI contributions should be deliberately constrained and host-rendered, for example:
Extensions should invoke actions through fixed core RPC methods such as
extensions.list,extensions.getSettings,extensions.updateSettings, andextensions.invokeAction, rather than dynamically adding RPC methods.I do not think the first version should load arbitrary React components. Unlike Pi's single local TUI, T3 Code supports a potentially remote server plus web, desktop, and mobile clients that may be on different versions. A declarative contribution protocol would preserve the remote-ready and multi-surface architecture.
The existing scoped provider-driver registry appears to provide a useful lifecycle pattern for an
ExtensionRegistry, while the canonical provider runtime events and schema-driven provider settings UI provide much of the underlying machinery already.Why this matters
This would let users and organizations add internal integrations, notifications, accessibility helpers, workflow automations, and niche UI actions without requiring each one to become a core feature.
It would reduce pressure for large feature PRs and make it easier to keep private or experimental behavior isolated while still following upstream T3 Code releases.
Smallest useful scope
A narrow first implementation could include:
Non-goals for the first version:
Alternatives considered
Risks or tradeoffs
Project-local extensions should never execute without an explicit trust decision. Extensions should declare capabilities, be failure-isolated, use bounded event delivery, and receive redacted settings. A worker or child-process boundary would be preferable; any in-process first version should be described as trusted-only.
Examples or references
Contribution
I would be happy to start with a small contracts/registry proof of concept after maintainers confirm the desired boundary and smallest acceptable scope.
All reactions