Merge PR #8423: fix(extensions): populate runtime mode in context (@roboomp)

This commit is contained in:
can1357
2026-08-13 16:57:11 +02:00
10 changed files with 69 additions and 3 deletions
@@ -2419,6 +2419,7 @@ export class AcpAgent implements Agent {
compact: instructionsOrOptions => runExtensionCompact(record.session, instructionsOrOptions),
},
uiContext,
"rpc",
);
await extensionRunner.emit({ type: "session_start" });
record.extensionsConfigured = true;
@@ -283,7 +283,7 @@ export class ExtensionUiController {
},
};
extensionRunner.initialize(actions, contextActions, commandActions, uiContext);
extensionRunner.initialize(actions, contextActions, commandActions, uiContext, "tui");
// Subscribe to extension errors
extensionRunner.onError((error: ExtensionError) => {
@@ -512,7 +512,7 @@ export class ExtensionUiController {
},
};
extensionRunner.initialize(actions, contextActions, commandActions, uiContext);
extensionRunner.initialize(actions, contextActions, commandActions, uiContext, "tui");
}
/**
@@ -118,6 +118,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
}
// Set up extensions for print mode (no UI, no command context)
await initializeExtensions(session, {
mode: mode === "json" ? "json" : "print",
reportSendError: (action, err) => {
process.stderr.write(
`Extension ${action === "extension_send" ? "sendMessage" : "sendUserMessage"} failed: ${err.message}\n`,
@@ -933,6 +933,7 @@ export async function runRpcMode(
// Set up extensions with RPC-based UI context
await initializeExtensions(session, {
mode: "rpc",
reportSendError: (action, err) => {
output(error(undefined, action, err.message));
},
@@ -8,7 +8,7 @@
*/
import { runExtensionCompact, runExtensionSetModel } from "../extensibility/extensions/compact-handler";
import { getSessionSlashCommands } from "../extensibility/extensions/get-commands-handler";
import type { ExtensionError, ExtensionUIContext } from "../extensibility/extensions/types";
import type { ExtensionError, ExtensionMode, ExtensionUIContext } from "../extensibility/extensions/types";
import type { AgentSession } from "../session/agent-session";
import { USER_INTERRUPT_LABEL } from "../session/messages";
@@ -22,6 +22,8 @@ export interface InitializeExtensionsOptions {
reportRuntimeError: (error: ExtensionError) => void;
/** Optional shutdown hook (rpc mode signals its loop; print mode is a no-op). */
onShutdown?: () => void;
/** Pi-compatible mode exposed to extension contexts. Defaults to `"print"`. */
mode?: ExtensionMode;
/** Optional UI context (rpc supplies one; print runs headless). */
uiContext?: ExtensionUIContext;
/** Optional lifecycle hook for extension-originated messages that can start an agent turn. */
@@ -44,6 +46,7 @@ export async function initializeExtensions(session: AgentSession, options: Initi
reportSendError,
reportRuntimeError,
onShutdown,
mode = "print",
uiContext,
markAgentInvokingMessage,
trackAgentInvokingMessage,
@@ -137,6 +140,7 @@ export async function initializeExtensions(session: AgentSession, options: Initi
compact: instructionsOrOptions => runExtensionCompact(session, instructionsOrOptions),
},
uiContext,
mode,
);
runner.onError(reportRuntimeError);