feat: expose codex app-server protocol drift summary

This commit is contained in:
AI Bot
2026-06-04 14:43:27 +08:00
parent 5bf2216cb0
commit 0eaf78c3c2
8 changed files with 122 additions and 47 deletions

View File

@@ -1400,6 +1400,35 @@ function normalizeDiscoveryThreadCollaborationSummary(collaborationModes) {
};
}
const CODEX_APP_SERVER_DOC_FOLLOWUP_ITEMS = [
"collaborationMode/list",
"thread/turns/list",
"ThreadItem.collabToolCall",
];
function discoveryMethodFromError(errorText) {
const text = typeof errorText === "string" ? errorText.trim() : "";
if (!text) return "";
return text.split(":")[0] || "";
}
function normalizeDiscoveryProtocolDriftSummary(errors) {
const runtimeFailureMethods = Array.from(
new Set(asArray(errors).map(discoveryMethodFromError).filter(Boolean)),
).slice(0, 12);
return {
driftLevel: runtimeFailureMethods.length > 0 ? "warning" : "compatible",
compatibilityMode: "runtime-probe",
failedProbeCount: runtimeFailureMethods.length,
runtimeFailureMethods,
docFollowupCount: CODEX_APP_SERVER_DOC_FOLLOWUP_ITEMS.length,
docFollowupItems: CODEX_APP_SERVER_DOC_FOLLOWUP_ITEMS,
fallbackStrategy: "Boss Broker + App Server 注入/执行",
userInitiatedOnly: true,
labels: ["运行时探测", "官方文档跟进", "Boss Broker 兜底"],
};
}
function normalizeDiscoveryPluginGovernanceSummary() {
const actions = [
{ label: "安装", group: "lifecycle" },
@@ -2216,6 +2245,51 @@ export async function discoverCodexAppServerCapabilities(runnerConfig) {
}),
})),
);
const discoveryErrors = [
modelResult?.__bossError ? `model/list:${safeRuntimeDiagnosticText(modelResult.__bossError)}` : undefined,
providerCapabilities?.__bossError
? `modelProvider/capabilities/read:${safeRuntimeDiagnosticText(providerCapabilities.__bossError)}`
: undefined,
skillsResult?.__bossError ? `skills/list:${safeRuntimeDiagnosticText(skillsResult.__bossError)}` : undefined,
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
? `experimentalFeature/list:${safeRuntimeDiagnosticText(experimentalFeaturesResult.__bossError)}`
: undefined,
collaborationModesResult?.__bossError
? `collaborationMode/list:${safeRuntimeDiagnosticText(collaborationModesResult.__bossError)}`
: undefined,
permissionProfilesResult?.__bossError
? `permissionProfile/list:${safeRuntimeDiagnosticText(permissionProfilesResult.__bossError)}`
: undefined,
mcpServersResult?.__bossError
? `mcpServerStatus/list:${safeRuntimeDiagnosticText(mcpServersResult.__bossError)}`
: undefined,
accountResult?.__bossError ? `account/read:${safeRuntimeDiagnosticText(accountResult.__bossError)}` : undefined,
rateLimitsResult?.__bossError
? `account/rateLimits/read:${safeRuntimeDiagnosticText(rateLimitsResult.__bossError)}`
: undefined,
configResult?.__bossError ? `config/read:${safeRuntimeDiagnosticText(configResult.__bossError)}` : undefined,
configRequirementsResult?.__bossError
? `configRequirements/read:${safeRuntimeDiagnosticText(configRequirementsResult.__bossError)}`
: undefined,
externalAgentConfigResult?.__bossError
? `externalAgentConfig/detect:${safeRuntimeDiagnosticText(externalAgentConfigResult.__bossError)}`
: undefined,
threadListResult?.__bossError
? `thread/list:${safeRuntimeDiagnosticText(threadListResult.__bossError)}`
: undefined,
loadedThreadsResult?.__bossError
? `thread/loaded/list:${safeRuntimeDiagnosticText(loadedThreadsResult.__bossError)}`
: undefined,
...threadTurnResults
.filter((entry) => entry.result?.__bossError)
.map((entry) => `thread/turns/list:${entry.threadId}:${safeRuntimeDiagnosticText(entry.result.__bossError)}`),
].filter(Boolean);
return {
version: trimToDefined(runnerConfig.version),
@@ -2249,6 +2323,7 @@ export async function discoverCodexAppServerCapabilities(runnerConfig) {
threadCollaborationSummary: normalizeDiscoveryThreadCollaborationSummary(
normalizeDiscoveryCollaborationModes(collaborationModesResult),
),
protocolDriftSummary: normalizeDiscoveryProtocolDriftSummary(discoveryErrors),
pluginGovernanceSummary: normalizeDiscoveryPluginGovernanceSummary(),
accountGovernanceSummary: normalizeDiscoveryAccountGovernanceSummary(),
configGovernanceSummary: normalizeDiscoveryConfigGovernanceSummary(),
@@ -2267,51 +2342,7 @@ export async function discoverCodexAppServerCapabilities(runnerConfig) {
extensionEventSummary: normalizeDiscoveryExtensionEventSummary(),
threadLifecycleEventSummary: normalizeDiscoveryThreadLifecycleEventSummary(),
streamDeltaEventSummary: normalizeDiscoveryStreamDeltaEventSummary(),
errors: [
modelResult?.__bossError ? `model/list:${safeRuntimeDiagnosticText(modelResult.__bossError)}` : undefined,
providerCapabilities?.__bossError
? `modelProvider/capabilities/read:${safeRuntimeDiagnosticText(providerCapabilities.__bossError)}`
: undefined,
skillsResult?.__bossError ? `skills/list:${safeRuntimeDiagnosticText(skillsResult.__bossError)}` : undefined,
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
? `experimentalFeature/list:${safeRuntimeDiagnosticText(experimentalFeaturesResult.__bossError)}`
: undefined,
collaborationModesResult?.__bossError
? `collaborationMode/list:${safeRuntimeDiagnosticText(collaborationModesResult.__bossError)}`
: undefined,
permissionProfilesResult?.__bossError
? `permissionProfile/list:${safeRuntimeDiagnosticText(permissionProfilesResult.__bossError)}`
: undefined,
mcpServersResult?.__bossError
? `mcpServerStatus/list:${safeRuntimeDiagnosticText(mcpServersResult.__bossError)}`
: undefined,
accountResult?.__bossError ? `account/read:${safeRuntimeDiagnosticText(accountResult.__bossError)}` : undefined,
rateLimitsResult?.__bossError
? `account/rateLimits/read:${safeRuntimeDiagnosticText(rateLimitsResult.__bossError)}`
: undefined,
configResult?.__bossError ? `config/read:${safeRuntimeDiagnosticText(configResult.__bossError)}` : undefined,
configRequirementsResult?.__bossError
? `configRequirements/read:${safeRuntimeDiagnosticText(configRequirementsResult.__bossError)}`
: undefined,
externalAgentConfigResult?.__bossError
? `externalAgentConfig/detect:${safeRuntimeDiagnosticText(externalAgentConfigResult.__bossError)}`
: undefined,
threadListResult?.__bossError
? `thread/list:${safeRuntimeDiagnosticText(threadListResult.__bossError)}`
: undefined,
loadedThreadsResult?.__bossError
? `thread/loaded/list:${safeRuntimeDiagnosticText(loadedThreadsResult.__bossError)}`
: undefined,
...threadTurnResults
.filter((entry) => entry.result?.__bossError)
.map((entry) => `thread/turns/list:${entry.threadId}:${safeRuntimeDiagnosticText(entry.result.__bossError)}`),
].filter(Boolean),
errors: discoveryErrors,
};
});
}