feat(coding-agent): add InlineExtension type for named inline extension factories (#6267)

* feat(coding-agent): add InlineExtension type for named inline extension factories

* test(coding-agent): update utilities and add regression test for InlineExtension
This commit is contained in:
Victor Araújo
2026-07-06 15:59:37 -03:00
committed by GitHub
parent c8ada4e76e
commit b3dff19a04
13 changed files with 164 additions and 19 deletions
@@ -84,6 +84,7 @@ export type {
GetThinkingLevelHandler,
GrepToolCallEvent,
GrepToolResultEvent,
InlineExtension,
// Events - Input
InputEvent,
InputEventResult,
@@ -1446,6 +1446,14 @@ export interface ProviderModelConfig {
/** Extension factory function type. Supports both sync and async initialization. */
export type ExtensionFactory = (pi: ExtensionAPI) => void | Promise<void>;
export type InlineExtension =
| ExtensionFactory
| {
/** Display name shown as `<inline:name>` in the startup Extensions list. */
name: string;
factory: ExtensionFactory;
};
// ============================================================================
// Loaded Extension Types
// ============================================================================
+1
View File
@@ -55,6 +55,7 @@ export {
ExtensionRunner,
type ExtensionShortcut,
type ExtensionUIContext,
type InlineExtension,
type LoadExtensionsResult,
type MessageRenderer,
type RegisteredCommand,
@@ -15,7 +15,7 @@ import {
loadExtensionFromFactory,
loadExtensionsCached,
} from "./extensions/loader.ts";
import type { Extension, ExtensionFactory, ExtensionRuntime, LoadExtensionsResult } from "./extensions/types.ts";
import type { Extension, ExtensionRuntime, InlineExtension, LoadExtensionsResult } from "./extensions/types.ts";
import { DefaultPackageManager, type PathMetadata, type ResolvedResource } from "./package-manager.ts";
import type { PromptTemplate } from "./prompt-templates.ts";
import { loadPromptTemplates } from "./prompt-templates.ts";
@@ -131,7 +131,7 @@ export interface DefaultResourceLoaderOptions {
additionalSkillPaths?: string[];
additionalPromptTemplatePaths?: string[];
additionalThemePaths?: string[];
extensionFactories?: ExtensionFactory[];
extensionFactories?: InlineExtension[];
noExtensions?: boolean;
noSkills?: boolean;
noPromptTemplates?: boolean;
@@ -169,7 +169,7 @@ export class DefaultResourceLoader implements ResourceLoader {
private additionalSkillPaths: string[];
private additionalPromptTemplatePaths: string[];
private additionalThemePaths: string[];
private extensionFactories: ExtensionFactory[];
private extensionFactories: InlineExtension[];
private noExtensions: boolean;
private noSkills: boolean;
private noPromptTemplates: boolean;
@@ -896,8 +896,10 @@ export class DefaultResourceLoader implements ResourceLoader {
const extensions: Extension[] = [];
const errors: Array<{ path: string; error: string }> = [];
for (const [index, factory] of this.extensionFactories.entries()) {
const extensionPath = `<inline:${index + 1}>`;
for (const [index, input] of this.extensionFactories.entries()) {
const isNamed = typeof input !== "function";
const factory = isNamed ? input.factory : input;
const extensionPath = `<inline:${isNamed ? input.name : index + 1}>`;
try {
const extension = await loadExtensionFromFactory(factory, this.cwd, this.eventBus, runtime, extensionPath);
extensions.push(extension);
+1
View File
@@ -100,6 +100,7 @@ export type {
ExtensionCommandContext,
ExtensionContext,
ExtensionFactory,
InlineExtension,
SlashCommandInfo,
SlashCommandSource,
ToolDefinition,