import { supportsNewPermissionSystem } from "./opencode-version" export { supportsNewPermissionSystem } export type PermissionValue = "ask" | "allow" | "deny" export interface LegacyToolsFormat { tools: Record } export interface NewPermissionFormat { permission: Record } export type VersionAwareRestrictions = LegacyToolsFormat | NewPermissionFormat export function createAgentToolRestrictions( denyTools: string[] ): VersionAwareRestrictions { if (supportsNewPermissionSystem()) { return { permission: Object.fromEntries( denyTools.map((tool) => [tool, "deny" as const]) ), } } return { tools: Object.fromEntries(denyTools.map((tool) => [tool, false])), } } export function migrateToolsToPermission( tools: Record ): Record { return Object.fromEntries( Object.entries(tools).map(([key, value]) => [ key, value ? ("allow" as const) : ("deny" as const), ]) ) } export function migratePermissionToTools( permission: Record ): Record { return Object.fromEntries( Object.entries(permission) .filter(([, value]) => value !== "ask") .map(([key, value]) => [key, value === "allow"]) ) } export function migrateAgentConfig( config: Record ): Record { const result = { ...config } if (supportsNewPermissionSystem()) { if (result.tools && typeof result.tools === "object") { const existingPermission = (result.permission as Record) || {} const migratedPermission = migrateToolsToPermission( result.tools as Record ) result.permission = { ...migratedPermission, ...existingPermission } delete result.tools } } else { if (result.permission && typeof result.permission === "object") { const existingTools = (result.tools as Record) || {} const migratedTools = migratePermissionToTools( result.permission as Record ) result.tools = { ...migratedTools, ...existingTools } delete result.permission } } return result }