Skip to content

Skills

Skill definitions and the invoke contract.

Every schema below is exported from @novaterra/contracts and validated on both sides of the wire. Source: packages/contracts/src/skills.ts.

SkillKind

'builtin' | 'http' | 'script'

SkillCategory

'web' | 'files' | 'code' | 'docs' | 'image' | 'comms' | 'data' | 'memory' | 'desktop' | 'llm' | 'other'

SkillDef

FieldTypeNotes
idId
namestringdotted: ‘web.search’
descriptionstring
categorySkillCategory
inputSchemaJsonJSON Schema
outputSchemaJson
kindSkillKind
configJsonoptional · default {} · for http: {url, method, headers}; script: {language, source}
ownerIdId | nulloptional · default null
isPublicbooleanoptional · default true
requiresConnectionstring | nulloptional · default null · ‘gmail’ | ‘telegram’ | …
createdAtISODate

SkillSummary

The skill shelf’s card fields. inputSchema + outputSchema were 73% of GET /api/studio/skills (47.8 kB for ~45 skills), and nothing on a card reads either one. Only the try-it drawer does — it builds a form from inputSchema and shows both raw — and it needs them for the ONE skill being opened, so it fetches GET /api/studio/skills/:name instead of every skill’s schemas being sent to render a list. .pick() rather than .omit(), for the reason spelled out on GeneratorSummary in ./studio.ts: a field added to SkillDef later must be named here to appear in the list, so a new heavy field cannot silently re-inflate this response, and a consumer reading a dropped field fails as a type error rather than reading undefined.

FieldTypeNotes
idId
namestring
descriptionstring
categorySkillCategory
kindSkillKind
requiresConnectionstring | nulloptional · default null

SkillInvokeRequest

FieldTypeNotes
namestring
inputJson

SkillInvokeResponse

FieldTypeNotes
okboolean
outputJsonoptional
errorstringoptional
durationMsnumber