feat(skills): audit scan results and block unroutable skills

This commit is contained in:
William Valentin
2026-02-15 11:06:52 -08:00
parent 83752d4e1c
commit 56e887a6bf
5 changed files with 50 additions and 1 deletions
+11
View File
@@ -10,6 +10,7 @@ import type {
ToolApprovalEvent,
SkillsInstallerExecutionBlockedEvent,
SkillsInstallerCommandResultEvent,
SkillsScanEvent,
SessionCreateEvent,
SessionMessageEvent,
SessionDeleteEvent,
@@ -113,6 +114,16 @@ export class AuditLogger {
});
}
skillsScan(event: SkillsScanEvent): void {
const level = event.ok ? 'debug' : 'warn';
if (!this.shouldLog('tools', level)) {return;}
this.write({
level,
event_type: event.ok ? 'skills.scan.pass' : 'skills.scan.fail',
event: event as unknown as Record<string, unknown>,
});
}
// ── Session Events ───────────────────────────────────────────
sessionCreate(event: SessionCreateEvent): void {
+12
View File
@@ -3,6 +3,8 @@ export type AuditLevel = 'debug' | 'info' | 'warn' | 'error';
export type AuditEventType =
// Tool execution
| 'tool.start' | 'tool.success' | 'tool.error' | 'tool.denied' | 'tool.approval'
// Skills scan
| 'skills.scan.pass' | 'skills.scan.fail'
// Skills installer
| 'skills.installer.execution_blocked' | 'skills.installer.command_result'
// Session lifecycle
@@ -122,6 +124,16 @@ export interface SkillsInstallerCommandResultEvent {
reason: string;
}
export interface SkillsScanEvent {
skill_name: string;
tier: 'bundled' | 'managed' | 'workspace' | 'unknown';
phase: 'load' | 'install';
ok: boolean;
error_count: number;
warn_count: number;
issue_codes: string[];
}
export interface SessionCreateEvent {
session_id: string;
frontend: string;