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
task.ts2.1 KB
// Subagent snapshots (`TaskInfo`) as plain objects: absent fields are
// `null` or left out while the plugin works on them, and dropped when a
// snapshot is sent, the way the host's types leave them out.
import { compact } from "../sdk/agent.ts";
import { objectOf } from "./wire.ts";
import type { Task } from "./types.ts";
const LIVE = new Set(["queued", "running", "waiting"]);
/// Task statuses that still have work in hand.
export function isLive(status: string) {
return LIVE.has(status);
}
/// The snapshot as the host reads it: no `null`s, no `background: false`,
/// no empty workflow lists.
export function cleanTask(info: Task) {
const { workflow, background, ...rest } = info;
const out = compact({ ...rest, background: background === true ? true : undefined });
if (!workflow) return out;
return {
...out,
workflow: compact({
phases: workflow.phases.length ? workflow.phases.map((phase) => ({ title: phase.title })) : undefined,
result: workflow.result,
logs: workflow.logs.length ? [...workflow.logs] : undefined,
}),
};
}
/// Whether two snapshots say the same thing.
export function sameTask(a: Task, b: Task) {
return canonical(cleanTask(a)) === canonical(cleanTask(b));
}
function canonical(value: unknown): string {
if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
if (value && typeof value === "object") {
return `{${Object.keys(value)
.sort()
.map((key) => `${JSON.stringify(key)}:${canonical(objectOf(value)[key])}`)
.join(",")}}`;
}
return JSON.stringify(value) ?? "undefined";
}
/// A deep copy of a snapshot. (The runtime has no `structuredClone`; a
/// snapshot is JSON through and through.)
export function copyTask(info: Task): Task {
return {
...info,
usage: info.usage ? { ...info.usage } : info.usage,
workflow: info.workflow
? {
phases: info.workflow.phases.map((phase) => ({ ...phase })),
result: JSON.parse(JSON.stringify(info.workflow.result)),
logs: [...info.workflow.logs],
}
: info.workflow,
};
}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.