40 lines
1.1 KiB
TypeScript
40 lines
1.1 KiB
TypeScript
/**
|
|
* Shared infrastructure for classifier-based permission systems.
|
|
*
|
|
* This module provides common types, schemas, and utilities used by both:
|
|
* - bashClassifier.ts (semantic Bash command matching)
|
|
* - yoloClassifier.ts (YOLO mode security classification)
|
|
*/
|
|
|
|
import type { BetaContentBlock } from '@anthropic-ai/sdk/resources/beta/messages.js'
|
|
import type { z } from 'zod/v4'
|
|
|
|
/**
|
|
* Extract tool use block from message content by tool name.
|
|
*/
|
|
export function extractToolUseBlock(
|
|
content: BetaContentBlock[],
|
|
toolName: string,
|
|
): Extract<BetaContentBlock, { type: 'tool_use' }> | null {
|
|
const block = content.find(b => b.type === 'tool_use' && b.name === toolName)
|
|
if (!block || block.type !== 'tool_use') {
|
|
return null
|
|
}
|
|
return block
|
|
}
|
|
|
|
/**
|
|
* Parse and validate classifier response from tool use block.
|
|
* Returns null if parsing fails.
|
|
*/
|
|
export function parseClassifierResponse<T extends z.ZodTypeAny>(
|
|
toolUseBlock: Extract<BetaContentBlock, { type: 'tool_use' }>,
|
|
schema: T,
|
|
): z.infer<T> | null {
|
|
const parseResult = schema.safeParse(toolUseBlock.input)
|
|
if (!parseResult.success) {
|
|
return null
|
|
}
|
|
return parseResult.data
|
|
}
|