Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
62 changes: 62 additions & 0 deletions .changeset/reusable-settings-and-connections.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
"@tryopenbot/agent-provider": minor
"@tryopenbot/agent-service-provider": minor
"@tryopenbot/auth-provider": minor
"openbot": minor
"@tryopenbot/computer-service-provider": minor
"@tryopenbot/client-runtime": minor
"@tryopenbot/computer-tools": minor
"@tryopenbot/computer-service": minor
"@tryopenbot/computer-service-proto": minor
"@tryopenbot/configuration": minor
"@tryopenbot/desktop": minor
"@tryopenbot/utilities": minor
"@tryopenbot/platform-integrations": minor
"@tryopenbot/control-service-provider": minor
"@tryopenbot/runtime-provider": minor
"@tryopenbot/control-service": minor
"@tryopenbot/ui": minor
"@tryopenbot/web": minor
"@tryopenbot/git-provider": minor
---

Expose reusable settings, form primitives, controlled connections, and host-themed connector consumption. Add framework-neutral plugin, provider setup, prompt/attachment, session search, participation and transcript controllers.

Compose chat controls through `ChatPrompt`: transparent floating dock, embedded non-scrolling queue, floating replies, centered scroll, actionable statuses, and circular attachment controls. Add participant avatars, editable session headers, source badges and native roster and existing-identity addition controls. Gate nonmember messaging by session source and confirm native API joins through the authoritative roster.

Separate bubbled messages from unbubbled events and respect native tool-summary projection. Match dialog action heights and increase body bottom spacing. Organize Storybook into Chat Controls, Messages, Events and Primitives with paired isolated and full-chat examples. Remove unused timeline/combined activity, voice, rolling text, model picker and custom scrolling exports.

Refine prompt overflow and badge shadows, crossfade replies with queue/notices, move people controls beside names, and show source brand icons. Add rich Markdown prompt editing with responsive growth and circular attachment chips outside message bubbles. Search highlights rich text and loads earlier matches; participant search uses a floating autocomplete and direct native addition of existing identities.

Keep attachment chips directly beneath their own message with a tighter gap, flowing left-to-right for agents and right-to-left for users.

Open document and gallery story examples from actual attachment chips, and allow FileCard previews to delegate to a shared gallery.

Use a single inline audio player for sound attachments, remove fullscreen audio and link-hover previews, and keep link/diagram examples outside bubbles. Add shared transcript day grouping, centered date labels, tighter consecutive messages and 24-hour hover timestamps. Audit actual Chat catalog adoption and remaining runtime workflow gaps.

Flash the focused search-result bubble blue three times instead of outlining its row, with a runtime focus token to replay deliberate result navigation without retriggering on unrelated history updates.

Remove message action controls and quoted-reply runtime state, align source-only prompt typography, render sound attachments inside bubbles, and use warning-styled ordinary unknown messages. Remove redundant composed-content/message-actions stories and tighten follow-on spacing across story wrappers.

Remove unused generic permission-request and local-tool permission cards, their dock, public types, styles and approval stories. Keep the capability-approval renderer and stories.

Consolidate transcript loading/errors and the scroll/new-message prompt control. Remove transcript notices and generic reasoning cards. Use one unboxed generic tool-call row for summaries and expandable full details, preserving specialized tool presentations.

Prune unused Beautiful UI demos, StreamText and glimm. Remove their exports and
Patterns catalog; use the retained production Tools pattern for chained calls,
with persistent leading chevrons, content-sized parameter chips and output-only
expansion. Anchor send notices beneath their message and center system events.

Remove unused ComputerHandoffCard source, types, styling and Storybook examples.

Expose reusable settings provider cards, tool/skill rows, filters, routine list/
table/status/action/delete and provider-connection components. Keep Dispatch's
existing compositions and permit host-owned actions, descriptions and agent-free
layouts. Remove unused Agent Exchange overlays. Preserve full tool/reasoning
output in scroll areas capped at 400px.

Retire capability proposals and default account-picker tools. Provision native
Tilde resource skills and the managed connection process for every agent. Render
native pending connector setup as an event card with controlled continuation
modals. Add scoped resource inventories and inner-call rendering for tool batches.
Expose form-dialog and screen-state compositions for external application reuse.
12 changes: 4 additions & 8 deletions THIRD_PARTY_NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ copyright and license status.
- Retrieved: 2026-08-17, directly from the site's published component source
(the payload behind its "Copy code" affordance)
- Upstream description: copy-paste components for AI-native interfaces
- Files: `packages/ui/src/beautiful-ui/upstream/`
- Retained files: the theme/license in `packages/ui/src/beautiful-ui/upstream/`
and production reconstructions/forks in its sibling `atoms/` and `blocks/` directories.
- License: MIT, copyright (c) 2026 Shane Levine, published at
<https://www.beautifului.dev/license>; preserved in
`packages/ui/src/beautiful-ui/upstream/LICENSE`
Expand All @@ -20,7 +21,8 @@ An earlier 2026-08-12 retrieval came from the
it. Per-file SHA-256 values at retrieval and the small recorded OpenBot
modifications (analytics removal, import-path rewrites) are documented in
`packages/ui/src/beautiful-ui/PROVENANCE.md`. OpenBot-specific composition is
kept outside the upstream directory.
kept outside the upstream directory. Unused React demos were removed in September
2026; the retained tool/reasoning forks and attribution remain.

