v2026.04
Read release notes
exAI Agentic OSexAI
§ 01 / 06
Extensions · TypeScript SDKCommands · Panels · Webhooks · BusBuild internal tools without leaving the workspace.
SDK v1.4.0 · marketplace open
Platform engineering · without yet another tab

Your editor,
your way.

A TypeScript-native SDK for shipping commands, panels, and webhook listeners that fold the workspace into your existing stack — GitHub, Linear, Datadog, PagerDuty, every system you already pay for.

No iframe glue, no JSON-RPC choreography, no privileged plugin host. Extensions run in the same TypeScript runtime as the rest of the workspace, with the same typed event bus the orchestrator uses internally.

extension.ts
@exai/extension-sdk
import { defineExtension } from "@exai/extension-sdk";
export default defineExtension({
id: "acme.ship-to-staging",
commands: [
{ id: "ship", title: "Ship to staging", run: onShip },
],
panels: [InboxPanel],
}); // 11 lines, fully typed
tsc · 0 errors · 11 linesv1.4.0
Fig. 01 · the smallest valid extension11 lines
§ 02 / 06
SDK surface

Four primitives.
No plugin host.

Commands, panels, webhooks, bus. The same primitives the workspace itself is built on. Nothing privileged, nothing hidden — every line of the SDK is in the public typings.

01 · Commandscommands
Commands

Keyboard-first registry. Every command is typed, discoverable from the palette, and bindable to a chord. Same surface the workspace uses internally — no privileged API.

commands.register({ id, run })
02 · Panelspanels
Panels

Mount a React component as a sidebar, status bar, or modal panel. Or drop a vanilla webview in. Two-way RPC over a typed channel — no JSON.parse glue code.

panels.mount(<Inbox />, "sidebar")
03 · Webhookswebhooks
Webhooks

Subscribe to typed events from any external system. The SDK signs, retries, deduplicates, and routes — you receive a fully-typed payload, not a raw request.

webhooks.on<GhPushEvent>("github.push", fn)
04 · Busbus
Bus

Listen to any agent event the workspace emits — plan started, hunk landed, run finished, gate awaiting. The same bus the orchestrator uses, exposed read-only.

bus.on("run.finished", ({ runId }) => …)
§ 03 / 06
Native · zero-config integrations
40+ first-party. Everything else speaks OpenAPI or webhook.

Each integration ships with a typed client, signed webhook handler, and an audit-mapped event schema. Drop into your extension; the workspace handles auth, retries, and replay.

GitHubGitLabBitbucketLinearJiraAsanaDatadogSentryPagerDutySnykVercelCloudflareSlackDiscordGitHubGitLabBitbucketLinearJiraAsanaDatadogSentryPagerDutySnykVercelCloudflareSlackDiscord
14 of 40+ shown · full catalogue in marketplace
● signed webhooks● typed clients● replay-safe
§ 04 / 06
Quickstart · three steps

Install, register,
ship.

First extension in under five minutes. The SDK is published to npm; the CLI ships with the workspace; the manifest is verified at type-check time, not at upload.

  1. Step 01~30s
    Install

    Add the SDK to any TypeScript repo. Zero peer dependencies, zero codegen, zero post-install scripts.

    $npm i @exai/extension-sdk
  2. Step 02~3m
    Register

    Declare commands, panels, and webhook listeners in one factory call. The SDK verifies the manifest at type-check time.

    $defineExtension({ id, commands, panels })
  3. Step 03~60s
    Ship

    Publish to the marketplace, your private registry, or pin to a single workspace. Versions are immutable; rollbacks are one command.

    $exai ext publish
ship-to-staging.ts
acme.ship-to-staging · v0.1.0
import { defineExtension, webhooks } from "@exai/extension-sdk";
import type { CommandCtx, PushDispatch } from "@exai/types";
const REPO = "acme/store-frontend";
const EVENT = "deploy-staging";
async function onShip(ctx: CommandCtx) {
const sha = await ctx.git.headSha();
const body: PushDispatch = { event_type: EVENT, client_payload: { sha } };
await ctx.fetch(
`https://api.github.com/repos/${REPO}/dispatches`,
{ method: "POST", body: JSON.stringify(body) },
);
ctx.toast("dispatched · " + sha.slice(0, 7));
}
webhooks.on<PushDispatch>("github.workflow_run", notifyAuthor);
export default defineExtension({
id: "acme.ship-to-staging", commands: [{ id: "ship", title: "Ship to staging", run: onShip } }],
});
// 18 lines · zero glue code · fully typed end-to-end
tsc · 0 errorseslint · 0 warnings● ready to publish
Fig. 02 · GitHub Actions repository_dispatch from a command18 lines
§ 05 / 06
Marketplace

A catalogue, not
an app store.

Every extension is signed, sandboxed, and source-available. Install policy is governed at workspace, team, and tenant scope. Telemetry is off by default — and stays off unless you flip it.

Listed
0
extensions in marketplace · across 14 categories
First-party
0
maintained by the exAI team · same SLA as the workspace
Telemetry-leaking
0
extensions phoning home without consent · enforced at install
Featured · this week
curated by the platform team · refreshed Mondays
Reviews@exai
PR-Pal

auto-summary on every PR — file-by-file, with a risk score and a one-line release note.

18,420 installsinstall →
Observability@datadog
Splunk-Bridge

stream every audit event into Splunk HEC — schema-mapped, replayable, governed.

9,140 installsinstall →
Workflowcommunity
Branch-Inbox

group reviewable hunks by intent — one column per agent run, drag to merge or punt.

4,820 installsinstall →
§ 06 / 06
Bring your stack into the workspace

Bring your stack
into the workspace.

No more iframe hacks, no more brittle webhook glue, no more second-class plugin host. One SDK, one runtime, one set of types — for every internal tool your platform team owns.

TypeScript · strict0 telemetry by defaultSigned extensionsSandboxed runtimeWorkspace-scoped install policy