initial new skill system:

- allow users to edit skills
 - ui for skills insdie settings
 - alerts for updated skills + skill diff
This commit is contained in:
tusharmagar 2026-03-23 12:15:29 +05:30
parent c41586b85d
commit 5cbe388096
15 changed files with 851 additions and 17 deletions

View file

@ -11,4 +11,5 @@ export * as inlineTask from './inline-task.js';
export * as blocks from './blocks.js';
export * as frontmatter from './frontmatter.js';
export * as bases from './bases.js';
export * as skill from './skill.js';
export { PrefixLogger };

View file

@ -7,6 +7,7 @@ import { AgentScheduleConfig, AgentScheduleEntry } from './agent-schedule.js';
import { AgentScheduleState } from './agent-schedule-state.js';
import { ServiceEvent } from './service-events.js';
import { UserMessageContent } from './message.js';
import { ResolvedSkill, SkillOverride } from './skill.js';
// ============================================================================
// Runtime Validation Schemas (Single Source of Truth)
@ -550,6 +551,43 @@ const ipcSchemas = {
}),
},
// Billing channels
// Skills channels
'skills:list': {
req: z.null(),
res: z.object({
skills: z.array(ResolvedSkill),
}),
},
'skills:get': {
req: z.object({
id: z.string(),
}),
res: ResolvedSkill.nullable(),
},
'skills:getOfficial': {
req: z.object({
id: z.string(),
}),
res: ResolvedSkill.nullable(),
},
'skills:saveOverride': {
req: z.object({
skillId: z.string(),
meta: SkillOverride,
content: z.string(),
}),
res: z.object({
success: z.literal(true),
}),
},
'skills:deleteOverride': {
req: z.object({
skillId: z.string(),
}),
res: z.object({
success: z.literal(true),
}),
},
'billing:getInfo': {
req: z.null(),
res: z.object({

View file

@ -0,0 +1,42 @@
import { z } from 'zod';
// Official skill metadata (bundled with app)
export const OfficialSkillMeta = z.object({
id: z.string(),
title: z.string(),
summary: z.string(),
version: z.string(),
source: z.literal("official"),
});
// User override metadata (stored on disk as YAML frontmatter)
export const SkillOverride = z.object({
base_skill_id: z.string(),
base_version: z.string(),
title: z.string().optional(),
summary: z.string().optional(),
});
// Parsed override entry (metadata + content)
export const SkillOverrideEntry = z.object({
skillId: z.string(),
meta: SkillOverride,
content: z.string(),
});
// Resolved skill seen by the agent (source-agnostic)
export const ResolvedSkill = z.object({
id: z.string(),
title: z.string(),
summary: z.string(),
version: z.string(),
source: z.enum(["official", "override", "installed"]),
content: z.string(),
hasUpdate: z.boolean().optional(),
baseVersion: z.string().optional(),
});
export type OfficialSkillMeta = z.infer<typeof OfficialSkillMeta>;
export type SkillOverride = z.infer<typeof SkillOverride>;
export type SkillOverrideEntry = z.infer<typeof SkillOverrideEntry>;
export type ResolvedSkill = z.infer<typeof ResolvedSkill>;