## shadcn/ui

Expand All @@ -41,12 +43,6 @@ kept outside the upstream directory.
utilities remapped as above; a type cast added for the
`streamdown`/`@streamdown/*` shiki version skew.

## glimm

- Source: <https://www.npmjs.com/package/glimm>
- License: MIT
- Used by the vendored Beautiful UI `prompt-bar` component; declared as a
regular npm dependency of `packages/ui`.

## Cua Driver and GUI Automation skill

Expand Down
6 changes: 3 additions & 3 deletions apps/control-service/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ The portable Hono control application. It serves health, exposes raw allowlisted
room roster/invitation semantics for an exact Client Runtime operation allowlist and exposes only
the short-lived ChatKit realtime ticket needed for a direct browser WebSocket.
- `registerTildeProxy(app, options)` preserves request and response bodies for a strict allowlist of Tilde-owned settings operations while keeping the installation API key out of clients.
- `registerCapabilityApprovalRoutes(app, options)` forwards an exact approval/hash/generation
decision using only the owner bearer already verified by `requireOwner`; it never substitutes
the installation API key and returns only the tokenless approval projection consumed by clients.
- The `user-tools/` bridge uses only the verified owner bearer for setup and inventory reads.
Personal account operations retain the native user namespace; the installation key is never
substituted when a human credential is required. Capability-proposal routes are removed.
- `registerComputerPreview(app, provider, options)` exposes the narrow owner preview redirect without making Computer service browser-accessible.
- `registerConnectorAuthorizedRoute(app)` serves only the public OAuth completion page that bounces desktop flows to the `openbot://` deep link. Connector resources and setup use native Tilde APIs through `registerTildeProxy`.

Expand Down
36 changes: 36 additions & 0 deletions apps/control-service/src/app.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -656,6 +656,42 @@ describe("bare OpenBot server", () => {
expect(upstreamCalls).toBe(0);
});

it("bridges only a read of the configured team's people directory", async () => {
const urls: string[] = [];
const app = createApp({
tildeChatProxy: {
apiKey: "test-key",
orgId: "org-one",
teamId: "team-one",
baseUrl: "https://tilde.test",
fetch: async (input) => {
urls.push(
typeof input === "string" ? input : input instanceof URL ? input.href : input.url,
);
return Response.json({ items: [] });
},
},
});
const response = await app.request(
"https://openbot.test/api/chat/_identity/team-members?user_type=human&page_size=100",
);
expect(response.status).toBe(200);
expect(urls[0]).toBe(
"https://tilde.test/api/v1/identity/teams/team-one/members?user_type=human&page_size=100",
);
expect(
(
await app.request("https://openbot.test/api/chat/_identity/team-members", {
method: "POST",
})
).status,
).toBe(404);
expect(
(await app.request("https://openbot.test/api/chat/_identity/teams/another-team/members"))
.status,
).toBe(404);
});

it("allows only the room operations consumed by Client Runtime", async () => {
const calls: Array<[string, string]> = [];
const chatApp = createApp({
Expand Down
3 changes: 0 additions & 3 deletions apps/control-service/src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import type { ComputerProvider } from "@tryopenbot/computer-service-provider";
import { registerAgentCreation, type AgentCreationOptions } from "./agent-create.js";
import { registerTildeChatProxy, type TildeChatProxyOptions } from "./chat-proxy.js";
import { registerTildeProxy, type TildeProxyOptions } from "./tilde-proxy.js";
import { registerCapabilityApprovalRoutes } from "./capability-approvals.js";
import { registerConnectorAuthorizedRoute } from "./connector-authorized.js";
import { registerComputerPreview } from "./computer-preview.js";
import { registerOwnerAuth, requireOwner } from "./auth.js";
Expand Down Expand Up @@ -40,7 +39,6 @@ export function createApp(options: AppOptions = {}): Hono {
const middleware = requireOwner(options.authProvider, options);
app.use("/api/chat/*", middleware);
app.use("/api/tilde/*", middleware);
app.use("/api/capability-approvals/*", middleware);
app.use("/api/computer/*", middleware);
app.use("/api/agents", middleware);
app.use("/api/agents/*", middleware);
Expand All @@ -55,7 +53,6 @@ export function createApp(options: AppOptions = {}): Hono {
registerAgentCreation(app, { environment: options.environment, ...options.agentCreation });
registerTildeChatProxy(app, options.tildeChatProxy);
registerTildeProxy(app, options.tildeProxy ?? options.tildeChatProxy);
registerCapabilityApprovalRoutes(app, options.tildeProxy ?? options.tildeChatProxy);
registerConnectorAuthorizedRoute(app);
if (existsSync(webRoot)) {
const cacheHeaders = (
Expand Down
Loading