test(ci): remove suite-order mock coupling
This commit is contained in:
+132
-83
@@ -29,108 +29,157 @@ type HooksWithCompactionAutocontinue = Hooks & {
|
||||
"experimental.compaction.autocontinue"?: CompactionAutocontinueHook
|
||||
}
|
||||
|
||||
const serverPlugin: Plugin = async (input, _options): Promise<Hooks> => {
|
||||
installAgentSortShim()
|
||||
initConfigContext("opencode", null)
|
||||
log("[oh-my-openagent] ENTRY - plugin loading", {
|
||||
directory: input.directory,
|
||||
})
|
||||
logLegacyPluginStartupWarning()
|
||||
type PluginModuleDeps = {
|
||||
initConfigContext: typeof initConfigContext
|
||||
installAgentSortShim: typeof installAgentSortShim
|
||||
setAgentSortOrder: typeof setAgentSortOrder
|
||||
log: typeof log
|
||||
logLegacyPluginStartupWarning: typeof logLegacyPluginStartupWarning
|
||||
detectExternalSkillPlugin: typeof detectExternalSkillPlugin
|
||||
getSkillPluginConflictWarning: typeof getSkillPluginConflictWarning
|
||||
injectServerAuthIntoClient: typeof injectServerAuthIntoClient
|
||||
loadPluginConfig: typeof loadPluginConfig
|
||||
initializeOpenClaw: typeof initializeOpenClaw
|
||||
isTmuxIntegrationEnabled: typeof isTmuxIntegrationEnabled
|
||||
startTmuxCheck: typeof startTmuxCheck
|
||||
createFirstMessageVariantGate: typeof createFirstMessageVariantGate
|
||||
createRuntimeTmuxConfig: typeof createRuntimeTmuxConfig
|
||||
createModelCacheState: typeof createModelCacheState
|
||||
createManagers: typeof createManagers
|
||||
createTools: typeof createTools
|
||||
createHooks: typeof createHooks
|
||||
createPluginInterface: typeof createPluginInterface
|
||||
}
|
||||
|
||||
const skillPluginCheck = detectExternalSkillPlugin(input.directory)
|
||||
if (skillPluginCheck.detected && skillPluginCheck.pluginName) {
|
||||
console.warn(getSkillPluginConflictWarning(skillPluginCheck.pluginName))
|
||||
}
|
||||
const defaultPluginModuleDeps: PluginModuleDeps = {
|
||||
initConfigContext,
|
||||
installAgentSortShim,
|
||||
setAgentSortOrder,
|
||||
log,
|
||||
logLegacyPluginStartupWarning,
|
||||
detectExternalSkillPlugin,
|
||||
getSkillPluginConflictWarning,
|
||||
injectServerAuthIntoClient,
|
||||
loadPluginConfig,
|
||||
initializeOpenClaw,
|
||||
isTmuxIntegrationEnabled,
|
||||
startTmuxCheck,
|
||||
createFirstMessageVariantGate,
|
||||
createRuntimeTmuxConfig,
|
||||
createModelCacheState,
|
||||
createManagers,
|
||||
createTools,
|
||||
createHooks,
|
||||
createPluginInterface,
|
||||
}
|
||||
|
||||
injectServerAuthIntoClient(input.client)
|
||||
export function createPluginModule(overrides: Partial<PluginModuleDeps> = {}): PluginModule {
|
||||
const deps = { ...defaultPluginModuleDeps, ...overrides }
|
||||
const serverPlugin: Plugin = async (input, _options): Promise<Hooks> => {
|
||||
deps.installAgentSortShim()
|
||||
deps.initConfigContext("opencode", null)
|
||||
deps.log("[oh-my-openagent] ENTRY - plugin loading", {
|
||||
directory: input.directory,
|
||||
})
|
||||
deps.logLegacyPluginStartupWarning()
|
||||
|
||||
const pluginConfig = loadPluginConfig(input.directory, input)
|
||||
setAgentSortOrder(pluginConfig.agent_order)
|
||||
|
||||
if (pluginConfig.openclaw) {
|
||||
await initializeOpenClaw(pluginConfig.openclaw)
|
||||
}
|
||||
if (pluginConfig.team_mode?.enabled) {
|
||||
const teamModeConfig = pluginConfig.team_mode
|
||||
try {
|
||||
const { ensureBaseDirs, resolveBaseDir } = await import("./features/team-mode/team-registry/paths")
|
||||
const { checkTeamModeDependencies } = await import("./features/team-mode/deps")
|
||||
await checkTeamModeDependencies(teamModeConfig)
|
||||
await ensureBaseDirs(resolveBaseDir(teamModeConfig))
|
||||
if (pluginConfig.disabled_skills?.includes("team-mode")) {
|
||||
console.warn(
|
||||
"[team-mode] enabled=true but team-mode skill is disabled; skill docs hidden but tools still registered (D-29)",
|
||||
)
|
||||
}
|
||||
} catch (err) {
|
||||
console.warn("[team-mode] init failed:", err)
|
||||
const skillPluginCheck = deps.detectExternalSkillPlugin(input.directory)
|
||||
if (skillPluginCheck.detected && skillPluginCheck.pluginName) {
|
||||
console.warn(deps.getSkillPluginConflictWarning(skillPluginCheck.pluginName))
|
||||
}
|
||||
}
|
||||
const tmuxIntegrationEnabled = isTmuxIntegrationEnabled(pluginConfig)
|
||||
if (tmuxIntegrationEnabled) {
|
||||
startTmuxCheck()
|
||||
}
|
||||
const disabledHooks = new Set(pluginConfig.disabled_hooks ?? [])
|
||||
|
||||
const isHookEnabled = (hookName: HookName): boolean => !disabledHooks.has(hookName)
|
||||
const safeHookEnabled = pluginConfig.experimental?.safe_hook_creation ?? true
|
||||
deps.injectServerAuthIntoClient(input.client)
|
||||
|
||||
const firstMessageVariantGate = createFirstMessageVariantGate()
|
||||
const pluginConfig = deps.loadPluginConfig(input.directory, input)
|
||||
deps.setAgentSortOrder(pluginConfig.agent_order)
|
||||
|
||||
const tmuxConfig = createRuntimeTmuxConfig(pluginConfig)
|
||||
if (pluginConfig.openclaw) {
|
||||
await deps.initializeOpenClaw(pluginConfig.openclaw)
|
||||
}
|
||||
if (pluginConfig.team_mode?.enabled) {
|
||||
const teamModeConfig = pluginConfig.team_mode
|
||||
try {
|
||||
const { ensureBaseDirs, resolveBaseDir } = await import("./features/team-mode/team-registry/paths")
|
||||
const { checkTeamModeDependencies } = await import("./features/team-mode/deps")
|
||||
await checkTeamModeDependencies(teamModeConfig)
|
||||
await ensureBaseDirs(resolveBaseDir(teamModeConfig))
|
||||
if (pluginConfig.disabled_skills?.includes("team-mode")) {
|
||||
console.warn(
|
||||
"[team-mode] enabled=true but team-mode skill is disabled; skill docs hidden but tools still registered (D-29)",
|
||||
)
|
||||
}
|
||||
} catch (err) {
|
||||
console.warn("[team-mode] init failed:", err)
|
||||
}
|
||||
}
|
||||
const tmuxIntegrationEnabled = deps.isTmuxIntegrationEnabled(pluginConfig)
|
||||
if (tmuxIntegrationEnabled) {
|
||||
deps.startTmuxCheck()
|
||||
}
|
||||
const disabledHooks = new Set(pluginConfig.disabled_hooks ?? [])
|
||||
|
||||
const modelCacheState = createModelCacheState()
|
||||
const isHookEnabled = (hookName: HookName): boolean => !disabledHooks.has(hookName)
|
||||
const safeHookEnabled = pluginConfig.experimental?.safe_hook_creation ?? true
|
||||
|
||||
const managers = createManagers({
|
||||
ctx: input,
|
||||
pluginConfig,
|
||||
tmuxConfig,
|
||||
modelCacheState,
|
||||
backgroundNotificationHookEnabled: isHookEnabled("background-notification"),
|
||||
})
|
||||
const firstMessageVariantGate = deps.createFirstMessageVariantGate()
|
||||
|
||||
const toolsResult = await createTools({
|
||||
ctx: input,
|
||||
pluginConfig,
|
||||
managers,
|
||||
})
|
||||
const tmuxConfig = deps.createRuntimeTmuxConfig(pluginConfig)
|
||||
|
||||
const hooks = createHooks({
|
||||
ctx: input,
|
||||
pluginConfig,
|
||||
modelCacheState,
|
||||
backgroundManager: managers.backgroundManager,
|
||||
modelFallbackControllerAccessor: managers.modelFallbackControllerAccessor,
|
||||
isHookEnabled,
|
||||
safeHookEnabled,
|
||||
mergedSkills: toolsResult.mergedSkills,
|
||||
availableSkills: toolsResult.availableSkills,
|
||||
})
|
||||
const modelCacheState = deps.createModelCacheState()
|
||||
|
||||
const pluginInterface = createPluginInterface({
|
||||
ctx: input,
|
||||
pluginConfig,
|
||||
firstMessageVariantGate,
|
||||
managers,
|
||||
hooks,
|
||||
tools: toolsResult.filteredTools,
|
||||
})
|
||||
const managers = deps.createManagers({
|
||||
ctx: input,
|
||||
pluginConfig,
|
||||
tmuxConfig,
|
||||
modelCacheState,
|
||||
backgroundNotificationHookEnabled: isHookEnabled("background-notification"),
|
||||
})
|
||||
|
||||
const pluginHooks: HooksWithCompactionAutocontinue = {
|
||||
...pluginInterface,
|
||||
const toolsResult = await deps.createTools({
|
||||
ctx: input,
|
||||
pluginConfig,
|
||||
managers,
|
||||
})
|
||||
|
||||
"experimental.session.compacting": createSessionCompactingHandler(hooks),
|
||||
const hooks = deps.createHooks({
|
||||
ctx: input,
|
||||
pluginConfig,
|
||||
modelCacheState,
|
||||
backgroundManager: managers.backgroundManager,
|
||||
modelFallbackControllerAccessor: managers.modelFallbackControllerAccessor,
|
||||
isHookEnabled,
|
||||
safeHookEnabled,
|
||||
mergedSkills: toolsResult.mergedSkills,
|
||||
availableSkills: toolsResult.availableSkills,
|
||||
})
|
||||
|
||||
"experimental.compaction.autocontinue": createCompactionAutocontinueHandler(hooks),
|
||||
const pluginInterface = deps.createPluginInterface({
|
||||
ctx: input,
|
||||
pluginConfig,
|
||||
firstMessageVariantGate,
|
||||
managers,
|
||||
hooks,
|
||||
tools: toolsResult.filteredTools,
|
||||
})
|
||||
|
||||
const pluginHooks: HooksWithCompactionAutocontinue = {
|
||||
...pluginInterface,
|
||||
|
||||
"experimental.session.compacting": createSessionCompactingHandler(hooks),
|
||||
|
||||
"experimental.compaction.autocontinue": createCompactionAutocontinueHandler(hooks),
|
||||
}
|
||||
|
||||
return pluginHooks
|
||||
}
|
||||
|
||||
return pluginHooks
|
||||
return {
|
||||
id: "oh-my-openagent",
|
||||
server: serverPlugin,
|
||||
}
|
||||
}
|
||||
|
||||
const pluginModule: PluginModule = {
|
||||
id: "oh-my-openagent",
|
||||
server: serverPlugin,
|
||||
}
|
||||
const pluginModule: PluginModule = createPluginModule()
|
||||
|
||||
export default pluginModule
|
||||
|
||||
|
||||
Reference in New Issue
Block a user