Plugins: remove public extension-api surface (#48462)

* Plugins: remove public extension-api surface

* Plugins: fix loader setup routing follow-ups

* CI: ignore non-extension helper dirs in extension-fast

* Docs: note extension-api removal as breaking
This commit is contained in:
Tak Hoffman
2026-03-16 15:51:08 -05:00
committed by GitHub
parent 412811ec19
commit 2de28379dd
26 changed files with 179 additions and 306 deletions

View File

@@ -1,4 +1,5 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
import { DEFAULT_MODEL, DEFAULT_PROVIDER } from "../../agents/defaults.js";
import { onAgentEvent } from "../../infra/agent-events.js";
import { requestHeartbeatNow } from "../../infra/heartbeat-wake.js";
import { onSessionTranscriptUpdate } from "../../sessions/transcript-events.js";
@@ -54,6 +55,17 @@ describe("plugin runtime command execution", () => {
expect(runtime.system.requestHeartbeatNow).toBe(requestHeartbeatNow);
});
it("exposes runtime.agent host helpers", () => {
const runtime = createPluginRuntime();
expect(runtime.agent.defaults).toEqual({
model: DEFAULT_MODEL,
provider: DEFAULT_PROVIDER,
});
expect(typeof runtime.agent.runEmbeddedPiAgent).toBe("function");
expect(typeof runtime.agent.resolveAgentDir).toBe("function");
expect(typeof runtime.agent.session.resolveSessionFilePath).toBe("function");
});
it("exposes runtime.modelAuth with getApiKeyForModel and resolveApiKeyForProvider", () => {
const runtime = createPluginRuntime();
expect(runtime.modelAuth).toBeDefined();

View File

@@ -6,6 +6,7 @@ import {
import { resolveStateDir } from "../../config/paths.js";
import { transcribeAudioFile } from "../../media-understanding/transcribe-audio.js";
import { textToSpeechTelephony } from "../../tts/tts.js";
import { createRuntimeAgent } from "./runtime-agent.js";
import { createRuntimeChannel } from "./runtime-channel.js";
import { createRuntimeConfig } from "./runtime-config.js";
import { createRuntimeEvents } from "./runtime-events.js";
@@ -53,6 +54,7 @@ export function createPluginRuntime(_options: CreatePluginRuntimeOptions = {}):
const runtime = {
version: resolveVersion(),
config: createRuntimeConfig(),
agent: createRuntimeAgent(),
subagent: _options.subagent ?? createUnavailableSubagentRuntime(),
system: createRuntimeSystem(),
media: createRuntimeMedia(),

View File

@@ -0,0 +1,36 @@
import { resolveAgentDir, resolveAgentWorkspaceDir } from "../../agents/agent-scope.js";
import { DEFAULT_MODEL, DEFAULT_PROVIDER } from "../../agents/defaults.js";
import { resolveAgentIdentity } from "../../agents/identity.js";
import { resolveThinkingDefault } from "../../agents/model-selection.js";
import { runEmbeddedPiAgent } from "../../agents/pi-embedded.js";
import { resolveAgentTimeoutMs } from "../../agents/timeout.js";
import { ensureAgentWorkspace } from "../../agents/workspace.js";
import {
loadSessionStore,
resolveSessionFilePath,
resolveStorePath,
saveSessionStore,
} from "../../config/sessions.js";
import type { PluginRuntime } from "./types.js";
export function createRuntimeAgent(): PluginRuntime["agent"] {
return {
defaults: {
model: DEFAULT_MODEL,
provider: DEFAULT_PROVIDER,
},
resolveAgentDir,
resolveAgentWorkspaceDir,
resolveAgentIdentity,
resolveThinkingDefault,
runEmbeddedPiAgent,
resolveAgentTimeoutMs,
ensureAgentWorkspace,
session: {
resolveStorePath,
loadSessionStore,
saveSessionStore,
resolveSessionFilePath,
},
};
}

View File

@@ -13,6 +13,25 @@ export type PluginRuntimeCore = {
loadConfig: typeof import("../../config/config.js").loadConfig;
writeConfigFile: typeof import("../../config/config.js").writeConfigFile;
};
agent: {
defaults: {
model: typeof import("../../agents/defaults.js").DEFAULT_MODEL;
provider: typeof import("../../agents/defaults.js").DEFAULT_PROVIDER;
};
resolveAgentDir: typeof import("../../agents/agent-scope.js").resolveAgentDir;
resolveAgentWorkspaceDir: typeof import("../../agents/agent-scope.js").resolveAgentWorkspaceDir;
resolveAgentIdentity: typeof import("../../agents/identity.js").resolveAgentIdentity;
resolveThinkingDefault: typeof import("../../agents/model-selection.js").resolveThinkingDefault;
runEmbeddedPiAgent: typeof import("../../agents/pi-embedded.js").runEmbeddedPiAgent;
resolveAgentTimeoutMs: typeof import("../../agents/timeout.js").resolveAgentTimeoutMs;
ensureAgentWorkspace: typeof import("../../agents/workspace.js").ensureAgentWorkspace;
session: {
resolveStorePath: typeof import("../../config/sessions.js").resolveStorePath;
loadSessionStore: typeof import("../../config/sessions.js").loadSessionStore;
saveSessionStore: typeof import("../../config/sessions.js").saveSessionStore;
resolveSessionFilePath: typeof import("../../config/sessions.js").resolveSessionFilePath;
};
};
system: {
enqueueSystemEvent: typeof import("../../infra/system-events.js").enqueueSystemEvent;
requestHeartbeatNow: typeof import("../../infra/heartbeat-wake.js").requestHeartbeatNow;