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

  • Provide agents agents.provideMediumAdds agents to the app.Provide the Claude Code agent and pass its tool calls to plugin tools
  • Run named programs processMediumStarts the listed programs.Run the Claude Code CLI (sessions, sign-in, `claude update`), and ask the npm installation that owns it about a newer versionPrograms: claudenpm
  • Read files fs.readMediumReads files in the listed places.Read Claude Code's sessions, settings and skills (in ~/.claude, other accounts' ~/.claude-* folders, the shared skills and the folder you choose in Settings), the project's .claude folder, the administrator's skill policy, and once, what the previous provider keptPlaces: ~/.claude/**~/.claude*/**~/.agents/skills/**the open workspaceits own data folder/Library/Application Support/ClaudeCode/managed-settings.json/etc/claude-code/managed-settings.json${settings.configDir}
  • Environment variables envMediumReads the listed environment variables.Find Claude Code's configuration directory, and the launch settings you set in CLAUDE_* variables (extra arguments, MCP servers, setting sources, appended system prompt, extra folders)Variables: HOMECLAUDE_CONFIG_DIRCLAUDE_EXTRA_ARGSCLAUDE_MCP_CONFIGCLAUDE_STRICT_MCP_CONFIGCLAUDE_SETTING_SOURCESCLAUDE_APPEND_SYSTEM_PROMPTCLAUDE_ADD_DIRS

Files

wire.ts6.2 KB
// The CLI fields used by streams, stored records and workflow snapshots.
// Loose objects preserve fields passed back to Claude without interpreting them.
import * as z from "zod";

const text = z.string().nullish();
const number = z.number().nullish();
const boolean = z.boolean().nullish();
export const object = z.record(z.string(), z.unknown());
export const toolInput = z.looseObject({
  to: text,
  subagent_type: text,
  prompt: text,
  description: text,
  run_in_background: boolean,
  offset: number,
  edits: z.array(object).nullish(),
  todos: z.array(z.looseObject({ content: text, activeForm: text, status: text })).nullish(),
  questions: z
    .array(
      z.looseObject({
        question: text,
        header: text,
        multiSelect: boolean,
        options: z.array(z.looseObject({ label: text, description: text })).nullish(),
      }),
    )
    .nullish(),
});
export const block = z.looseObject({
  type: text,
  id: text,
  name: text,
  text: text,
  thinking: text,
  input: toolInput.nullish(),
  tool_use_id: text,
  is_error: boolean,
  content: z.unknown().optional(),
});
const content = z.union([z.string(), z.array(block)]).nullish();
export const usage = z.looseObject({
  total_tokens: number,
  input_tokens: number,
  cache_read_input_tokens: number,
  cache_creation_input_tokens: number,
  output_tokens: number,
  tool_uses: number,
  output_tokens_details: z.object({ thinking_tokens: number }).nullish(),
});
export const progress = z.looseObject({
  type: text,
  index: number,
  title: text,
  label: text,
  agentId: text,
  model: text,
  state: text,
  startedAt: number,
  lastProgressAt: number,
  durationMs: number,
  lastToolName: text,
  lastToolSummary: text,
  error: text,
  resultPreview: text,
  agentType: text,
  promptPreview: text,
  tokens: number,
  toolCalls: number,
  phaseTitle: text,
});
export const structured = z.looseObject({
  taskType: text,
  taskId: text,
  runId: text,
  workflowName: text,
  summary: text,
  transcriptDir: text,
  agentId: text,
  isAsync: boolean,
  status: text,
  content: z.unknown().optional(),
  totalTokens: number,
  totalToolCalls: number,
  totalToolUseCount: number,
});
export const record = z.looseObject({
  type: text,
  subtype: text,
  uuid: text,
  user_message_uuid: text,
  user_message_uuids: z.array(z.string()).nullish(),
  num_turns: number,
  request_sent_wall_ms: number,
  error: text,
  parentUuid: text,
  timestamp: text,
  customTitle: text,
  aiTitle: text,
  isSidechain: boolean,
  parent_tool_use_id: text,
  task_id: text,
  tool_use_id: text,
  task_type: text,
  description: text,
  subagent_type: text,
  prompt: text,
  is_backgrounded: boolean,
  workflow_name: text,
  summary: text,
  last_tool_name: text,
  status: text,
  output_file: text,
  agent_id: text,
  tool_name: text,
  state: text,
  usage: usage.nullish(),
  modelUsage: z.record(z.string(), z.looseObject({ contextWindow: number, thinkingTokens: number })).nullish(),
  total_cost_usd: number,
  is_error: boolean,
  errors: z.array(z.unknown()).nullish(),
  result: z.unknown().optional(),
  message: z.looseObject({ id: text, model: text, role: text, content, usage: usage.nullish() }).nullish(),
  tool_use_result: structured.nullish(),
  toolUseResult: structured.nullish(),
  origin: z.object({ kind: text }).nullish(),
  attachment: z.object({ prompt: text }).nullish(),
  operation: text,
  content: z.unknown().optional(),
  workflow_progress: z.array(progress).nullish(),
  patch: z.looseObject({ status: text, is_backgrounded: boolean, error: text }).nullish(),
  compact_result: text,
  compact_error: text,
  isCompactSummary: boolean,
  level: text,
  compact_metadata: z.unknown().optional(),
  event: z
    .looseObject({
      type: text,
      index: number,
      message: z.object({ id: text, model: text }).nullish(),
      content_block: block.nullish(),
      delta: z.object({ type: text, text: text, thinking: text, partial_json: text }).nullish(),
    })
    .nullish(),
  request_id: text,
  request: z
    .looseObject({
      subtype: text,
      server_name: text,
      message: z.unknown().optional(),
      tool_name: text,
      tool_use_id: text,
      input: toolInput.nullish(),
      title: text,
      display_name: text,
      agent_id: text,
      permission_suggestions: z.unknown().optional(),
    })
    .nullish(),
  response: z.looseObject({ subtype: text, request_id: text, error: text, response: z.unknown().optional() }).nullish(),
  rate_limit_info: z.unknown().optional(),
});
export const workflowOutput = z.looseObject({
  result: z.unknown().optional(),
  logs: z.array(z.unknown()).nullish(),
  phases: z.array(z.object({ title: text })).nullish(),
  workflowProgress: z.array(progress).nullish(),
  totalTokens: number,
  totalToolCalls: number,
  startTime: number,
  durationMs: number,
  status: text,
  summary: text,
  workflowName: text,
  script: text,
  error: text,
});
export const metadata = z.looseObject({
  toolUseId: text,
  model: text,
  description: text,
  requestShape: text,
  agentType: text,
  parentAgentId: text,
  workflowPhase: text,
});
export const model = z.looseObject({
  value: text,
  resolvedModel: text,
  supportsAdaptiveThinking: boolean,
  supportsFastMode: boolean,
});
export const command = z.looseObject({ name: text, description: text, argumentHint: text });
export const catalog = z.looseObject({
  models: z.array(model).nullish(),
  commands: z.array(command).nullish(),
  fast_mode_state: text,
  fast_mode_disabled_reason: text,
});
export type CatalogResponse = z.infer<typeof catalog>;
export type Record = z.infer<typeof record>;
export type Input = z.infer<typeof toolInput>;
export type Progress = z.infer<typeof progress>;
export type Structured = z.infer<typeof structured>;
export type Output = z.infer<typeof workflowOutput>;
export type Metadata = z.infer<typeof metadata>;
export type Command = z.infer<typeof command>;
export type Model = z.infer<typeof model>;
export type ControlRequest = NonNullable<Record["request"]>;
export type StreamEvent = NonNullable<Record["event"]>;
export function objectOf(value: unknown) {
  const parsed = object.safeParse(value);
  return parsed.success ? parsed.data : {};
}
export function inputOf(value: unknown) {
  const parsed = toolInput.safeParse(value);
  return parsed.success ? parsed.data : {};
}

Versions

VersionPublishedPlugin APISizePermissionsStatus
0.2.0latestOct 5, 2026>=2 <3128.7 KB4 permissionsListed

Reviews and comments

0 threads · 0 reviews

No comments yet.