Official
terminal
Built-in integrated terminal (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/terminal@0.2.0
Permissions in 0.2.0
Take care. This plugin asks for permissions that can do anything your account can. The app asks you to hold Enable for two seconds or to type the plugin's name before it turns on.
Files
main.ts1.9 KB
// Register terminal views synchronously; expose them only after the kernel support probe succeeds.
// Both listeners and session work belong to the activation scope.
import * as Effect from "effect/Effect";
import * as Stream from "effect/Stream";
import { Commands, Events, Views, runPlugin } from "convergence/effect";
import { controller } from "./controller.ts";
import { TerminalState } from "./state.ts";
import { renderFlyOut, renderRail } from "./view.ts";
const program = Effect.gen(function* () {
const terminal = yield* controller();
const views = yield* Views;
const events = yield* Events;
terminal.state.rail = yield* views.slot("rail", (ctx) => renderRail(terminal, ctx), {
on: ["app_state", "terminal"],
order: 100,
});
terminal.state.flyOut = yield* views.slot(
"right",
(ctx) => {
// The baseline requests a missing session when this view renders, after registrations are published.
ctx.run(terminal.ensureVisible());
return renderFlyOut(terminal, ctx);
},
{
on: ["app_state", "terminal"],
order: 100,
title: "Terminal",
flyout: { width: 1400, height: 820, align: "bottom" },
},
);
yield* Effect.forkScoped(
events
.stream("terminal")
.pipe(Stream.runForEach(() => Effect.forkIn(terminal.refresh(), terminal.scope, { startImmediately: true }))),
{ startImmediately: true },
);
const supported = yield* terminal.refresh().pipe(
Effect.match({
onSuccess: () => true,
onFailure: (error) => {
console.warn(`terminal: this build has no terminal support (${error.message})`);
return false;
},
}),
);
if (!supported) return;
const commands = yield* Commands;
yield* commands.register("terminal.toggle", terminal.openInPane());
yield* commands.register("terminal.new", terminal.openInPane(true));
terminal.state.ready = true;
terminal.update();
});
export const activate = runPlugin(TerminalState.layer, program);Versions
| Version | Published | Plugin API | Size | Permissions | Status |
|---|---|---|---|---|---|
| 0.2.0latest | Oct 5, 2026 | >=2 <3 | 8.7 KB | 3 permissions | Listed |
No comments yet.