add InstalledPluginConfig type and plugin config schema

This commit is contained in:
Dhruv Sharma 2026-03-31 04:02:14 +05:30
parent b8c67dca50
commit 582c296737
2 changed files with 59 additions and 0 deletions

View File

@ -181,12 +181,40 @@ const DefaultPluginsSchema = z.object({
worker: RoleAgentDefaultsSchema,
});
const InstalledPluginConfigSchema = z
.object({
name: z.string(),
source: z.enum(["registry", "npm", "local"]),
package: z.string().optional(),
version: z.string().optional(),
path: z.string().optional(),
enabled: z.boolean().default(true),
})
.superRefine((value, ctx) => {
if (value.source === "local" && !value.path) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
path: ["path"],
message: "Local plugins require a path",
});
}
if ((value.source === "registry" || value.source === "npm") && !value.package) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
path: ["package"],
message: "Registry and npm plugins require a package name",
});
}
});
const OrchestratorConfigSchema = z.object({
port: z.number().default(3000),
terminalPort: z.number().optional(),
directTerminalPort: z.number().optional(),
readyThresholdMs: z.number().nonnegative().default(300_000),
defaults: DefaultPluginsSchema.default({}),
plugins: z.array(InstalledPluginConfigSchema).default([]),
projects: z.record(ProjectConfigSchema),
notifiers: z.record(NotifierConfigSchema).default({}),
notificationRouting: z.record(z.array(z.string())).default({
@ -216,6 +244,12 @@ function expandPaths(config: OrchestratorConfig): OrchestratorConfig {
project.path = expandHome(project.path);
}
for (const plugin of config.plugins ?? []) {
if (plugin.path) {
plugin.path = expandHome(plugin.path);
}
}
return config;
}

View File

@ -971,6 +971,9 @@ export interface OrchestratorConfig {
/** Default plugin selections */
defaults: DefaultPlugins;
/** Installer-managed external plugin descriptors */
plugins?: InstalledPluginConfig[];
/** Project configurations */
projects: Record<string, ProjectConfig>;
@ -997,6 +1000,28 @@ export interface DefaultPlugins {
};
}
export type InstalledPluginSource = "registry" | "npm" | "local";
export interface InstalledPluginConfig {
/** Stable logical plugin name used in config and CLI UX */
name: string;
/** Where the plugin should be resolved from */
source: InstalledPluginSource;
/** Package name for registry/npm-managed plugins */
package?: string;
/** Requested version/range for installer-managed plugins */
version?: string;
/** Filesystem path for local plugins */
path?: string;
/** Installer-managed enable flag (defaults to true) */
enabled?: boolean;
}
export interface RoleAgentConfig {
agent?: string;
agentConfig?: AgentSpecificConfig;