refactor(tools): unify tool APIs and result handling (#38367)

This commit is contained in:
Kit Langton 2026-07-23 17:13:31 -04:00 committed by GitHub
commit 79c1544072
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
133 changed files with 3602 additions and 2770 deletions

View file

@ -17,7 +17,7 @@ export type PermissionPresentationInput = {
resources: ReadonlyArray<unknown>
metadata?: unknown
input?: unknown
structured?: unknown
toolMetadata?: unknown
}
export function permissionPresentation(
@ -26,7 +26,7 @@ export function permissionPresentation(
): PermissionPresentation {
const action = canonicalToolName(source.action)
const input = normalizeInput(action, source.input)
const metadata = { ...dict(source.structured), ...dict(source.metadata) }
const metadata = { ...dict(source.toolMetadata), ...dict(source.metadata) }
const resources = source.resources.filter((item): item is string => typeof item === "string")
if (action === "edit") {

View file

@ -28,7 +28,19 @@ export function webSearchProviderLabel(provider: unknown) {
export function toolDisplayMetadata(state: unknown): Record<string, unknown> {
if (!state || typeof state !== "object" || Array.isArray(state)) return {}
if (!("status" in state) || state.status === "streaming") return {}
if (!("structured" in state) || !state.structured || typeof state.structured !== "object") return {}
if (Array.isArray(state.structured)) return {}
return state.structured as Record<string, unknown>
if (!("metadata" in state) || !state.metadata || typeof state.metadata !== "object") return {}
if (Array.isArray(state.metadata)) return {}
return state.metadata as Record<string, unknown>
}
export function toolDisplayContent(state: SessionMessageAssistantTool["state"]) {
if (state.status === "streaming" || state.status === "running") return []
return state.content ?? []
}
export function nonEmptyToolContent<T>(content: ReadonlyArray<T> | undefined): [T, ...T[]] | undefined {
if (!content) return undefined
const [first, ...rest] = content
return first === undefined ? undefined : [first, ...rest]
}
import type { SessionMessageAssistantTool } from "@opencode-ai/client/promise"