// Approval payload contract for suggest_skill_installation. The backend // (skill_installation/tool.py) treats any user_input other than // { action: 'approved', skill: { namespace, slug } } as a decline, so the // generic empty approve payload would silently dismiss the install. export type SkillInstallRef = { description: string; displayName: string; namespace: string; slug: string; }; export function getSkillInstallRef(args: Record | string | null): SkillInstallRef | null { if (!args || typeof args === 'string') return null; const skill = args.skill; if (!skill || typeof skill !== 'object') return null; const record = skill as Record; const namespace = typeof record.namespace === 'string' ? record.namespace.trim() : ''; const slug = typeof record.slug === 'string' ? record.slug.trim() : ''; if (!namespace || !slug) return null; const displayName = typeof record.displayName === 'string' && record.displayName.trim() ? record.displayName.trim() : slug; return { description: typeof record.description === 'string' ? record.description : '', displayName, namespace, slug, }; } export function buildSkillInstallApprovalPayload(skill: SkillInstallRef): { action: 'approved'; skill: { namespace: string; slug: string } } { return { action: 'approved', skill: { namespace: skill.namespace, slug: skill.slug } }; }