UNPKG

autosnippet

Version:

Extract code patterns into a knowledge base for AI coding assistants

409 lines (408 loc) 10.6 kB
/** * Shared type definitions for MCP handler modules. * Runtime-free only interfaces and type aliases. */ import type { SessionStore } from '#agent/memory/SessionStore.js'; /** * Minimal DI container shape used by MCP handlers. * Compatible with both the full ServiceContainer class and the * lightweight ServiceContainer interface in agent tools. */ export interface McpServiceContainer { get(name: string): any; getServiceNames?(): string[]; singletons?: Record<string, unknown>; } /** A single decision recorded during an intent lifecycle */ export interface DecisionRecord { id: string; title: string; description: string; rationale?: string; tags?: string[]; recordedAt: number; } /** A single tool call record within an intent */ export interface ToolCallRecord { tool: string; timestamp: number; args_summary: string; } /** A drift event detected during an intent */ export interface DriftEvent { timestamp: number; trigger: string; type: 'new_module' | 'new_class' | 'search_shift' | 'file_shift'; detail: string; primeOverlap: number; } /** Intent lifecycle state machine tracks user intent from prime to close/fail */ export interface IntentState { phase: 'idle' | 'active' | 'ended'; primeQuery: string; primeActiveFile?: string; primeRecipeIds: string[]; primeAt: number; primeLanguage: string | null; primeModule: string | null; primeScenario: string; searchMeta?: { queries: string[]; resultCount: number; filteredCount: number; }; taskId?: string; taskTitle?: string; toolCalls: ToolCallRecord[]; searchQueries: string[]; mentionedFiles: string[]; mentionedModules: Set<string>; decisions: DecisionRecord[]; driftEvents: DriftEvent[]; } /** Create a fresh idle IntentState */ export declare function createIdleIntent(): IntentState; /** A complete intent chain record, written to JSONL on close/fail */ export interface IntentChainRecord { sessionId: string; taskId?: string; outcome: 'completed' | 'failed' | 'abandoned'; primeQuery: string; primeActiveFile?: string; primeRecipeIds: string[]; primeAt: number; primeLanguage: string | null; primeModule: string | null; primeScenario: string; searchMeta?: { queries: string[]; resultCount: number; filteredCount: number; }; toolCalls: ToolCallRecord[]; searchQueries: string[]; mentionedFiles: string[]; decisions: DecisionRecord[]; driftEvents: DriftEvent[]; driftScore: number; closeReason?: string; failReason?: string; guardViolations?: number; startedAt: number; endedAt: number; duration: number; } /** MCP session tracking */ export interface McpSession { id: string; startedAt: number; toolCallCount: number; toolsUsed: Set<string>; lastActivityAt: number; intent: IntentState; } /** MCP handler context passed from McpServer / router layer */ export interface McpContext { container: McpServiceContainer; startedAt?: number; session?: McpSession; [key: string]: unknown; } /** Common search handler args */ export interface SearchArgs { query: string; limit?: number; kind?: string; type?: string; mode?: string; language?: string; sessionHistory?: unknown[]; [key: string]: unknown; } /** Raw search result item before projection */ export interface SearchResultItem { id: string; title: string; trigger?: string; kind?: string; language?: string; score?: number; description?: string; doClause?: string; whenClause?: string; metadata?: { kind?: string; [key: string]: unknown; }; [key: string]: unknown; } /** Slim search item after projection */ export interface SlimSearchItem { id: string; title: string; trigger: string; kind: string; language: string; score?: number; description: string; actionHint?: string; } /** Minimal shape of a knowledge entry JSON (read-only projections) */ export interface KnowledgeEntryJSON { id: string; title: string; trigger?: string; kind?: string; language?: string; category?: string; lifecycle?: string; complexity?: string; description?: string; knowledgeType?: string; doClause?: string; whenClause?: string; dontClause?: string; coreCode?: string; tags?: string[]; scope?: string; headers?: string[]; content?: { pattern?: string; markdown?: string; rationale?: string; steps?: unknown[]; codeChanges?: unknown[]; verification?: unknown; [key: string]: unknown; }; reasoning?: { whyStandard?: string; confidence?: number; sources?: unknown[]; qualitySignals?: unknown; alternatives?: unknown; [key: string]: unknown; }; relations?: Record<string, unknown[]>; constraints?: { guards?: unknown[]; sideEffects?: unknown[]; boundaries?: unknown[]; preconditions?: unknown[]; [key: string]: unknown; }; quality?: { overall?: number | null; completeness?: number | null; adaptation?: number | null; documentation?: number | null; [key: string]: unknown; }; stats?: { adoptions?: number; applications?: number; guardHits?: number; views?: number; searchHits?: number; [key: string]: unknown; }; createdBy?: string; createdAt?: string; updatedAt?: string; toJSON?: () => KnowledgeEntryJSON; [key: string]: unknown; } export interface BrowseListArgs { kind?: string; language?: string; category?: string; knowledgeType?: string; complexity?: string; status?: string; limit?: number; [key: string]: unknown; } export interface BrowseGetArgs { id?: string; [key: string]: unknown; } export interface ConfirmUsageArgs { recipeId?: string; id?: string; usageType?: string; feedback?: string | null; [key: string]: unknown; } export interface ValidateCandidateArgs { candidate?: Record<string, unknown>; strict?: boolean; [key: string]: unknown; } /** Shape of a candidate object expected by validateCandidate (input from Agent) */ export interface CandidateInput { title?: string; code?: string; language?: string; category?: string; knowledgeType?: string; complexity?: string; trigger?: string; summary?: string; description?: string; usageGuide?: string; rationale?: string; headers?: string[]; steps?: unknown; codeChanges?: unknown; constraints?: unknown; reasoning?: { whyStandard?: string; sources?: unknown[]; confidence?: number; }; [key: string]: unknown; } export interface CheckDuplicateArgs { candidate?: Record<string, unknown>; threshold?: number; topK?: number; [key: string]: unknown; } export interface EnrichCandidatesArgs { candidateIds?: string[]; [key: string]: unknown; } export interface ConsolidatedSearchArgs extends SearchArgs { mode?: string; } export interface ConsolidatedKnowledgeArgs extends BrowseListArgs, BrowseGetArgs { operation?: string; recipeId?: string; usageType?: string; feedback?: string | null; } export interface ConsolidatedStructureArgs { operation?: string; [key: string]: unknown; } export interface ConsolidatedGraphArgs { operation?: string; [key: string]: unknown; } export interface ConsolidatedGuardArgs { operation?: 'check' | 'review' | 'reverse_audit' | 'coverage_matrix' | 'compliance_report'; code?: string; files?: Array<string | { path?: string; [key: string]: unknown; }>; [key: string]: unknown; } export interface ConsolidatedSkillArgs { operation?: string; name?: string; skillName?: string; [key: string]: unknown; } export interface SubmitKnowledgeArgs { title?: string; description?: string; content?: { pattern?: string; [key: string]: unknown; }; dimensionId?: string; knowledgeType?: string; skipDuplicateCheck?: boolean; skipConsolidation?: boolean; [key: string]: unknown; } export interface KnowledgeBaseStats { recipes: { total: number; active: number; rules: number; patterns: number; facts: number; }; candidates: { total: number; pending: number; }; vectorIndex?: { documentCount: number; }; } export interface EnrichResultEntry { id: string; found: boolean; title?: string; language?: string; lifecycle?: string; kind?: string; missingFields: string[]; recipeReadyMissing: { field: string; hint: string; }[]; complete?: boolean; error?: string; } export interface BootstrapFile { path: string; relativePath: string; content: string; } export interface IncrementalPlan { canIncremental: boolean; mode: 'incremental' | 'full'; affectedDimensions: string[]; skippedDimensions: string[]; previousSnapshot: Record<string, unknown> | null; diff: { added: string[]; modified: string[]; deleted: string[]; unchanged: string[]; changeRatio: number; } | null; reason: string; restoredEpisodic: SessionStore | null; } export interface SaveSnapshotParams { sessionId: string; allFiles: BootstrapFile[]; dimensionStats: Record<string, Record<string, unknown>>; episodicMemory?: { toJSON(): unknown; getCompletedDimensions(): string[]; getDimensionReport?(dimId: string): { referencedFiles?: string[]; } | null; } | null; meta?: Record<string, unknown>; plan?: IncrementalPlan | null; } export interface DimensionCheckpointResult { dimId?: string; sessionId?: string; completedAt?: number; digest?: unknown; [key: string]: unknown; } export interface LoggerLike { info?(...args: unknown[]): void; warn?(...args: unknown[]): void; error?(...args: unknown[]): void; debug?(...args: unknown[]): void; } export interface DuplicateCheckResult { hasSimilar: boolean; closest?: Record<string, unknown> | null; note?: string; } export interface ByKindGroup { rule: SlimSearchItem[]; pattern: SlimSearchItem[]; fact: SlimSearchItem[]; }