#!/usr/bin/env npx tsx
/**
* Complete Smart Features Test Script
*/
import { createConfig } from '../src/lib/config.js';
import { createAppContext } from '../src/lib/context.js';
import { createSmartHandlers } from '../src/lib/handlers/smart.js';
import { resetBrain } from '../src/lib/brain/index.js';
import * as fs from 'fs';
import * as path from 'path';
// Manual .env loading
function loadEnvFile() {
const envPath = path.join(process.cwd(), '.env');
if (fs.existsSync(envPath)) {
const content = fs.readFileSync(envPath, 'utf-8');
for (const line of content.split('\n')) {
const trimmed = line.trim();
if (trimmed && !trimmed.startsWith('#')) {
const [key, ...valueParts] = trimmed.split('=');
const value = valueParts.join('=');
if (key && value && !process.env[key]) {
process.env[key] = value;
}
}
}
}
}
loadEnvFile();
process.env.ENABLE_SMART_FEATURES = 'true';
async function main() {
console.log('π§ͺ Complete Smart Features Test\n');
const config = createConfig(process.env);
const ctx = createAppContext(config);
const handlers = createSmartHandlers(ctx);
console.log(`π‘ Wiki: ${config.OUTLINE_URL}\n`);
try {
// 1. Smart Status (μ΄κΈ°)
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
console.log('π 1. smart_status (μ΄κΈ° μν)');
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
const status1 = await handlers.smart_status();
console.log(JSON.stringify(status1, null, 2));
console.log();
// 2. Sync Knowledge (μ΄λ―Έ λκΈ°νλ¨)
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
console.log('π 2. sync_knowledge (λ¬Έμ λκΈ°ν)');
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
// μ΄λ―Έ λκΈ°νλ κ²½μ° μ€ν΅
if (status1.indexedChunks > 100) {
console.log(`μ΄λ―Έ ${status1.indexedChunks}κ° μ²ν¬κ° μΈλ±μ±λμ΄ μμ΅λλ€. μ€ν΅ν©λλ€.`);
} else {
const syncResult = await handlers.sync_knowledge({});
console.log(JSON.stringify(syncResult, null, 2));
}
console.log();
// 3. Ask Wiki - λ€μν μ§λ¬Έ ν
μ€νΈ
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
console.log('β 3. ask_wiki (RAG μ§λ¬Έ λ΅λ³)');
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
const questions = [
'VectorDBμ λν΄ μ€λͺ
ν΄μ€',
'νμλ‘μ μ΄λμ λ³Ό μ μμ΄?',
'μ κ· μ
μ¬μ κ°μ΄λκ° μμ΄?',
];
for (const q of questions) {
console.log(`\n㪠Q: ${q}`);
const answer = await handlers.ask_wiki({ question: q });
console.log(`π A: ${answer.answer?.substring(0, 500)}...`);
console.log(`π Sources: ${answer.sources?.map((s: {title: string}) => s.title).join(', ')}`);
}
console.log();
// 4. Summarize Document - 첫 λ²μ§Έ λ¬Έμ μμ½
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
console.log('π 4. summarize_document (λ¬Έμ μμ½)');
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
// λ¨Όμ λ¬Έμ λͺ©λ‘ κ°μ Έμ€κΈ°
const { data: docs } = await ctx.apiCall(() =>
ctx.apiClient.post<Array<{id: string; title: string}>>('/documents.list', { limit: 5 })
);
if (docs && docs.length > 0) {
const doc = docs[0];
console.log(`λ¬Έμ: ${doc.title} (${doc.id})`);
const summary = await handlers.summarize_document({ documentId: doc.id });
console.log('μμ½:', summary.summary || summary.error);
}
console.log();
// 5. Suggest Tags
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
console.log('π·οΈ 5. suggest_tags (νκ·Έ μΆμ²)');
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
if (docs && docs.length > 0) {
const doc = docs[0];
console.log(`λ¬Έμ: ${doc.title}`);
const tags = await handlers.suggest_tags({ documentId: doc.id });
console.log('μΆμ² νκ·Έ:', tags.suggestedTags || tags.error);
}
console.log();
// 6. Find Related
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
console.log('π 6. find_related (μ°κ΄ λ¬Έμ μ°ΎκΈ°)');
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
if (docs && docs.length > 0) {
const doc = docs[0];
console.log(`κΈ°μ€ λ¬Έμ: ${doc.title}`);
const related = await handlers.find_related({ documentId: doc.id, limit: 3 });
if (related.related) {
console.log('μ°κ΄ λ¬Έμ:');
for (const r of related.related) {
console.log(` - ${r.title}`);
}
} else {
console.log(related.error);
}
}
console.log();
// 7. Generate Diagram
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
console.log('π 7. generate_diagram (λ€μ΄μ΄κ·Έλ¨ μμ±)');
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
const diagramDesc = 'μ¬μ©μκ° λ‘κ·ΈμΈνλ©΄ ν ν°μ λ°κΈλ°κ³ , ν ν°μΌλ‘ APIλ₯Ό νΈμΆνλ νλ¦';
console.log(`μ€λͺ
: ${diagramDesc}`);
const diagram = await handlers.generate_diagram({ description: diagramDesc });
console.log('μμ±λ Mermaid:');
console.log(diagram.diagram);
console.log();
// 8. Final Status
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
console.log('π 8. smart_status (μ΅μ’
μν)');
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββ');
const status2 = await handlers.smart_status();
console.log(JSON.stringify(status2, null, 2));
console.log('\nβ
λͺ¨λ Smart κΈ°λ₯ ν
μ€νΈ μλ£!');
} catch (error) {
console.error('β ν
μ€νΈ μ€ν¨:', error);
process.exit(1);
} finally {
resetBrain();
}
}
main();