Official
chat
Built-in chat UI (JavaScript UI plugin).
The app opens the listing; nothing installs until an agent in your Plugins workspace has read the files and you enable the plugin. In a terminal: cvg install convergence/chat@0.2.0
Permissions in 0.2.0
Files
commands.ts1.6 KB
// Commands retain their manifest ids and clear's same-agent, same-workspace behavior.
import * as Effect from "effect/Effect";
import { Commands, Slash } from "convergence/effect";
import type { Controller } from "./controller.ts";
export const registerEarlyCommands = Effect.fn("Chat.registerCommands")(function* (c: Controller) {
const commands = yield* Commands;
yield* commands.register(
"chat.switchNext",
Effect.sync(() => c.switchBy(1)),
{ title: "Switch to the previous chat", keybinding: "ctrl-tab" },
);
yield* commands.register(
"chat.switchPrevious",
Effect.sync(() => c.switchBy(-1)),
{ title: "Switch back through recent chats", keybinding: "ctrl-shift-tab" },
);
yield* commands.register(
"chat.cancel",
Effect.gen(function* () {
const chatId = c.api.app.state().chatId;
if (chatId) yield* c.scheduler.stop(chatId);
}),
{ title: "Stop the current run", keybinding: "cmd-shift-c" },
);
const slash = yield* Slash;
yield* slash.register({
name: "clear",
description: "Start a new chat with the same agent and workspace",
run: Effect.fn("Chat.clear")(function* (_input, context) {
const chat = context.chatId ? c.state.chats[context.chatId] : null;
if (chat) {
const inUse = [...Object.keys(c.state.draftTitles), ...c.state.chatQueue.map((queued) => queued.chatId)];
const next = yield* c.host.call("host/chats.create", { workspaceId: chat.workspaceId, agentId: chat.agentId, inUse });
yield* c.app.select(next.id, chat.workspaceId);
}
return { action: "none" };
}),
});
});Versions
| Version | Published | Plugin API | Size | Permissions | Status |
|---|---|---|---|---|---|
| 0.2.0latest | Oct 5, 2026 | >=2 <3 | 105.1 KB | 5 permissions | Listed |
No comments yet.