Events Reference

Devframe carries change notifications through client contexts, node event buses, RPC, broadcasts, and shared state.

Devframe carries change notifications through client contexts, node event buses, RPC, broadcasts, and shared state.

Two prefixes mark the wire protocol: hub: for hub-layer server RPC (client → server), devframe: for the client-facing protocol (server → client). The internal event bus mirrors the subsystem vocabulary (docks, terminals, messages, commands): docks:activate fans out to devframe:docks:activate.

Each name lives in code: HUB_EVENTS (@devframes/hub/constants) backs the hub tables, DEVFRAME_EVENTS (devframe/constants) the core ones.

Hub events

Client-context events

Client scripts subscribe to these events on the client context inside the host page.

EventEmitterPayload
panel:state:changedctx.panel.eventsDevframeDockPanelState

ctx.panel.state supplies the current snapshot when a client script loads. Later open, close, dock selection, and hub UI provider visibility changes emit panel:state:changed. The snapshot contains state: 'open' | 'closed' | 'hidden' and an optional selectedDockId.

Internal node event bus

Each subsystem emits on ctx.<subsystem>.events, consumed inside the same node process by createHubContext, which fans them onto the wire.

EventEmitted byConsumed byPayload
docks:entry:updatedDocksHost.register / updatecontext → devframe:docks shared stateDevframeDockUserEntry
docks:activateDocksHost.activate()context → broadcast + devframe:docks:activeDevframeDockActivation
terminals:session:updatedTerminalsHost register / update / remove / status changecontext → devframe:terminals:updated; the terminals devframeDevframeTerminalSession
messages:added / messages:updated / messages:removed / messages:clearedMessagesHost mutationscontext → devframe:messages:updated; the messages devframeentry / entry / id / none
commands:registered / commands:unregisteredCommandsHost register / update / unregistercontext → devframe:commands shared stateentry / id

Server RPC methods (client → server)

MethodSignaturePurpose
hub:docks:activate({ dockId, params? }) => voidAsk the hub UI provider to switch its active dock; see Deep Linking.
hub:commands:execute(id, ...args) => unknownInvoke a registered server command by id.
hub:messages:add(input) => DevframeMessageEntryAdd a message to the feed (marked from: 'browser').
hub:messages:update(id, patch) => DevframeMessageEntry | undefinedPatch a message by id.
hub:messages:remove(id) => voidRemove a message by id.
hub:messages:clear() => voidRemove every message.
hub:terminals:write(id, data) => voidSend input to an interactive PTY session.
hub:terminals:resize(id, cols, rows) => voidResize an interactive PTY session.
hub:terminals:terminate(id) => voidKill a session's process, keeping it registered.
hub:terminals:restart(id) => voidRe-run a session's command in place.
hub:terminals:remove(id) => voidKill a session's process and drop it from the registry.

Broadcasts & shared state (server → client)

A hub-aware RPC client reads or subscribes via rpc.client.register(...); the client runtime registers the devframe:docks:activate handler for you.

NameKindCarries
devframe:docks:activatebroadcastLive "switch active dock" request; the client runtime calls its local switchEntry.
devframe:terminals:updatedbroadcastTerminal sessions changed; re-read terminal state.
devframe:messages:updatedbroadcastMessage list changed; re-read message state.
devframe:docksshared stateProjected dock entry list (DevframeDockEntry[]).
devframe:docks:activeshared stateMost recent DevframeDockActivation, so a dock that mounts in response still converges on it.
devframe:commandsshared stateSerializable command list, handlers stripped (DevframeServerCommandEntry[]).
devframe:user-settingsshared statePersisted project-scope hub settings (DevframeDocksUserSettings).
devframe:terminalsstreaming channelLive terminal output stream, keyed by session id.

Same-origin BroadcastChannels

Used on a static backend, where no live server can relay a client's request to its sibling browsing contexts.

NamePosted byCarries
devframe:docks:activatea panel iframe (e.g. the messages panel's activate actions)The { dockId, params? } activation; the client runtime in the host page switches the dock locally.

Core devframe events

This map covers notifications only; request/response RPC endpoints (devframe:rpc:server-state:*, devframe:streaming:subscribe, anonymous:devframe:auth, …) are typed in types/rpc-augments.ts, not events.

Node event bus

Emitted on ctx.agent.events; adapters (e.g. the MCP server) re-publish their manifest.

EventEmitted byPayload
agent:manifest:changedany tool/resource/provider changenone
agent:tool:registered / agent:tool:unregisteredregisterTool / unregisterToolAgentTool / id
agent:resource:registered / agent:resource:unregisteredregisterResource / unregisterResourceAgentResource / id

RPC client connection events

Emitted on the RPC client's rpc.events (RpcClientEvents) to track connection lifecycle and errors.

EventCarries
rpc:is-trusted:updatedTrust gate flipped (boolean).
rpc:errorAn RPC call rejected (error, method).
connection:statusConnection status changed (status, previous).
connection:errorA connection-level error (WebSocket errored, or trust refused).

Broadcasts (server → client)

Pushed to subscribed RPC clients, wired by the core node side.

NameCarries
devframe:auth:revokedThis connection's bearer token was revoked; the RPC client drops to untrusted.
devframe:rpc:client-state:updatedFull shared-state snapshot for a key.
devframe:rpc:client-state:patchIncremental shared-state patch for a key.
devframe:streaming:chunkA streaming chunk for a subscribed channel/id.
devframe:streaming:endA streaming terminator (optionally an error).
devframe:streaming:upload-cancelServer-side cancel of an in-flight upload.

In-page channel notifications (page script → panel)

Pushed over each panel's in-page channel port; the paired request methods (devframe:in-page:page-state:subscribe/set/patch) are call endpoints defined at their handlers, not events.

NameCarries
devframe:in-page:panel-state:updatedFull channel shared-state snapshot for a key.
devframe:in-page:panel-state:patchIncremental channel shared-state patch for a key.

postMessage channels

NamePosted byCarries
devframe:remote-assets-errorthe remote-assets fallback page, to window.parentThe failed package/version/reason, so an embedding hub UI provider can replace the 502 page.
devframe:in-page-channelboth in-page channel endpoints, across window boundariesThe versioned handshake envelope (panel hello, page-script port grant).