Official
claude
Claude Code agent provider: runs the Claude Code CLI headless for each account.
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/claude@0.2.0
Permissions in 0.2.0
Files
main.ts2.2 KB
// Register the default account synchronously; stored accounts follow legacy
// adoption. Settings and each account's background work share the plugin scope.
import * as Effect from "effect/Effect";
import * as Queue from "effect/Queue";
import * as Scope from "effect/Scope";
import * as Stream from "effect/Stream";
import * as z from "zod";
import { Agents, Host, Settings, parse, runPlugin } from "convergence/effect";
import { ClaudeAgent } from "./agent.ts";
import { defaultAccount, parseInstances } from "./instances.ts";
import type { Instance } from "./instances.ts";
import { SessionStates } from "./state.ts";
import type { Job } from "./session.ts";
export const registerAccounts = Effect.fn("Claude.registerAccounts")(function* (accounts: ClaudeAgent[] = []) {
const agents = yield* Agents;
const scope = yield* Scope.Scope;
const store = yield* SessionStates;
const settings = yield* Settings;
const account = defaultAccount();
account.configDir = (yield* settings.get("configDir", z.string().nullish())) ?? null;
yield* Stream.runForEach(settings.changes, (change) =>
Effect.gen(function* () {
if (change.key === "configDir")
account.configDir = (yield* parse("Claude configuration folder", z.string().nullish(), change.value)) ?? null;
}),
).pipe(Effect.forkScoped);
const register = Effect.fn("Claude.register")(function* (instance: Instance) {
const jobs = yield* Effect.acquireRelease(Queue.make<Job>(), Queue.shutdown);
const agent = new ClaudeAgent({ instance, store, scope, jobs });
const handle = yield* agents.register(agent.definition());
agent.emit = handle.emit;
accounts.push(agent);
yield* agent.background();
});
yield* register(account);
yield* store.ready;
const stored = yield* (yield* Host).call("host/storage.get", { key: "instances" }).pipe(
Effect.catchTag(["HostCallFailed", "PermissionNotGranted", "NeedsReview"], (error) =>
Effect.sync(() => {
console.warn(`claude: the stored accounts could not be read: ${error.message}`);
return { value: null };
}),
),
);
for (const instance of parseInstances(stored.value).slice(1)) yield* register(instance);
});
export const activate = runPlugin(SessionStates.layer, registerAccounts());Versions
| Version | Published | Plugin API | Size | Permissions | Status |
|---|---|---|---|---|---|
| 0.2.0latest | Oct 5, 2026 | >=2 <3 | 128.7 KB | 4 permissions | Listed |
No comments yet.