hana-cli
Version:
HANA Developer Command Line Interface
285 lines (256 loc) • 9.37 kB
text/typescript
/**
* Intent-based command recommendation system
* Helps agents find the right command based on natural language intent
*/
import { COMMAND_METADATA_MAP } from './command-metadata.js';
export interface CommandRecommendation {
command: string;
confidence: 'high' | 'medium' | 'low';
reason: string;
category: string;
tags: string[];
useCases?: string[];
exampleParameters?: Record<string, string>;
}
/**
* Intent keywords mapped to related terms
*/
const INTENT_PATTERNS: Record<string, string[]> = {
// Data Operations
'import': ['import', 'load', 'insert', 'upload', 'bring in', 'add data', 'bulk load', 'csv to table'],
'export': ['export', 'extract', 'download', 'save', 'output', 'dump', 'to csv', 'to excel'],
'copy': ['copy', 'clone', 'duplicate', 'replicate', 'backup table'],
'sync': ['sync', 'synchronize', 'replicate', 'mirror'],
// Data Quality
'validate': ['validate', 'check', 'verify', 'quality', 'integrity', 'rule'],
'duplicate': ['duplicate', 'duplicates', 'dupe', 'repeated', 'redundant', 'same'],
'profile': ['profile', 'analyze', 'statistics', 'distribution', 'summary'],
'compare': ['compare', 'diff', 'difference', 'versus', 'vs'],
// Database Info
'list': ['list', 'show', 'display', 'see', 'view', 'get all'],
'inspect': ['inspect', 'examine', 'details', 'metadata', 'info about', 'describe'],
'find': ['find', 'search', 'locate', 'lookup', 'query'],
'schema': ['schema', 'namespace', 'database schema'],
'table': ['table', 'tables', 'relation'],
'view': ['view', 'views'],
'procedure': ['procedure', 'stored procedure', 'sproc', 'function'],
// Performance
'performance': ['performance', 'slow', 'bottleneck', 'optimize', 'speed', 'fast'],
'memory': ['memory', 'ram', 'memory usage', 'memory consumption'],
'expensive': ['expensive', 'costly', 'resource intensive', 'slow query', 'long running'],
// Security
'user': ['user', 'users', 'account', 'accounts'],
'role': ['role', 'roles', 'permission', 'permissions'],
'privilege': ['privilege', 'privileges', 'grant', 'access', 'authorization'],
'security': ['security', 'secure', 'vulnerability', 'audit'],
// System Admin
'status': ['status', 'connection', 'connected', 'current state'],
'health': ['health', 'healthy', 'check health', 'system health'],
'version': ['version', 'build', 'release'],
'backup': ['backup', 'back up', 'save database'],
'restore': ['restore', 'recover', 'recovery'],
// Monitoring
'alert': ['alert', 'alerts', 'warning', 'warnings', 'notification'],
'trace': ['trace', 'traces', 'tracing', 'debug'],
'log': ['log', 'logs', 'logging', 'audit log'],
'monitor': ['monitor', 'monitoring', 'watch'],
// Troubleshooting
'error': ['error', 'errors', 'failure', 'failed', 'problem', 'issue'],
'diagnose': ['diagnose', 'diagnostic', 'troubleshoot', 'debug'],
'fix': ['fix', 'repair', 'resolve', 'solve'],
};
/**
* Calculate similarity score between intent and command metadata
*/
function calculateScore(intent: string, commandName: string, metadata: any): number {
let score = 0;
const intentLower = intent.toLowerCase();
const words = intentLower.split(/\s+/);
// Check command name
if (commandName.toLowerCase().includes(intentLower)) {
score += 50;
}
for (const word of words) {
if (commandName.toLowerCase().includes(word)) {
score += 10;
}
}
// Check tags
if (metadata.tags) {
for (const tag of metadata.tags) {
if (tag.toLowerCase().includes(intentLower)) {
score += 30;
}
for (const word of words) {
if (tag.toLowerCase().includes(word)) {
score += 5;
}
}
}
}
// Check use cases
if (metadata.useCases) {
for (const useCase of metadata.useCases) {
const useCaseLower = useCase.toLowerCase();
if (useCaseLower.includes(intentLower)) {
score += 20;
}
for (const word of words) {
if (useCaseLower.includes(word)) {
score += 3;
}
}
}
}
// Check category
if (metadata.category && metadata.category.toLowerCase().includes(intentLower)) {
score += 15;
}
// Match against intent patterns
for (const [key, patterns] of Object.entries(INTENT_PATTERNS)) {
for (const pattern of patterns) {
if (intentLower.includes(pattern)) {
// Check if command or tags match this pattern key
if (commandName.toLowerCase().includes(key) ||
(metadata.tags && metadata.tags.some((t: string) => t.toLowerCase().includes(key)))) {
score += 25;
}
}
}
}
return score;
}
/**
* Get command recommendations based on natural language intent
*/
export function recommendCommands(intent: string, limit: number = 5): CommandRecommendation[] {
const recommendations: CommandRecommendation[] = [];
for (const [command, metadata] of Object.entries(COMMAND_METADATA_MAP)) {
const score = calculateScore(intent, command, metadata);
if (score > 0) {
let confidence: 'high' | 'medium' | 'low';
let reason: string;
if (score >= 50) {
confidence = 'high';
reason = 'Strong match with command name and purpose';
} else if (score >= 25) {
confidence = 'medium';
reason = 'Good match with tags or use cases';
} else {
confidence = 'low';
reason = 'Partial match found';
}
recommendations.push({
command,
confidence,
reason,
category: metadata.category,
tags: metadata.tags,
useCases: metadata.useCases,
exampleParameters: getExampleParameters(command),
});
}
}
// Sort by score (calculate again for sorting)
recommendations.sort((a, b) => {
const scoreA = calculateScore(intent, a.command, COMMAND_METADATA_MAP[a.command]);
const scoreB = calculateScore(intent, b.command, COMMAND_METADATA_MAP[b.command]);
return scoreB - scoreA;
});
return recommendations.slice(0, limit);
}
/**
* Get example parameters for common commands
*/
function getExampleParameters(command: string): Record<string, string> | undefined {
const examples: Record<string, Record<string, string>> = {
'tables': { schema: '<schema-name>' },
'inspectTable': { table: '<table-name>', schema: '<schema-name>' },
'import': { filename: '<file.csv>', table: '<table-name>', schema: '<schema-name>' },
'export': { table: '<table-name>', schema: '<schema-name>', filename: '<output.csv>' },
'dataProfile': { table: '<table-name>', schema: '<schema-name>' },
'dataValidator': { table: '<table-name>', schema: '<schema-name>', rulesFile: '<rules.json>' },
'duplicateDetection': { table: '<table-name>', schema: '<schema-name>' },
'compareSchema': { sourceSchema: '<schema1>', targetSchema: '<schema2>' },
'schemaClone': { sourceSchema: '<source>', targetSchema: '<target>' },
'tableCopy': { sourceTable: '<table>', sourceSchema: '<schema>', targetTable: '<new-table>', targetSchema: '<schema>' },
};
return examples[command];
}
/**
* Quick start commands for new users
*/
export interface QuickStartStep {
order: number;
command: string;
description: string;
purpose: string;
parameters?: Record<string, string>;
tips?: string[];
}
export function getQuickStartGuide(): QuickStartStep[] {
return [
{
order: 1,
command: 'status',
description: 'Check your database connection and current user',
purpose: 'Verify that you are connected and see your user permissions',
tips: [
'This should be your first command',
'Shows current user, roles, and connection details',
],
},
{
order: 2,
command: 'version',
description: 'View SAP HANA database version',
purpose: 'Understand which HANA version you are working with',
tips: [
'Different versions have different features',
'Useful for compatibility checks',
],
},
{
order: 3,
command: 'schemas',
description: 'List all available database schemas',
purpose: 'Discover what schemas you have access to',
tips: [
'Shows all schemas you can read',
'Use this to find where your data is located',
],
},
{
order: 4,
command: 'tables',
description: 'List tables in a specific schema',
purpose: 'See what tables exist in your schema',
parameters: { schema: '<your-schema-name>' },
tips: [
'Replace <your-schema-name> with actual schema from step 3',
'Shows table types, row counts, and sizes',
],
},
{
order: 5,
command: 'inspectTable',
description: 'View detailed information about a table',
purpose: 'See columns, types, keys, and indexes for a table',
parameters: { table: '<table-name>', schema: '<schema-name>' },
tips: [
'Essential before importing or querying data',
'Shows complete table structure',
],
},
{
order: 6,
command: 'healthCheck',
description: 'Run a quick system health check',
purpose: 'Verify database is healthy before running operations',
tips: [
'Good to run periodically',
'Identifies potential issues early',
],
},
];
}