feat: surface codex app server hook governance

This commit is contained in:
AI Bot
2026-06-03 11:03:45 +08:00
parent 3c6a0c546b
commit 0071dec860
13 changed files with 154 additions and 13 deletions

View File

@@ -1221,6 +1221,30 @@ function normalizeDiscoverySkillExtraRootsSummary(roots, result) {
};
}
function normalizeDiscoveryHookSummary(result) {
const entries = asArray(result?.data);
const hooks = entries.flatMap((entry) => asArray(entry?.hooks));
const eventNames = Array.from(
new Set(hooks.map((hook) => safeProgressText(hook?.eventName, 80)).filter(Boolean)),
).sort();
const handlerTypes = Array.from(
new Set(hooks.map((hook) => safeProgressText(hook?.handlerType, 80)).filter(Boolean)),
).sort();
return {
workspaceCount: entries.length,
hookCount: hooks.length,
enabledHookCount: hooks.filter((hook) => hook?.enabled !== false).length,
managedHookCount: hooks.filter((hook) => Boolean(hook?.isManaged)).length,
trustedHookCount: hooks.filter((hook) => safeProgressText(hook?.trustStatus, 40) === "trusted").length,
modifiedHookCount: hooks.filter((hook) => safeProgressText(hook?.trustStatus, 40) === "modified").length,
untrustedHookCount: hooks.filter((hook) => safeProgressText(hook?.trustStatus, 40) === "untrusted").length,
warningCount: entries.reduce((sum, entry) => sum + asArray(entry?.warnings).length, 0),
errorCount: entries.reduce((sum, entry) => sum + asArray(entry?.errors).length, 0),
eventNames: eventNames.slice(0, 12),
handlerTypes: handlerTypes.slice(0, 12),
};
}
function normalizeDiscoveryPlugins(result) {
return asArray(result?.marketplaces)
.flatMap((marketplace) => asArray(marketplace?.plugins))
@@ -1618,6 +1642,7 @@ export async function discoverCodexAppServerCapabilities(runnerConfig) {
modelResult,
providerCapabilities,
skillsResult,
hooksResult,
pluginResult,
appsResult,
experimentalFeaturesResult,
@@ -1635,6 +1660,7 @@ export async function discoverCodexAppServerCapabilities(runnerConfig) {
safeRequest(request, "model/list", { includeHidden: false, limit }),
safeRequest(request, "modelProvider/capabilities/read", {}),
safeRequest(request, "skills/list", { cwds: [cwd], forceReload: false }),
safeRequest(request, "hooks/list", { cwds: [cwd] }),
safeRequest(request, "plugin/list", { cwds: [cwd] }),
safeRequest(request, "app/list", { limit }),
safeRequest(request, "experimentalFeature/list", { limit }),
@@ -1698,6 +1724,7 @@ export async function discoverCodexAppServerCapabilities(runnerConfig) {
configRequirements: normalizeDiscoveryConfigRequirements(configRequirementsResult),
externalAgentMigration: normalizeDiscoveryExternalAgentMigration(externalAgentConfigResult),
skillExtraRootsSummary: normalizeDiscoverySkillExtraRootsSummary(skillExtraRoots, skillExtraRootsResult),
hookSummary: normalizeDiscoveryHookSummary(hooksResult),
threadSummary,
threadTurnSummary: normalizeDiscoveryThreadTurnSummary(threadTurnResults, limit),
errors: [
@@ -1709,6 +1736,7 @@ export async function discoverCodexAppServerCapabilities(runnerConfig) {
skillExtraRootsResult?.__bossError
? `skills/extraRoots/set:${safeRuntimeDiagnosticText(skillExtraRootsResult.__bossError)}`
: undefined,
hooksResult?.__bossError ? `hooks/list:${safeRuntimeDiagnosticText(hooksResult.__bossError)}` : undefined,
pluginResult?.__bossError ? `plugin/list:${safeRuntimeDiagnosticText(pluginResult.__bossError)}` : undefined,
appsResult?.__bossError ? `app/list:${safeRuntimeDiagnosticText(appsResult.__bossError)}` : undefined,
experimentalFeaturesResult?.__bossError