export interface SkillSyncDesired { pluginSlug: string; pluginVersion: string; /** Pre-signed S3 URL for the plugin tar; 15-min TTL from issuance. */ s3TarUrl: string; distMode: 'thin' | 'fat' | 'both'; /** Embedded skill components (for indexing only; tar still contains the same data). */ skills: Array<{ slug: string; name: string; description: string; configSchema: unknown; }>; } /** Container-bound event: gateway-core → agent-runtime (sent as JSON string via bridge) */ export interface ContainerSyncSkillsEvent { type: 'sync_skills'; desired: SkillSyncDesired[]; } type SkillSyncEvent = ContainerSyncSkillsEvent; /** * Result combined across both phases. Used by ws-bridge to send 'skills_synced' WS event. */ export interface SkillSyncResult { added: number; removed: number; failed: number; cliInstalled: number; cliFailed: number; } interface SyncLogger { warn(msg: string, meta?: Record): void; info?(msg: string, meta?: Record): void; } export declare function isValidSlug(slug: string): boolean; export declare function acquireLock(skillsDir: string): Promise<() => Promise>; export interface Phase1Result { /** Plugin slugs newly downloaded + extracted this run. */ added: string[]; /** Skill dir names rm-rf'd because their owning plugin is no longer desired. */ removed: string[]; /** Plugin slugs that failed during content sync. */ failedContent: Array<{ pluginSlug: string; reason: string; }>; } export interface Phase1Opts { baselinePluginSlugs?: ReadonlySet; logger?: SyncLogger; /** Override fetch (tests). Defaults to global fetch with 60s timeout. */ tarFetch?: (url: string) => Promise; } export declare function runSkillSyncPhase1(skillsDir: string, _cliRoot: string, event: SkillSyncEvent, opts?: Phase1Opts): Promise; export interface Phase2Result { cliInstalled: Array<{ pluginSlug: string; cliName: string; }>; cliFailed: Array<{ pluginSlug: string; cliName: string; reason: string; }>; } export interface Phase2Opts { baselineCommands: ReadonlySet; /** Override installer (tests). Defaults to npm child-process install. */ cliInstaller?: (npmPackage: string, version: string, prefix: string) => Promise; logger?: SyncLogger; } export declare function runSkillSyncPhase2(skillsDir: string, cliRoot: string, event: SkillSyncEvent, opts: Phase2Opts): Promise; export interface HandleSkillSyncOpts { cliRoot: string; baselinePluginSlugs?: ReadonlySet; baselineCommands: ReadonlySet; cliInstaller?: (npmPackage: string, version: string, prefix: string) => Promise; /** Called after Phase 1 completes (before Phase 2 starts). Used by ws-bridge to resolve firstSyncGate. */ onPhase1Complete?: () => void; logger?: SyncLogger; tarFetch?: (url: string) => Promise; } export declare function handleSkillSync(skillsDir: string, event: SkillSyncEvent, opts: HandleSkillSyncOpts): Promise; export {}; //# sourceMappingURL=skill-sync-handler.d.ts.map