@agent-native/dispatch
Dispatch is the Agent-Native workspace control plane and a separate product. It is not a Toolkit capability module.
Workspace control plane for agent-native apps — vault, integrations, destinations, cross-app workspace resources, recurring "dream" report jobs, and cross-app delegation, shipped as a single drop-in package.
Powers the dispatch template. Provides:
- Drizzle schemas — destinations, identity links, link tokens, approval requests, audit events, dream reports/proposals, vault secrets/grants/ requests/audit, workspace resources/grants
- Server layer —
setupDispatch(config)plus Nitro plugins for auth, integrations, agent chat, DB, and core routes - Actions — ~90
defineActionmodules (vault grants/requests, workspace resource grants, destinations, dream jobs, provider-api catalog/docs/ request, Slack thread context, connected-agent discovery, audit/approvals, platform messaging, and more) consumed as agent tools + HTTP endpoints - Routes — a full React Router 7
RouteConfig[](chat, overview, apps, vault, integrations, agents, workspace, messaging, destinations, identities, approvals, automations, audit, settings, dreams, extensions, ...) to splat into a consumer'sapp/routes.ts - React components —
DispatchShell,Layout/NavContent,CreateAppPopover/CreateAppFlow,AppKeysPopover, plus a full shadcn/ui-basedcomponents/ui/*primitive set.SimpleAgentsPanelis also exported for embedding the shared agent manager in another workspace UI. - Styles —
dispatch.cssTailwind layer
Install
pnpm add @agent-native/dispatch
Peer-depends on @agent-native/core (>=0.8.0), react/react-dom
(>=19.2.7), and react-router (>=8).
Compose
Template's app/routes.ts:
import { type RouteConfig } from "@react-router/dev/routes";
import { dispatchRoutes } from "@agent-native/dispatch/routes";
export default [
...localRoutes, // consumer's own routes win on collision
...dispatchRoutes, // dispatch fills in everything else
] satisfies RouteConfig;
Template's server/plugins/*.ts (each export lives in its own file so Nitro
auto-loads it):
// server/plugins/setup-dispatch.ts
import { setupDispatch } from "@agent-native/dispatch/server";
export default setupDispatch({ auth: { googleOnly: true } });
// server/plugins/auth.ts
export { dispatchAuthPlugin as default } from "@agent-native/dispatch/server";
// server/plugins/integrations.ts
export { dispatchIntegrationsPlugin as default } from "@agent-native/dispatch/server";
// server/plugins/agent-chat.ts
export { dispatchAgentChatPlugin as default } from "@agent-native/dispatch/server";
// server/plugins/db.ts
export { dispatchDbPlugin as default } from "@agent-native/dispatch/server";
// server/plugins/core-routes.ts
export { dispatchCoreRoutesPlugin as default } from "@agent-native/dispatch/server";
Template's server/db/schema.ts:
export * from "@agent-native/dispatch/db";
@agent-native/dispatch/actions doesn't need a manual import for most
consumers: import "@agent-native/dispatch/server" (pulled in by the plugin
wiring above) side-effect-registers every Dispatch action via
registerPackageActions, and the framework's autoDiscoverActions merges
them in after the consumer's local actions/ directory. Drop a same-named
file in the consumer's own actions/ to override any single action.
Exports
| Subpath | What it is |
|---|---|
. | Shared config types only — DispatchConfig, DispatchAuthConfig, DispatchIntegrationsConfig. Import this where a type is needed without pulling in server/client code. |
./routes | dispatchRoutes — a programmatic RouteConfig[] covering every Dispatch page (chat, overview, metrics, operations, apps, vault, integrations, agents, workspace, messaging, destinations, identities, approvals, automations, audit, settings, dreams, extensions, thread-debug, team, and a workspace-app catch-all route). |
./routes/pages/* | Individual compiled page modules the routes above point at (e.g. ./routes/pages/vault.js). Not normally imported directly. |
./server | setupDispatch(config) plus the Nitro plugin set: dispatchAuthPlugin, dispatchIntegrationsPlugin, dispatchAgentChatPlugin, dispatchDbPlugin, dispatchCoreRoutesPlugin. Importing this module also side-effect-registers all Dispatch actions. |
./shared/feature-flags | The default-off DISPATCH_WORKSPACE_SSO_FLAG definition used to target browser workspace sign-in safely. |
./shared/workspace-sso | Exact first-party workspace SSO origins and the additive custom registration parser shared by Dispatch and the identity hub. |
./server/lib/thread-link-preview | loadThreadLinkPreview(threadId) — server-only helper (reads request context and checks thread ownership) that builds link-preview metadata for shared thread URLs. |
./actions | dispatchActions — the flat name → ActionEntry map of every Dispatch action (vault, workspace resources, destinations, dream jobs, provider-api catalog/docs/request, connected agents, audit, approvals, platform messaging, and more). |
./db | getDb() / db(), the Drizzle schema namespace, the Dispatch table exports (dispatchDestinations, dispatchIdentityLinks, dispatchLinkTokens, dispatchApprovalRequests, dispatchAuditEvents, dispatchDreams, dispatchDreamProposals, vaultSecrets, vaultGrants, vaultRequests, vaultAuditLog, workspaceResources, workspaceResourceGrants), and migrations. |
./lib/thread-link-preview | Isomorphic helpers behind the server one above — extractThreadPreviewImageUrl, buildThreadLinkPreviewMeta, and the ThreadLinkPreview type. Safe to import from client code. |
./components | Escape-hatch UI pieces for custom layouts: DispatchShell, Layout/NavContent (plus DispatchExtensionConfig/DispatchNavIcon/DispatchNavItem/DispatchNavSection types), CreateAppPopover/CreateAppFlow, AppKeysPopover. Most consumers only need dispatchRoutes and never import from here directly. |
./components/ui/* | The shadcn/ui primitive set Dispatch's own UI is built on (button, dialog, dropdown-menu, card, command, calendar, chart, ...), exported per-file so a consumer can reuse one primitive without pulling in the rest. |
./styles/dispatch.css | Tailwind layer with Dispatch-specific styles. Import once in the consumer's global CSS entry. |
Hosts that compose the exported layout can brand its desktop and mobile navigation together without forking Dispatch:
import { Layout } from "@agent-native/dispatch/components";
<Layout brandName="Acme Workspace" brandIcon={<AcmeMark />}>
{children}
</Layout>;
Verify a community template branch
When a branch verification fails, an organization owner or admin can call
inspect-community-builder-backup with only branchName. It reads bounded
backup and branch status metadata from the organization's saved Builder project
to show whether the backup is partial, valid, complete and current, whether the
branch is active, archived, deleted or unknown, and whether it is idle or has
unpushed changes. It only reads existing status metadata; it does not request a
backup, download a bundle, or verify app files.
backupPartial returns missing or invalid when the provider flag is absent
or malformed; it never coerces those cases to false.
An explicit provider invalid/no-backup status with no backup object is a
typed status_no_backup failure; other missing backup objects remain malformed
status failures.
verificationPerformed is always false. Use
verify-curated-community-app for the separate hash verification step.
The verifier requests a bundle-download URL and may refresh provider backup
state; this status action does not. Status metadata is diagnostic only and
never authorizes an install or a retry.
Organization owners and admins can call verify-curated-community-app with
sourceId, appId, and branchName to check an existing Builder branch in
the organization's configured Builder project. Project selection and reviewed
file pins come from Dispatch; callers cannot supply another project or hashes.
The action uses the saved Builder connection with project read access. It
requires a complete backup whose digest and immutable commit match the idle,
clean branch before and after reading its Git bundle. Every regular file under
apps/<appId> must match the reviewed template's exact path and Git blob hash;
missing, extra, changed, or linked files fail verification. The result contains
commit and file hashes, without file contents or signed download URLs.
The server needs a writable temporary directory. Verification bounds pack decompression before a JavaScript Git reader opens an isolated object store, never checks out or executes app code, and removes its temporary files. Stale or partial backups, unverifiable identities, access errors, and size limits fail closed.
Verification does not install an app, grant access, change Community Lab, or mark an app ready. Builder-mode community installs remain disabled pending verified generated-branch acceptance.
What it's for
Dispatch is the workspace control plane sitting above individual template apps:
- Vault — shared workspace secrets with a request → grant → audit flow, scoped per app.
- Workspace resources — cross-app resources (e.g. shared instructions or data) with explicit per-app grants and effective-context resolution.
- Simple agents and agent packs — reusable agents keep a Claude-compatible
Markdown/JSON profile at
agents/<slug>.mdand can own sibling files underagents/<slug>/context/,references/, andskills/<name>/SKILL.md. Theimport-agent-packandlist-agent-packactions create/read the whole pack;import-agentremains the fast single-file path. Unsafe capabilities such as credentials, hooks, shell commands, and local environment settings are stripped or reported as warnings. Pack files are text resources, not an execution grant. - Integrations & destinations — outbound messaging channel setup (Slack, Teams, Discord, Telegram, WhatsApp, email, and more) and a destinations queue for delivering agent output.
- Dream jobs — a recurring background job (
ensure-dream-job) that scans agent thread-debug history across connected sources and produces pending, evidence-backed proposals (create-dream-report,list-dream-candidates,apply-dream-proposal/reject-dream-proposal) without an extra LLM call. - Connected agents & provider APIs — discovery of other workspace apps
(
list-connected-agents,open_app,ask_app) and a generic provider-api catalog/docs/request surface for calling third-party APIs through stored credentials. - Approvals & audit — a shared approval-request/audit-event model used across the above surfaces.
Eject
There is no agent-native.package.json / CLI package-lifecycle wiring for
this package yet (unlike @agent-native/scheduling). To customize beyond the
setupDispatch config surface, copy the files you want to own out of
node_modules/@agent-native/dispatch/src into your own package and swap the
dependency manually.