Official

palette

Built-in command palette (⌘⇧P) and chat search (⌘P).

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/palette@0.2.0

Permissions in 0.2.0

  • Run other plugins' commands commands.runHighRuns commands of other plugins.Run the command you pick, whichever plugin it belongs to
  • Read chats chats.readMediumReads your transcripts and chat lists.Search your chats by title and workspace, and open the one you pick
  • Show panels ui.slotsLowShows views in the listed parts of the window.Hold the palette, which opens over the windowSlots: title

Files

state.ts1.7 KB
// Palette state belongs to one activation; ranking and rendering share it through this layer.
// Its view handle lets asynchronous catalog and search results request a render.
import * as Context from "effect/Context";
import * as Layer from "effect/Layer";
import type { EffectClient } from "convergence/effect";
import type { Chat, CommandInfo, PaletteItem, PaletteProviderInfo, ViewHandle, Workspace } from "convergence";
import type { Settings } from "../settings/contract.ts";

export interface State {
  open: "commands" | "chats" | null;
  query: string;
  selected: number;
  commands: readonly CommandInfo[];
  chats: readonly Chat[];
  workspaces: Record<string, Workspace>;
  providers: readonly PaletteProviderInfo[];
  found: { key: string; items: readonly PaletteItem[] };
  recent: string[];
  searching: number;
  view?: ViewHandle;
  // The convergence/settings client while its provider runs; Assign on a
  // conflicting key does nothing without it.
  settings: EffectClient<typeof Settings> | undefined;
}

export interface State {
  open: "commands" | "chats" | null;
  query: string;
  selected: number;
  commands: readonly CommandInfo[];
  chats: readonly Chat[];
  workspaces: Record<string, Workspace>;
  providers: readonly PaletteProviderInfo[];
  found: { key: string; items: readonly PaletteItem[] };
  recent: string[];
  searching: number;
  view?: ViewHandle;
}

export class PaletteState extends Context.Service<PaletteState, State>()("palette/State") {
  static readonly layer = Layer.sync(PaletteState, () => ({
    open: null,
    query: "",
    selected: 0,
    commands: [],
    chats: [],
    workspaces: {},
    providers: [],
    found: { key: "", items: [] },
    recent: [],
    searching: 0,
    settings: undefined,
  }));
}

Versions

VersionPublishedPlugin APISizePermissionsStatus
0.2.0latestOct 5, 2026>=2 <311.2 KB3 permissionsListed

Reviews and comments

0 threads · 0 reviews

No comments yet.