import type { OfficialSkillInfo, SkillHubPreview, SkillHubScanResult, SkillHubSearchResponse, SkillHubSourcesResponse, SkillInfo, StarmapGraph } from '@/types/hermes' import type { ActionResponse } from '@/types/hermes' import { capabilityScoped, hermesApi, type ProfileScope, profileScoped } from './client' export function getSkills(profile?: ProfileScope): Promise { return window.hermesDesktop.api({ ...capabilityScoped(profile), path: '/api/skills' }) } /** Raw SKILL.md text (frontmatter included) for ANY skill — bundled, hub, or * learned — backing the Capabilities detail pane's full-skill view. */ export function getSkillContent( name: string, profile?: ProfileScope ): Promise<{ content: string; name: string; path: string }> { return window.hermesDesktop.api<{ content: string; name: string; path: string }>({ ...capabilityScoped(profile), path: `/api/skills/content?name=${encodeURIComponent(name)}` }) } export function setSkillEnabled( name: string, enabled: boolean, profile?: ProfileScope ): Promise<{ ok: boolean; name: string; enabled: boolean }> { return window.hermesDesktop.api<{ ok: boolean; name: string; enabled: boolean }>({ ...capabilityScoped(profile), path: '/api/skills/toggle', method: 'PUT', body: { name, enabled } }) } export function getStarmapGraph(): Promise { return hermesApi({ ...profileScoped(), // Backend REST contract — stays /api/learning even though the UI feature is // now "star map". Renaming this would break against an un-upgraded backend. path: '/api/learning/graph' }) } export interface LearningNodeDetail { content: string kind: 'memory' | 'skill' label: string ok: boolean } export function getLearningNode(id: string, profile?: ProfileScope): Promise { return window.hermesDesktop.api({ ...capabilityScoped(profile), path: `/api/learning/node?id=${encodeURIComponent(id)}` }) } export function deleteLearningNode(id: string, profile?: ProfileScope): Promise<{ message: string; ok: boolean }> { return window.hermesDesktop.api<{ message: string; ok: boolean }>({ ...capabilityScoped(profile), path: '/api/learning/node', method: 'DELETE', body: { id } }) } export function editLearningNode( id: string, content: string, profile?: ProfileScope ): Promise<{ message: string; ok: boolean }> { return window.hermesDesktop.api<{ message: string; ok: boolean }>({ ...capabilityScoped(profile), path: '/api/learning/node', method: 'PUT', body: { content, id } }) } // --------------------------------------------------------------------------- // Skills hub — search / preview / scan / install (parity with `hermes skills` // and the dashboard's Browse-hub tab). Installs spawn background actions whose // logs are tailed via getActionStatus(). // --------------------------------------------------------------------------- const HUB_REQUEST_TIMEOUT_MS = 45_000 /** The full built-in optional-skills catalog (local checkout scan — fast), * with per-profile installed flags. Feeds the Capabilities Skills list's * "available to install" rows. */ export function getOfficialSkills(profile?: ProfileScope): Promise<{ skills: OfficialSkillInfo[] }> { return window.hermesDesktop.api<{ skills: OfficialSkillInfo[] }>({ ...capabilityScoped(profile), path: '/api/skills/hub/official' }) } export function getSkillHubSources(profile?: null | string): Promise { return hermesApi({ ...profileScoped(profile), path: '/api/skills/hub/sources', timeoutMs: HUB_REQUEST_TIMEOUT_MS }) } export function searchSkillsHub( query: string, source = 'all', limit = 20, profile?: null | string ): Promise { const params = new URLSearchParams({ q: query, source, limit: String(limit) }) return hermesApi({ ...profileScoped(profile), path: `/api/skills/hub/search?${params.toString()}`, timeoutMs: HUB_REQUEST_TIMEOUT_MS }) } export function previewSkillHub(identifier: string, profile?: ProfileScope): Promise { return window.hermesDesktop.api({ ...capabilityScoped(profile), path: `/api/skills/hub/preview?identifier=${encodeURIComponent(identifier)}`, timeoutMs: HUB_REQUEST_TIMEOUT_MS }) } export function scanSkillHub(identifier: string, profile?: null | string): Promise { return hermesApi({ ...profileScoped(profile), path: `/api/skills/hub/scan?identifier=${encodeURIComponent(identifier)}`, timeoutMs: HUB_REQUEST_TIMEOUT_MS }) } export function installSkillFromHub(identifier: string, profile?: ProfileScope): Promise { return window.hermesDesktop.api({ ...capabilityScoped(profile), path: '/api/skills/hub/install', method: 'POST', body: { identifier } }) } export function uninstallSkillFromHub(name: string, profile?: ProfileScope): Promise { return window.hermesDesktop.api({ ...capabilityScoped(profile), path: '/api/skills/hub/uninstall', method: 'POST', body: { name } }) } export function updateSkillsFromHub(profile?: ProfileScope): Promise { return window.hermesDesktop.api({ ...capabilityScoped(profile), path: '/api/skills/hub/update', method: 'POST', body: {} }) }