scai
Version:
> AI-powered CLI tool for commit messages **and** pull request reviews — using local models.
102 lines (101 loc) • 3.43 kB
JavaScript
// Upsert file metadata into `files`
export const upsertFileTemplate = `
INSERT INTO files (path, filename, summary, type, last_modified, indexed_at, embedding)
VALUES (:path, :filename, :summary, :type, :lastModified, :indexedAt, :embedding)
ON CONFLICT(path) DO UPDATE SET
filename = excluded.filename, -- Update filename when path conflicts
summary = CASE
WHEN excluded.summary IS NOT NULL AND excluded.summary != files.summary
THEN excluded.summary
ELSE files.summary
END,
type = excluded.type,
last_modified = excluded.last_modified,
indexed_at = excluded.indexed_at,
embedding = CASE
WHEN excluded.embedding IS NOT NULL AND excluded.embedding != files.embedding
THEN excluded.embedding
ELSE files.embedding
END
`;
// 📌 CHANGE 1: Include `filename` in SELECT + weight `filename` highest in bm25
export const fetchBm25ScoresTemplate = `
SELECT f.path, f.filename, f.summary, f.type,
bm25(files_fts, 10.0, 2.0, 1.0) AS bm25Score
FROM files_fts
JOIN files f ON files_fts.rowid = f.id
WHERE files_fts MATCH :query
LIMIT 50
`;
// Fetch embedding vector for a file
export const fetchEmbeddingTemplate = `
SELECT embedding FROM files WHERE path = :path
`;
// 📌 CHANGE 2: Also added weighted `bm25()` with explicit weights here
export const rawQueryTemplate = `
SELECT f.path, f.filename, f.summary, f.type, f.last_modified, f.indexed_at,
bm25(files_fts, 10.0, 2.0, 1.0) AS rank
FROM files_fts
JOIN files f ON files_fts.rowid = f.id
WHERE files_fts MATCH :query
ORDER BY rank
LIMIT :limit
`;
// Insert function metadata
export const insertFunctionTemplate = `
INSERT INTO functions (file_id, name, start_line, end_line, content, embedding, lang)
VALUES (:file_id, :name, :start_line, :end_line, :content, :embedding, :lang)
`;
// Insert function call edge
export const insertFunctionCallTemplate = `
INSERT INTO function_calls (caller_id, callee_name)
VALUES (:caller_id, :callee_name)
`;
// Mark a file as unprocessed
export const markFileAsUnprocessedTemplate = `
UPDATE files
SET processing_status = 'unprocessed',
functions_extracted_at = NULL
WHERE id = :id
`;
// Mark a file as extracted
export const markFileAsExtractedTemplate = `
UPDATE files
SET processing_status = 'extracted',
functions_extracted_at = CURRENT_TIMESTAMP
WHERE id = :id
`;
// Mark a file as skipped (not extractable)
export const markFileAsSkippedTemplate = `
UPDATE files
SET processing_status = 'skipped',
functions_extracted_at = NULL
WHERE id = :id
`;
// Mark a file as failed
export const markFileAsFailedTemplate = `
UPDATE files
SET processing_status = 'failed',
functions_extracted_at = NULL
WHERE id = :id
`;
export const selectUnprocessedFiles = `
SELECT id, path, type, summary, indexed_at, last_modified, processing_status
FROM files
WHERE processing_status = 'unprocessed' OR summary IS NULL OR summary = ''
ORDER BY last_modified DESC
LIMIT ?
`;
export const markFileAsSkippedByPath = `
UPDATE files
SET processing_status = 'skipped',
functions_extracted_at = NULL
WHERE path = @path
`;
export const updateFileWithSummaryAndEmbedding = `
UPDATE files
SET summary = @summary,
embedding = @embedding,
indexed_at = datetime('now')
WHERE path = @path
`;