openxgen 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config/store.ts","../src/api/client.ts","../src/utils/format.ts","../src/api/auth.ts","../src/api/workflow.ts","../src/utils/ui.ts","../src/commands/provider.ts","../src/api/xgen-extra.ts","../src/api/document.ts","../src/api/ontology.ts","../src/dashboard/InkDashboard.tsx","../src/index.ts","../src/commands/config.ts","../src/commands/login.ts","../src/commands/workflow/list.ts","../src/commands/workflow/info.ts","../src/commands/workflow/run.ts","../src/utils/sse.ts","../src/utils/markdown.ts","../src/commands/workflow/history.ts","../src/commands/workflow/index.ts","../src/commands/chat.ts","../src/commands/agent.ts","../src/agent/llm.ts","../src/agent/tools/file-read.ts","../src/agent/tools/file-write.ts","../src/agent/tools/file-edit.ts","../src/agent/tools/bash.ts","../src/agent/tools/grep.ts","../src/agent/tools/list-files.ts","../src/agent/tools/sandbox.ts","../src/agent/tools/index.ts","../src/agent/tools/xgen-api.ts","../src/mcp/client.ts","../src/commands/doc.ts","../src/commands/ontology.ts"],"sourcesContent":["/**\n * XGEN CLI 설정 저장소\n * ~/.xgen/ 디렉토리에 설정과 인증 정보를 관리\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst XGEN_DIR = join(homedir(), \".xgen\");\nconst CONFIG_FILE = join(XGEN_DIR, \"config.json\");\nconst AUTH_FILE = join(XGEN_DIR, \"auth.json\");\nconst PROVIDERS_FILE = join(XGEN_DIR, \"providers.json\");\n\nexport interface XgenConfig {\n server: string | null;\n defaultWorkflow: string | null;\n theme: string;\n streamLogs: boolean;\n}\n\nexport interface XgenAuth {\n accessToken: string;\n refreshToken: string;\n userId: string;\n username: string;\n isAdmin: boolean;\n expiresAt: string | null;\n}\n\nconst DEFAULT_CONFIG: XgenConfig = {\n server: null,\n defaultWorkflow: null,\n theme: \"default\",\n streamLogs: false,\n};\n\nfunction ensureDir(): void {\n if (!existsSync(XGEN_DIR)) {\n mkdirSync(XGEN_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nfunction readJson<T>(filePath: string, fallback: T): T {\n try {\n if (!existsSync(filePath)) return fallback;\n const data = readFileSync(filePath, \"utf-8\");\n return JSON.parse(data) as T;\n } catch {\n return fallback;\n }\n}\n\nfunction writeJson(filePath: string, data: unknown, secure = false): void {\n ensureDir();\n writeFileSync(filePath, JSON.stringify(data, null, 2), \"utf-8\");\n if (secure) {\n chmodSync(filePath, 0o600);\n }\n}\n\n// ── Config ──\n\nexport function getConfig(): XgenConfig {\n return { ...DEFAULT_CONFIG, ...readJson(CONFIG_FILE, {}) };\n}\n\nexport function setConfig(partial: Partial<XgenConfig>): void {\n const current = getConfig();\n writeJson(CONFIG_FILE, { ...current, ...partial });\n}\n\nexport function getServer(): string | null {\n return getConfig().server;\n}\n\nexport function setServer(url: string): void {\n // URL 정규화: 끝의 / 제거\n const normalized = url.replace(/\\/+$/, \"\");\n setConfig({ server: normalized });\n}\n\n// ── Auth ──\n\nexport function getAuth(): XgenAuth | null {\n const auth = readJson<XgenAuth | null>(AUTH_FILE, null);\n if (!auth || !auth.accessToken) return null;\n return auth;\n}\n\nexport function setAuth(auth: XgenAuth): void {\n writeJson(AUTH_FILE, auth, true);\n}\n\nexport function clearAuth(): void {\n writeJson(AUTH_FILE, {}, true);\n}\n\nexport function getAccessToken(): string | null {\n return getAuth()?.accessToken ?? null;\n}\n\nexport function getRefreshToken(): string | null {\n return getAuth()?.refreshToken ?? null;\n}\n\n// ── Providers ──\n\nexport interface ProviderConfig {\n id: string;\n name: string;\n type: \"openai\" | \"gemini\" | \"ollama\" | \"anthropic\" | \"custom\";\n baseUrl?: string;\n apiKey: string;\n model: string;\n}\n\ninterface ProvidersStore {\n providers: ProviderConfig[];\n defaultId: string | null;\n}\n\nconst DEFAULT_PROVIDERS: ProvidersStore = { providers: [], defaultId: null };\n\nexport function getProvidersStore(): ProvidersStore {\n return { ...DEFAULT_PROVIDERS, ...readJson(PROVIDERS_FILE, DEFAULT_PROVIDERS) };\n}\n\nexport function getProviders(): ProviderConfig[] {\n return getProvidersStore().providers;\n}\n\nexport function addProvider(provider: ProviderConfig): void {\n const store = getProvidersStore();\n store.providers = store.providers.filter((p) => p.id !== provider.id);\n store.providers.push(provider);\n store.defaultId = provider.id; // 항상 새로 추가한 걸 기본으로\n writeJson(PROVIDERS_FILE, store, true);\n}\n\nexport function removeProvider(id: string): boolean {\n const store = getProvidersStore();\n const before = store.providers.length;\n store.providers = store.providers.filter((p) => p.id !== id);\n if (store.defaultId === id) {\n store.defaultId = store.providers[0]?.id ?? null;\n }\n writeJson(PROVIDERS_FILE, store, true);\n return store.providers.length < before;\n}\n\nexport function getDefaultProvider(): ProviderConfig | null {\n const store = getProvidersStore();\n if (!store.defaultId) return store.providers[0] ?? null;\n return store.providers.find((p) => p.id === store.defaultId) ?? null;\n}\n\nexport function setDefaultProvider(id: string): boolean {\n const store = getProvidersStore();\n const exists = store.providers.some((p) => p.id === id);\n if (!exists) return false;\n store.defaultId = id;\n writeJson(PROVIDERS_FILE, store, true);\n return true;\n}\n\n// ── Environments ──\n\nexport interface XgenEnvironment {\n id: string;\n name: string;\n url: string;\n email?: string;\n description?: string;\n}\n\nconst ENVIRONMENTS_FILE = join(XGEN_DIR, \"environments.json\");\n\ninterface EnvStore {\n environments: XgenEnvironment[];\n activeId: string | null;\n}\n\nconst DEFAULT_ENV_STORE: EnvStore = { environments: [], activeId: null };\n\nexport function getEnvStore(): EnvStore {\n return { ...DEFAULT_ENV_STORE, ...readJson(ENVIRONMENTS_FILE, DEFAULT_ENV_STORE) };\n}\n\nexport function getEnvironments(): XgenEnvironment[] {\n return getEnvStore().environments;\n}\n\nexport function addEnvironment(env: XgenEnvironment): void {\n const store = getEnvStore();\n store.environments = store.environments.filter((e) => e.id !== env.id);\n store.environments.push(env);\n if (!store.activeId) store.activeId = env.id;\n writeJson(ENVIRONMENTS_FILE, store);\n}\n\nexport function removeEnvironment(id: string): boolean {\n const store = getEnvStore();\n const before = store.environments.length;\n store.environments = store.environments.filter((e) => e.id !== id);\n if (store.activeId === id) store.activeId = store.environments[0]?.id ?? null;\n writeJson(ENVIRONMENTS_FILE, store);\n return store.environments.length < before;\n}\n\nexport function switchEnvironment(id: string): boolean {\n const store = getEnvStore();\n const env = store.environments.find((e) => e.id === id);\n if (!env) return false;\n store.activeId = id;\n writeJson(ENVIRONMENTS_FILE, store);\n // 서버 URL도 같이 변경\n setServer(env.url);\n return true;\n}\n\nexport function getActiveEnvironment(): XgenEnvironment | null {\n const store = getEnvStore();\n if (!store.activeId) return null;\n return store.environments.find((e) => e.id === store.activeId) ?? null;\n}\n\n// ── Helpers ──\n\nexport function requireServer(): string {\n const server = getServer();\n if (!server) {\n console.error(\"서버가 설정되지 않았습니다. 먼저 실행하세요:\");\n console.error(\" xgen config set-server <url>\");\n process.exit(1);\n }\n return server;\n}\n\nexport function requireAuth(): XgenAuth {\n const auth = getAuth();\n if (!auth) {\n console.error(\"로그인이 필요합니다. 먼저 실행하세요:\");\n console.error(\" xgen login\");\n process.exit(1);\n }\n return auth;\n}\n","/**\n * XGEN API 클라이언트\n * axios 인스턴스 + 토큰 자동 갱신 인터셉터\n */\nimport axios, { type AxiosInstance, type InternalAxiosRequestConfig } from \"axios\";\nimport {\n getAccessToken,\n getRefreshToken,\n getServer,\n setAuth,\n getAuth,\n clearAuth,\n} from \"../config/store.js\";\n\nlet client: AxiosInstance | null = null;\n\nexport function getClient(): AxiosInstance {\n if (client) return client;\n\n const server = getServer();\n if (!server) {\n throw new Error(\"서버가 설정되지 않았습니다. xgen config set-server <url>\");\n }\n\n client = axios.create({\n baseURL: server,\n timeout: 120_000,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // Request 인터셉터: 토큰 자동 추가\n client.interceptors.request.use((config: InternalAxiosRequestConfig) => {\n const token = getAccessToken();\n if (token && config.headers) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n });\n\n // Response 인터셉터: 401 시 토큰 갱신\n client.interceptors.response.use(\n (response) => response,\n async (error) => {\n const originalRequest = error.config;\n\n if (\n error.response?.status === 401 &&\n !originalRequest._retry &&\n getRefreshToken()\n ) {\n originalRequest._retry = true;\n\n try {\n const refreshToken = getRefreshToken()!;\n const server = getServer()!;\n const res = await axios.post(`${server}/api/auth/refresh`, {\n refresh_token: refreshToken,\n });\n\n if (res.data.success && res.data.access_token) {\n const auth = getAuth()!;\n setAuth({\n ...auth,\n accessToken: res.data.access_token,\n });\n\n originalRequest.headers.Authorization = `Bearer ${res.data.access_token}`;\n return client!(originalRequest);\n }\n } catch {\n clearAuth();\n console.error(\"\\n세션이 만료되었습니다. 다시 로그인하세요: xgen login\");\n process.exit(1);\n }\n }\n\n return Promise.reject(error);\n }\n );\n\n return client;\n}\n\n/** 클라이언트 리셋 (서버 변경 시) */\nexport function resetClient(): void {\n client = null;\n}\n","/**\n * 출력 포맷팅 유틸리티\n */\nimport chalk from \"chalk\";\n\nexport function printHeader(text: string): void {\n const line = \"─\".repeat(Math.max(text.length + 4, 40));\n console.log(chalk.cyan(line));\n console.log(chalk.cyan.bold(` ${text}`));\n console.log(chalk.cyan(line));\n}\n\nexport function printSuccess(text: string): void {\n console.log(chalk.green(`✓ ${text}`));\n}\n\nexport function printError(text: string): void {\n console.error(chalk.red(`✗ ${text}`));\n}\n\nexport function printWarning(text: string): void {\n console.log(chalk.yellow(`⚠ ${text}`));\n}\n\nexport function printInfo(text: string): void {\n console.log(chalk.blue(`ℹ ${text}`));\n}\n\nexport function printKeyValue(key: string, value: string | number | boolean | null | undefined): void {\n console.log(` ${chalk.gray(key + \":\")} ${value ?? chalk.dim(\"(없음)\")}`);\n}\n\nexport function printTable(headers: string[], rows: string[][]): void {\n // 각 컬럼의 최대 너비 계산\n const widths = headers.map((h, i) => {\n const colMax = rows.reduce((max, row) => Math.max(max, (row[i] ?? \"\").length), 0);\n return Math.max(h.length, colMax);\n });\n\n // 헤더 출력\n const headerLine = headers.map((h, i) => h.padEnd(widths[i])).join(\" \");\n console.log(chalk.bold(headerLine));\n console.log(chalk.gray(\"─\".repeat(headerLine.length)));\n\n // 행 출력\n for (const row of rows) {\n const line = row.map((cell, i) => (cell ?? \"\").padEnd(widths[i])).join(\" \");\n console.log(line);\n }\n}\n\nexport function truncate(text: string, maxLen = 50): string {\n if (text.length <= maxLen) return text;\n return text.slice(0, maxLen - 3) + \"...\";\n}\n\nexport function formatDate(dateStr?: string | null): string {\n if (!dateStr) return \"-\";\n try {\n const d = new Date(dateStr);\n return d.toLocaleDateString(\"ko-KR\") + \" \" + d.toLocaleTimeString(\"ko-KR\", { hour: \"2-digit\", minute: \"2-digit\" });\n } catch {\n return dateStr;\n }\n}\n","/**\n * 인증 API\n */\nimport axios from \"axios\";\nimport { createHash } from \"node:crypto\";\nimport { getServer } from \"../config/store.js\";\n\nexport interface LoginResult {\n success: boolean;\n message: string;\n access_token?: string;\n refresh_token?: string;\n token_type: string;\n user_id?: string;\n username?: string;\n}\n\nexport interface ValidateResult {\n valid: boolean;\n user_id?: string;\n username?: string;\n is_admin?: boolean;\n user_type?: string;\n available_user_sections?: string;\n new_access_token?: string;\n}\n\nexport async function apiLogin(\n email: string,\n password: string\n): Promise<LoginResult> {\n const server = getServer();\n if (!server) throw new Error(\"서버가 설정되지 않았습니다\");\n\n const hashedPassword = createHash(\"sha256\").update(password).digest(\"hex\");\n\n const res = await axios.post(`${server}/api/auth/login`, {\n email,\n password: hashedPassword,\n });\n\n return res.data;\n}\n\nexport async function apiValidate(\n accessToken: string\n): Promise<ValidateResult> {\n const server = getServer();\n if (!server) throw new Error(\"서버가 설정되지 않았습니다\");\n\n const res = await axios.get(`${server}/api/auth/validate`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n return res.data;\n}\n\nexport async function apiRefresh(\n refreshToken: string\n): Promise<{ success: boolean; access_token?: string }> {\n const server = getServer();\n if (!server) throw new Error(\"서버가 설정되지 않았습니다\");\n\n const res = await axios.post(`${server}/api/auth/refresh`, {\n refresh_token: refreshToken,\n });\n\n return res.data;\n}\n","/**\n * 워크플로우 API\n */\nimport { getClient } from \"./client.js\";\n\nexport interface Workflow {\n id?: string;\n workflow_id?: string;\n workflow_name: string;\n description?: string;\n created_at?: string;\n updated_at?: string;\n deploy_status?: string;\n version?: string;\n}\n\nexport interface WorkflowDetail {\n id: string;\n workflow_name: string;\n description?: string;\n nodes?: unknown[];\n edges?: unknown[];\n parameters?: Record<string, unknown>;\n}\n\nexport interface WorkflowExecuteRequest {\n workflow_id: string;\n workflow_name: string;\n input_data: string;\n interaction_id: string;\n parameters?: Record<string, unknown>;\n}\n\nexport interface IOLog {\n interaction_id: string;\n input_data: string;\n output_data: string;\n created_at: string;\n execution_time?: number;\n}\n\nexport async function listWorkflows(userId?: string): Promise<Workflow[]> {\n const client = getClient();\n const params: Record<string, string> = {};\n if (userId) params.user_id = userId;\n\n const res = await client.get(\"/api/workflow/list\", { params });\n return res.data.workflows ?? res.data;\n}\n\nexport async function getWorkflowDetail(workflowId: string): Promise<WorkflowDetail> {\n const client = getClient();\n const res = await client.get(`/api/workflow/load/${workflowId}`);\n return res.data;\n}\n\nexport async function getWorkflowListDetail(): Promise<Workflow[]> {\n const client = getClient();\n const res = await client.get(\"/api/workflow/list/detail\");\n return res.data.workflows ?? res.data;\n}\n\n/**\n * 워크플로우 스트리밍 실행\n * SSE 응답을 반환 — 호출자가 직접 파싱\n */\nexport async function executeWorkflowStream(\n request: WorkflowExecuteRequest\n): Promise<NodeJS.ReadableStream> {\n const client = getClient();\n const res = await client.post(\"/api/workflow/execute/based_id/stream\", request, {\n responseType: \"stream\",\n headers: {\n Accept: \"text/event-stream\",\n },\n });\n\n return res.data;\n}\n\n/**\n * 워크플로우 실행 (JSON 응답)\n * deploy/stream 엔드포인트는 배포 여부 무관하게 workflow_id로 실행 가능\n * response_format=json 으로 non-streaming 응답\n */\nexport async function executeWorkflow(\n request: WorkflowExecuteRequest & { deploy_key?: string; user_id?: number }\n): Promise<unknown> {\n const client = getClient();\n const body = {\n ...request,\n user_id: request.user_id ?? 1,\n response_format: \"json\",\n };\n const res = await client.post(\"/api/workflow/execute/deploy/stream\", body);\n return res.data;\n}\n\n/**\n * 워크플로우 SSE 스트리밍 실행\n * deploy/stream 엔드포인트 + response_format=stream\n * 배포 여부 무관하게 모든 워크플로우 실행 가능\n */\nexport async function executeWorkflowSSE(\n request: WorkflowExecuteRequest & { deploy_key?: string; user_id?: number }\n): Promise<NodeJS.ReadableStream> {\n const client = getClient();\n const body = {\n ...request,\n user_id: request.user_id ?? 1,\n response_format: \"stream\",\n };\n const res = await client.post(\"/api/workflow/execute/deploy/stream\", body, {\n responseType: \"stream\",\n headers: { Accept: \"text/event-stream\" },\n });\n return res.data;\n}\n\nexport async function getExecutionStatus(executionId: string): Promise<unknown> {\n const client = getClient();\n const res = await client.get(`/api/workflow/execute/status/${executionId}`);\n return res.data;\n}\n\nexport async function getIOLogs(\n workflowId: string,\n workflowName: string,\n limit = 20\n): Promise<IOLog[]> {\n const client = getClient();\n const params: Record<string, string | number> = {\n workflow_id: workflowId,\n workflow_name: workflowName,\n limit,\n };\n\n const res = await client.get(\"/api/workflow/io_logs\", { params });\n return res.data.in_out_logs ?? res.data ?? [];\n}\n","/**\n * OPEN XGEN UI 유틸리티 — 터미널 UI 컴포넌트\n */\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\n\nconst W = Math.min(process.stdout.columns || 60, 70);\n\n// ── 박스 ──\n\nexport function box(lines: string[], color: \"cyan\" | \"green\" | \"yellow\" | \"gray\" = \"cyan\"): string {\n const c = chalk[color];\n const inner = W - 4;\n const top = c(\" ╭\" + \"─\".repeat(inner) + \"╮\");\n const bot = c(\" ╰\" + \"─\".repeat(inner) + \"╯\");\n const body = lines.map((line) => {\n const clean = line.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n const pad = Math.max(0, inner - clean.length);\n return c(\" │ \") + line + \" \".repeat(pad) + c(\" │\");\n });\n return [top, ...body, bot].join(\"\\n\");\n}\n\n// ── 구분선 ──\n\nexport function divider(label?: string): string {\n if (label) {\n const rest = W - label.length - 6;\n return chalk.gray(` ── ${label} ${\"─\".repeat(Math.max(0, rest))}`);\n }\n return chalk.gray(\" \" + \"─\".repeat(W - 2));\n}\n\n// ── 상태 표시 ──\n\nexport function statusDot(active: boolean, label: string, detail?: string): string {\n const dot = active ? chalk.green(\"●\") : chalk.gray(\"○\");\n const d = detail ? chalk.gray(` ${detail}`) : \"\";\n return ` ${dot} ${label}${d}`;\n}\n\n// ── 번호 메뉴 ──\n\nexport interface MenuItem {\n label: string;\n hint?: string;\n disabled?: boolean;\n}\n\nexport function menu(items: MenuItem[], opts?: { title?: string }): string {\n const lines: string[] = [];\n if (opts?.title) {\n lines.push(\"\");\n lines.push(chalk.bold(` ${opts.title}`));\n lines.push(\"\");\n }\n items.forEach((item, i) => {\n const num = chalk.cyan.bold(` ${String(i + 1).padStart(2)}.`);\n const hint = item.hint ? chalk.gray(` — ${item.hint}`) : \"\";\n const label = item.disabled ? chalk.gray(item.label) : item.label;\n lines.push(` ${num} ${label}${hint}`);\n });\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n// ── 프롬프트 ──\n\nexport function ask(question: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\n// ── 채팅 메시지 ──\n\nexport function userMsg(text: string): string {\n return `\\n ${chalk.blue.bold(\"You\")} ${chalk.gray(\"›\")} ${text}`;\n}\n\nexport function aiMsg(name: string): string {\n return `\\n ${chalk.green.bold(name)} ${chalk.gray(\"›\")} `;\n}\n\nexport function toolCall(name: string, summary: string): string {\n return chalk.gray(` ⚙ ${chalk.white(name)} ${summary}`);\n}\n\nexport function toolResult(text: string): string {\n const lines = text.split(\"\\n\").slice(0, 5);\n return lines.map((l) => chalk.gray(` │ ${l}`)).join(\"\\n\");\n}\n\n// ── 환영 메시지 ──\n\nexport function welcome(): string {\n const logo = chalk.cyan(`\n ██████ ██████ ███████ ███ ██\n ██ ██ ██ ██ ██ ████ ██\n ██ ██ ██████ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██\n ██████ ██ ███████ ██ ████`) +\n chalk.white.bold(`\n ██ ██ ██████ ███████ ███ ██\n ██ ██ ██ ██ ████ ██\n ███ ██ ███ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██ ██\n ██ ██ ██████ ███████ ██ ████`);\n\n return logo;\n}\n\n// ── 진행 표시 ──\n\nexport function spinner(): { update: (text: string) => void; stop: () => void } {\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n let i = 0;\n let text = \"\";\n const interval = setInterval(() => {\n process.stdout.write(`\\r ${chalk.cyan(frames[i++ % frames.length])} ${chalk.gray(text)}`);\n }, 80);\n\n return {\n update(t: string) { text = t; },\n stop() {\n clearInterval(interval);\n process.stdout.write(\"\\r\" + \" \".repeat(W) + \"\\r\");\n },\n };\n}\n","/**\n * xgen provider — AI 프로바이더 관리\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport OpenAI from \"openai\";\nimport {\n addProvider,\n getProviders,\n removeProvider,\n getDefaultProvider,\n setDefaultProvider,\n type ProviderConfig,\n} from \"../config/store.js\";\nimport { printSuccess, printError, printTable } from \"../utils/format.js\";\nimport { ask, box } from \"../utils/ui.js\";\n\ninterface ProviderPreset {\n label: string;\n type: ProviderConfig[\"type\"];\n baseUrl?: string;\n defaultModel: string;\n models: string[];\n needsKey: boolean;\n keyHint: string;\n envKey?: string;\n}\n\nconst PRESETS: ProviderPreset[] = [\n {\n label: \"OpenAI\",\n type: \"openai\",\n defaultModel: \"gpt-4o-mini\",\n models: [\n \"gpt-4o\", \"gpt-4o-mini\",\n \"gpt-4.1\", \"gpt-4.1-mini\", \"gpt-4.1-nano\",\n \"o3-mini\", \"o4-mini\",\n \"gpt-3.5-turbo\",\n ],\n needsKey: true,\n keyHint: \"https://platform.openai.com/api-keys\",\n envKey: \"OPENAI_API_KEY\",\n },\n {\n label: \"Google Gemini\",\n type: \"gemini\",\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n defaultModel: \"gemini-2.0-flash\",\n models: [\n \"gemini-2.5-pro-preview-06-05\",\n \"gemini-2.5-flash-preview-05-20\",\n \"gemini-2.0-flash\",\n \"gemini-2.0-flash-lite\",\n \"gemini-1.5-pro\",\n \"gemini-1.5-flash\",\n ],\n needsKey: true,\n keyHint: \"https://aistudio.google.com/apikey\",\n envKey: \"GEMINI_API_KEY\",\n },\n {\n label: \"Anthropic (Claude)\",\n type: \"anthropic\",\n baseUrl: \"https://api.anthropic.com/v1\",\n defaultModel: \"claude-sonnet-4-20250514\",\n models: [\n \"claude-opus-4-20250514\",\n \"claude-sonnet-4-20250514\",\n \"claude-haiku-4-5-20251001\",\n \"claude-3.5-sonnet-20241022\",\n ],\n needsKey: true,\n keyHint: \"https://console.anthropic.com/settings/keys\",\n envKey: \"ANTHROPIC_API_KEY\",\n },\n {\n label: \"Ollama (로컬 무료)\",\n type: \"ollama\",\n baseUrl: \"http://localhost:11434/v1\",\n defaultModel: \"llama3.1\",\n models: [\n \"llama3.1\", \"llama3.2\", \"llama3.3\",\n \"codellama\", \"deepseek-coder-v2\",\n \"qwen2.5-coder\", \"qwen2.5\",\n \"mistral\", \"mixtral\",\n \"phi3\", \"gemma2\",\n ],\n needsKey: false,\n keyHint: \"https://ollama.ai 설치 후 ollama pull <모델>\",\n },\n {\n label: \"Groq (빠른 추론)\",\n type: \"custom\",\n baseUrl: \"https://api.groq.com/openai/v1\",\n defaultModel: \"llama-3.3-70b-versatile\",\n models: [\n \"llama-3.3-70b-versatile\",\n \"llama-3.1-8b-instant\",\n \"mixtral-8x7b-32768\",\n \"gemma2-9b-it\",\n ],\n needsKey: true,\n keyHint: \"https://console.groq.com/keys\",\n envKey: \"GROQ_API_KEY\",\n },\n {\n label: \"Together AI\",\n type: \"custom\",\n baseUrl: \"https://api.together.xyz/v1\",\n defaultModel: \"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo\",\n models: [\n \"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo\",\n \"meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo\",\n \"mistralai/Mixtral-8x7B-Instruct-v0.1\",\n \"Qwen/Qwen2.5-72B-Instruct-Turbo\",\n ],\n needsKey: true,\n keyHint: \"https://api.together.xyz/settings/api-keys\",\n envKey: \"TOGETHER_API_KEY\",\n },\n {\n label: \"OpenRouter (멀티 모델)\",\n type: \"custom\",\n baseUrl: \"https://openrouter.ai/api/v1\",\n defaultModel: \"openai/gpt-4o-mini\",\n models: [\n \"openai/gpt-4o\", \"openai/gpt-4o-mini\",\n \"anthropic/claude-sonnet-4\", \"anthropic/claude-haiku-4.5\",\n \"google/gemini-2.0-flash-exp\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"deepseek/deepseek-chat-v3\",\n ],\n needsKey: true,\n keyHint: \"https://openrouter.ai/keys\",\n envKey: \"OPENROUTER_API_KEY\",\n },\n {\n label: \"DeepSeek\",\n type: \"custom\",\n baseUrl: \"https://api.deepseek.com/v1\",\n defaultModel: \"deepseek-chat\",\n models: [\n \"deepseek-chat\",\n \"deepseek-coder\",\n \"deepseek-reasoner\",\n ],\n needsKey: true,\n keyHint: \"https://platform.deepseek.com/api_keys\",\n envKey: \"DEEPSEEK_API_KEY\",\n },\n {\n label: \"기타 (OpenAI 호환 서버)\",\n type: \"custom\",\n defaultModel: \"gpt-4o-mini\",\n models: [],\n needsKey: true,\n keyHint: \"서버에서 발급받은 API Key\",\n },\n];\n\n/**\n * 환경변수에서 API 키 자동 감지\n */\nfunction detectEnvKey(preset: ProviderPreset): string | null {\n if (!preset.envKey) return null;\n return process.env[preset.envKey] ?? null;\n}\n\n/**\n * 가이드 설정\n */\nexport async function guidedProviderSetup(): Promise<ProviderConfig | null> {\n console.log();\n console.log(box([\"OPEN XGEN — 프로바이더 설정\", \"\", chalk.gray(\"AI 에이전트에 사용할 LLM을 선택하세요.\")]));\n console.log();\n\n // 프로바이더 목록\n console.log(chalk.bold(\" 프로바이더 선택:\\n\"));\n PRESETS.forEach((p, i) => {\n const envDetected = detectEnvKey(p);\n const envTag = envDetected ? chalk.green(\" [키 감지됨]\") : \"\";\n const free = !p.needsKey ? chalk.green(\" [무료]\") : \"\";\n console.log(` ${chalk.cyan(`${String(i + 1).padStart(2)}.`)} ${p.label}${free}${envTag}`);\n console.log(` ${chalk.gray(p.defaultModel)}`);\n });\n console.log();\n\n const choice = await ask(chalk.cyan(\" 번호: \"));\n const idx = parseInt(choice) - 1;\n if (isNaN(idx) || idx < 0 || idx >= PRESETS.length) {\n console.log(chalk.red(\" 잘못된 선택.\\n\"));\n return null;\n }\n\n const preset = PRESETS[idx];\n console.log(chalk.green(`\\n ✓ ${preset.label}\\n`));\n\n // API Key (환경변수 자동감지)\n let apiKey = \"\";\n if (preset.needsKey) {\n const envKey = detectEnvKey(preset);\n if (envKey) {\n console.log(chalk.green(` API Key 자동 감지 (${preset.envKey})`));\n const useEnv = await ask(chalk.white(` 이 키를 사용할까요? (Y/n): `));\n if (useEnv.toLowerCase() !== \"n\") {\n apiKey = envKey;\n }\n }\n if (!apiKey) {\n console.log(chalk.gray(` 발급: ${preset.keyHint}\\n`));\n apiKey = await ask(chalk.white(\" API Key: \"));\n if (!apiKey) {\n console.log(chalk.red(\" API Key 필요.\\n\"));\n return null;\n }\n }\n }\n\n // Base URL\n let baseUrl = preset.baseUrl;\n if (preset.label === \"기타 (OpenAI 호환 서버)\") {\n baseUrl = await ask(chalk.white(\" Base URL: \"));\n if (!baseUrl) {\n console.log(chalk.red(\" URL 필요.\\n\"));\n return null;\n }\n }\n\n // 모델 선택\n let model = preset.defaultModel;\n if (preset.models.length > 0) {\n console.log(chalk.bold(\"\\n 모델:\\n\"));\n const defaultIdx = preset.models.indexOf(preset.defaultModel);\n preset.models.forEach((m, i) => {\n const tag = i === defaultIdx ? chalk.green(\" ← 추천\") : \"\";\n console.log(` ${chalk.cyan(`${String(i + 1).padStart(2)}.`)} ${m}${tag}`);\n });\n console.log(` ${chalk.cyan(`${String(preset.models.length + 1).padStart(2)}.`)} 직접 입력`);\n console.log();\n\n const mc = await ask(chalk.cyan(` 번호 [${defaultIdx + 1}]: `));\n if (!mc || mc === String(defaultIdx + 1)) {\n model = preset.defaultModel;\n } else {\n const mi = parseInt(mc) - 1;\n if (mi >= 0 && mi < preset.models.length) {\n model = preset.models[mi];\n } else if (parseInt(mc) === preset.models.length + 1) {\n model = (await ask(chalk.white(\" 모델명: \"))) || preset.defaultModel;\n }\n }\n } else if (preset.label === \"기타 (OpenAI 호환 서버)\") {\n model = (await ask(chalk.white(` 모델명 [${preset.defaultModel}]: `))) || preset.defaultModel;\n }\n\n console.log(chalk.green(`\\n ✓ ${preset.label} · ${model}`));\n\n // 연결 테스트\n console.log(chalk.gray(\" 연결 테스트 중...\\n\"));\n const provider: ProviderConfig = {\n id: preset.label.toLowerCase().replace(/[^a-z0-9]/g, \"-\").replace(/-+/g, \"-\"),\n name: preset.label,\n type: preset.type,\n baseUrl,\n apiKey,\n model,\n };\n\n try {\n const client = new OpenAI({ apiKey: apiKey || \"ollama\", baseURL: baseUrl });\n await client.chat.completions.create({\n model,\n messages: [{ role: \"user\", content: \"Hi\" }],\n max_tokens: 5,\n });\n console.log(chalk.green(\" ✓ 연결 성공!\\n\"));\n } catch (err) {\n const msg = (err as Error).message || \"\";\n if (msg.includes(\"401\") || msg.includes(\"API key\") || msg.includes(\"Unauthorized\")) {\n console.log(chalk.red(` ✗ API 키가 유효하지 않습니다.`));\n const retry = await ask(chalk.white(\" 다시 입력할까요? (Y/n): \"));\n if (retry.toLowerCase() !== \"n\") {\n const newKey = await ask(chalk.white(\" API Key: \"));\n if (newKey) {\n provider.apiKey = newKey;\n try {\n const c2 = new OpenAI({ apiKey: newKey, baseURL: baseUrl });\n await c2.chat.completions.create({ model, messages: [{ role: \"user\", content: \"Hi\" }], max_tokens: 5 });\n console.log(chalk.green(\" ✓ 연결 성공!\\n\"));\n } catch {\n console.log(chalk.yellow(\" ⚠ 여전히 실패. 설정은 저장됩니다.\\n\"));\n }\n }\n } else {\n console.log(chalk.gray(\" 설정은 저장됩니다.\\n\"));\n }\n } else if (msg.includes(\"ECONNREFUSED\") || msg.includes(\"ENOTFOUND\")) {\n console.log(chalk.yellow(` ⚠ 서버에 연결할 수 없습니다. URL을 확인하세요.`));\n console.log(chalk.gray(\" 설정은 저장됩니다.\\n\"));\n } else {\n console.log(chalk.yellow(` ⚠ 테스트 실패: ${msg}`));\n console.log(chalk.gray(\" 설정은 저장됩니다.\\n\"));\n }\n }\n\n addProvider(provider);\n console.log(chalk.green.bold(` ✓ 설정 완료! ${preset.label} (${model})\\n`));\n\n return provider;\n}\n\nexport function registerProviderCommand(program: Command): void {\n const prov = program.command(\"provider\").description(\"AI 프로바이더 관리\");\n\n prov.command(\"add\").description(\"프로바이더 추가\").action(async () => {\n await guidedProviderSetup();\n });\n\n prov.command(\"list\").alias(\"ls\").description(\"프로바이더 목록\").action(() => {\n const providers = getProviders();\n const defaultP = getDefaultProvider();\n if (providers.length === 0) {\n console.log(chalk.yellow(\"\\n 프로바이더 없음. xgen provider add\\n\"));\n return;\n }\n console.log(chalk.cyan.bold(`\\n 프로바이더 (${providers.length}개)\\n`));\n printTable(\n [\"\", \"ID\", \"이름\", \"타입\", \"모델\"],\n providers.map((p) => [\n p.id === defaultP?.id ? chalk.green(\"●\") : \" \",\n p.id, p.name, p.type, p.model,\n ])\n );\n console.log();\n });\n\n prov.command(\"remove <id>\").description(\"프로바이더 제거\").action((id: string) => {\n removeProvider(id) ? printSuccess(`제거: ${id}`) : printError(`없음: ${id}`);\n });\n\n prov.command(\"use <id>\").description(\"기본 프로바이더 설정\").action((id: string) => {\n setDefaultProvider(id) ? printSuccess(`기본: ${id}`) : printError(`없음: ${id}`);\n });\n}\n","/**\n * XGEN 확장 API — 노드, 프롬프트, 도구, 스케줄, 인터랙션, 트레이스, MCP\n */\nimport { getClient } from \"./client.js\";\n\n// ── Node ──\n\nexport async function listNodes(): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/node/get\");\n return res.data.nodes ?? res.data ?? [];\n}\n\nexport async function searchNodes(query: string): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/node/search\", { params: { query } });\n return res.data.nodes ?? res.data ?? [];\n}\n\nexport async function getNodeDetail(nodeId: string): Promise<unknown> {\n const client = getClient();\n const res = await client.get(\"/api/node/detail\", { params: { node_id: nodeId } });\n return res.data;\n}\n\nexport async function getNodeCategories(): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/node/categories\");\n return res.data.categories ?? res.data ?? [];\n}\n\n// ── Prompt ──\n\nexport async function listPrompts(opts?: { limit?: number; language?: string }): Promise<unknown[]> {\n const client = getClient();\n const params: Record<string, unknown> = { limit: opts?.limit ?? 100 };\n if (opts?.language) params.language = opts.language;\n const res = await client.get(\"/api/prompt/list\", { params });\n return res.data.prompts ?? res.data ?? [];\n}\n\nexport async function createPrompt(data: { name: string; content: string; prompt_type?: string; language?: string }): Promise<unknown> {\n const client = getClient();\n const res = await client.post(\"/api/prompt/create\", data);\n return res.data;\n}\n\n// ── Tools ──\n\nexport async function listToolStore(): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/tools/store/list\");\n return res.data.tools ?? res.data ?? [];\n}\n\nexport async function listUserTools(): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/tools/storage/list\");\n return res.data.tools ?? res.data ?? [];\n}\n\n// ── Schedule ──\n\nexport async function listSchedules(): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/workflow/schedule/sessions\");\n return res.data.sessions ?? res.data ?? [];\n}\n\nexport async function getSchedulerStatus(): Promise<unknown> {\n const client = getClient();\n const res = await client.get(\"/api/workflow/schedule/status\");\n return res.data;\n}\n\n// ── Interaction / Trace ──\n\nexport async function listInteractions(workflowId?: string, limit = 20): Promise<unknown[]> {\n const client = getClient();\n const params: Record<string, unknown> = { limit };\n if (workflowId) params.workflow_id = workflowId;\n const res = await client.get(\"/api/interaction/list\", { params });\n return res.data.interactions ?? res.data ?? [];\n}\n\nexport async function listTraces(workflowId?: string, page = 1): Promise<unknown> {\n const client = getClient();\n const params: Record<string, unknown> = { page, page_size: 20 };\n if (workflowId) params.workflow_id = workflowId;\n const res = await client.get(\"/api/workflow/trace/list\", { params });\n return res.data;\n}\n\nexport async function getTraceDetail(traceId: string): Promise<unknown> {\n const client = getClient();\n const res = await client.get(`/api/workflow/trace/detail/${traceId}`);\n return res.data;\n}\n\n// ── Workflow Store ──\n\nexport async function listWorkflowStore(): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/workflow/store/list\");\n return res.data.workflows ?? res.data ?? [];\n}\n\n// ── Workflow Auto-generation ──\n\nexport async function generateWorkflow(requirements: string): Promise<unknown> {\n const client = getClient();\n const res = await client.post(\"/api/workflow/auto-generation/generate\", { requirements });\n return res.data;\n}\n\n// ── Performance ──\n\nexport async function getWorkflowPerformance(workflowId: string, workflowName: string): Promise<unknown> {\n const client = getClient();\n const res = await client.get(\"/api/workflow/performance\", {\n params: { workflow_id: workflowId, workflow_name: workflowName },\n });\n return res.data;\n}\n\n// ── MCP ──\n\nexport async function listMcpSessions(): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/mcp/sessions\");\n return res.data.sessions ?? res.data ?? [];\n}\n","/**\n * 문서/컬렉션 API — 실제 작동하는 엔드포인트\n */\nimport { getClient } from \"./client.js\";\n\nexport interface Collection {\n id: number;\n collection_make_name: string;\n collection_name: string;\n description?: string;\n total_documents: number;\n total_chunks: number;\n is_shared: boolean;\n share_group?: string;\n init_embedding_model?: string;\n created_at?: string;\n}\n\nexport interface Document {\n id?: string;\n document_id?: string;\n name?: string;\n file_name?: string;\n file_type?: string;\n status?: string;\n created_at?: string;\n file_size?: number;\n}\n\nexport async function listCollections(): Promise<Collection[]> {\n const client = getClient();\n const res = await client.get(\"/api/retrieval/collections\");\n return Array.isArray(res.data) ? res.data : res.data.collections ?? [];\n}\n\nexport async function listDocuments(collectionId?: string): Promise<Document[]> {\n const client = getClient();\n try {\n const params: Record<string, string> = {};\n if (collectionId) params.collection_id = collectionId;\n const res = await client.get(\"/api/retrieval/documents/list\", { params });\n return res.data.documents ?? res.data ?? [];\n } catch {\n return [];\n }\n}\n\nexport async function uploadDocument(\n filePath: string,\n collectionId?: string,\n name?: string\n): Promise<unknown> {\n const client = getClient();\n const { createReadStream, statSync } = await import(\"node:fs\");\n const { basename } = await import(\"node:path\");\n const stat = statSync(filePath);\n const fileName = name || basename(filePath);\n\n const form = new FormData();\n const fileBlob = new Blob([createReadStream(filePath) as unknown as BlobPart]);\n form.append(\"file\", fileBlob, fileName);\n if (collectionId) form.append(\"collection_id\", collectionId);\n\n const res = await client.post(\"/api/retrieval/documents/upload\", form, {\n headers: { \"Content-Type\": \"multipart/form-data\" },\n maxBodyLength: stat.size + 1024 * 1024,\n });\n return res.data;\n}\n\nexport async function getDocumentInfo(docId: string): Promise<Document> {\n const client = getClient();\n const res = await client.get(`/api/retrieval/documents/${docId}`);\n return res.data;\n}\n","/**\n * 온톨로지 / GraphRAG API\n */\nimport { getClient } from \"./client.js\";\n\nexport interface GraphRAGResult {\n answer?: string;\n sources?: string[];\n scs_context?: string;\n triples_used?: string[];\n}\n\nexport interface GraphStats {\n total_nodes?: number;\n total_edges?: number;\n total_classes?: number;\n total_instances?: number;\n}\n\nexport async function queryGraphRAG(\n query: string,\n graphId?: string,\n opts?: { scs?: boolean }\n): Promise<GraphRAGResult> {\n const client = getClient();\n const res = await client.post(\"/api/graph-rag\", {\n query,\n graph_id: graphId,\n use_scs: opts?.scs ?? true,\n });\n return res.data;\n}\n\nexport async function queryGraphRAGMultiTurn(\n query: string,\n sessionId: string,\n graphId?: string,\n opts?: { maxTurns?: number }\n): Promise<GraphRAGResult & { session_id?: string }> {\n const client = getClient();\n const res = await client.post(\"/api/graph-rag/multi-turn\", {\n query,\n session_id: sessionId,\n graph_id: graphId,\n max_turns: opts?.maxTurns ?? 5,\n });\n return res.data;\n}\n\nexport async function getGraphStats(graphId: string): Promise<GraphStats> {\n const client = getClient();\n const res = await client.get(`/api/graph/${graphId}/stats`);\n return res.data;\n}\n\nexport async function listGraphs(): Promise<{ id: string; name?: string }[]> {\n const client = getClient();\n const res = await client.get(\"/api/graph/list\");\n return res.data.graphs ?? res.data ?? [];\n}\n","/**\n * OPEN XGEN Ink Dashboard — Gemini CLI 스타일\n */\nimport React, { useState, useEffect } from \"react\";\nimport { render, Box, Text, useInput, useApp, useStdout } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport { getServer, getAuth, getDefaultProvider } from \"../config/store.js\";\n\ntype Tab = \"workflows\" | \"collections\" | \"nodes\" | \"prompts\" | \"tools\";\n\ninterface WfItem { name: string; id: string; deployed: boolean; }\ninterface ColItem { name: string; docs: number; chunks: number; }\n\nconst TABS: { key: Tab; label: string; shortcut: string }[] = [\n { key: \"workflows\", label: \"워크플로우\", shortcut: \"1\" },\n { key: \"collections\", label: \"컬렉션\", shortcut: \"2\" },\n { key: \"nodes\", label: \"노드\", shortcut: \"3\" },\n { key: \"prompts\", label: \"프롬프트\", shortcut: \"4\" },\n { key: \"tools\", label: \"도구\", shortcut: \"5\" },\n];\n\nfunction Header({ tab, serverDisplay, model }: { tab: Tab; serverDisplay: string; model: string }) {\n const tabStr = TABS.map((t) => {\n const active = tab === t.key;\n return `[${t.shortcut}]${active ? \"▸\" : \" \"}${t.label}`;\n }).join(\" \");\n\n return (\n <Box paddingX={1}>\n <Text bold>OPEN XGEN</Text>\n <Text dimColor> {model} {serverDisplay} │ {tabStr}</Text>\n </Box>\n );\n}\n\nfunction ListPanel({ items, selected, onSelect }: {\n items: { label: string; dimLabel?: string }[];\n selected: number;\n onSelect?: (i: number) => void;\n}) {\n const { stdout } = useStdout();\n const height = (stdout?.rows ?? 24) - 8;\n const visibleCount = Math.max(1, height);\n const start = Math.max(0, Math.min(selected - Math.floor(visibleCount / 2), items.length - visibleCount));\n const visible = items.slice(start, start + visibleCount);\n\n return (\n <Box flexDirection=\"column\" width=\"50%\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n {visible.map((item, i) => {\n const realIndex = start + i;\n const isSelected = realIndex === selected;\n return (\n <Text key={`item-${realIndex}`} inverse={isSelected}>\n {isSelected ? \"▸ \" : \" \"}\n {item.label}\n {item.dimLabel ? <Text dimColor> {item.dimLabel}</Text> : null}\n </Text>\n );\n })}\n {items.length === 0 && <Text dimColor> (없음)</Text>}\n </Box>\n );\n}\n\nfunction DetailPanel({ lines }: { lines: string[] }) {\n return (\n <Box flexDirection=\"column\" width=\"50%\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n {lines.map((line, i) => (\n <Text key={`line-${i}`}>{line}</Text>\n ))}\n </Box>\n );\n}\n\nfunction StatusBar({ message }: { message: string }) {\n return (\n <Box paddingX={1}>\n <Text dimColor>{message}</Text>\n </Box>\n );\n}\n\nfunction InputBar({ value, onChange, onSubmit, placeholder }: {\n value: string;\n onChange: (v: string) => void;\n onSubmit: (v: string) => void;\n placeholder?: string;\n}) {\n return (\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text>❯ </Text>\n <TextInput\n value={value}\n onChange={onChange}\n onSubmit={onSubmit}\n placeholder={placeholder ?? \"입력...\"}\n />\n </Box>\n );\n}\n\nfunction Dashboard() {\n const { exit } = useApp();\n const provider = getDefaultProvider();\n const server = getServer();\n const auth = getAuth();\n const serverDisplay = auth && server\n ? `${auth.username}@${server.replace(\"https://\", \"\").replace(\"http://\", \"\")}`\n : \"미연결\";\n\n const [tab, setTab] = useState<Tab>(\"workflows\");\n const [selected, setSelected] = useState(0);\n const [workflows, setWorkflows] = useState<WfItem[]>([]);\n const [collections, setCollections] = useState<ColItem[]>([]);\n const [nodes, setNodes] = useState<any[]>([]);\n const [prompts, setPrompts] = useState<any[]>([]);\n const [tools, setTools] = useState<any[]>([]);\n const [detail, setDetail] = useState<string[]>([\"← 항목을 선택하세요\"]);\n const [inputValue, setInputValue] = useState(\"\");\n const [inputMode, setInputMode] = useState(false);\n const [runTarget, setRunTarget] = useState<WfItem | null>(null);\n const [loading, setLoading] = useState(true);\n const [statusMsg, setStatusMsg] = useState(\"로딩...\");\n\n // 데이터 로드\n useEffect(() => {\n loadAll();\n }, []);\n\n async function loadAll() {\n setLoading(true);\n setStatusMsg(\"로딩...\");\n try {\n if (server && auth) {\n const [wfMod, docMod, extraMod] = await Promise.all([\n import(\"../api/workflow.js\"),\n import(\"../api/document.js\"),\n import(\"../api/xgen-extra.js\"),\n ]);\n\n const [wfs, cols, nodeList, promptList, toolList] = await Promise.allSettled([\n wfMod.getWorkflowListDetail(),\n docMod.listCollections(),\n extraMod.listNodes(),\n extraMod.listPrompts(),\n extraMod.listToolStore(),\n ]);\n\n if (wfs.status === \"fulfilled\") {\n setWorkflows(wfs.value.map((w: any) => ({\n name: w.workflow_name, id: w.workflow_id ?? w.id ?? \"\", deployed: !!w.is_deployed,\n })));\n }\n if (cols.status === \"fulfilled\") {\n setCollections(cols.value.map((c: any) => ({\n name: c.collection_make_name, docs: c.total_documents, chunks: c.total_chunks,\n })));\n }\n if (nodeList.status === \"fulfilled\") setNodes(nodeList.value as any[]);\n if (promptList.status === \"fulfilled\") setPrompts(promptList.value as any[]);\n if (toolList.status === \"fulfilled\") setTools(toolList.value as any[]);\n }\n } catch {}\n setLoading(false);\n setStatusMsg(\"↑↓:이동 Enter:선택 1-5:탭 i:입력 r:새로고침 q:종료\");\n }\n\n function getListItems() {\n switch (tab) {\n case \"workflows\":\n return workflows.map((w) => ({ label: `${w.deployed ? \"●\" : \"○\"} ${w.name}`, dimLabel: \"\" }));\n case \"collections\":\n return collections.map((c) => ({ label: c.name, dimLabel: `${c.docs}문서 ${c.chunks}청크` }));\n case \"nodes\":\n return nodes.map((n: any) => ({ label: n.nodeName ?? n.name ?? \"?\", dimLabel: (n.description ?? \"\").slice(0, 30) }));\n case \"prompts\":\n return prompts.map((p: any) => ({ label: p.name ?? p.title ?? \"?\", dimLabel: `[${p.prompt_type ?? \"\"}]` }));\n case \"tools\":\n return tools.map((t: any) => ({ label: t.name ?? t.tool_name ?? \"?\", dimLabel: (t.description ?? \"\").slice(0, 30) }));\n default:\n return [];\n }\n }\n\n function showDetail() {\n const items = getListItems();\n if (selected < 0 || selected >= items.length) return;\n\n if (tab === \"workflows\") {\n const w = workflows[selected];\n if (w) setDetail([w.name, \"\", `ID ${w.id}`, `배포 ${w.deployed ? \"Yes\" : \"No\"}`, \"\", \"Enter → 실행\"]);\n } else if (tab === \"collections\") {\n const c = collections[selected];\n if (c) setDetail([c.name, \"\", `문서 ${c.docs}개`, `청크 ${c.chunks}개`]);\n } else if (tab === \"nodes\") {\n const n = nodes[selected] as any;\n if (n) setDetail([n.nodeName ?? n.name ?? \"?\", \"\", n.description ?? \"\", \"\", `ID: ${n.node_id ?? n.id ?? \"?\"}`]);\n } else if (tab === \"prompts\") {\n const p = prompts[selected] as any;\n if (p) setDetail([p.name ?? \"?\", `[${p.prompt_type ?? \"\"}]`, \"\", (p.content ?? \"\").slice(0, 200)]);\n } else if (tab === \"tools\") {\n const t = tools[selected] as any;\n if (t) setDetail([t.name ?? t.tool_name ?? \"?\", \"\", t.description ?? \"\"]);\n }\n }\n\n useEffect(() => { showDetail(); }, [selected, tab]);\n\n function switchTab(t: Tab) {\n setTab(t);\n setSelected(0);\n setInputMode(false);\n setRunTarget(null);\n }\n\n async function handleSubmit(value: string) {\n if (!value.trim()) {\n setInputMode(false);\n setRunTarget(null);\n return;\n }\n\n if (runTarget) {\n setDetail([`실행 중: ${runTarget.name}`, `입력: ${value}`, \"\", \"...\"]);\n setInputValue(\"\");\n setInputMode(false);\n\n try {\n const { executeWorkflow } = await import(\"../api/workflow.js\");\n const { randomUUID } = await import(\"node:crypto\");\n const result = await executeWorkflow({\n workflow_id: runTarget.id,\n workflow_name: runTarget.name,\n input_data: value,\n interaction_id: `tui_${randomUUID().slice(0, 8)}`,\n user_id: auth?.userId ? parseInt(auth.userId) : 1,\n }) as any;\n\n const content = result.content ?? result.message ?? JSON.stringify(result).slice(0, 500);\n setDetail([`${runTarget.name}`, \"\", `입력: ${value}`, \"\", `결과:`, String(content)]);\n } catch (err) {\n setDetail([`실행 실패: ${(err as Error).message}`]);\n }\n setRunTarget(null);\n } else {\n setInputValue(\"\");\n setInputMode(false);\n }\n }\n\n useInput((input, key) => {\n if (inputMode) {\n if (key.escape) { setInputMode(false); setRunTarget(null); }\n return;\n }\n\n if (input === \"q\" || (key.ctrl && input === \"c\")) { exit(); return; }\n if (input === \"r\") { loadAll(); return; }\n if (input === \"i\") { setInputMode(true); return; }\n\n // 탭 전환\n if (input === \"1\") switchTab(\"workflows\");\n else if (input === \"2\") switchTab(\"collections\");\n else if (input === \"3\") switchTab(\"nodes\");\n else if (input === \"4\") switchTab(\"prompts\");\n else if (input === \"5\") switchTab(\"tools\");\n\n // 목록 이동\n const items = getListItems();\n if (key.upArrow) setSelected(Math.max(0, selected - 1));\n else if (key.downArrow) setSelected(Math.min(items.length - 1, selected + 1));\n else if (key.tab) switchTab(TABS[(TABS.findIndex((t) => t.key === tab) + 1) % TABS.length].key);\n\n // Enter\n if (key.return && items.length > 0) {\n if (tab === \"workflows\" && workflows[selected]) {\n setRunTarget(workflows[selected]);\n setInputMode(true);\n setStatusMsg(`${workflows[selected].name} — 입력 후 Enter로 실행, Esc 취소`);\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n <Header tab={tab} serverDisplay={serverDisplay} model={provider?.model ?? \"\"} />\n <Box flexDirection=\"row\" flexGrow={1}>\n <ListPanel items={getListItems()} selected={selected} />\n <DetailPanel lines={detail} />\n </Box>\n {inputMode ? (\n <InputBar\n value={inputValue}\n onChange={setInputValue}\n onSubmit={handleSubmit}\n placeholder={runTarget ? `${runTarget.name}에 입력...` : \"입력...\"}\n />\n ) : (\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>❯ i를 눌러 입력 · Enter로 실행</Text>\n </Box>\n )}\n <StatusBar message={loading ? \"로딩...\" : statusMsg} />\n </Box>\n );\n}\n\nexport async function startInkDashboard(): Promise<void> {\n const { waitUntilExit } = render(<Dashboard />);\n await waitUntilExit();\n}\n","#!/usr/bin/env node\n/**\n * XGEN CLI — XGEN 2.0 플랫폼 + AI 코딩 에이전트\n *\n * xgen → 설정에 따라 에이전트 또는 채팅 모드\n * xgen agent → AI 코딩 에이전트\n * xgen chat → XGEN 워크플로우 채팅\n * xgen wf run → 워크플로우 실행\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerLoginCommand } from \"./commands/login.js\";\nimport { registerWorkflowCommand } from \"./commands/workflow/index.js\";\nimport { registerChatCommand, chat } from \"./commands/chat.js\";\nimport { registerProviderCommand } from \"./commands/provider.js\";\nimport { registerAgentCommand, agentRepl } from \"./commands/agent.js\";\nimport { registerDocCommand } from \"./commands/doc.js\";\nimport { registerOntologyCommand } from \"./commands/ontology.js\";\nimport { getAuth, getServer, getDefaultProvider } from \"./config/store.js\";\n\nconst VERSION = \"2.0.0\";\n\nconst LOGO = chalk.cyan(`\n ██████ ██████ ███████ ███ ██\n ██ ██ ██ ██ ██ ████ ██\n ██ ██ ██████ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██\n ██████ ██ ███████ ██ ████\n`) + chalk.white.bold(`\n ██ ██ ██████ ███████ ███ ██\n ██ ██ ██ ██ ████ ██\n ███ ██ ███ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██ ██\n ██ ██ ██████ ███████ ██ ████\n`) + chalk.gray(` v${VERSION}\\n`);\n\nconst BANNER = LOGO;\n\nconst program = new Command();\n\nprogram\n .name(\"xgen\")\n .description(\"OPEN XGEN — AI Coding Agent + XGEN Platform CLI\")\n .version(VERSION)\n .addHelpText(\"before\", BANNER)\n .addHelpText(\n \"after\",\n `\n${chalk.bold(\"시작하기:\")}\n ${chalk.cyan(\"xgen provider add\")} AI 프로바이더 설정\n ${chalk.cyan(\"xgen agent\")} AI 코딩 에이전트\n ${chalk.cyan(\"xgen config set-server\")} <url> XGEN 서버 연결\n ${chalk.cyan(\"xgen login\")} 서버 로그인\n\n${chalk.bold(\"AI 에이전트:\")}\n ${chalk.cyan(\"xgen agent\")} 코딩 에이전트 (파일, 터미널, 검색)\n ${chalk.cyan(\"xgen provider ls\")} 프로바이더 목록\n ${chalk.cyan(\"xgen provider add\")} 프로바이더 추가\n\n${chalk.bold(\"XGEN 플랫폼:\")}\n ${chalk.cyan(\"xgen chat\")} 워크플로우 대화\n ${chalk.cyan(\"xgen wf ls\")} 워크플로우 목록\n ${chalk.cyan(\"xgen wf run\")} <id> \"질문\" 워크플로우 실행\n ${chalk.cyan(\"xgen doc ls\")} 문서 목록\n ${chalk.cyan(\"xgen ont query\")} \"질문\" 온톨로지 질의\n`\n );\n\n// 커맨드 등록\nregisterConfigCommand(program);\nregisterLoginCommand(program);\nregisterWorkflowCommand(program);\nregisterChatCommand(program);\nregisterProviderCommand(program);\nregisterAgentCommand(program);\nregisterDocCommand(program);\nregisterOntologyCommand(program);\n\n// 인자 없이 실행: 바로 AI 채팅 (Claude Code 스타일)\nif (process.argv.length <= 2) {\n agentRepl().catch((err) => {\n console.error(chalk.red(`오류: ${err.message}`));\n process.exit(1);\n });\n} else {\n program.parse();\n}\n","/**\n * xgen config — 설정 관리\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getConfig, setServer, getServer, setConfig } from \"../config/store.js\";\nimport { resetClient } from \"../api/client.js\";\nimport { printSuccess, printError, printKeyValue } from \"../utils/format.js\";\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"XGEN CLI 설정 관리\");\n\n config\n .command(\"set-server <url>\")\n .description(\"XGEN 서버 URL 설정\")\n .action((url: string) => {\n if (!url.startsWith(\"http://\") && !url.startsWith(\"https://\")) {\n printError(\"URL은 http:// 또는 https://로 시작해야 합니다\");\n process.exit(1);\n }\n setServer(url);\n resetClient();\n printSuccess(`서버 설정 완료: ${chalk.underline(url)}`);\n });\n\n config\n .command(\"get-server\")\n .description(\"현재 설정된 서버 URL 확인\")\n .action(() => {\n const server = getServer();\n if (server) {\n console.log(server);\n } else {\n printError(\"서버가 설정되지 않았습니다\");\n console.log(\" 설정: xgen config set-server <url>\");\n }\n });\n\n config\n .command(\"list\")\n .description(\"전체 설정 확인\")\n .action(() => {\n const cfg = getConfig();\n console.log(chalk.bold(\"\\nXGEN CLI 설정\"));\n console.log(chalk.gray(\"─\".repeat(40)));\n printKeyValue(\"서버\", cfg.server);\n printKeyValue(\"기본 워크플로우\", cfg.defaultWorkflow);\n printKeyValue(\"테마\", cfg.theme);\n printKeyValue(\"스트림 로그\", String(cfg.streamLogs));\n console.log();\n });\n\n config\n .command(\"set <key> <value>\")\n .description(\"설정 값 변경\")\n .action((key: string, value: string) => {\n const allowedKeys = [\"defaultWorkflow\", \"theme\", \"streamLogs\"];\n if (!allowedKeys.includes(key)) {\n printError(`알 수 없는 설정 키: ${key}`);\n console.log(` 사용 가능: ${allowedKeys.join(\", \")}`);\n process.exit(1);\n }\n\n const parsed = key === \"streamLogs\" ? value === \"true\" : value;\n setConfig({ [key]: parsed });\n printSuccess(`${key} = ${value}`);\n });\n}\n","/**\n * xgen login — 서버 로그인\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { apiLogin } from \"../api/auth.js\";\nimport { setAuth, requireServer, getAuth } from \"../config/store.js\";\nimport { printSuccess, printError, printHeader } from \"../utils/format.js\";\n\nfunction prompt(question: string, hidden = false): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n if (hidden) {\n // 비밀번호 입력 시 에코 숨김\n process.stdout.write(question);\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n if (stdin.isTTY) stdin.setRawMode(true);\n\n let password = \"\";\n const onData = (ch: Buffer) => {\n const c = ch.toString(\"utf8\");\n if (c === \"\\n\" || c === \"\\r\" || c === \"\\u0004\") {\n if (stdin.isTTY) stdin.setRawMode(wasRaw ?? false);\n stdin.removeListener(\"data\", onData);\n process.stdout.write(\"\\n\");\n rl.close();\n resolve(password);\n } else if (c === \"\\u0003\") {\n // Ctrl+C\n process.exit(0);\n } else if (c === \"\\u007F\" || c === \"\\b\") {\n // Backspace\n if (password.length > 0) {\n password = password.slice(0, -1);\n process.stdout.write(\"\\b \\b\");\n }\n } else {\n password += c;\n process.stdout.write(\"*\");\n }\n };\n stdin.on(\"data\", onData);\n } else {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n }\n });\n}\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command(\"login\")\n .description(\"XGEN 서버에 로그인\")\n .option(\"-e, --email <email>\", \"이메일\")\n .option(\"-p, --password <password>\", \"비밀번호\")\n .action(async (opts) => {\n const server = requireServer();\n\n printHeader(\"XGEN Login\");\n console.log(chalk.gray(`서버: ${server}\\n`));\n\n let email = opts.email;\n let password = opts.password;\n\n if (!email) {\n email = await prompt(chalk.white(\"이메일: \"));\n }\n if (!password) {\n password = await prompt(chalk.white(\"비밀번호: \"), true);\n }\n\n if (!email || !password) {\n printError(\"이메일과 비밀번호를 모두 입력하세요\");\n process.exit(1);\n }\n\n try {\n const result = await apiLogin(email, password);\n\n if (result.success && result.access_token) {\n setAuth({\n accessToken: result.access_token,\n refreshToken: result.refresh_token ?? \"\",\n userId: result.user_id ?? \"\",\n username: result.username ?? \"\",\n isAdmin: false,\n expiresAt: null,\n });\n\n console.log();\n printSuccess(`로그인 성공! ${chalk.bold(result.username ?? email)}`);\n } else {\n printError(result.message || \"로그인 실패\");\n process.exit(1);\n }\n } catch (err: unknown) {\n const msg =\n (err as { response?: { data?: { message?: string; detail?: string } } })\n ?.response?.data?.message ??\n (err as { response?: { data?: { detail?: string } } })\n ?.response?.data?.detail ??\n (err as Error).message;\n printError(`로그인 실패: ${msg}`);\n process.exit(1);\n }\n });\n\n program\n .command(\"logout\")\n .description(\"로그아웃\")\n .action(async () => {\n const { clearAuth } = await import(\"../config/store.js\");\n clearAuth();\n printSuccess(\"로그아웃 완료\");\n });\n\n program\n .command(\"whoami\")\n .description(\"현재 로그인된 사용자 정보\")\n .action(async () => {\n const auth = getAuth();\n if (!auth) {\n printError(\"로그인되지 않았습니다. xgen login 실행하세요\");\n process.exit(1);\n }\n\n const server = requireServer();\n console.log(chalk.bold(\"\\n현재 사용자\"));\n console.log(chalk.gray(\"─\".repeat(30)));\n console.log(` ${chalk.gray(\"서버:\")} ${server}`);\n console.log(` ${chalk.gray(\"사용자:\")} ${chalk.bold(auth.username)}`);\n console.log(` ${chalk.gray(\"User ID:\")} ${auth.userId}`);\n\n // 토큰 유효성 확인\n try {\n const { apiValidate } = await import(\"../api/auth.js\");\n const result = await apiValidate(auth.accessToken);\n if (result.valid) {\n console.log(` ${chalk.gray(\"상태:\")} ${chalk.green(\"활성\")}`);\n if (result.is_admin) {\n console.log(` ${chalk.gray(\"권한:\")} ${chalk.yellow(\"관리자\")}`);\n }\n if (result.user_type) {\n console.log(` ${chalk.gray(\"유형:\")} ${result.user_type}`);\n }\n } else {\n console.log(` ${chalk.gray(\"상태:\")} ${chalk.red(\"토큰 만료\")}`);\n }\n } catch {\n console.log(` ${chalk.gray(\"상태:\")} ${chalk.yellow(\"검증 불가 (서버 연결 실패)\")}`);\n }\n console.log();\n });\n}\n","/**\n * xgen workflow list — 워크플로우 목록 조회\n */\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { listWorkflows, getWorkflowListDetail } from \"../../api/workflow.js\";\nimport { printTable, printError, printHeader, truncate, formatDate } from \"../../utils/format.js\";\n\nexport async function workflowList(opts: { detail?: boolean }): Promise<void> {\n requireAuth();\n\n try {\n if (opts.detail) {\n const workflows = await getWorkflowListDetail();\n\n if (!workflows || workflows.length === 0) {\n console.log(chalk.yellow(\"\\n워크플로우가 없습니다.\\n\"));\n return;\n }\n\n printHeader(`워크플로우 목록 (${workflows.length}개)`);\n console.log();\n\n printTable(\n [\"#\", \"ID\", \"이름\", \"배포\", \"업데이트\"],\n workflows.map((w, i) => [\n String(i + 1),\n (w.workflow_id ?? w.id ?? \"-\").slice(0, 12),\n truncate(w.workflow_name ?? \"-\", 30),\n (w as Record<string, unknown>).is_deployed\n ? chalk.green(\"배포됨\")\n : chalk.gray(\"미배포\"),\n formatDate(w.updated_at),\n ])\n );\n } else {\n const workflows = await listWorkflows();\n\n if (!workflows || workflows.length === 0) {\n console.log(chalk.yellow(\"\\n워크플로우가 없습니다.\\n\"));\n return;\n }\n\n printHeader(`워크플로우 목록 (${workflows.length}개)`);\n console.log();\n\n printTable(\n [\"#\", \"ID\", \"이름\"],\n workflows.map((w, i) => [\n String(i + 1),\n (w.workflow_id ?? w.id ?? \"-\").slice(0, 12),\n w.workflow_name ?? \"-\",\n ])\n );\n }\n console.log();\n } catch (err: unknown) {\n const msg = (err as Error).message;\n printError(`워크플로우 목록 조회 실패: ${msg}`);\n process.exit(1);\n }\n}\n","/**\n * xgen workflow info <id> — 워크플로우 상세 정보\n */\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { getWorkflowDetail } from \"../../api/workflow.js\";\nimport { printError, printHeader, printKeyValue } from \"../../utils/format.js\";\n\nexport async function workflowInfo(workflowId: string): Promise<void> {\n requireAuth();\n\n try {\n const detail = await getWorkflowDetail(workflowId);\n\n printHeader(`워크플로우: ${detail.workflow_name ?? workflowId}`);\n console.log();\n\n printKeyValue(\"ID\", detail.id);\n printKeyValue(\"이름\", detail.workflow_name);\n printKeyValue(\"설명\", detail.description ?? \"(없음)\");\n\n if (detail.nodes && Array.isArray(detail.nodes)) {\n console.log();\n console.log(chalk.bold(\" 노드 구성:\"));\n for (const node of detail.nodes as Array<{ id: string; data?: { label?: string; type?: string } }>) {\n const label = node.data?.label ?? node.id;\n const type = node.data?.type ?? \"unknown\";\n console.log(` ${chalk.cyan(\"•\")} ${label} ${chalk.gray(`(${type})`)}`);\n }\n }\n\n if (detail.parameters && Object.keys(detail.parameters).length > 0) {\n console.log();\n console.log(chalk.bold(\" 파라미터:\"));\n for (const [key, val] of Object.entries(detail.parameters)) {\n console.log(` ${chalk.gray(key)}: ${JSON.stringify(val)}`);\n }\n }\n\n console.log();\n } catch (err: unknown) {\n const msg = (err as Error).message;\n printError(`워크플로우 조회 실패: ${msg}`);\n process.exit(1);\n }\n}\n","/**\n * xgen workflow run <id> — 워크플로우 실행\n */\nimport chalk from \"chalk\";\nimport { randomUUID } from \"node:crypto\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { executeWorkflowStream, getWorkflowDetail } from \"../../api/workflow.js\";\nimport { parseSSEStream } from \"../../utils/sse.js\";\nimport { printError, printHeader, printInfo } from \"../../utils/format.js\";\nimport { renderMarkdown } from \"../../utils/markdown.js\";\nimport type { SSEEvent } from \"../../api/types.js\";\n\nexport async function workflowRun(\n workflowId: string,\n input: string | undefined,\n opts: { interactive?: boolean; logs?: boolean }\n): Promise<void> {\n const auth = requireAuth();\n\n // 워크플로우 정보 가져오기\n let workflowName = workflowId;\n try {\n const detail = await getWorkflowDetail(workflowId);\n workflowName = detail.workflow_name ?? workflowId;\n } catch {\n // 이름 조회 실패해도 실행은 계속\n }\n\n // 인터랙티브 모드: 입력이 없으면 프롬���트\n if (!input) {\n if (opts.interactive || !process.stdin.isTTY) {\n const { createInterface } = await import(\"node:readline\");\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n input = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan(\"입력> \"), (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n } else {\n printError(\"입력값이 필요합니다. 사용법:\");\n console.log(' xgen workflow run <id> \"입력 텍스���\"');\n console.log(\" xgen workflow run -i <id>\");\n process.exit(1);\n }\n }\n\n if (!input) {\n printError(\"입력값이 비어있습니다\");\n process.exit(1);\n }\n\n const interactionId = `cli_${randomUUID().slice(0, 8)}`;\n\n printHeader(`실행: ${workflowName}`);\n printInfo(`입력: ${input}`);\n console.log();\n\n try {\n const stream = await executeWorkflowStream({\n workflow_id: workflowId,\n workflow_name: workflowName,\n input_data: input,\n interaction_id: interactionId,\n });\n\n let hasOutput = false;\n let fullResponse = \"\";\n\n await parseSSEStream(\n stream,\n (event: SSEEvent) => {\n switch (event.type) {\n case \"token\":\n if (event.content) {\n if (!hasOutput) {\n hasOutput = true;\n console.log();\n }\n process.stdout.write(event.content);\n fullResponse += event.content;\n }\n break;\n\n case \"log\":\n if (opts.logs && event.content) {\n process.stderr.write(chalk.gray(`[LOG] ${event.content}\\n`));\n }\n break;\n\n case \"node_status\":\n if (opts.logs) {\n const nodeName = event.node_name ?? event.node_id ?? \"?\";\n const status = event.status ?? \"?\";\n process.stderr.write(\n chalk.gray(`[노드] ${nodeName}: ${status}\\n`)\n );\n }\n break;\n\n case \"tool\":\n if (opts.logs) {\n process.stderr.write(chalk.gray(`[도구] ${JSON.stringify(event.data)}\\n`));\n }\n break;\n\n case \"complete\":\n break;\n\n case \"error\":\n console.log();\n printError(event.error ?? event.content ?? \"알 수 없는 오류\");\n break;\n\n default:\n // 알 수 없는 이벤트는 content가 있으면 출력\n if (event.content) {\n if (!hasOutput) {\n process.stdout.write(chalk.green(\"응답: \"));\n hasOutput = true;\n }\n process.stdout.write(event.content);\n }\n }\n },\n () => {\n if (hasOutput) {\n // 스트리밍 끝 — 마크다운이 있으면 렌더링된 버전도 표시\n console.log();\n if (fullResponse.includes(\"```\") || fullResponse.includes(\"**\")) {\n console.log(chalk.gray(\"─\".repeat(40)));\n console.log(renderMarkdown(fullResponse));\n }\n }\n console.log();\n console.log(chalk.gray(`세션: ${interactionId}`));\n },\n (err) => {\n console.log();\n printError(`스트리밍 오류: ${err.message}`);\n }\n );\n } catch (err: unknown) {\n const msg =\n (err as { response?: { data?: { detail?: string } } })?.response?.data\n ?.detail ?? (err as Error).message;\n printError(`실행 실패: ${msg}`);\n process.exit(1);\n }\n}\n","/**\n * SSE (Server-Sent Events) 파서\n * 워크플로우 스트리밍 응답 처리\n */\nimport type { SSEEvent } from \"../api/types.js\";\n\n/**\n * ReadableStream에서 SSE 이벤트를 파싱하여 콜백으로 전달\n */\nexport async function parseSSEStream(\n stream: NodeJS.ReadableStream,\n onEvent: (event: SSEEvent) => void,\n onDone?: () => void,\n onError?: (error: Error) => void\n): Promise<void> {\n let buffer = \"\";\n\n return new Promise<void>((resolve, reject) => {\n stream.on(\"data\", (chunk: Buffer) => {\n buffer += chunk.toString();\n\n // SSE 이벤트 파싱: 빈 줄로 구분\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n const lines = part.split(\"\\n\");\n let data = \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n data += line.slice(6);\n } else if (line.startsWith(\"data:\")) {\n data += line.slice(5);\n }\n }\n\n if (!data) continue;\n\n try {\n const event = JSON.parse(data) as SSEEvent;\n onEvent(event);\n } catch {\n // JSON 파싱 실패 시 텍스트로 처리\n onEvent({ type: \"token\", content: data });\n }\n }\n });\n\n stream.on(\"end\", () => {\n // 남은 버퍼 처리\n if (buffer.trim()) {\n const lines = buffer.split(\"\\n\");\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const event = JSON.parse(line.slice(6)) as SSEEvent;\n onEvent(event);\n } catch {\n onEvent({ type: \"token\", content: line.slice(6) });\n }\n }\n }\n }\n onDone?.();\n resolve();\n });\n\n stream.on(\"error\", (err: Error) => {\n onError?.(err);\n reject(err);\n });\n });\n}\n","/**\n * 터미널 마크다운 렌더링 — 가볍게\n * marked-terminal 안 쓰고 직접 처리 (의존성 최소화)\n */\nimport chalk from \"chalk\";\n\n/** 코드 블록 감지용 */\nconst CODE_BLOCK_RE = /```(\\w*)\\n([\\s\\S]*?)```/g;\nconst INLINE_CODE_RE = /`([^`]+)`/g;\nconst BOLD_RE = /\\*\\*(.+?)\\*\\*/g;\nconst HEADING_RE = /^(#{1,3})\\s+(.+)$/gm;\nconst LIST_RE = /^(\\s*)[-*]\\s+(.+)$/gm;\nconst LINK_RE = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n\nexport function renderMarkdown(text: string): string {\n let result = text;\n\n // 코드 블록: 박스로 표시\n result = result.replace(CODE_BLOCK_RE, (_match, lang, code) => {\n const trimmed = code.trimEnd();\n const header = lang ? chalk.gray(` ── ${lang} ──`) : chalk.gray(\" ── code ──\");\n const lines = trimmed.split(\"\\n\").map((l: string) => chalk.white(` ${l}`)).join(\"\\n\");\n return `\\n${header}\\n${lines}\\n${chalk.gray(\" ──────────\")}\\n`;\n });\n\n // 인라인 코드\n result = result.replace(INLINE_CODE_RE, (_m, code) => chalk.cyan(`\\`${code}\\``));\n\n // 볼드\n result = result.replace(BOLD_RE, (_m, text) => chalk.bold(text));\n\n // 헤딩\n result = result.replace(HEADING_RE, (_m, hashes, text) => {\n if (hashes.length === 1) return chalk.bold.underline(text);\n if (hashes.length === 2) return chalk.bold(text);\n return chalk.bold.dim(text);\n });\n\n // 리스트\n result = result.replace(LIST_RE, (_m, indent, text) => `${indent}${chalk.cyan(\"•\")} ${text}`);\n\n // 링크\n result = result.replace(LINK_RE, (_m, label, url) => `${chalk.blue.underline(label)} ${chalk.gray(`(${url})`)}`);\n\n return result;\n}\n","/**\n * xgen workflow history — 실행 이력 조회\n */\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { getIOLogs } from \"../../api/workflow.js\";\nimport { printError, printHeader, truncate, formatDate } from \"../../utils/format.js\";\n\nexport async function workflowHistory(\n workflowId?: string,\n workflowName?: string,\n opts: { limit?: number } = {}\n): Promise<void> {\n requireAuth();\n\n if (!workflowId || !workflowName) {\n console.log(chalk.yellow(\"\\n워크플로우 ID와 이름이 필요합니다.\\n 사용법: xgen wf history <workflow-id> <workflow-name>\\n\"));\n return;\n }\n\n const limit = opts.limit ?? 20;\n\n try {\n const logs = await getIOLogs(workflowId, workflowName, limit);\n\n if (!logs || logs.length === 0) {\n console.log(chalk.yellow(\"\\n실행 이력이 없습니다.\\n\"));\n return;\n }\n\n printHeader(`실행 이력 (최근 ${logs.length}건)`);\n console.log();\n\n for (const log of logs) {\n console.log(\n ` ${chalk.gray(formatDate(log.created_at))} ${chalk.cyan(log.interaction_id)}`\n );\n console.log(` ${chalk.white(\"입력:\")} ${truncate(log.input_data, 60)}`);\n console.log(\n ` ${chalk.green(\"출력:\")} ${truncate(log.output_data, 60)}`\n );\n if (log.execution_time) {\n console.log(\n ` ${chalk.gray(\"시간:\")} ${(log.execution_time / 1000).toFixed(1)}s`\n );\n }\n console.log();\n }\n } catch (err: unknown) {\n const msg = (err as Error).message;\n printError(`이력 조회 실패: ${msg}`);\n process.exit(1);\n }\n}\n","/**\n * xgen workflow — 워크플로우 커맨드 그룹\n */\nimport { Command } from \"commander\";\nimport { workflowList } from \"./list.js\";\nimport { workflowInfo } from \"./info.js\";\nimport { workflowRun } from \"./run.js\";\nimport { workflowHistory } from \"./history.js\";\n\nexport function registerWorkflowCommand(program: Command): void {\n const wf = program\n .command(\"workflow\")\n .alias(\"wf\")\n .description(\"워크플로우 관리 및 실행\");\n\n wf.command(\"list\")\n .alias(\"ls\")\n .description(\"워크플로우 목록 조회\")\n .option(\"-d, --detail\", \"상세 정보 포함\")\n .action((opts) => workflowList(opts));\n\n wf.command(\"info <workflow-id>\")\n .description(\"워크플로우 상세 정보\")\n .action((id) => workflowInfo(id));\n\n wf.command(\"run <workflow-id> [input]\")\n .description(\"워크플로우 실행\")\n .option(\"-i, --interactive\", \"인터랙티브 모드 (입력 프롬프트)\")\n .option(\"-l, --logs\", \"디버그 로그 표시\")\n .action((id, input, opts) => workflowRun(id, input, opts));\n\n wf.command(\"history [workflow-id]\")\n .description(\"실행 이력 조회\")\n .option(\"-n, --limit <number>\", \"조회 건수\", \"20\")\n .action((id, opts) => workflowHistory(id, { limit: parseInt(opts.limit) }));\n}\n","/**\n * xgen chat — 인터랙티브 터미널 모드\n *\n * Gemini CLI 스타일: 터미널 열면 바로 대화, 워크플로우 전환 가능\n *\n * 슬래시 커맨드:\n * /workflows — 워크플로우 목록 + 전환\n * /switch — 워크플로우 전환\n * /history — 최근 대화 이력\n * /clear — 화면 지우기\n * /help — 도움말\n * /exit — 종료\n */\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { randomUUID } from \"node:crypto\";\nimport { requireAuth, getAuth, getServer } from \"../config/store.js\";\nimport { listWorkflows, executeWorkflowStream, type Workflow } from \"../api/workflow.js\";\nimport { parseSSEStream } from \"../utils/sse.js\";\nimport { renderMarkdown } from \"../utils/markdown.js\";\nimport { printError } from \"../utils/format.js\";\nimport type { SSEEvent } from \"../api/types.js\";\n\nconst CHAT_BANNER = `\n${chalk.cyan(\"╭──────────────────────────────────────╮\")}\n${chalk.cyan(\"│\")} ${chalk.white.bold(\"XGEN\")} ${chalk.gray(\"— 워크플로우 AI 터미널\")} ${chalk.cyan(\"│\")}\n${chalk.cyan(\"│\")} ${chalk.gray(\"/help 도움말 /workflows 전환 /exit\")} ${chalk.cyan(\"│\")}\n${chalk.cyan(\"╰──────────────────────────────────────╯\")}`;\n\nfunction printHelp() {\n console.log(`\n${chalk.bold(\"슬래시 커맨드\")}\n ${chalk.cyan(\"/workflows\")} 워크플로우 목록 보기 & 전환\n ${chalk.cyan(\"/switch\")} 워크플로우 번호로 전환 (예: /switch 3)\n ${chalk.cyan(\"/history\")} 현재 세션 대화 이력\n ${chalk.cyan(\"/clear\")} 화면 지우기\n ${chalk.cyan(\"/info\")} 현재 연결 정보\n ${chalk.cyan(\"/help\")} 이 도움말\n ${chalk.cyan(\"/exit\")} 종료 (Ctrl+C도 가능)\n`);\n}\n\nasync function promptLine(rl: ReturnType<typeof createInterface>, promptStr: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(promptStr, (answer) => resolve(answer));\n });\n}\n\nexport async function chat(workflowId?: string): Promise<void> {\n const auth = requireAuth();\n const server = getServer();\n\n // 워크플로우 목록 로드\n let workflows: Workflow[] = [];\n try {\n workflows = await listWorkflows();\n } catch {\n printError(\"워크플로우 목록을 불러올 수 없습니다\");\n process.exit(1);\n }\n\n if (workflows.length === 0) {\n printError(\"사용 가능한 워크플로우가 없습니다\");\n process.exit(1);\n }\n\n // 워크플로우 선택\n let current: Workflow;\n if (workflowId) {\n const found = workflows.find((w) => w.id === workflowId || w.workflow_name === workflowId);\n current = found ?? { id: workflowId, workflow_name: workflowId };\n } else {\n // 첫 번째 또는 선택\n console.log(CHAT_BANNER);\n console.log(chalk.gray(` 서버: ${server} | 사용자: ${auth.username}\\n`));\n console.log(chalk.bold(\" 워크플로우 선택:\\n\"));\n workflows.forEach((w, i) => {\n console.log(` ${chalk.cyan(String(i + 1).padStart(3))} ${w.workflow_name}`);\n });\n console.log();\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await promptLine(rl, chalk.cyan(\" 번호> \"));\n rl.close();\n\n const idx = parseInt(answer.trim()) - 1;\n if (isNaN(idx) || idx < 0 || idx >= workflows.length) {\n current = workflows[0];\n } else {\n current = workflows[idx];\n }\n }\n\n // 세션 시작\n const sessionId = randomUUID().slice(0, 8);\n let turnCount = 0;\n const history: Array<{ role: string; content: string }> = [];\n\n console.log();\n console.log(chalk.cyan(\"─\".repeat(42)));\n console.log(chalk.white.bold(` ${current.workflow_name}`));\n console.log(chalk.cyan(\"─\".repeat(42)));\n console.log(chalk.gray(\" 메시지를 입력하세요. /help 로 도움말.\\n\"));\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const getPrompt = () => chalk.cyan(\"❯ \");\n\n const processInput = async (line: string) => {\n const input = line.trim();\n if (!input) return;\n\n // 슬래시 커맨드\n if (input.startsWith(\"/\")) {\n const [cmd, ...args] = input.slice(1).split(\" \");\n\n switch (cmd.toLowerCase()) {\n case \"exit\":\n case \"quit\":\n case \"q\":\n console.log(chalk.gray(\"\\n 종료합니다.\\n\"));\n rl.close();\n process.exit(0);\n break;\n\n case \"help\":\n case \"h\":\n printHelp();\n break;\n\n case \"clear\":\n case \"cls\":\n console.clear();\n console.log(chalk.white.bold(` ${current.workflow_name}`));\n console.log(chalk.cyan(\"─\".repeat(42)));\n break;\n\n case \"workflows\":\n case \"wf\":\n console.log();\n workflows.forEach((w, i) => {\n const marker = w.id === current.id ? chalk.green(\"▸\") : \" \";\n console.log(` ${marker} ${chalk.cyan(String(i + 1).padStart(2))} ${w.workflow_name}`);\n });\n console.log(chalk.gray(\"\\n /switch <번호> 로 전환\\n\"));\n break;\n\n case \"switch\":\n case \"sw\": {\n const num = parseInt(args[0]);\n if (isNaN(num) || num < 1 || num > workflows.length) {\n console.log(chalk.yellow(` 1~${workflows.length} 사이 번호를 입력하세요`));\n } else {\n current = workflows[num - 1];\n turnCount = 0;\n history.length = 0;\n console.log(chalk.green(`\\n 전환: ${current.workflow_name}\\n`));\n }\n break;\n }\n\n case \"history\":\n case \"hist\":\n if (history.length === 0) {\n console.log(chalk.gray(\" 대화 이력이 없습니다.\\n\"));\n } else {\n console.log();\n for (const h of history) {\n const label = h.role === \"user\" ? chalk.cyan(\"나\") : chalk.green(\"AI\");\n const text = h.content.length > 80 ? h.content.slice(0, 80) + \"...\" : h.content;\n console.log(` ${label}: ${text}`);\n }\n console.log();\n }\n break;\n\n case \"info\":\n console.log(`\n ${chalk.gray(\"서버:\")} ${server}\n ${chalk.gray(\"사용자:\")} ${auth.username}\n ${chalk.gray(\"워크플로우:\")} ${current.workflow_name}\n ${chalk.gray(\"세션:\")} ${sessionId}\n ${chalk.gray(\"턴:\")} ${turnCount}\n`);\n break;\n\n default:\n console.log(chalk.yellow(` 알 수 없는 커맨드: /${cmd}. /help 참고`));\n }\n\n rl.prompt();\n return;\n }\n\n // 워크플로우 실행\n turnCount++;\n const interactionId = `${sessionId}_t${turnCount}`;\n history.push({ role: \"user\", content: input });\n\n // 스피너 시작\n process.stdout.write(chalk.gray(\" thinking...\"));\n\n try {\n const stream = await executeWorkflowStream({\n workflow_id: current.id,\n workflow_name: current.workflow_name,\n input_data: input,\n interaction_id: interactionId,\n });\n\n // 스피너 지우기\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n\n let fullResponse = \"\";\n let hasOutput = false;\n\n await parseSSEStream(\n stream,\n (event: SSEEvent) => {\n if ((event.type === \"token\" || !event.type) && event.content) {\n if (!hasOutput) {\n hasOutput = true;\n console.log();\n }\n process.stdout.write(event.content);\n fullResponse += event.content;\n } else if (event.type === \"error\") {\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n printError(event.error ?? event.content ?? \"오류\");\n }\n },\n () => {\n if (hasOutput) {\n // 응답 끝 — 마크다운 렌더링은 전체 텍스트에 적용\n console.log();\n console.log();\n }\n if (fullResponse) {\n history.push({ role: \"assistant\", content: fullResponse });\n }\n },\n (err) => {\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n printError(`스트리밍 오류: ${err.message}`);\n }\n );\n } catch (err: unknown) {\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n const msg =\n (err as { response?: { data?: { detail?: string } } })?.response?.data\n ?.detail ?? (err as Error).message;\n printError(`실행 실패: ${msg}`);\n }\n\n rl.prompt();\n };\n\n rl.setPrompt(getPrompt());\n rl.prompt();\n\n rl.on(\"line\", (line) => {\n // async 처리 — 입력 비활성화 후 완료되면 다시 prompt\n processInput(line).then(() => {\n // prompt는 processInput 내부에서 호출\n });\n });\n\n rl.on(\"close\", () => {\n console.log(chalk.gray(\"\\n 종료합니다.\\n\"));\n process.exit(0);\n });\n\n // Ctrl+C 깔끔하게\n process.on(\"SIGINT\", () => {\n console.log(chalk.gray(\"\\n 종료합니다.\\n\"));\n process.exit(0);\n });\n}\n\nexport function registerChatCommand(program: import(\"commander\").Command): void {\n program\n .command(\"chat [workflow-id]\")\n .description(\"인터랙티브 대화 모드\")\n .action((workflowId) => chat(workflowId));\n}\n","/**\n * OPEN XGEN — AI 에이전트 (메인 인터페이스)\n * Claude Code / Gemini CLI 스타일 — 채팅이 곧 인터페이스\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { getDefaultProvider, getServer, getAuth, getEnvironments, getActiveEnvironment } from \"../config/store.js\";\nimport { createLLMClient, streamChat, type Message, type TokenUsage } from \"../agent/llm.js\";\nimport { getAllToolDefs, executeTool, getToolNames } from \"../agent/tools/index.js\";\nimport { definitions as xgenToolDefs, execute as xgenExecute, isXgenTool } from \"../agent/tools/xgen-api.js\";\nimport { McpManager, loadMcpConfig } from \"../mcp/client.js\";\nimport { guidedProviderSetup } from \"./provider.js\";\nimport { box, ask, welcome } from \"../utils/ui.js\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nfunction buildSystemPrompt(): string {\n const server = getServer();\n const auth = getAuth();\n const env = getActiveEnvironment();\n\n let prompt = `You are OPEN XGEN, a terminal AI agent. Act like Claude Code.\n\nABSOLUTE RULES — VIOLATING THESE IS FAILURE:\n1. NEVER show menus, numbered options, or \"다음 중 선택\" style responses. NEVER.\n2. NEVER ask \"무엇을 도와드릴까요\" or \"어떤 작업을 하시겠습니까\". NEVER.\n3. When the user asks something → call the tool IMMEDIATELY. No preamble.\n4. After tool results → show the data directly. One sentence summary max.\n5. If user says a number → it refers to the previous list item. Act on it.\n6. If user says \"실행\" → execute immediately with context you have. Don't ask for confirmation.\n7. If ambiguous → make your best guess and do it. Don't ask.\n8. Response language: match the user. Korean → Korean.\n9. Max response: 1-2 sentences + data. No filler, no explanations unless asked.\n10. You are NOT a menu system. You are a doer. Do, don't ask.\n\nEXAMPLES OF BAD RESPONSES (NEVER DO THIS):\n- \"다음과 같은 작업이 가능합니다: 1. 목록 2. 실행...\"\n- \"원하는 작업을 선택해 주세요\"\n- \"어떻게 도와드릴까요?\"\n- Any numbered list of options\n\nEXAMPLES OF GOOD RESPONSES:\n- User: \"워크플로우\" → [call xgen_workflow_list] → show list\n- User: \"6\" → [call xgen_workflow_run for item 6] → show result\n- User: \"컬렉션\" → [call xgen_collection_list] → show list\n- User: \"이 폴더 뭐있어\" → [call list_files] → show files`;\n\n if (server && auth) {\n prompt += `\n\nXGEN CONNECTED: ${server} as ${auth.username}\n\nYou have full access to XGEN platform. Available tools:\n\nWORKFLOW: xgen_workflow_list, xgen_workflow_run (모든 워크플로우 실행 가능, 배포 무관), xgen_workflow_info, xgen_execution_history, xgen_workflow_performance, xgen_workflow_store, xgen_workflow_generate (자연어로 워크플로우 자동 생성)\nDOCUMENTS: xgen_collection_list, xgen_document_list, xgen_document_upload\nNODES: xgen_node_list, xgen_node_search, xgen_node_categories\nPROMPTS: xgen_prompt_list\nTOOLS: xgen_tool_store, xgen_user_tools\nSCHEDULE: xgen_schedule_list\nTRACE: xgen_trace_list, xgen_interaction_list\nMCP: xgen_mcp_sessions\nONTOLOGY: xgen_graph_rag_query, xgen_graph_stats\nSERVER: xgen_server_status\n\nWhen user says a number → find it from previous list. \"실행\" → execute immediately.`;\n } else {\n prompt += `\\nXGEN: Not connected. User can run /connect to connect.`;\n }\n\n return prompt;\n}\n\n// ── 대화 이력 ──\nconst CONV_DIR = join(homedir(), \".xgen\", \"conversations\");\n\nfunction ensureConvDir(): void {\n if (!existsSync(CONV_DIR)) mkdirSync(CONV_DIR, { recursive: true });\n}\n\nfunction saveConversation(messages: Message[], name?: string): string {\n ensureConvDir();\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n const filename = `${name || ts}.json`;\n const filepath = join(CONV_DIR, filename);\n // system 프롬프트 제외하고 저장\n const toSave = messages.filter((m) => m.role !== \"system\");\n writeFileSync(filepath, JSON.stringify(toSave, null, 2), \"utf-8\");\n return filename;\n}\n\nfunction listConversations(): { name: string; date: string; msgs: number }[] {\n ensureConvDir();\n const files = readdirSync(CONV_DIR).filter((f) => f.endsWith(\".json\")).sort().reverse();\n return files.slice(0, 20).map((f) => {\n try {\n const data = JSON.parse(readFileSync(join(CONV_DIR, f), \"utf-8\")) as Message[];\n const userMsgs = data.filter((m) => m.role === \"user\").length;\n return { name: f.replace(\".json\", \"\"), date: f.slice(0, 10), msgs: userMsgs };\n } catch {\n return { name: f.replace(\".json\", \"\"), date: \"\", msgs: 0 };\n }\n });\n}\n\nfunction loadConversation(name: string): Message[] | null {\n const filepath = join(CONV_DIR, `${name}.json`);\n if (!existsSync(filepath)) return null;\n try {\n return JSON.parse(readFileSync(filepath, \"utf-8\")) as Message[];\n } catch {\n return null;\n }\n}\n\nlet mcpManager: McpManager | null = null;\n\n// 세션 토큰 추적\nconst sessionUsage = { prompt: 0, completion: 0, total: 0, calls: 0 };\n\nfunction formatTokens(n: number): string {\n if (n >= 1_000_000) return (n / 1_000_000).toFixed(1) + \"M\";\n if (n >= 1_000) return (n / 1_000).toFixed(1) + \"k\";\n return String(n);\n}\n\nfunction showUsage(usage: TokenUsage | null): void {\n if (!usage || usage.totalTokens === 0) return;\n sessionUsage.prompt += usage.promptTokens;\n sessionUsage.completion += usage.completionTokens;\n sessionUsage.total += usage.totalTokens;\n sessionUsage.calls++;\n console.log(chalk.gray(` tokens: ${formatTokens(usage.promptTokens)}→${formatTokens(usage.completionTokens)} (session: ${formatTokens(sessionUsage.total)})`));\n}\n\nexport async function agentRepl(): Promise<void> {\n // ── 로고 ──\n console.log(chalk.cyan(`\n ██████ ██████ ███████ ███ ██\n ██ ██ ██ ██ ██ ████ ██\n ██ ██ ██████ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██\n ██████ ██ ███████ ██ ████`) +\n chalk.white.bold(`\n ██ ██ ██████ ███████ ███ ██\n ██ ██ ██ ██ ████ ██\n ███ ██ ███ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██ ██\n ██ ██ ██████ ███████ ██ ████`));\n console.log();\n\n // ── 1단계: 프로바이더 ──\n let provider = getDefaultProvider();\n if (!provider) {\n provider = await guidedProviderSetup();\n if (!provider) process.exit(1);\n }\n\n // ── 2단계: XGEN 서버 연결 (미연결이면 자동 가이드) ──\n let server = getServer();\n let auth = getAuth();\n\n if (!server || !auth) {\n console.log(chalk.yellow(\" XGEN 서버에 연결되지 않았습니다.\"));\n console.log(chalk.gray(\" 연결하면 워크플로우, 컬렉션, 온톨로지 등 XGEN 기능을 사용할 수 있습니다.\\n\"));\n\n const { ask: askOnce } = await import(\"../utils/ui.js\");\n const doConnect = await askOnce(chalk.white(\" XGEN 서버에 연결할까요? (Y/n): \"));\n if (doConnect.toLowerCase() !== \"n\") {\n await connectServer();\n server = getServer();\n auth = getAuth();\n } else {\n console.log(chalk.gray(\" 나중에 /connect 로 연결할 수 있습니다.\\n\"));\n }\n } else {\n // 저장된 인증이 있으면 유효성 확인\n try {\n const { apiValidate } = await import(\"../api/auth.js\");\n const valid = await apiValidate(auth.accessToken);\n if (!valid.valid) {\n // 토큰 갱신 시도\n const { apiRefresh } = await import(\"../api/auth.js\");\n const refreshed = await apiRefresh(auth.refreshToken);\n if (refreshed.success && refreshed.access_token) {\n const { setAuth } = await import(\"../config/store.js\");\n setAuth({ ...auth, accessToken: refreshed.access_token });\n auth = getAuth();\n }\n }\n } catch {\n // 검증 실패해도 계속 (오프라인일 수 있음)\n }\n }\n\n const client = createLLMClient(provider);\n\n // 도구 조합: 기본 + XGEN + MCP\n const allTools: ChatCompletionTool[] = [...getAllToolDefs(), ...xgenToolDefs];\n const builtinNames = getToolNames();\n\n // MCP\n const mcpConfig = loadMcpConfig();\n if (mcpConfig && Object.keys(mcpConfig.mcpServers).length > 0) {\n mcpManager = new McpManager();\n try {\n await mcpManager.startAll(mcpConfig);\n if (mcpManager.serverCount > 0) allTools.push(...mcpManager.getAllTools());\n } catch { /* MCP 실패해도 계속 */ }\n }\n\n const messages: Message[] = [{ role: \"system\", content: buildSystemPrompt() }];\n\n // ── 헤더 ──\n const env = getActiveEnvironment();\n\n console.log(chalk.gray(` model ${provider.model}`));\n if (server && auth) {\n console.log(chalk.gray(` xgen ${chalk.green(\"●\")} ${auth.username}@${server.replace(\"https://\", \"\").replace(\"http://\", \"\")}`));\n } else {\n console.log(chalk.gray(` xgen ${chalk.red(\"○\")} 미연결`));\n }\n console.log(chalk.gray(` cwd ${process.cwd()}`));\n console.log();\n\n // XGEN 연결 시 자동으로 상태 요약 표시\n if (server && auth) {\n try {\n const [wfRes, colRes] = await Promise.allSettled([\n import(\"../api/workflow.js\").then((m) => m.getWorkflowListDetail()),\n import(\"../api/document.js\").then((m) => m.listCollections()),\n ]);\n const wfCount = wfRes.status === \"fulfilled\" ? wfRes.value.length : 0;\n const colCount = colRes.status === \"fulfilled\" ? colRes.value.length : 0;\n const deployed = wfRes.status === \"fulfilled\" ? wfRes.value.filter((w: Record<string, unknown>) => w.is_deployed).length : 0;\n console.log(chalk.gray(` ─────────────────────────────────`));\n console.log(chalk.gray(` 워크플로우 ${chalk.white(String(wfCount))}개 (배포 ${deployed}) · 컬렉션 ${chalk.white(String(colCount))}개`));\n console.log(chalk.gray(` ─────────────────────────────────`));\n console.log();\n console.log(chalk.gray(` \"워크플로우 목록\", \"컬렉션\", \"6번 실행\" 등 자유롭게 입력`));\n console.log(chalk.gray(` /dashboard 로 TUI 대시보드 · /help 전체 도움말`));\n } catch {\n console.log(chalk.gray(` 무엇이든 물어보세요. /help`));\n }\n } else {\n console.log(chalk.gray(` 무엇이든 물어보세요. /help`));\n }\n console.log();\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n let rlClosed = false;\n rl.on(\"close\", () => { rlClosed = true; });\n\n const askUser = (): Promise<string> =>\n new Promise((resolve) => {\n if (rlClosed) { resolve(\"/exit\"); return; }\n rl.question(chalk.cyan(\" ❯ \"), (a) => resolve(a?.trim() ?? \"/exit\"));\n });\n\n process.on(\"SIGINT\", () => {\n console.log(chalk.gray(\"\\n 👋\\n\"));\n mcpManager?.stopAll();\n rl.close();\n process.exit(0);\n });\n\n while (true) {\n const input = await askUser();\n if (!input) continue;\n\n // ── 슬래시 커맨드 ──\n if (input === \"/exit\" || input === \"exit\") {\n console.log(chalk.gray(\"\\n 👋\\n\"));\n mcpManager?.stopAll();\n rl.close();\n break;\n }\n\n if (input === \"/help\") {\n console.log(`\n ${chalk.bold(\"슬래시 커맨드\")}\n ${chalk.cyan(\"/connect\")} XGEN 서버 연결 + 로그인\n ${chalk.cyan(\"/env\")} 환경 전환 (본사/제주/롯데몰)\n ${chalk.cyan(\"/provider\")} 프로바이더 변경\n ${chalk.cyan(\"/dashboard\")} TUI 대시보드 (4분할 화면)\n ${chalk.cyan(\"/tools\")} 사용 가능한 도구 목록\n ${chalk.cyan(\"/status\")} 현재 연결 상태\n ${chalk.cyan(\"/save [이름]\")} 대화 저장\n ${chalk.cyan(\"/load\")} 이전 대화 불러오기\n ${chalk.cyan(\"/conversations\")} 저장된 대화 목록\n ${chalk.cyan(\"/usage\")} 토큰 사용량\n ${chalk.cyan(\"/clear\")} 대화 초기화\n ${chalk.cyan(\"/exit\")} 종료\n`);\n continue;\n }\n\n if (input === \"/clear\") {\n messages.length = 0;\n messages.push({ role: \"system\", content: buildSystemPrompt() });\n sessionUsage.prompt = 0; sessionUsage.completion = 0; sessionUsage.total = 0; sessionUsage.calls = 0;\n console.log(chalk.gray(\" 대화 초기화됨.\\n\"));\n continue;\n }\n\n if (input.startsWith(\"/save\")) {\n const name = input.slice(5).trim() || undefined;\n const filename = saveConversation(messages, name);\n console.log(chalk.green(` ✓ 저장됨: ${filename}\\n`));\n continue;\n }\n\n if (input === \"/conversations\" || input === \"/convs\") {\n const convs = listConversations();\n if (!convs.length) {\n console.log(chalk.gray(\"\\n 저장된 대화 없음.\\n\"));\n } else {\n console.log();\n convs.forEach((c, i) => {\n console.log(` ${chalk.cyan(`${i + 1}.`)} ${c.name} ${chalk.gray(`(${c.msgs}턴)`)}`);\n });\n console.log();\n }\n continue;\n }\n\n if (input === \"/load\") {\n const convs = listConversations();\n if (!convs.length) {\n console.log(chalk.gray(\"\\n 저장된 대화 없음.\\n\"));\n continue;\n }\n console.log();\n convs.forEach((c, i) => {\n console.log(` ${chalk.cyan(`${i + 1}.`)} ${c.name} ${chalk.gray(`(${c.msgs}턴)`)}`);\n });\n console.log();\n const choice = await askUser();\n const ci = parseInt(choice) - 1;\n if (ci >= 0 && ci < convs.length) {\n const loaded = loadConversation(convs[ci].name);\n if (loaded) {\n messages.length = 0;\n messages.push({ role: \"system\", content: buildSystemPrompt() });\n messages.push(...loaded);\n console.log(chalk.green(` ✓ \"${convs[ci].name}\" 불러옴 (${loaded.filter((m) => m.role === \"user\").length}턴)\\n`));\n }\n }\n continue;\n }\n\n if (input === \"/usage\") {\n console.log(`\\n ${chalk.bold(\"세션 토큰 사용량\")}`);\n console.log(` 프롬프트: ${formatTokens(sessionUsage.prompt)}`);\n console.log(` 응답: ${formatTokens(sessionUsage.completion)}`);\n console.log(` 합계: ${formatTokens(sessionUsage.total)}`);\n console.log(` API 호출: ${sessionUsage.calls}회\\n`);\n continue;\n }\n\n if (input === \"/status\") {\n const p = getDefaultProvider();\n const s = getServer();\n const a = getAuth();\n const e = getActiveEnvironment();\n console.log();\n console.log(` ${chalk.bold(\"프로바이더\")} ${p ? `${p.name} · ${p.model}` : chalk.red(\"미설정\")}`);\n console.log(` ${chalk.bold(\"서버\")} ${s && a ? `${a.username}@${s.replace(\"https://\", \"\")}` : chalk.red(\"미연결\")}`);\n console.log(` ${chalk.bold(\"환경\")} ${e?.name ?? \"없음\"} (${getEnvironments().length}개 등록)`);\n if (mcpManager?.serverCount) {\n console.log(` ${chalk.bold(\"MCP\")} ${mcpManager.getServerNames().join(\", \")}`);\n }\n console.log();\n continue;\n }\n\n if (input === \"/tools\") {\n console.log(`\\n ${chalk.bold(\"코딩\")} ${builtinNames.join(\", \")}`);\n console.log(` ${chalk.bold(\"XGEN\")} ${xgenToolDefs.map((t) => t.function.name).join(\", \")}`);\n if (mcpManager?.serverCount) {\n console.log(` ${chalk.bold(\"MCP\")} ${mcpManager.getAllTools().map((t) => t.function.name).join(\", \")}`);\n }\n console.log();\n continue;\n }\n\n if (input === \"/connect\") {\n rl.pause();\n await connectServer();\n rl.resume();\n messages[0] = { role: \"system\", content: buildSystemPrompt() };\n continue;\n }\n\n if (input === \"/env\") {\n rl.pause();\n await switchEnv();\n rl.resume();\n messages[0] = { role: \"system\", content: buildSystemPrompt() };\n continue;\n }\n\n if (input === \"/provider\") {\n rl.pause();\n const { guidedProviderSetup: setup } = await import(\"./provider.js\");\n await setup();\n rl.resume();\n console.log(chalk.gray(\" 프로바이더 변경됨. /exit 후 재시작하세요.\\n\"));\n continue;\n }\n\n if (input === \"/dashboard\" || input === \"/dash\") {\n console.log(chalk.gray(\" 대시보드 열기...\\n\"));\n mcpManager?.stopAll();\n rl.close();\n if (process.stdin.isTTY) process.stdin.setRawMode?.(false);\n const { startInkDashboard } = await import(\"../dashboard/InkDashboard.js\");\n await startInkDashboard();\n return;\n }\n\n // ── AI 대화 ──\n messages.push({ role: \"user\", content: input });\n\n try {\n await runLoop(client, provider.model, messages, allTools);\n } catch (err) {\n const msg = (err as Error).message || String(err);\n if (msg.includes(\"401\") || msg.includes(\"API key\") || msg.includes(\"Unauthorized\")) {\n console.log(chalk.red(`\\n ✗ API 키가 유효하지 않습니다. /provider 로 재설정하세요.\\n`));\n } else if (msg.includes(\"429\") || msg.includes(\"rate limit\")) {\n console.log(chalk.yellow(`\\n ⚠ 요청 한도 초과. 잠시 후 다시 시도하세요.\\n`));\n } else if (msg.includes(\"ECONNREFUSED\") || msg.includes(\"ENOTFOUND\")) {\n console.log(chalk.red(`\\n ✗ 프로바이더 서버에 연결할 수 없습니다. URL/네트워크 확인.\\n`));\n } else {\n console.log(chalk.red(`\\n 오류: ${msg}\\n`));\n }\n messages.pop(); // 실패한 user 메시지 제거 (재시도 가능)\n }\n }\n}\n\nasync function runLoop(\n client: ReturnType<typeof createLLMClient>,\n model: string,\n messages: Message[],\n tools: ChatCompletionTool[]\n): Promise<void> {\n for (let i = 0; i < 20; i++) {\n let first = true;\n const result = await streamChat(client, model, messages, tools, (delta) => {\n if (first) { process.stdout.write(chalk.green(\"\\n \") + \"\"); first = false; }\n process.stdout.write(delta);\n });\n\n if (result.content) process.stdout.write(\"\\n\\n\");\n\n if (result.toolCalls.length === 0) {\n if (result.content) messages.push({ role: \"assistant\", content: result.content });\n showUsage(result.usage);\n return;\n }\n\n messages.push({\n role: \"assistant\",\n content: result.content || null,\n tool_calls: result.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n });\n\n for (const tc of result.toolCalls) {\n let args: Record<string, unknown>;\n try { args = JSON.parse(tc.arguments); } catch { args = {}; }\n\n const shortArgs = Object.entries(args).map(([k, v]) => {\n const s = String(v);\n return s.length > 40 ? s.slice(0, 40) + \"…\" : s;\n }).join(\", \");\n console.log(chalk.dim(` ┌ ${tc.name}(${shortArgs})`));\n\n let toolResult: string;\n if (isXgenTool(tc.name)) {\n toolResult = await xgenExecute(tc.name, args);\n } else if (mcpManager?.isMcpTool(tc.name)) {\n toolResult = await mcpManager.callTool(tc.name, args);\n } else {\n toolResult = await executeTool(tc.name, args);\n }\n\n const truncated = toolResult.length > 8000 ? toolResult.slice(0, 8000) + \"\\n…(truncated)\" : toolResult;\n // 도구 결과 미리보기 (1줄)\n const preview = toolResult.split(\"\\n\")[0].slice(0, 60);\n console.log(chalk.dim(` └ ${preview}${toolResult.length > 60 ? \"…\" : \"\"}`));\n messages.push({ role: \"tool\", tool_call_id: tc.id, content: truncated });\n }\n }\n console.log(chalk.yellow(\"\\n 최대 반복 횟수 도달.\\n\"));\n}\n\nasync function connectServer(): Promise<void> {\n const { setServer, setAuth } = await import(\"../config/store.js\");\n const { addEnvironment } = await import(\"../config/store.js\");\n\n console.log(chalk.bold(\"\\n XGEN 서버 연결\\n\"));\n\n const presets = [\n { id: \"hq\", name: \"본사\", url: \"https://xgen.x2bee.com\", email: \"admin@plateer.com\" },\n { id: \"jeju\", name: \"제주\", url: \"https://jeju-xgen.x2bee.com\", email: \"admin@plateer.com\" },\n { id: \"lotte\", name: \"롯데몰\", url: \"https://lotteimall-xgen.x2bee.com\" },\n ];\n presets.forEach((p, i) => console.log(` ${chalk.cyan(`${i + 1}.`)} ${p.name} ${chalk.gray(p.url)}`));\n console.log(` ${chalk.cyan(\"4.\")} 직접 입력`);\n console.log();\n\n const choice = await ask(chalk.cyan(\" ❯ \"));\n let url: string;\n let email: string | undefined;\n const ci = parseInt(choice) - 1;\n if (ci >= 0 && ci < presets.length) {\n url = presets[ci].url;\n email = presets[ci].email;\n addEnvironment({ ...presets[ci], description: presets[ci].name });\n } else {\n url = await ask(chalk.white(\" URL: \"));\n if (!url) return;\n }\n\n setServer(url);\n console.log(chalk.green(` ✓ ${url}\\n`));\n\n const inputEmail = email || await ask(chalk.white(\" 이메일: \"));\n const pw = await ask(chalk.white(\" 비밀번호: \"));\n if (!inputEmail || !pw) return;\n\n try {\n const { apiLogin } = await import(\"../api/auth.js\");\n const result = await apiLogin(inputEmail, pw);\n if (result.success && result.access_token) {\n setAuth({ accessToken: result.access_token, refreshToken: result.refresh_token ?? \"\", userId: result.user_id ?? \"\", username: result.username ?? \"\", isAdmin: false, expiresAt: null });\n console.log(chalk.green(` ✓ ${result.username} 로그인됨\\n`));\n } else {\n console.log(chalk.red(` ✗ ${result.message}\\n`));\n }\n } catch (err) {\n console.log(chalk.red(` ✗ ${(err as Error).message}\\n`));\n }\n}\n\nasync function switchEnv(): Promise<void> {\n const { getEnvironments: getEnvs, switchEnvironment } = await import(\"../config/store.js\");\n const envs = getEnvs();\n if (!envs.length) {\n console.log(chalk.gray(\"\\n 환경 없음. /connect로 먼저 연결하세요.\\n\"));\n return;\n }\n const active = getActiveEnvironment();\n console.log();\n envs.forEach((e, i) => {\n const mark = e.id === active?.id ? chalk.green(\"● \") : \" \";\n console.log(` ${mark}${chalk.cyan(`${i + 1}.`)} ${e.name} ${chalk.gray(e.url)}`);\n });\n console.log();\n const ci = parseInt(await ask(chalk.cyan(\" ❯ \"))) - 1;\n if (ci >= 0 && ci < envs.length) {\n switchEnvironment(envs[ci].id);\n console.log(chalk.green(` ✓ ${envs[ci].name}\\n`));\n }\n}\n\nexport function registerAgentCommand(program: Command): void {\n program\n .command(\"agent\")\n .description(\"OPEN XGEN AI 에이전트\")\n .action(async () => { await agentRepl(); });\n}\n","/**\n * LLM 클라이언트 — OpenAI SDK 기반 멀티 프로바이더\n */\nimport OpenAI from \"openai\";\nimport type { ChatCompletionMessageParam, ChatCompletionTool } from \"openai/resources/chat/completions\";\nimport type { ProviderConfig } from \"../config/store.js\";\n\nexport type { ChatCompletionMessageParam as Message, ChatCompletionTool as ToolDef };\n\nexport function createLLMClient(provider: ProviderConfig): OpenAI {\n const opts: ConstructorParameters<typeof OpenAI>[0] = {\n apiKey: provider.apiKey || \"ollama\",\n };\n\n if (provider.baseUrl) {\n opts.baseURL = provider.baseUrl;\n }\n\n return new OpenAI(opts);\n}\n\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface StreamResult {\n content: string;\n toolCalls: {\n id: string;\n name: string;\n arguments: string;\n }[];\n usage: TokenUsage | null;\n}\n\n/**\n * 스트리밍 채팅 — content를 실시간 출력하고 tool_calls를 수집\n */\nexport async function streamChat(\n client: OpenAI,\n model: string,\n messages: ChatCompletionMessageParam[],\n tools?: ChatCompletionTool[],\n onDelta?: (text: string) => void\n): Promise<StreamResult> {\n const params: OpenAI.ChatCompletionCreateParamsStreaming = {\n model,\n messages,\n stream: true,\n stream_options: { include_usage: true },\n };\n\n if (tools && tools.length > 0) {\n params.tools = tools;\n }\n\n const stream = await client.chat.completions.create(params);\n\n let content = \"\";\n let usage: TokenUsage | null = null;\n const toolCallMap = new Map<number, { id: string; name: string; arguments: string }>();\n\n for await (const chunk of stream) {\n // usage는 마지막 청크에 포함\n if (chunk.usage) {\n usage = {\n promptTokens: chunk.usage.prompt_tokens ?? 0,\n completionTokens: chunk.usage.completion_tokens ?? 0,\n totalTokens: chunk.usage.total_tokens ?? 0,\n };\n }\n\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n if (delta.content) {\n content += delta.content;\n onDelta?.(delta.content);\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n if (!toolCallMap.has(idx)) {\n toolCallMap.set(idx, { id: tc.id ?? \"\", name: tc.function?.name ?? \"\", arguments: \"\" });\n }\n const entry = toolCallMap.get(idx)!;\n if (tc.id) entry.id = tc.id;\n if (tc.function?.name) entry.name = tc.function.name;\n if (tc.function?.arguments) entry.arguments += tc.function.arguments;\n }\n }\n }\n\n return {\n content,\n toolCalls: [...toolCallMap.values()],\n usage,\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"file_read\",\n description: \"파일 내용을 읽습니다. 줄 번호가 포함됩니다.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"파일 경로\" },\n start_line: { type: \"number\", description: \"시작 줄 번호 (선택)\" },\n end_line: { type: \"number\", description: \"끝 줄 번호 (선택)\" },\n },\n required: [\"path\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = args.path as string;\n const startLine = (args.start_line as number) || 1;\n const endLine = args.end_line as number | undefined;\n\n try {\n const content = readFileSync(path, \"utf-8\");\n const lines = content.split(\"\\n\");\n const sliced = lines.slice(startLine - 1, endLine ?? lines.length);\n return sliced.map((line, i) => `${startLine + i}\\t${line}`).join(\"\\n\");\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","import { writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"file_write\",\n description: \"파일을 생성하거나 덮어씁니다.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"파일 경로\" },\n content: { type: \"string\", description: \"파일 내용\" },\n },\n required: [\"path\", \"content\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = args.path as string;\n const content = args.content as string;\n\n try {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, content, \"utf-8\");\n return `파일 작성 완료: ${path}`;\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"file_edit\",\n description: \"파일에서 특정 텍스트를 찾아 교체합니다.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"파일 경로\" },\n old_text: { type: \"string\", description: \"교체할 기존 텍스트\" },\n new_text: { type: \"string\", description: \"새 텍스트\" },\n },\n required: [\"path\", \"old_text\", \"new_text\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = args.path as string;\n const oldText = args.old_text as string;\n const newText = args.new_text as string;\n\n try {\n const content = readFileSync(path, \"utf-8\");\n if (!content.includes(oldText)) {\n return `Error: 텍스트를 찾을 수 없습니다`;\n }\n const updated = content.replace(oldText, newText);\n writeFileSync(path, updated, \"utf-8\");\n return `파일 수정 완료: ${path}`;\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","import { execSync } from \"node:child_process\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"bash\",\n description: \"셸 명령어를 실행합니다. stdout + stderr를 반환합니다.\",\n parameters: {\n type: \"object\",\n properties: {\n command: { type: \"string\", description: \"실행할 명령어\" },\n },\n required: [\"command\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const command = args.command as string;\n\n try {\n const output = execSync(command, {\n encoding: \"utf-8\",\n timeout: 30_000,\n maxBuffer: 1024 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return output || \"(no output)\";\n } catch (err) {\n const e = err as { stdout?: string; stderr?: string; message: string };\n return (e.stdout || \"\") + (e.stderr || \"\") || `Error: ${e.message}`;\n }\n}\n","import { execSync } from \"node:child_process\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"grep\",\n description: \"파일에서 패턴을 검색합니다 (재귀, 줄 번호 포함).\",\n parameters: {\n type: \"object\",\n properties: {\n pattern: { type: \"string\", description: \"검색 패턴 (정규식)\" },\n path: { type: \"string\", description: \"검색 디렉토리 또는 파일 (기본: .)\" },\n glob: { type: \"string\", description: \"파일 필터 (예: *.ts)\" },\n },\n required: [\"pattern\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const pattern = args.pattern as string;\n const path = (args.path as string) || \".\";\n const glob = args.glob as string | undefined;\n\n try {\n let cmd = `grep -rn --color=never \"${pattern.replace(/\"/g, '\\\\\"')}\" \"${path}\"`;\n if (glob) cmd += ` --include=\"${glob}\"`;\n cmd += \" | head -50\";\n\n const output = execSync(cmd, {\n encoding: \"utf-8\",\n timeout: 10_000,\n maxBuffer: 512 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return output || \"일치하는 결과 없음\";\n } catch {\n return \"일치하는 결과 없음\";\n }\n}\n","import { execSync } from \"node:child_process\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"list_files\",\n description: \"디렉토리의 파일/폴더 목록을 반환합니다. glob 패턴 지원.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"디렉토리 경로 (기본: .)\" },\n pattern: { type: \"string\", description: \"glob 패턴 (예: **/*.ts)\" },\n },\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = (args.path as string) || \".\";\n const pattern = args.pattern as string | undefined;\n\n try {\n let cmd: string;\n if (pattern) {\n cmd = `find \"${path}\" -name \"${pattern}\" -type f | head -100`;\n } else {\n cmd = `ls -la \"${path}\"`;\n }\n const output = execSync(cmd, {\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return output || \"(empty)\";\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","/**\n * Sandbox — 격리된 환경에서 코드 실행\n * npm (Node.js) / python 지원\n */\nimport { execSync } from \"node:child_process\";\nimport { mkdirSync, writeFileSync, existsSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nconst SANDBOX_DIR = join(tmpdir(), \"xgen-sandbox\");\n\nfunction ensureSandbox(): string {\n if (!existsSync(SANDBOX_DIR)) {\n mkdirSync(SANDBOX_DIR, { recursive: true });\n }\n return SANDBOX_DIR;\n}\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"sandbox_run\",\n description:\n \"격리된 샌드박스에서 코드를 실행합니다. Node.js 또는 Python 코드를 안전하게 실행할 수 있습니다. npm 패키지 설치도 가능합니다.\",\n parameters: {\n type: \"object\",\n properties: {\n language: {\n type: \"string\",\n enum: [\"javascript\", \"typescript\", \"python\"],\n description: \"실행할 언어\",\n },\n code: { type: \"string\", description: \"실행할 코드\" },\n packages: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"설치할 패키지 (npm 또는 pip)\",\n },\n },\n required: [\"language\", \"code\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const language = args.language as string;\n const code = args.code as string;\n const packages = (args.packages as string[]) ?? [];\n\n const dir = ensureSandbox();\n const runId = `run_${Date.now()}`;\n const runDir = join(dir, runId);\n mkdirSync(runDir, { recursive: true });\n\n try {\n // 패키지 설치\n if (packages.length > 0) {\n if (language === \"python\") {\n const pkgList = packages.join(\" \");\n execSync(`pip install ${pkgList}`, {\n cwd: runDir,\n encoding: \"utf-8\",\n timeout: 60_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } else {\n // Node.js — npm init + install\n execSync(\"npm init -y\", { cwd: runDir, encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n const pkgList = packages.join(\" \");\n execSync(`npm install ${pkgList}`, {\n cwd: runDir,\n encoding: \"utf-8\",\n timeout: 60_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n }\n }\n\n // 코드 실행\n let cmd: string;\n let filename: string;\n\n if (language === \"python\") {\n filename = \"script.py\";\n writeFileSync(join(runDir, filename), code, \"utf-8\");\n cmd = `python3 ${filename}`;\n } else if (language === \"typescript\") {\n filename = \"script.ts\";\n writeFileSync(join(runDir, filename), code, \"utf-8\");\n cmd = `npx tsx ${filename}`;\n } else {\n filename = \"script.mjs\";\n writeFileSync(join(runDir, filename), code, \"utf-8\");\n cmd = `node ${filename}`;\n }\n\n const output = execSync(cmd, {\n cwd: runDir,\n encoding: \"utf-8\",\n timeout: 30_000,\n maxBuffer: 1024 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n return output || \"(no output)\";\n } catch (err) {\n const e = err as { stdout?: string; stderr?: string; message: string };\n return (e.stdout || \"\") + (e.stderr || \"\") || `Error: ${e.message}`;\n } finally {\n // 정리\n try {\n rmSync(runDir, { recursive: true, force: true });\n } catch {\n // ignore cleanup errors\n }\n }\n}\n","/**\n * Agent 도구 레지스트리\n */\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\nimport * as fileRead from \"./file-read.js\";\nimport * as fileWrite from \"./file-write.js\";\nimport * as fileEdit from \"./file-edit.js\";\nimport * as bash from \"./bash.js\";\nimport * as grep from \"./grep.js\";\nimport * as listFiles from \"./list-files.js\";\nimport * as sandbox from \"./sandbox.js\";\n\ninterface Tool {\n definition: ChatCompletionTool;\n execute: (args: Record<string, unknown>) => Promise<string>;\n}\n\nconst tools: Tool[] = [fileRead, fileWrite, fileEdit, bash, grep, listFiles, sandbox];\n\nconst toolMap = new Map<string, Tool>();\nfor (const t of tools) {\n toolMap.set(t.definition.function.name, t);\n}\n\nexport function getAllToolDefs(): ChatCompletionTool[] {\n return tools.map((t) => t.definition);\n}\n\nexport async function executeTool(name: string, args: Record<string, unknown>): Promise<string> {\n const tool = toolMap.get(name);\n if (!tool) return `Unknown tool: ${name}`;\n return tool.execute(args);\n}\n\nexport function getToolNames(): string[] {\n return tools.map((t) => t.definition.function.name);\n}\n","/**\n * XGEN 플랫폼 API 도구 — AI 에이전트가 XGEN 전체 기능을 사용\n */\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\nimport { getAuth, getServer } from \"../../config/store.js\";\n\n// ── 도구 정의 ──\n\nexport const definitions: ChatCompletionTool[] = [\n // === 워크플로우 ===\n { type: \"function\", function: { name: \"xgen_workflow_list\", description: \"XGEN 워크플로우 전체 목록. 배포 상태 포함.\", parameters: { type: \"object\", properties: {} } } },\n { type: \"function\", function: { name: \"xgen_workflow_run\", description: \"워크플로우 실행. 배포/비배포 모두 가능.\", parameters: { type: \"object\", properties: { workflow_id: { type: \"string\" }, workflow_name: { type: \"string\" }, input_data: { type: \"string\", description: \"입력 메시지\" } }, required: [\"workflow_id\", \"workflow_name\", \"input_data\"] } } },\n { type: \"function\", function: { name: \"xgen_workflow_info\", description: \"워크플로우 상세 (노드, 엣지 구조).\", parameters: { type: \"object\", properties: { workflow_id: { type: \"string\" } }, required: [\"workflow_id\"] } } },\n { type: \"function\", function: { name: \"xgen_execution_history\", description: \"워크플로우 실행 이력.\", parameters: { type: \"object\", properties: { workflow_id: { type: \"string\" }, workflow_name: { type: \"string\" }, limit: { type: \"number\" } }, required: [\"workflow_id\", \"workflow_name\"] } } },\n { type: \"function\", function: { name: \"xgen_workflow_performance\", description: \"워크플로우 성능 통계 (노드별 처리 시간, 리소스 사용).\", parameters: { type: \"object\", properties: { workflow_id: { type: \"string\" }, workflow_name: { type: \"string\" } }, required: [\"workflow_id\", \"workflow_name\"] } } },\n { type: \"function\", function: { name: \"xgen_workflow_store\", description: \"공개 워크플로우 스토어 목록.\", parameters: { type: \"object\", properties: {} } } },\n { type: \"function\", function: { name: \"xgen_workflow_generate\", description: \"자연어 요구사항으로 워크플로우 자동 생성.\", parameters: { type: \"object\", properties: { requirements: { type: \"string\", description: \"생성할 워크플로우 요구사항\" } }, required: [\"requirements\"] } } },\n\n // === 문서/컬렉션 ===\n { type: \"function\", function: { name: \"xgen_collection_list\", description: \"문서 컬렉션(지식베이스) 목록.\", parameters: { type: \"object\", properties: {} } } },\n { type: \"function\", function: { name: \"xgen_document_list\", description: \"컬렉션의 문서 목록.\", parameters: { type: \"object\", properties: { collection_id: { type: \"string\" } } } } },\n { type: \"function\", function: { name: \"xgen_document_upload\", description: \"문서 업로드.\", parameters: { type: \"object\", properties: { file_path: { type: \"string\" }, collection_id: { type: \"string\" } }, required: [\"file_path\"] } } },\n\n // === 노드 ===\n { type: \"function\", function: { name: \"xgen_node_list\", description: \"XGEN 노드 전체 목록. 워크플로우 빌딩 블록.\", parameters: { type: \"object\", properties: {} } } },\n { type: \"function\", function: { name: \"xgen_node_search\", description: \"노드 검색 (이름, 설명 기반).\", parameters: { type: \"object\", properties: { query: { type: \"string\" } }, required: [\"query\"] } } },\n { type: \"function\", function: { name: \"xgen_node_categories\", description: \"노드 카테고리 목록.\", parameters: { type: \"object\", properties: {} } } },\n\n // === 프롬프트 ===\n { type: \"function\", function: { name: \"xgen_prompt_list\", description: \"프롬프트 라이브러리 목록.\", parameters: { type: \"object\", properties: { language: { type: \"string\", description: \"en 또는 ko\" } } } } },\n\n // === 도구/스킬 ===\n { type: \"function\", function: { name: \"xgen_tool_store\", description: \"공개 도구 스토어 목록.\", parameters: { type: \"object\", properties: {} } } },\n { type: \"function\", function: { name: \"xgen_user_tools\", description: \"내 도구 목록.\", parameters: { type: \"object\", properties: {} } } },\n\n // === 스케줄 ===\n { type: \"function\", function: { name: \"xgen_schedule_list\", description: \"워크플로우 스케줄 목록 (cron 작업).\", parameters: { type: \"object\", properties: {} } } },\n\n // === 트레이스/인터랙션 ===\n { type: \"function\", function: { name: \"xgen_trace_list\", description: \"워크플로우 실행 트레이스 목록.\", parameters: { type: \"object\", properties: { workflow_id: { type: \"string\" } } } } },\n { type: \"function\", function: { name: \"xgen_interaction_list\", description: \"워크플로우 인터랙션(실행 메타) 목록.\", parameters: { type: \"object\", properties: { workflow_id: { type: \"string\" }, limit: { type: \"number\" } } } } },\n\n // === MCP ===\n { type: \"function\", function: { name: \"xgen_mcp_sessions\", description: \"XGEN MCP 서버 세션 목록.\", parameters: { type: \"object\", properties: {} } } },\n\n // === GraphRAG ===\n { type: \"function\", function: { name: \"xgen_graph_rag_query\", description: \"GraphRAG 온톨로지 질의.\", parameters: { type: \"object\", properties: { query: { type: \"string\" }, graph_id: { type: \"string\" } }, required: [\"query\"] } } },\n { type: \"function\", function: { name: \"xgen_graph_stats\", description: \"온톨로지 그래프 통계.\", parameters: { type: \"object\", properties: { graph_id: { type: \"string\" } }, required: [\"graph_id\"] } } },\n\n // === 서버 ===\n { type: \"function\", function: { name: \"xgen_server_status\", description: \"XGEN 서버 연결 상태.\", parameters: { type: \"object\", properties: {} } } },\n];\n\n// ── 실행 ──\n\nexport async function execute(name: string, args: Record<string, unknown>): Promise<string> {\n const server = getServer();\n const auth = getAuth();\n if (!server || !auth) return \"XGEN 서버에 연결되어 있지 않습니다. /connect 명령으로 연결하세요.\";\n\n try {\n const fn = handlers[name];\n if (!fn) return `Unknown XGEN tool: ${name}`;\n return await fn(args);\n } catch (err) {\n return `XGEN API 오류: ${(err as Error).message}`;\n }\n}\n\nexport function isXgenTool(name: string): boolean {\n return name.startsWith(\"xgen_\");\n}\n\n// ── 핸들러 맵 ──\n\nconst handlers: Record<string, (args: Record<string, unknown>) => Promise<string>> = {\n xgen_workflow_list: async () => {\n const { getWorkflowListDetail } = await import(\"../../api/workflow.js\");\n const wfs = await getWorkflowListDetail();\n if (!wfs.length) return \"워크플로우 없음.\";\n return `총 ${wfs.length}개:\\n` + wfs.map((w, i) => {\n const d = (w as Record<string, unknown>).is_deployed ? \"●\" : \"○\";\n return `${d} ${i + 1}. ${w.workflow_name} | ${w.workflow_id ?? w.id}`;\n }).join(\"\\n\");\n },\n\n xgen_workflow_run: async (args) => {\n const { executeWorkflow } = await import(\"../../api/workflow.js\");\n const { randomUUID } = await import(\"node:crypto\");\n const auth = getAuth();\n const r = await executeWorkflow({\n workflow_id: args.workflow_id as string,\n workflow_name: args.workflow_name as string,\n input_data: args.input_data as string,\n interaction_id: `cli_${randomUUID().slice(0, 8)}`,\n user_id: auth?.userId ? parseInt(auth.userId) : 1,\n }) as Record<string, unknown>;\n return r.content ? String(r.content) : r.message ? String(r.message) : JSON.stringify(r, null, 2).slice(0, 2000);\n },\n\n xgen_workflow_info: async (args) => {\n const { getWorkflowDetail } = await import(\"../../api/workflow.js\");\n const d = await getWorkflowDetail(args.workflow_id as string);\n const nodes = (d.nodes as unknown[])?.length ?? 0;\n const edges = (d.edges as unknown[])?.length ?? 0;\n return `${d.workflow_name}\\nID: ${d.id}\\n노드: ${nodes}개 · 엣지: ${edges}개`;\n },\n\n xgen_execution_history: async (args) => {\n const { getIOLogs } = await import(\"../../api/workflow.js\");\n if (!args.workflow_id || !args.workflow_name) return \"workflow_id, workflow_name 필수.\";\n const logs = await getIOLogs(args.workflow_id as string, args.workflow_name as string, (args.limit as number) || 10);\n if (!logs.length) return \"실행 이력 없음.\";\n return logs.map((l, i) => `${i + 1}. [${l.created_at ?? \"\"}] 입력: ${(l.input_data ?? \"\").slice(0, 60)} → 출력: ${(l.output_data ?? \"\").slice(0, 60)}`).join(\"\\n\");\n },\n\n xgen_workflow_performance: async (args) => {\n const { getWorkflowPerformance } = await import(\"../../api/xgen-extra.js\");\n const p = await getWorkflowPerformance(args.workflow_id as string, args.workflow_name as string);\n return JSON.stringify(p, null, 2).slice(0, 2000);\n },\n\n xgen_workflow_store: async () => {\n const { listWorkflowStore } = await import(\"../../api/xgen-extra.js\");\n const wfs = await listWorkflowStore();\n if (!wfs.length) return \"공개 워크플로우 없음.\";\n return wfs.map((w: any, i: number) => `${i + 1}. ${w.workflow_name ?? w.name ?? \"이름없음\"}`).join(\"\\n\");\n },\n\n xgen_workflow_generate: async (args) => {\n const { generateWorkflow } = await import(\"../../api/xgen-extra.js\");\n const r = await generateWorkflow(args.requirements as string);\n return JSON.stringify(r, null, 2).slice(0, 3000);\n },\n\n xgen_collection_list: async () => {\n const { listCollections } = await import(\"../../api/document.js\");\n const cols = await listCollections();\n if (!cols.length) return \"컬렉션 없음.\";\n return `총 ${cols.length}개:\\n` + cols.map((c, i) =>\n `${i + 1}. ${c.collection_make_name} | ${c.total_documents}문서 ${c.total_chunks}청크${c.is_shared ? ` [공유:${c.share_group}]` : \"\"}`\n ).join(\"\\n\");\n },\n\n xgen_document_list: async (args) => {\n const { listDocuments } = await import(\"../../api/document.js\");\n const docs = await listDocuments(args.collection_id as string | undefined);\n if (!docs.length) return \"문서 없음.\";\n return docs.map((d, i) => `${i + 1}. ${d.name || d.file_name || \"이름없음\"} ${d.file_type ?? \"\"} ${d.status ?? \"\"}`).join(\"\\n\");\n },\n\n xgen_document_upload: async (args) => {\n const { uploadDocument } = await import(\"../../api/document.js\");\n const { existsSync } = await import(\"node:fs\");\n if (!args.file_path) return \"파일 경로 필요.\";\n if (!existsSync(args.file_path as string)) return `파일 없음: ${args.file_path}`;\n const r = await uploadDocument(args.file_path as string, args.collection_id as string | undefined);\n return `업로드 완료: ${JSON.stringify(r)}`;\n },\n\n xgen_node_list: async () => {\n const { listNodes } = await import(\"../../api/xgen-extra.js\");\n const nodes = await listNodes();\n if (!nodes.length) return \"노드 없음.\";\n return `총 ${nodes.length}개:\\n` + (nodes as any[]).slice(0, 50).map((n, i) =>\n `${i + 1}. ${n.nodeName ?? n.name ?? n.node_id ?? \"?\"} ${n.description ? \"— \" + String(n.description).slice(0, 40) : \"\"}`\n ).join(\"\\n\") + (nodes.length > 50 ? `\\n...(+${nodes.length - 50}개)` : \"\");\n },\n\n xgen_node_search: async (args) => {\n const { searchNodes } = await import(\"../../api/xgen-extra.js\");\n const nodes = await searchNodes(args.query as string);\n if (!nodes.length) return \"검색 결과 없음.\";\n return (nodes as any[]).map((n, i) =>\n `${i + 1}. ${n.nodeName ?? n.name ?? \"?\"} — ${(n.description ?? \"\").slice(0, 60)}`\n ).join(\"\\n\");\n },\n\n xgen_node_categories: async () => {\n const { getNodeCategories } = await import(\"../../api/xgen-extra.js\");\n const cats = await getNodeCategories();\n return (cats as any[]).map((c, i) => `${i + 1}. ${c.name ?? c.category ?? c}`).join(\"\\n\") || \"카테고리 없음.\";\n },\n\n xgen_prompt_list: async (args) => {\n const { listPrompts } = await import(\"../../api/xgen-extra.js\");\n const prompts = await listPrompts({ language: args.language as string | undefined });\n if (!(prompts as any[]).length) return \"프롬프트 없음.\";\n return (prompts as any[]).slice(0, 30).map((p, i) =>\n `${i + 1}. ${p.name ?? p.title ?? \"?\"} [${p.prompt_type ?? \"\"}] ${(p.content ?? \"\").slice(0, 40)}...`\n ).join(\"\\n\");\n },\n\n xgen_tool_store: async () => {\n const { listToolStore } = await import(\"../../api/xgen-extra.js\");\n const tools = await listToolStore();\n if (!(tools as any[]).length) return \"공개 도구 없음.\";\n return (tools as any[]).map((t, i) => `${i + 1}. ${t.name ?? t.tool_name ?? \"?\"} — ${(t.description ?? \"\").slice(0, 50)}`).join(\"\\n\");\n },\n\n xgen_user_tools: async () => {\n const { listUserTools } = await import(\"../../api/xgen-extra.js\");\n const tools = await listUserTools();\n if (!(tools as any[]).length) return \"내 도구 없음.\";\n return (tools as any[]).map((t, i) => `${i + 1}. ${t.name ?? t.tool_name ?? \"?\"}`).join(\"\\n\");\n },\n\n xgen_schedule_list: async () => {\n const { listSchedules } = await import(\"../../api/xgen-extra.js\");\n const sessions = await listSchedules();\n if (!(sessions as any[]).length) return \"스케줄 없음.\";\n return (sessions as any[]).map((s, i) => `${i + 1}. ${s.name ?? s.session_id ?? \"?\"} ${s.cron_expression ?? \"\"} [${s.status ?? \"?\"}]`).join(\"\\n\");\n },\n\n xgen_trace_list: async (args) => {\n const { listTraces } = await import(\"../../api/xgen-extra.js\");\n const data = await listTraces(args.workflow_id as string | undefined) as any;\n const traces = data.traces ?? data ?? [];\n if (!traces.length) return \"트레이스 없음.\";\n return traces.slice(0, 20).map((t: any, i: number) =>\n `${i + 1}. ${t.trace_id ?? t.id ?? \"?\"} [${t.status ?? \"?\"}] ${t.created_at ?? \"\"}`\n ).join(\"\\n\");\n },\n\n xgen_interaction_list: async (args) => {\n const { listInteractions } = await import(\"../../api/xgen-extra.js\");\n const items = await listInteractions(args.workflow_id as string | undefined, (args.limit as number) || 20);\n if (!(items as any[]).length) return \"인터랙션 없음.\";\n return (items as any[]).slice(0, 20).map((it: any, i: number) =>\n `${i + 1}. ${it.interaction_id ?? \"?\"} ${it.workflow_name ?? \"\"} [${it.status ?? \"?\"}]`\n ).join(\"\\n\");\n },\n\n xgen_mcp_sessions: async () => {\n const { listMcpSessions } = await import(\"../../api/xgen-extra.js\");\n const sessions = await listMcpSessions();\n if (!(sessions as any[]).length) return \"MCP 세션 없음.\";\n return (sessions as any[]).map((s: any, i: number) =>\n `${i + 1}. ${s.session_name ?? s.session_id ?? \"?\"} [${s.server_type ?? \"?\"}] ${s.status ?? \"\"}`\n ).join(\"\\n\");\n },\n\n xgen_graph_rag_query: async (args) => {\n const { queryGraphRAG } = await import(\"../../api/ontology.js\");\n if (!args.query) return \"질의 내용 필요.\";\n const r = await queryGraphRAG(args.query as string, args.graph_id as string | undefined);\n let out = `답변: ${r.answer ?? \"없음\"}`;\n if (r.sources?.length) out += `\\n출처: ${r.sources.join(\", \")}`;\n return out;\n },\n\n xgen_graph_stats: async (args) => {\n const { getGraphStats } = await import(\"../../api/ontology.js\");\n const s = await getGraphStats(args.graph_id as string);\n return `노드: ${s.total_nodes ?? 0} · 엣지: ${s.total_edges ?? 0} · 클래스: ${s.total_classes ?? 0} · 인스턴스: ${s.total_instances ?? 0}`;\n },\n\n xgen_server_status: async () => {\n const server = getServer();\n const auth = getAuth();\n return `서버: ${server}\\n사용자: ${auth?.username} (ID: ${auth?.userId})`;\n },\n};\n","/**\n * MCP (Model Context Protocol) 클라이언트\n * .mcp.json 설정을 읽어서 stdio MCP 서버와 통신\n */\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\ninterface McpServerConfig {\n type: \"stdio\";\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\ninterface McpConfig {\n mcpServers: Record<string, McpServerConfig>;\n}\n\ninterface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: number;\n method: string;\n params?: unknown;\n}\n\ninterface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: number;\n result?: unknown;\n error?: { code: number; message: string };\n}\n\ninterface McpTool {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\nexport class McpClient {\n private process: ChildProcess | null = null;\n private requestId = 0;\n private pending = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void }>();\n private serverName: string;\n private config: McpServerConfig;\n private tools: McpTool[] = [];\n\n constructor(serverName: string, config: McpServerConfig) {\n this.serverName = serverName;\n this.config = config;\n }\n\n async start(): Promise<void> {\n this.process = spawn(this.config.command, this.config.args ?? [], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, ...this.config.env },\n });\n\n const rl = createInterface({ input: this.process.stdout! });\n rl.on(\"line\", (line) => {\n try {\n const msg = JSON.parse(line) as JsonRpcResponse;\n if (msg.id !== undefined && this.pending.has(msg.id)) {\n const p = this.pending.get(msg.id)!;\n this.pending.delete(msg.id);\n if (msg.error) {\n p.reject(new Error(msg.error.message));\n } else {\n p.resolve(msg.result);\n }\n }\n } catch {\n // ignore non-JSON lines\n }\n });\n\n this.process.on(\"error\", (err) => {\n console.error(`MCP [${this.serverName}] 프로세스 오류:`, err.message);\n });\n\n // Initialize\n await this.send(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: \"open-xgen\", version: \"0.3.0\" },\n });\n\n await this.send(\"notifications/initialized\", {});\n }\n\n private send(method: string, params?: unknown): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const id = ++this.requestId;\n const request: JsonRpcRequest = { jsonrpc: \"2.0\", id, method, params };\n\n this.pending.set(id, { resolve, reject });\n\n const timeout = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`MCP 요청 타임아웃: ${method}`));\n }, 15_000);\n\n this.pending.set(id, {\n resolve: (v) => {\n clearTimeout(timeout);\n resolve(v);\n },\n reject: (e) => {\n clearTimeout(timeout);\n reject(e);\n },\n });\n\n this.process?.stdin?.write(JSON.stringify(request) + \"\\n\");\n });\n }\n\n async listTools(): Promise<McpTool[]> {\n const result = (await this.send(\"tools/list\", {})) as { tools: McpTool[] };\n this.tools = result.tools ?? [];\n return this.tools;\n }\n\n async callTool(name: string, args: Record<string, unknown>): Promise<string> {\n const result = (await this.send(\"tools/call\", { name, arguments: args })) as {\n content?: { type: string; text?: string }[];\n };\n return result.content?.map((c) => c.text ?? \"\").join(\"\\n\") ?? \"\";\n }\n\n getOpenAITools(): ChatCompletionTool[] {\n return this.tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: `mcp_${this.serverName}_${t.name}`,\n description: `[MCP:${this.serverName}] ${t.description ?? t.name}`,\n parameters: (t.inputSchema as Record<string, unknown>) ?? { type: \"object\", properties: {} },\n },\n }));\n }\n\n stop(): void {\n this.process?.kill();\n this.process = null;\n }\n}\n\n/**\n * .mcp.json에서 MCP 서버 설정 로드\n */\nexport function loadMcpConfig(dir?: string): McpConfig | null {\n const searchPaths = [\n dir ? join(dir, \".mcp.json\") : null,\n join(process.cwd(), \".mcp.json\"),\n join(process.env.HOME ?? \"\", \".mcp.json\"),\n ].filter(Boolean) as string[];\n\n for (const p of searchPaths) {\n if (existsSync(p)) {\n try {\n return JSON.parse(readFileSync(p, \"utf-8\")) as McpConfig;\n } catch {\n continue;\n }\n }\n }\n return null;\n}\n\n/**\n * 모든 MCP 서버 시작 + 도구 수집\n */\nexport class McpManager {\n private clients = new Map<string, McpClient>();\n\n async startAll(config: McpConfig): Promise<void> {\n for (const [name, serverConfig] of Object.entries(config.mcpServers)) {\n if (serverConfig.type !== \"stdio\") continue;\n try {\n const client = new McpClient(name, serverConfig);\n await client.start();\n await client.listTools();\n this.clients.set(name, client);\n } catch (err) {\n console.error(`MCP [${name}] 시작 실패:`, (err as Error).message);\n }\n }\n }\n\n getAllTools(): ChatCompletionTool[] {\n const tools: ChatCompletionTool[] = [];\n for (const client of this.clients.values()) {\n tools.push(...client.getOpenAITools());\n }\n return tools;\n }\n\n async callTool(fullName: string, args: Record<string, unknown>): Promise<string> {\n // fullName format: mcp_{serverName}_{toolName}\n const parts = fullName.split(\"_\");\n if (parts.length < 3 || parts[0] !== \"mcp\") return `Unknown MCP tool: ${fullName}`;\n\n const serverName = parts[1];\n const toolName = parts.slice(2).join(\"_\");\n const client = this.clients.get(serverName);\n if (!client) return `MCP 서버를 찾을 수 없습니다: ${serverName}`;\n\n return client.callTool(toolName, args);\n }\n\n isMcpTool(name: string): boolean {\n return name.startsWith(\"mcp_\");\n }\n\n stopAll(): void {\n for (const client of this.clients.values()) {\n client.stop();\n }\n this.clients.clear();\n }\n\n get serverCount(): number {\n return this.clients.size;\n }\n\n getServerNames(): string[] {\n return [...this.clients.keys()];\n }\n}\n","/**\n * xgen doc — 문서 관리\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../config/store.js\";\nimport { listDocuments, uploadDocument, getDocumentInfo } from \"../api/document.js\";\nimport { printTable, printError, printHeader, formatDate } from \"../utils/format.js\";\n\nexport function registerDocCommand(program: Command): void {\n const doc = program.command(\"doc\").description(\"문서 관리\");\n\n doc\n .command(\"list\")\n .alias(\"ls\")\n .description(\"문서 목록 조회\")\n .option(\"-c, --collection <id>\", \"컬렉션 ID\")\n .action(async (opts) => {\n requireAuth();\n try {\n const docs = await listDocuments(opts.collection);\n if (!docs.length) {\n console.log(chalk.yellow(\"\\n문서가 없습니다.\\n\"));\n return;\n }\n printHeader(`문서 목록 (${docs.length}개)`);\n console.log();\n printTable(\n [\"#\", \"ID\", \"파일명\", \"타입\", \"상태\", \"생성일\"],\n docs.map((d, i) => [\n String(i + 1),\n (d.document_id ?? d.id ?? \"-\").toString().slice(0, 10),\n d.file_name ?? d.name ?? \"-\",\n d.file_type ?? \"-\",\n d.status ?? \"-\",\n formatDate(d.created_at),\n ])\n );\n console.log();\n } catch (err) {\n printError(`문서 목록 조회 실패: ${(err as Error).message}`);\n }\n });\n\n doc\n .command(\"upload <file>\")\n .description(\"문서 업로드\")\n .option(\"-c, --collection <id>\", \"컬렉션 ID\")\n .option(\"-n, --name <name>\", \"파일명\")\n .action(async (file: string, opts) => {\n requireAuth();\n try {\n console.log(chalk.gray(`업로드 중: ${file}`));\n const result = await uploadDocument(file, opts.collection, opts.name);\n console.log(chalk.green(\"✓ 업로드 완료\"));\n console.log(chalk.gray(JSON.stringify(result, null, 2)));\n } catch (err) {\n printError(`업로드 실패: ${(err as Error).message}`);\n }\n });\n\n doc\n .command(\"info <id>\")\n .description(\"문서 상세 정보\")\n .action(async (id: string) => {\n requireAuth();\n try {\n const d = await getDocumentInfo(id);\n printHeader(\"문서 정보\");\n console.log(chalk.gray(JSON.stringify(d, null, 2)));\n } catch (err) {\n printError(`조회 실패: ${(err as Error).message}`);\n }\n });\n}\n","/**\n * xgen ontology — 온톨로지 GraphRAG 질의\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { requireAuth } from \"../config/store.js\";\nimport { queryGraphRAG, queryGraphRAGMultiTurn, getGraphStats } from \"../api/ontology.js\";\nimport { printError, printHeader } from \"../utils/format.js\";\nimport { randomUUID } from \"node:crypto\";\n\nexport function registerOntologyCommand(program: Command): void {\n const ont = program.command(\"ontology\").alias(\"ont\").description(\"온톨로지 GraphRAG 질의\");\n\n ont\n .command(\"query <question>\")\n .alias(\"q\")\n .description(\"GraphRAG 원샷 질의\")\n .option(\"-g, --graph <id>\", \"그래프 ID\")\n .option(\"--no-scs\", \"SCS 컨텍스트 비활성화\")\n .action(async (question: string, opts) => {\n requireAuth();\n try {\n console.log(chalk.gray(\"\\n질의 중...\\n\"));\n const result = await queryGraphRAG(question, opts.graph, { scs: opts.scs });\n\n if (result.answer) {\n console.log(chalk.bold(\"답변:\"));\n console.log(result.answer);\n }\n if (result.sources?.length) {\n console.log(chalk.bold(\"\\n출처:\"));\n result.sources.forEach((s) => console.log(chalk.gray(` - ${s}`)));\n }\n if (result.triples_used?.length) {\n console.log(chalk.bold(\"\\n사용된 트리플:\"));\n result.triples_used.forEach((t) => console.log(chalk.dim(` ${t}`)));\n }\n console.log();\n } catch (err) {\n printError(`질의 실패: ${(err as Error).message}`);\n }\n });\n\n ont\n .command(\"chat\")\n .description(\"멀티턴 GraphRAG 대화\")\n .option(\"-g, --graph <id>\", \"그래프 ID\")\n .action(async (opts) => {\n requireAuth();\n const sessionId = randomUUID();\n\n printHeader(\"Ontology Chat\");\n console.log(chalk.gray(\"멀티턴 GraphRAG 대화. exit로 종료.\\n\"));\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const ask = (): Promise<string> =>\n new Promise((resolve) => rl.question(chalk.green(\"❯ \"), (a) => resolve(a.trim())));\n\n while (true) {\n const input = await ask();\n if (!input) continue;\n if (input === \"exit\") {\n rl.close();\n break;\n }\n\n try {\n const result = await queryGraphRAGMultiTurn(input, sessionId, opts.graph);\n if (result.answer) console.log(`\\n${result.answer}\\n`);\n } catch (err) {\n console.log(chalk.red(`오류: ${(err as Error).message}\\n`));\n }\n }\n });\n\n ont\n .command(\"stats <graph-id>\")\n .description(\"그래프 통계\")\n .action(async (graphId: string) => {\n requireAuth();\n try {\n const stats = await getGraphStats(graphId);\n printHeader(\"그래프 통계\");\n console.log(chalk.gray(JSON.stringify(stats, null, 2)));\n console.log();\n } catch (err) {\n printError(`통계 조회 실패: ${(err as Error).message}`);\n }\n });\n}\n"],"mappings":"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","names":["server","axios","client","chalk","createInterface","chalk","client","program","client","client","client","tools","executeWorkflow","randomUUID","chalk","chalk","program","chalk","program","clearAuth","apiValidate","chalk","chalk","chalk","chalk","text","createInterface","chalk","chalk","program","chalk","createInterface","randomUUID","chalk","rl","createInterface","randomUUID","program","chalk","createInterface","existsSync","mkdirSync","readFileSync","writeFileSync","join","homedir","OpenAI","client","tools","readFileSync","definition","execute","writeFileSync","mkdirSync","definition","execute","readFileSync","writeFileSync","definition","execute","definition","execute","execSync","definition","execute","execSync","definition","execute","execSync","mkdirSync","writeFileSync","existsSync","join","execute","getWorkflowListDetail","executeWorkflow","randomUUID","getWorkflowDetail","getIOLogs","getWorkflowPerformance","listWorkflowStore","generateWorkflow","listCollections","listDocuments","uploadDocument","existsSync","listNodes","searchNodes","getNodeCategories","listPrompts","listToolStore","tools","listUserTools","listSchedules","listTraces","listInteractions","listMcpSessions","queryGraphRAG","getGraphStats","existsSync","readFileSync","join","createInterface","client","tools","prompt","join","homedir","existsSync","mkdirSync","writeFileSync","readFileSync","chalk","apiValidate","apiRefresh","setAuth","client","createInterface","startInkDashboard","tools","toolResult","execute","setServer","addEnvironment","apiLogin","switchEnvironment","program","chalk","program","chalk","createInterface","randomUUID","program","ask","chalk"]}
1
+ {"version":3,"sources":["../src/config/store.ts","../src/api/client.ts","../src/utils/format.ts","../src/api/auth.ts","../src/api/workflow.ts","../src/utils/ui.ts","../src/commands/provider.ts","../src/api/xgen-extra.ts","../src/api/document.ts","../src/api/ontology.ts","../src/dashboard/InkDashboard.tsx","../src/index.ts","../src/commands/config.ts","../src/commands/login.ts","../src/commands/workflow/list.ts","../src/commands/workflow/info.ts","../src/commands/workflow/run.ts","../src/utils/sse.ts","../src/utils/markdown.ts","../src/commands/workflow/history.ts","../src/commands/workflow/index.ts","../src/commands/chat.ts","../src/commands/agent.ts","../src/agent/llm.ts","../src/agent/tools/file-read.ts","../src/agent/tools/file-write.ts","../src/agent/tools/file-edit.ts","../src/agent/tools/bash.ts","../src/agent/tools/grep.ts","../src/agent/tools/list-files.ts","../src/agent/tools/sandbox.ts","../src/agent/tools/index.ts","../src/agent/tools/xgen-api.ts","../src/mcp/client.ts","../src/commands/doc.ts","../src/commands/ontology.ts"],"sourcesContent":["/**\n * XGEN CLI 설정 저장소\n * ~/.xgen/ 디렉토리에 설정과 인증 정보를 관리\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst XGEN_DIR = join(homedir(), \".xgen\");\nconst CONFIG_FILE = join(XGEN_DIR, \"config.json\");\nconst AUTH_FILE = join(XGEN_DIR, \"auth.json\");\nconst PROVIDERS_FILE = join(XGEN_DIR, \"providers.json\");\n\nexport interface XgenConfig {\n server: string | null;\n defaultWorkflow: string | null;\n theme: string;\n streamLogs: boolean;\n}\n\nexport interface XgenAuth {\n accessToken: string;\n refreshToken: string;\n userId: string;\n username: string;\n isAdmin: boolean;\n expiresAt: string | null;\n}\n\nconst DEFAULT_CONFIG: XgenConfig = {\n server: null,\n defaultWorkflow: null,\n theme: \"default\",\n streamLogs: false,\n};\n\nfunction ensureDir(): void {\n if (!existsSync(XGEN_DIR)) {\n mkdirSync(XGEN_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nfunction readJson<T>(filePath: string, fallback: T): T {\n try {\n if (!existsSync(filePath)) return fallback;\n const data = readFileSync(filePath, \"utf-8\");\n return JSON.parse(data) as T;\n } catch {\n return fallback;\n }\n}\n\nfunction writeJson(filePath: string, data: unknown, secure = false): void {\n ensureDir();\n writeFileSync(filePath, JSON.stringify(data, null, 2), \"utf-8\");\n if (secure) {\n chmodSync(filePath, 0o600);\n }\n}\n\n// ── Config ──\n\nexport function getConfig(): XgenConfig {\n return { ...DEFAULT_CONFIG, ...readJson(CONFIG_FILE, {}) };\n}\n\nexport function setConfig(partial: Partial<XgenConfig>): void {\n const current = getConfig();\n writeJson(CONFIG_FILE, { ...current, ...partial });\n}\n\nexport function getServer(): string | null {\n return getConfig().server;\n}\n\nexport function setServer(url: string): void {\n // URL 정규화: 끝의 / 제거\n const normalized = url.replace(/\\/+$/, \"\");\n setConfig({ server: normalized });\n}\n\n// ── Auth ──\n\nexport function getAuth(): XgenAuth | null {\n const auth = readJson<XgenAuth | null>(AUTH_FILE, null);\n if (!auth || !auth.accessToken) return null;\n return auth;\n}\n\nexport function setAuth(auth: XgenAuth): void {\n writeJson(AUTH_FILE, auth, true);\n}\n\nexport function clearAuth(): void {\n writeJson(AUTH_FILE, {}, true);\n}\n\nexport function getAccessToken(): string | null {\n return getAuth()?.accessToken ?? null;\n}\n\nexport function getRefreshToken(): string | null {\n return getAuth()?.refreshToken ?? null;\n}\n\n// ── Providers ──\n\nexport interface ProviderConfig {\n id: string;\n name: string;\n type: \"openai\" | \"gemini\" | \"ollama\" | \"anthropic\" | \"custom\";\n baseUrl?: string;\n apiKey: string;\n model: string;\n}\n\ninterface ProvidersStore {\n providers: ProviderConfig[];\n defaultId: string | null;\n}\n\nconst DEFAULT_PROVIDERS: ProvidersStore = { providers: [], defaultId: null };\n\nexport function getProvidersStore(): ProvidersStore {\n return { ...DEFAULT_PROVIDERS, ...readJson(PROVIDERS_FILE, DEFAULT_PROVIDERS) };\n}\n\nexport function getProviders(): ProviderConfig[] {\n return getProvidersStore().providers;\n}\n\nexport function addProvider(provider: ProviderConfig): void {\n const store = getProvidersStore();\n store.providers = store.providers.filter((p) => p.id !== provider.id);\n store.providers.push(provider);\n store.defaultId = provider.id; // 항상 새로 추가한 걸 기본으로\n writeJson(PROVIDERS_FILE, store, true);\n}\n\nexport function removeProvider(id: string): boolean {\n const store = getProvidersStore();\n const before = store.providers.length;\n store.providers = store.providers.filter((p) => p.id !== id);\n if (store.defaultId === id) {\n store.defaultId = store.providers[0]?.id ?? null;\n }\n writeJson(PROVIDERS_FILE, store, true);\n return store.providers.length < before;\n}\n\nexport function getDefaultProvider(): ProviderConfig | null {\n const store = getProvidersStore();\n if (!store.defaultId) return store.providers[0] ?? null;\n return store.providers.find((p) => p.id === store.defaultId) ?? null;\n}\n\nexport function setDefaultProvider(id: string): boolean {\n const store = getProvidersStore();\n const exists = store.providers.some((p) => p.id === id);\n if (!exists) return false;\n store.defaultId = id;\n writeJson(PROVIDERS_FILE, store, true);\n return true;\n}\n\n// ── Environments ──\n\nexport interface XgenEnvironment {\n id: string;\n name: string;\n url: string;\n email?: string;\n description?: string;\n}\n\nconst ENVIRONMENTS_FILE = join(XGEN_DIR, \"environments.json\");\n\ninterface EnvStore {\n environments: XgenEnvironment[];\n activeId: string | null;\n}\n\nconst DEFAULT_ENV_STORE: EnvStore = { environments: [], activeId: null };\n\nexport function getEnvStore(): EnvStore {\n return { ...DEFAULT_ENV_STORE, ...readJson(ENVIRONMENTS_FILE, DEFAULT_ENV_STORE) };\n}\n\nexport function getEnvironments(): XgenEnvironment[] {\n return getEnvStore().environments;\n}\n\nexport function addEnvironment(env: XgenEnvironment): void {\n const store = getEnvStore();\n store.environments = store.environments.filter((e) => e.id !== env.id);\n store.environments.push(env);\n if (!store.activeId) store.activeId = env.id;\n writeJson(ENVIRONMENTS_FILE, store);\n}\n\nexport function removeEnvironment(id: string): boolean {\n const store = getEnvStore();\n const before = store.environments.length;\n store.environments = store.environments.filter((e) => e.id !== id);\n if (store.activeId === id) store.activeId = store.environments[0]?.id ?? null;\n writeJson(ENVIRONMENTS_FILE, store);\n return store.environments.length < before;\n}\n\nexport function switchEnvironment(id: string): boolean {\n const store = getEnvStore();\n const env = store.environments.find((e) => e.id === id);\n if (!env) return false;\n store.activeId = id;\n writeJson(ENVIRONMENTS_FILE, store);\n // 서버 URL도 같이 변경\n setServer(env.url);\n return true;\n}\n\nexport function getActiveEnvironment(): XgenEnvironment | null {\n const store = getEnvStore();\n if (!store.activeId) return null;\n return store.environments.find((e) => e.id === store.activeId) ?? null;\n}\n\n// ── Helpers ──\n\nexport function requireServer(): string {\n const server = getServer();\n if (!server) {\n console.error(\"서버가 설정되지 않았습니다. 먼저 실행하세요:\");\n console.error(\" xgen config set-server <url>\");\n process.exit(1);\n }\n return server;\n}\n\nexport function requireAuth(): XgenAuth {\n const auth = getAuth();\n if (!auth) {\n console.error(\"로그인이 필요합니다. 먼저 실행하세요:\");\n console.error(\" xgen login\");\n process.exit(1);\n }\n return auth;\n}\n","/**\n * XGEN API 클라이언트\n * axios 인스턴스 + 토큰 자동 갱신 인터셉터\n */\nimport axios, { type AxiosInstance, type InternalAxiosRequestConfig } from \"axios\";\nimport {\n getAccessToken,\n getRefreshToken,\n getServer,\n setAuth,\n getAuth,\n clearAuth,\n} from \"../config/store.js\";\n\nlet client: AxiosInstance | null = null;\n\nexport function getClient(): AxiosInstance {\n if (client) return client;\n\n const server = getServer();\n if (!server) {\n throw new Error(\"서버가 설정되지 않았습니다. xgen config set-server <url>\");\n }\n\n client = axios.create({\n baseURL: server,\n timeout: 120_000,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // Request 인터셉터: 토큰 자동 추가\n client.interceptors.request.use((config: InternalAxiosRequestConfig) => {\n const token = getAccessToken();\n if (token && config.headers) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n });\n\n // Response 인터셉터: 401 시 토큰 갱신\n client.interceptors.response.use(\n (response) => response,\n async (error) => {\n const originalRequest = error.config;\n\n if (\n error.response?.status === 401 &&\n !originalRequest._retry &&\n getRefreshToken()\n ) {\n originalRequest._retry = true;\n\n try {\n const refreshToken = getRefreshToken()!;\n const server = getServer()!;\n const res = await axios.post(`${server}/api/auth/refresh`, {\n refresh_token: refreshToken,\n });\n\n if (res.data.success && res.data.access_token) {\n const auth = getAuth()!;\n setAuth({\n ...auth,\n accessToken: res.data.access_token,\n });\n\n originalRequest.headers.Authorization = `Bearer ${res.data.access_token}`;\n return client!(originalRequest);\n }\n } catch {\n clearAuth();\n console.error(\"\\n세션이 만료되었습니다. 다시 로그인하세요: xgen login\");\n process.exit(1);\n }\n }\n\n return Promise.reject(error);\n }\n );\n\n return client;\n}\n\n/** 클라이언트 리셋 (서버 변경 시) */\nexport function resetClient(): void {\n client = null;\n}\n","/**\n * 출력 포맷팅 유틸리티\n */\nimport chalk from \"chalk\";\n\nexport function printHeader(text: string): void {\n const line = \"─\".repeat(Math.max(text.length + 4, 40));\n console.log(chalk.cyan(line));\n console.log(chalk.cyan.bold(` ${text}`));\n console.log(chalk.cyan(line));\n}\n\nexport function printSuccess(text: string): void {\n console.log(chalk.green(`✓ ${text}`));\n}\n\nexport function printError(text: string): void {\n console.error(chalk.red(`✗ ${text}`));\n}\n\nexport function printWarning(text: string): void {\n console.log(chalk.yellow(`⚠ ${text}`));\n}\n\nexport function printInfo(text: string): void {\n console.log(chalk.blue(`ℹ ${text}`));\n}\n\nexport function printKeyValue(key: string, value: string | number | boolean | null | undefined): void {\n console.log(` ${chalk.gray(key + \":\")} ${value ?? chalk.dim(\"(없음)\")}`);\n}\n\nexport function printTable(headers: string[], rows: string[][]): void {\n // 각 컬럼의 최대 너비 계산\n const widths = headers.map((h, i) => {\n const colMax = rows.reduce((max, row) => Math.max(max, (row[i] ?? \"\").length), 0);\n return Math.max(h.length, colMax);\n });\n\n // 헤더 출력\n const headerLine = headers.map((h, i) => h.padEnd(widths[i])).join(\" \");\n console.log(chalk.bold(headerLine));\n console.log(chalk.gray(\"─\".repeat(headerLine.length)));\n\n // 행 출력\n for (const row of rows) {\n const line = row.map((cell, i) => (cell ?? \"\").padEnd(widths[i])).join(\" \");\n console.log(line);\n }\n}\n\nexport function truncate(text: string, maxLen = 50): string {\n if (text.length <= maxLen) return text;\n return text.slice(0, maxLen - 3) + \"...\";\n}\n\nexport function formatDate(dateStr?: string | null): string {\n if (!dateStr) return \"-\";\n try {\n const d = new Date(dateStr);\n return d.toLocaleDateString(\"ko-KR\") + \" \" + d.toLocaleTimeString(\"ko-KR\", { hour: \"2-digit\", minute: \"2-digit\" });\n } catch {\n return dateStr;\n }\n}\n","/**\n * 인증 API\n */\nimport axios from \"axios\";\nimport { createHash } from \"node:crypto\";\nimport { getServer } from \"../config/store.js\";\n\nexport interface LoginResult {\n success: boolean;\n message: string;\n access_token?: string;\n refresh_token?: string;\n token_type: string;\n user_id?: string;\n username?: string;\n}\n\nexport interface ValidateResult {\n valid: boolean;\n user_id?: string;\n username?: string;\n is_admin?: boolean;\n user_type?: string;\n available_user_sections?: string;\n new_access_token?: string;\n}\n\nexport async function apiLogin(\n email: string,\n password: string\n): Promise<LoginResult> {\n const server = getServer();\n if (!server) throw new Error(\"서버가 설정되지 않았습니다\");\n\n const hashedPassword = createHash(\"sha256\").update(password).digest(\"hex\");\n\n const res = await axios.post(`${server}/api/auth/login`, {\n email,\n password: hashedPassword,\n });\n\n return res.data;\n}\n\nexport async function apiValidate(\n accessToken: string\n): Promise<ValidateResult> {\n const server = getServer();\n if (!server) throw new Error(\"서버가 설정되지 않았습니다\");\n\n const res = await axios.get(`${server}/api/auth/validate`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n return res.data;\n}\n\nexport async function apiRefresh(\n refreshToken: string\n): Promise<{ success: boolean; access_token?: string }> {\n const server = getServer();\n if (!server) throw new Error(\"서버가 설정되지 않았습니다\");\n\n const res = await axios.post(`${server}/api/auth/refresh`, {\n refresh_token: refreshToken,\n });\n\n return res.data;\n}\n","/**\n * 워크플로우 API\n */\nimport { getClient } from \"./client.js\";\n\nexport interface Workflow {\n id?: string;\n workflow_id?: string;\n workflow_name: string;\n description?: string;\n created_at?: string;\n updated_at?: string;\n deploy_status?: string;\n version?: string;\n}\n\nexport interface WorkflowDetail {\n id: string;\n workflow_name: string;\n description?: string;\n nodes?: unknown[];\n edges?: unknown[];\n parameters?: Record<string, unknown>;\n}\n\nexport interface WorkflowExecuteRequest {\n workflow_id: string;\n workflow_name: string;\n input_data: string;\n interaction_id: string;\n parameters?: Record<string, unknown>;\n}\n\nexport interface IOLog {\n interaction_id: string;\n input_data: string;\n output_data: string;\n created_at: string;\n execution_time?: number;\n}\n\nexport async function listWorkflows(userId?: string): Promise<Workflow[]> {\n const client = getClient();\n const params: Record<string, string> = {};\n if (userId) params.user_id = userId;\n\n const res = await client.get(\"/api/workflow/list\", { params });\n return res.data.workflows ?? res.data;\n}\n\nexport async function getWorkflowDetail(workflowId: string): Promise<WorkflowDetail> {\n const client = getClient();\n const res = await client.get(`/api/workflow/load/${workflowId}`);\n return res.data;\n}\n\nexport async function getWorkflowListDetail(): Promise<Workflow[]> {\n const client = getClient();\n const res = await client.get(\"/api/workflow/list/detail\");\n return res.data.workflows ?? res.data;\n}\n\n/**\n * 워크플로우 스트리밍 실행\n * SSE 응답을 반환 — 호출자가 직접 파싱\n */\nexport async function executeWorkflowStream(\n request: WorkflowExecuteRequest\n): Promise<NodeJS.ReadableStream> {\n const client = getClient();\n const res = await client.post(\"/api/workflow/execute/based_id/stream\", request, {\n responseType: \"stream\",\n headers: {\n Accept: \"text/event-stream\",\n },\n });\n\n return res.data;\n}\n\n/**\n * 워크플로우 실행 (JSON 응답)\n * deploy/stream 엔드포인트는 배포 여부 무관하게 workflow_id로 실행 가능\n * response_format=json 으로 non-streaming 응답\n */\nexport async function executeWorkflow(\n request: WorkflowExecuteRequest & { deploy_key?: string; user_id?: number }\n): Promise<unknown> {\n const client = getClient();\n const body = {\n ...request,\n user_id: request.user_id ?? 1,\n response_format: \"json\",\n };\n const res = await client.post(\"/api/workflow/execute/deploy/stream\", body);\n return res.data;\n}\n\n/**\n * 워크플로우 SSE 스트리밍 실행\n * deploy/stream 엔드포인트 + response_format=stream\n * 배포 여부 무관하게 모든 워크플로우 실행 가능\n */\nexport async function executeWorkflowSSE(\n request: WorkflowExecuteRequest & { deploy_key?: string; user_id?: number }\n): Promise<NodeJS.ReadableStream> {\n const client = getClient();\n const body = {\n ...request,\n user_id: request.user_id ?? 1,\n response_format: \"stream\",\n };\n const res = await client.post(\"/api/workflow/execute/deploy/stream\", body, {\n responseType: \"stream\",\n headers: { Accept: \"text/event-stream\" },\n });\n return res.data;\n}\n\nexport async function getExecutionStatus(executionId: string): Promise<unknown> {\n const client = getClient();\n const res = await client.get(`/api/workflow/execute/status/${executionId}`);\n return res.data;\n}\n\nexport async function getIOLogs(\n workflowId: string,\n workflowName: string,\n limit = 20\n): Promise<IOLog[]> {\n const client = getClient();\n const params: Record<string, string | number> = {\n workflow_id: workflowId,\n workflow_name: workflowName,\n limit,\n };\n\n const res = await client.get(\"/api/workflow/io_logs\", { params });\n return res.data.in_out_logs ?? res.data ?? [];\n}\n","/**\n * OPEN XGEN UI 유틸리티 — 터미널 UI 컴포넌트\n */\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\n\nconst W = Math.min(process.stdout.columns || 60, 70);\n\n// ── 박스 ──\n\nexport function box(lines: string[], color: \"cyan\" | \"green\" | \"yellow\" | \"gray\" = \"cyan\"): string {\n const c = chalk[color];\n const inner = W - 4;\n const top = c(\" ╭\" + \"─\".repeat(inner) + \"╮\");\n const bot = c(\" ╰\" + \"─\".repeat(inner) + \"╯\");\n const body = lines.map((line) => {\n const clean = line.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n const pad = Math.max(0, inner - clean.length);\n return c(\" │ \") + line + \" \".repeat(pad) + c(\" │\");\n });\n return [top, ...body, bot].join(\"\\n\");\n}\n\n// ── 구분선 ──\n\nexport function divider(label?: string): string {\n if (label) {\n const rest = W - label.length - 6;\n return chalk.gray(` ── ${label} ${\"─\".repeat(Math.max(0, rest))}`);\n }\n return chalk.gray(\" \" + \"─\".repeat(W - 2));\n}\n\n// ── 상태 표시 ──\n\nexport function statusDot(active: boolean, label: string, detail?: string): string {\n const dot = active ? chalk.green(\"●\") : chalk.gray(\"○\");\n const d = detail ? chalk.gray(` ${detail}`) : \"\";\n return ` ${dot} ${label}${d}`;\n}\n\n// ── 번호 메뉴 ──\n\nexport interface MenuItem {\n label: string;\n hint?: string;\n disabled?: boolean;\n}\n\nexport function menu(items: MenuItem[], opts?: { title?: string }): string {\n const lines: string[] = [];\n if (opts?.title) {\n lines.push(\"\");\n lines.push(chalk.bold(` ${opts.title}`));\n lines.push(\"\");\n }\n items.forEach((item, i) => {\n const num = chalk.cyan.bold(` ${String(i + 1).padStart(2)}.`);\n const hint = item.hint ? chalk.gray(` — ${item.hint}`) : \"\";\n const label = item.disabled ? chalk.gray(item.label) : item.label;\n lines.push(` ${num} ${label}${hint}`);\n });\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n// ── 프롬프트 ──\n\nexport function ask(question: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\n// ── 채팅 메시지 ──\n\nexport function userMsg(text: string): string {\n return `\\n ${chalk.blue.bold(\"You\")} ${chalk.gray(\"›\")} ${text}`;\n}\n\nexport function aiMsg(name: string): string {\n return `\\n ${chalk.green.bold(name)} ${chalk.gray(\"›\")} `;\n}\n\nexport function toolCall(name: string, summary: string): string {\n return chalk.gray(` ⚙ ${chalk.white(name)} ${summary}`);\n}\n\nexport function toolResult(text: string): string {\n const lines = text.split(\"\\n\").slice(0, 5);\n return lines.map((l) => chalk.gray(` │ ${l}`)).join(\"\\n\");\n}\n\n// ── 환영 메시지 ──\n\nexport function welcome(): string {\n const logo = chalk.cyan(`\n ██████ ██████ ███████ ███ ██\n ██ ██ ██ ██ ██ ████ ██\n ██ ██ ██████ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██\n ██████ ██ ███████ ██ ████`) +\n chalk.white.bold(`\n ██ ██ ██████ ███████ ███ ██\n ██ ██ ██ ██ ████ ██\n ███ ██ ███ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██ ██\n ██ ██ ██████ ███████ ██ ████`);\n\n return logo;\n}\n\n// ── 진행 표시 ──\n\nexport function spinner(): { update: (text: string) => void; stop: () => void } {\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n let i = 0;\n let text = \"\";\n const interval = setInterval(() => {\n process.stdout.write(`\\r ${chalk.cyan(frames[i++ % frames.length])} ${chalk.gray(text)}`);\n }, 80);\n\n return {\n update(t: string) { text = t; },\n stop() {\n clearInterval(interval);\n process.stdout.write(\"\\r\" + \" \".repeat(W) + \"\\r\");\n },\n };\n}\n","/**\n * xgen provider — AI 프로바이더 관리\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport OpenAI from \"openai\";\nimport {\n addProvider,\n getProviders,\n removeProvider,\n getDefaultProvider,\n setDefaultProvider,\n type ProviderConfig,\n} from \"../config/store.js\";\nimport { printSuccess, printError, printTable } from \"../utils/format.js\";\nimport { ask, box } from \"../utils/ui.js\";\n\ninterface ProviderPreset {\n label: string;\n type: ProviderConfig[\"type\"];\n baseUrl?: string;\n defaultModel: string;\n models: string[];\n needsKey: boolean;\n keyHint: string;\n envKey?: string;\n}\n\nconst PRESETS: ProviderPreset[] = [\n {\n label: \"OpenAI\",\n type: \"openai\",\n defaultModel: \"gpt-4o-mini\",\n models: [\n \"gpt-4o\", \"gpt-4o-mini\",\n \"gpt-4.1\", \"gpt-4.1-mini\", \"gpt-4.1-nano\",\n \"o3-mini\", \"o4-mini\",\n \"gpt-3.5-turbo\",\n ],\n needsKey: true,\n keyHint: \"https://platform.openai.com/api-keys\",\n envKey: \"OPENAI_API_KEY\",\n },\n {\n label: \"Google Gemini\",\n type: \"gemini\",\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n defaultModel: \"gemini-2.0-flash\",\n models: [\n \"gemini-2.5-pro-preview-06-05\",\n \"gemini-2.5-flash-preview-05-20\",\n \"gemini-2.0-flash\",\n \"gemini-2.0-flash-lite\",\n \"gemini-1.5-pro\",\n \"gemini-1.5-flash\",\n ],\n needsKey: true,\n keyHint: \"https://aistudio.google.com/apikey\",\n envKey: \"GEMINI_API_KEY\",\n },\n {\n label: \"Anthropic (Claude)\",\n type: \"anthropic\",\n baseUrl: \"https://api.anthropic.com/v1\",\n defaultModel: \"claude-sonnet-4-20250514\",\n models: [\n \"claude-opus-4-20250514\",\n \"claude-sonnet-4-20250514\",\n \"claude-haiku-4-5-20251001\",\n \"claude-3.5-sonnet-20241022\",\n ],\n needsKey: true,\n keyHint: \"https://console.anthropic.com/settings/keys\",\n envKey: \"ANTHROPIC_API_KEY\",\n },\n {\n label: \"Ollama (로컬 무료)\",\n type: \"ollama\",\n baseUrl: \"http://localhost:11434/v1\",\n defaultModel: \"llama3.1\",\n models: [\n \"llama3.1\", \"llama3.2\", \"llama3.3\",\n \"codellama\", \"deepseek-coder-v2\",\n \"qwen2.5-coder\", \"qwen2.5\",\n \"mistral\", \"mixtral\",\n \"phi3\", \"gemma2\",\n ],\n needsKey: false,\n keyHint: \"https://ollama.ai 설치 후 ollama pull <모델>\",\n },\n {\n label: \"Groq (빠른 추론)\",\n type: \"custom\",\n baseUrl: \"https://api.groq.com/openai/v1\",\n defaultModel: \"llama-3.3-70b-versatile\",\n models: [\n \"llama-3.3-70b-versatile\",\n \"llama-3.1-8b-instant\",\n \"mixtral-8x7b-32768\",\n \"gemma2-9b-it\",\n ],\n needsKey: true,\n keyHint: \"https://console.groq.com/keys\",\n envKey: \"GROQ_API_KEY\",\n },\n {\n label: \"Together AI\",\n type: \"custom\",\n baseUrl: \"https://api.together.xyz/v1\",\n defaultModel: \"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo\",\n models: [\n \"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo\",\n \"meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo\",\n \"mistralai/Mixtral-8x7B-Instruct-v0.1\",\n \"Qwen/Qwen2.5-72B-Instruct-Turbo\",\n ],\n needsKey: true,\n keyHint: \"https://api.together.xyz/settings/api-keys\",\n envKey: \"TOGETHER_API_KEY\",\n },\n {\n label: \"OpenRouter (멀티 모델)\",\n type: \"custom\",\n baseUrl: \"https://openrouter.ai/api/v1\",\n defaultModel: \"openai/gpt-4o-mini\",\n models: [\n \"openai/gpt-4o\", \"openai/gpt-4o-mini\",\n \"anthropic/claude-sonnet-4\", \"anthropic/claude-haiku-4.5\",\n \"google/gemini-2.0-flash-exp\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"deepseek/deepseek-chat-v3\",\n ],\n needsKey: true,\n keyHint: \"https://openrouter.ai/keys\",\n envKey: \"OPENROUTER_API_KEY\",\n },\n {\n label: \"DeepSeek\",\n type: \"custom\",\n baseUrl: \"https://api.deepseek.com/v1\",\n defaultModel: \"deepseek-chat\",\n models: [\n \"deepseek-chat\",\n \"deepseek-coder\",\n \"deepseek-reasoner\",\n ],\n needsKey: true,\n keyHint: \"https://platform.deepseek.com/api_keys\",\n envKey: \"DEEPSEEK_API_KEY\",\n },\n {\n label: \"기타 (OpenAI 호환 서버)\",\n type: \"custom\",\n defaultModel: \"gpt-4o-mini\",\n models: [],\n needsKey: true,\n keyHint: \"서버에서 발급받은 API Key\",\n },\n];\n\n/**\n * 환경변수에서 API 키 자동 감지\n */\nfunction detectEnvKey(preset: ProviderPreset): string | null {\n if (!preset.envKey) return null;\n return process.env[preset.envKey] ?? null;\n}\n\n/**\n * 가이드 설정\n */\nexport async function guidedProviderSetup(): Promise<ProviderConfig | null> {\n console.log();\n console.log(box([\"OPEN XGEN — 프로바이더 설정\", \"\", chalk.gray(\"AI 에이전트에 사용할 LLM을 선택하세요.\")]));\n console.log();\n\n // 프로바이더 목록\n console.log(chalk.bold(\" 프로바이더 선택:\\n\"));\n PRESETS.forEach((p, i) => {\n const envDetected = detectEnvKey(p);\n const envTag = envDetected ? chalk.green(\" [키 감지됨]\") : \"\";\n const free = !p.needsKey ? chalk.green(\" [무료]\") : \"\";\n console.log(` ${chalk.cyan(`${String(i + 1).padStart(2)}.`)} ${p.label}${free}${envTag}`);\n console.log(` ${chalk.gray(p.defaultModel)}`);\n });\n console.log();\n\n const choice = await ask(chalk.cyan(\" 번호: \"));\n const idx = parseInt(choice) - 1;\n if (isNaN(idx) || idx < 0 || idx >= PRESETS.length) {\n console.log(chalk.red(\" 잘못된 선택.\\n\"));\n return null;\n }\n\n const preset = PRESETS[idx];\n console.log(chalk.green(`\\n ✓ ${preset.label}\\n`));\n\n // API Key (환경변수 자동감지)\n let apiKey = \"\";\n if (preset.needsKey) {\n const envKey = detectEnvKey(preset);\n if (envKey) {\n console.log(chalk.green(` API Key 자동 감지 (${preset.envKey})`));\n const useEnv = await ask(chalk.white(` 이 키를 사용할까요? (Y/n): `));\n if (useEnv.toLowerCase() !== \"n\") {\n apiKey = envKey;\n }\n }\n if (!apiKey) {\n console.log(chalk.gray(` 발급: ${preset.keyHint}\\n`));\n apiKey = await ask(chalk.white(\" API Key: \"));\n if (!apiKey) {\n console.log(chalk.red(\" API Key 필요.\\n\"));\n return null;\n }\n }\n }\n\n // Base URL\n let baseUrl = preset.baseUrl;\n if (preset.label === \"기타 (OpenAI 호환 서버)\") {\n baseUrl = await ask(chalk.white(\" Base URL: \"));\n if (!baseUrl) {\n console.log(chalk.red(\" URL 필요.\\n\"));\n return null;\n }\n }\n\n // 모델 선택\n let model = preset.defaultModel;\n if (preset.models.length > 0) {\n console.log(chalk.bold(\"\\n 모델:\\n\"));\n const defaultIdx = preset.models.indexOf(preset.defaultModel);\n preset.models.forEach((m, i) => {\n const tag = i === defaultIdx ? chalk.green(\" ← 추천\") : \"\";\n console.log(` ${chalk.cyan(`${String(i + 1).padStart(2)}.`)} ${m}${tag}`);\n });\n console.log(` ${chalk.cyan(`${String(preset.models.length + 1).padStart(2)}.`)} 직접 입력`);\n console.log();\n\n const mc = await ask(chalk.cyan(` 번호 [${defaultIdx + 1}]: `));\n if (!mc || mc === String(defaultIdx + 1)) {\n model = preset.defaultModel;\n } else {\n const mi = parseInt(mc) - 1;\n if (mi >= 0 && mi < preset.models.length) {\n model = preset.models[mi];\n } else if (parseInt(mc) === preset.models.length + 1) {\n model = (await ask(chalk.white(\" 모델명: \"))) || preset.defaultModel;\n }\n }\n } else if (preset.label === \"기타 (OpenAI 호환 서버)\") {\n model = (await ask(chalk.white(` 모델명 [${preset.defaultModel}]: `))) || preset.defaultModel;\n }\n\n console.log(chalk.green(`\\n ✓ ${preset.label} · ${model}`));\n\n // 연결 테스트\n console.log(chalk.gray(\" 연결 테스트 중...\\n\"));\n const provider: ProviderConfig = {\n id: preset.label.toLowerCase().replace(/[^a-z0-9]/g, \"-\").replace(/-+/g, \"-\"),\n name: preset.label,\n type: preset.type,\n baseUrl,\n apiKey,\n model,\n };\n\n try {\n const client = new OpenAI({ apiKey: apiKey || \"ollama\", baseURL: baseUrl });\n await client.chat.completions.create({\n model,\n messages: [{ role: \"user\", content: \"Hi\" }],\n max_tokens: 5,\n });\n console.log(chalk.green(\" ✓ 연결 성공!\\n\"));\n } catch (err) {\n const msg = (err as Error).message || \"\";\n if (msg.includes(\"401\") || msg.includes(\"API key\") || msg.includes(\"Unauthorized\")) {\n console.log(chalk.red(` ✗ API 키가 유효하지 않습니다.`));\n const retry = await ask(chalk.white(\" 다시 입력할까요? (Y/n): \"));\n if (retry.toLowerCase() !== \"n\") {\n const newKey = await ask(chalk.white(\" API Key: \"));\n if (newKey) {\n provider.apiKey = newKey;\n try {\n const c2 = new OpenAI({ apiKey: newKey, baseURL: baseUrl });\n await c2.chat.completions.create({ model, messages: [{ role: \"user\", content: \"Hi\" }], max_tokens: 5 });\n console.log(chalk.green(\" ✓ 연결 성공!\\n\"));\n } catch {\n console.log(chalk.yellow(\" ⚠ 여전히 실패. 설정은 저장됩니다.\\n\"));\n }\n }\n } else {\n console.log(chalk.gray(\" 설정은 저장됩니다.\\n\"));\n }\n } else if (msg.includes(\"ECONNREFUSED\") || msg.includes(\"ENOTFOUND\")) {\n console.log(chalk.yellow(` ⚠ 서버에 연결할 수 없습니다. URL을 확인하세요.`));\n console.log(chalk.gray(\" 설정은 저장됩니다.\\n\"));\n } else {\n console.log(chalk.yellow(` ⚠ 테스트 실패: ${msg}`));\n console.log(chalk.gray(\" 설정은 저장됩니다.\\n\"));\n }\n }\n\n addProvider(provider);\n console.log(chalk.green.bold(` ✓ 설정 완료! ${preset.label} (${model})\\n`));\n\n return provider;\n}\n\nexport function registerProviderCommand(program: Command): void {\n const prov = program.command(\"provider\").description(\"AI 프로바이더 관리\");\n\n prov.command(\"add\").description(\"프로바이더 추가\").action(async () => {\n await guidedProviderSetup();\n });\n\n prov.command(\"list\").alias(\"ls\").description(\"프로바이더 목록\").action(() => {\n const providers = getProviders();\n const defaultP = getDefaultProvider();\n if (providers.length === 0) {\n console.log(chalk.yellow(\"\\n 프로바이더 없음. xgen provider add\\n\"));\n return;\n }\n console.log(chalk.cyan.bold(`\\n 프로바이더 (${providers.length}개)\\n`));\n printTable(\n [\"\", \"ID\", \"이름\", \"타입\", \"모델\"],\n providers.map((p) => [\n p.id === defaultP?.id ? chalk.green(\"●\") : \" \",\n p.id, p.name, p.type, p.model,\n ])\n );\n console.log();\n });\n\n prov.command(\"remove <id>\").description(\"프로바이더 제거\").action((id: string) => {\n removeProvider(id) ? printSuccess(`제거: ${id}`) : printError(`없음: ${id}`);\n });\n\n prov.command(\"use <id>\").description(\"기본 프로바이더 설정\").action((id: string) => {\n setDefaultProvider(id) ? printSuccess(`기본: ${id}`) : printError(`없음: ${id}`);\n });\n}\n","/**\n * XGEN 확장 API — 노드, 프롬프트, 도구, 스케줄, 인터랙션, 트레이스, MCP\n */\nimport { getClient } from \"./client.js\";\n\n// ── Node ──\n\nexport async function listNodes(): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/node/get\");\n return res.data.nodes ?? res.data ?? [];\n}\n\nexport async function searchNodes(query: string): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/node/search\", { params: { query } });\n return res.data.nodes ?? res.data ?? [];\n}\n\nexport async function getNodeDetail(nodeId: string): Promise<unknown> {\n const client = getClient();\n const res = await client.get(\"/api/node/detail\", { params: { node_id: nodeId } });\n return res.data;\n}\n\nexport async function getNodeCategories(): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/node/categories\");\n return res.data.categories ?? res.data ?? [];\n}\n\n// ── Prompt ──\n\nexport async function listPrompts(opts?: { limit?: number; language?: string }): Promise<unknown[]> {\n const client = getClient();\n const params: Record<string, unknown> = { limit: opts?.limit ?? 100 };\n if (opts?.language) params.language = opts.language;\n const res = await client.get(\"/api/prompt/list\", { params });\n return res.data.prompts ?? res.data ?? [];\n}\n\nexport async function createPrompt(data: { name: string; content: string; prompt_type?: string; language?: string }): Promise<unknown> {\n const client = getClient();\n const res = await client.post(\"/api/prompt/create\", data);\n return res.data;\n}\n\n// ── Tools ──\n\nexport async function listToolStore(): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/tools/store/list\");\n return res.data.tools ?? res.data ?? [];\n}\n\nexport async function listUserTools(): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/tools/storage/list\");\n return res.data.tools ?? res.data ?? [];\n}\n\n// ── Schedule ──\n\nexport async function listSchedules(): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/workflow/schedule/sessions\");\n return res.data.sessions ?? res.data ?? [];\n}\n\nexport async function getSchedulerStatus(): Promise<unknown> {\n const client = getClient();\n const res = await client.get(\"/api/workflow/schedule/status\");\n return res.data;\n}\n\n// ── Interaction / Trace ──\n\nexport async function listInteractions(workflowId?: string, limit = 20): Promise<unknown[]> {\n const client = getClient();\n const params: Record<string, unknown> = { limit };\n if (workflowId) params.workflow_id = workflowId;\n const res = await client.get(\"/api/interaction/list\", { params });\n return res.data.interactions ?? res.data ?? [];\n}\n\nexport async function listTraces(workflowId?: string, page = 1): Promise<unknown> {\n const client = getClient();\n const params: Record<string, unknown> = { page, page_size: 20 };\n if (workflowId) params.workflow_id = workflowId;\n const res = await client.get(\"/api/workflow/trace/list\", { params });\n return res.data;\n}\n\nexport async function getTraceDetail(traceId: string): Promise<unknown> {\n const client = getClient();\n const res = await client.get(`/api/workflow/trace/detail/${traceId}`);\n return res.data;\n}\n\n// ── Workflow Store ──\n\nexport async function listWorkflowStore(): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/workflow/store/list\");\n return res.data.workflows ?? res.data ?? [];\n}\n\n// ── Workflow Auto-generation ──\n\nexport async function generateWorkflow(requirements: string): Promise<unknown> {\n const client = getClient();\n const res = await client.post(\"/api/workflow/auto-generation/generate\", { requirements });\n return res.data;\n}\n\n// ── Performance ──\n\nexport async function getWorkflowPerformance(workflowId: string, workflowName: string): Promise<unknown> {\n const client = getClient();\n const res = await client.get(\"/api/workflow/performance\", {\n params: { workflow_id: workflowId, workflow_name: workflowName },\n });\n return res.data;\n}\n\n// ── MCP ──\n\nexport async function listMcpSessions(): Promise<unknown[]> {\n const client = getClient();\n const res = await client.get(\"/api/mcp/sessions\");\n return res.data.sessions ?? res.data ?? [];\n}\n","/**\n * 문서/컬렉션 API — 실제 작동하는 엔드포인트\n */\nimport { getClient } from \"./client.js\";\n\nexport interface Collection {\n id: number;\n collection_make_name: string;\n collection_name: string;\n description?: string;\n total_documents: number;\n total_chunks: number;\n is_shared: boolean;\n share_group?: string;\n init_embedding_model?: string;\n created_at?: string;\n}\n\nexport interface Document {\n id?: string;\n document_id?: string;\n name?: string;\n file_name?: string;\n file_type?: string;\n status?: string;\n created_at?: string;\n file_size?: number;\n}\n\nexport async function listCollections(): Promise<Collection[]> {\n const client = getClient();\n const res = await client.get(\"/api/retrieval/collections\");\n return Array.isArray(res.data) ? res.data : res.data.collections ?? [];\n}\n\nexport async function listDocuments(collectionId?: string): Promise<Document[]> {\n const client = getClient();\n try {\n const params: Record<string, string> = {};\n if (collectionId) params.collection_id = collectionId;\n const res = await client.get(\"/api/retrieval/documents/list\", { params });\n return res.data.documents ?? res.data ?? [];\n } catch {\n return [];\n }\n}\n\nexport async function uploadDocument(\n filePath: string,\n collectionId?: string,\n name?: string\n): Promise<unknown> {\n const client = getClient();\n const { createReadStream, statSync } = await import(\"node:fs\");\n const { basename } = await import(\"node:path\");\n const stat = statSync(filePath);\n const fileName = name || basename(filePath);\n\n const form = new FormData();\n const fileBlob = new Blob([createReadStream(filePath) as unknown as BlobPart]);\n form.append(\"file\", fileBlob, fileName);\n if (collectionId) form.append(\"collection_id\", collectionId);\n\n const res = await client.post(\"/api/retrieval/documents/upload\", form, {\n headers: { \"Content-Type\": \"multipart/form-data\" },\n maxBodyLength: stat.size + 1024 * 1024,\n });\n return res.data;\n}\n\nexport async function getDocumentInfo(docId: string): Promise<Document> {\n const client = getClient();\n const res = await client.get(`/api/retrieval/documents/${docId}`);\n return res.data;\n}\n","/**\n * 온톨로지 / GraphRAG API\n */\nimport { getClient } from \"./client.js\";\n\nexport interface GraphRAGResult {\n answer?: string;\n sources?: string[];\n scs_context?: string;\n triples_used?: string[];\n}\n\nexport interface GraphStats {\n total_nodes?: number;\n total_edges?: number;\n total_classes?: number;\n total_instances?: number;\n}\n\nexport async function queryGraphRAG(\n query: string,\n graphId?: string,\n opts?: { scs?: boolean }\n): Promise<GraphRAGResult> {\n const client = getClient();\n const res = await client.post(\"/api/graph-rag\", {\n query,\n graph_id: graphId,\n use_scs: opts?.scs ?? true,\n });\n return res.data;\n}\n\nexport async function queryGraphRAGMultiTurn(\n query: string,\n sessionId: string,\n graphId?: string,\n opts?: { maxTurns?: number }\n): Promise<GraphRAGResult & { session_id?: string }> {\n const client = getClient();\n const res = await client.post(\"/api/graph-rag/multi-turn\", {\n query,\n session_id: sessionId,\n graph_id: graphId,\n max_turns: opts?.maxTurns ?? 5,\n });\n return res.data;\n}\n\nexport async function getGraphStats(graphId: string): Promise<GraphStats> {\n const client = getClient();\n const res = await client.get(`/api/graph/${graphId}/stats`);\n return res.data;\n}\n\nexport async function listGraphs(): Promise<{ id: string; name?: string }[]> {\n const client = getClient();\n const res = await client.get(\"/api/graph/list\");\n return res.data.graphs ?? res.data ?? [];\n}\n","/**\n * OPEN XGEN Ink Dashboard — Gemini CLI 스타일\n */\nimport React, { useState, useEffect } from \"react\";\nimport { render, Box, Text, useInput, useApp, useStdout } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport { getServer, getAuth, getDefaultProvider } from \"../config/store.js\";\n\ntype Tab = \"workflows\" | \"collections\" | \"nodes\" | \"prompts\" | \"tools\";\n\ninterface WfItem { name: string; id: string; deployed: boolean; }\ninterface ColItem { name: string; docs: number; chunks: number; }\n\nconst TABS: { key: Tab; label: string; shortcut: string }[] = [\n { key: \"workflows\", label: \"워크플로우\", shortcut: \"1\" },\n { key: \"collections\", label: \"컬렉션\", shortcut: \"2\" },\n { key: \"nodes\", label: \"노드\", shortcut: \"3\" },\n { key: \"prompts\", label: \"프롬프트\", shortcut: \"4\" },\n { key: \"tools\", label: \"도구\", shortcut: \"5\" },\n];\n\nfunction Header({ tab, serverDisplay, model }: { tab: Tab; serverDisplay: string; model: string }) {\n const tabStr = TABS.map((t) => {\n const active = tab === t.key;\n return `[${t.shortcut}]${active ? \"▸\" : \" \"}${t.label}`;\n }).join(\" \");\n\n return (\n <Box paddingX={1}>\n <Text bold>OPEN XGEN</Text>\n <Text dimColor> {model} {serverDisplay} │ {tabStr}</Text>\n </Box>\n );\n}\n\nfunction ListPanel({ items, selected, onSelect }: {\n items: { label: string; dimLabel?: string }[];\n selected: number;\n onSelect?: (i: number) => void;\n}) {\n const { stdout } = useStdout();\n const height = (stdout?.rows ?? 24) - 8;\n const visibleCount = Math.max(1, height);\n const start = Math.max(0, Math.min(selected - Math.floor(visibleCount / 2), items.length - visibleCount));\n const visible = items.slice(start, start + visibleCount);\n\n return (\n <Box flexDirection=\"column\" width=\"50%\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n {visible.map((item, i) => {\n const realIndex = start + i;\n const isSelected = realIndex === selected;\n return (\n <Text key={`item-${realIndex}`} inverse={isSelected}>\n {isSelected ? \"▸ \" : \" \"}\n {item.label}\n {item.dimLabel ? <Text dimColor> {item.dimLabel}</Text> : null}\n </Text>\n );\n })}\n {items.length === 0 && <Text dimColor> (없음)</Text>}\n </Box>\n );\n}\n\nfunction DetailPanel({ lines }: { lines: string[] }) {\n return (\n <Box flexDirection=\"column\" width=\"50%\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n {lines.map((line, i) => (\n <Text key={`line-${i}`}>{line}</Text>\n ))}\n </Box>\n );\n}\n\nfunction StatusBar({ message }: { message: string }) {\n return (\n <Box paddingX={1}>\n <Text dimColor>{message}</Text>\n </Box>\n );\n}\n\nfunction InputBar({ value, onChange, onSubmit, placeholder }: {\n value: string;\n onChange: (v: string) => void;\n onSubmit: (v: string) => void;\n placeholder?: string;\n}) {\n return (\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text>❯ </Text>\n <TextInput\n value={value}\n onChange={onChange}\n onSubmit={onSubmit}\n placeholder={placeholder ?? \"입력...\"}\n />\n </Box>\n );\n}\n\nfunction Dashboard() {\n const { exit } = useApp();\n const provider = getDefaultProvider();\n const server = getServer();\n const auth = getAuth();\n const serverDisplay = auth && server\n ? `${auth.username}@${server.replace(\"https://\", \"\").replace(\"http://\", \"\")}`\n : \"미연결\";\n\n const [tab, setTab] = useState<Tab>(\"workflows\");\n const [selected, setSelected] = useState(0);\n const [workflows, setWorkflows] = useState<WfItem[]>([]);\n const [collections, setCollections] = useState<ColItem[]>([]);\n const [nodes, setNodes] = useState<any[]>([]);\n const [prompts, setPrompts] = useState<any[]>([]);\n const [tools, setTools] = useState<any[]>([]);\n const [detail, setDetail] = useState<string[]>([\"← 항목을 선택하세요\"]);\n const [inputValue, setInputValue] = useState(\"\");\n const [inputMode, setInputMode] = useState(false);\n const [runTarget, setRunTarget] = useState<WfItem | null>(null);\n const [loading, setLoading] = useState(true);\n const [statusMsg, setStatusMsg] = useState(\"로딩...\");\n\n // 데이터 로드\n useEffect(() => {\n loadAll();\n }, []);\n\n async function loadAll() {\n setLoading(true);\n setStatusMsg(\"로딩...\");\n try {\n if (server && auth) {\n const [wfMod, docMod, extraMod] = await Promise.all([\n import(\"../api/workflow.js\"),\n import(\"../api/document.js\"),\n import(\"../api/xgen-extra.js\"),\n ]);\n\n const [wfs, cols, nodeList, promptList, toolList] = await Promise.allSettled([\n wfMod.getWorkflowListDetail(),\n docMod.listCollections(),\n extraMod.listNodes(),\n extraMod.listPrompts(),\n extraMod.listToolStore(),\n ]);\n\n if (wfs.status === \"fulfilled\") {\n setWorkflows(wfs.value.map((w: any) => ({\n name: w.workflow_name, id: w.workflow_id ?? w.id ?? \"\", deployed: !!w.is_deployed,\n })));\n }\n if (cols.status === \"fulfilled\") {\n setCollections(cols.value.map((c: any) => ({\n name: c.collection_make_name, docs: c.total_documents, chunks: c.total_chunks,\n })));\n }\n if (nodeList.status === \"fulfilled\") setNodes(nodeList.value as any[]);\n if (promptList.status === \"fulfilled\") setPrompts(promptList.value as any[]);\n if (toolList.status === \"fulfilled\") setTools(toolList.value as any[]);\n }\n } catch {}\n setLoading(false);\n setStatusMsg(\"↑↓:이동 Enter:선택 1-5:탭 i:입력 r:새로고침 q:종료\");\n }\n\n function getListItems() {\n switch (tab) {\n case \"workflows\":\n return workflows.map((w) => ({ label: `${w.deployed ? \"●\" : \"○\"} ${w.name}`, dimLabel: \"\" }));\n case \"collections\":\n return collections.map((c) => ({ label: c.name, dimLabel: `${c.docs}문서 ${c.chunks}청크` }));\n case \"nodes\":\n return nodes.map((n: any) => ({ label: n.nodeName ?? n.name ?? \"?\", dimLabel: (n.description ?? \"\").slice(0, 30) }));\n case \"prompts\":\n return prompts.map((p: any) => ({ label: p.name ?? p.title ?? \"?\", dimLabel: `[${p.prompt_type ?? \"\"}]` }));\n case \"tools\":\n return tools.map((t: any) => ({ label: t.name ?? t.tool_name ?? \"?\", dimLabel: (t.description ?? \"\").slice(0, 30) }));\n default:\n return [];\n }\n }\n\n function showDetail() {\n const items = getListItems();\n if (selected < 0 || selected >= items.length) return;\n\n if (tab === \"workflows\") {\n const w = workflows[selected];\n if (w) setDetail([w.name, \"\", `ID ${w.id}`, `배포 ${w.deployed ? \"Yes\" : \"No\"}`, \"\", \"Enter → 실행\"]);\n } else if (tab === \"collections\") {\n const c = collections[selected];\n if (c) setDetail([c.name, \"\", `문서 ${c.docs}개`, `청크 ${c.chunks}개`]);\n } else if (tab === \"nodes\") {\n const n = nodes[selected] as any;\n if (n) setDetail([n.nodeName ?? n.name ?? \"?\", \"\", n.description ?? \"\", \"\", `ID: ${n.node_id ?? n.id ?? \"?\"}`]);\n } else if (tab === \"prompts\") {\n const p = prompts[selected] as any;\n if (p) setDetail([p.name ?? \"?\", `[${p.prompt_type ?? \"\"}]`, \"\", (p.content ?? \"\").slice(0, 200)]);\n } else if (tab === \"tools\") {\n const t = tools[selected] as any;\n if (t) setDetail([t.name ?? t.tool_name ?? \"?\", \"\", t.description ?? \"\"]);\n }\n }\n\n useEffect(() => { showDetail(); }, [selected, tab]);\n\n function switchTab(t: Tab) {\n setTab(t);\n setSelected(0);\n setInputMode(false);\n setRunTarget(null);\n }\n\n async function handleSubmit(value: string) {\n if (!value.trim()) {\n setInputMode(false);\n setRunTarget(null);\n return;\n }\n\n if (runTarget) {\n setDetail([`실행 중: ${runTarget.name}`, `입력: ${value}`, \"\", \"...\"]);\n setInputValue(\"\");\n setInputMode(false);\n\n try {\n const { executeWorkflow } = await import(\"../api/workflow.js\");\n const { randomUUID } = await import(\"node:crypto\");\n const result = await executeWorkflow({\n workflow_id: runTarget.id,\n workflow_name: runTarget.name,\n input_data: value,\n interaction_id: `tui_${randomUUID().slice(0, 8)}`,\n user_id: auth?.userId ? parseInt(auth.userId) : 1,\n }) as any;\n\n const content = result.content ?? result.message ?? JSON.stringify(result).slice(0, 500);\n setDetail([`${runTarget.name}`, \"\", `입력: ${value}`, \"\", `결과:`, String(content)]);\n } catch (err) {\n setDetail([`실행 실패: ${(err as Error).message}`]);\n }\n setRunTarget(null);\n } else {\n setInputValue(\"\");\n setInputMode(false);\n }\n }\n\n useInput((input, key) => {\n if (inputMode) {\n if (key.escape) { setInputMode(false); setRunTarget(null); }\n return;\n }\n\n if (input === \"q\" || (key.ctrl && input === \"c\")) { exit(); return; }\n if (input === \"r\") { loadAll(); return; }\n if (input === \"i\") { setInputMode(true); return; }\n\n // 탭 전환\n if (input === \"1\") switchTab(\"workflows\");\n else if (input === \"2\") switchTab(\"collections\");\n else if (input === \"3\") switchTab(\"nodes\");\n else if (input === \"4\") switchTab(\"prompts\");\n else if (input === \"5\") switchTab(\"tools\");\n\n // 목록 이동\n const items = getListItems();\n if (key.upArrow) setSelected(Math.max(0, selected - 1));\n else if (key.downArrow) setSelected(Math.min(items.length - 1, selected + 1));\n else if (key.tab) switchTab(TABS[(TABS.findIndex((t) => t.key === tab) + 1) % TABS.length].key);\n\n // Enter\n if (key.return && items.length > 0) {\n if (tab === \"workflows\" && workflows[selected]) {\n setRunTarget(workflows[selected]);\n setInputMode(true);\n setStatusMsg(`${workflows[selected].name} — 입력 후 Enter로 실행, Esc 취소`);\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n <Header tab={tab} serverDisplay={serverDisplay} model={provider?.model ?? \"\"} />\n <Box flexDirection=\"row\" flexGrow={1}>\n <ListPanel items={getListItems()} selected={selected} />\n <DetailPanel lines={detail} />\n </Box>\n {inputMode ? (\n <InputBar\n value={inputValue}\n onChange={setInputValue}\n onSubmit={handleSubmit}\n placeholder={runTarget ? `${runTarget.name}에 입력...` : \"입력...\"}\n />\n ) : (\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>❯ i를 눌러 입력 · Enter로 실행</Text>\n </Box>\n )}\n <StatusBar message={loading ? \"로딩...\" : statusMsg} />\n </Box>\n );\n}\n\nexport async function startInkDashboard(): Promise<void> {\n // readline이 pause 상태에서 Ink가 stdin을 다시 제어\n if (process.stdin.isPaused?.()) {\n process.stdin.resume();\n }\n\n const { waitUntilExit } = render(<Dashboard />, {\n exitOnCtrlC: true,\n });\n await waitUntilExit();\n}\n","#!/usr/bin/env node\n/**\n * XGEN CLI — XGEN 2.0 플랫폼 + AI 코딩 에이전트\n *\n * xgen → 설정에 따라 에이전트 또는 채팅 모드\n * xgen agent → AI 코딩 에이전트\n * xgen chat → XGEN 워크플로우 채팅\n * xgen wf run → 워크플로우 실행\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerLoginCommand } from \"./commands/login.js\";\nimport { registerWorkflowCommand } from \"./commands/workflow/index.js\";\nimport { registerChatCommand, chat } from \"./commands/chat.js\";\nimport { registerProviderCommand } from \"./commands/provider.js\";\nimport { registerAgentCommand, agentRepl } from \"./commands/agent.js\";\nimport { registerDocCommand } from \"./commands/doc.js\";\nimport { registerOntologyCommand } from \"./commands/ontology.js\";\nimport { getAuth, getServer, getDefaultProvider } from \"./config/store.js\";\n\nconst VERSION = \"2.2.0\";\n\nconst LOGO = chalk.cyan(`\n ██████ ██████ ███████ ███ ██\n ██ ██ ██ ██ ██ ████ ██\n ██ ██ ██████ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██\n ██████ ██ ███████ ██ ████\n`) + chalk.white.bold(`\n ██ ██ ██████ ███████ ███ ██\n ██ ██ ██ ██ ████ ██\n ███ ██ ███ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██ ██\n ██ ██ ██████ ███████ ██ ████\n`) + chalk.gray(` v${VERSION}\\n`);\n\nconst BANNER = LOGO;\n\nconst program = new Command();\n\nprogram\n .name(\"xgen\")\n .description(\"OPEN XGEN — AI Coding Agent + XGEN Platform CLI\")\n .version(VERSION)\n .addHelpText(\"before\", BANNER)\n .addHelpText(\n \"after\",\n `\n${chalk.bold(\"시작하기:\")}\n ${chalk.cyan(\"xgen provider add\")} AI 프로바이더 설정\n ${chalk.cyan(\"xgen agent\")} AI 코딩 에이전트\n ${chalk.cyan(\"xgen config set-server\")} <url> XGEN 서버 연결\n ${chalk.cyan(\"xgen login\")} 서버 로그인\n\n${chalk.bold(\"AI 에이전트:\")}\n ${chalk.cyan(\"xgen agent\")} 코딩 에이전트 (파일, 터미널, 검색)\n ${chalk.cyan(\"xgen provider ls\")} 프로바이더 목록\n ${chalk.cyan(\"xgen provider add\")} 프로바이더 추가\n\n${chalk.bold(\"XGEN 플랫폼:\")}\n ${chalk.cyan(\"xgen chat\")} 워크플로우 대화\n ${chalk.cyan(\"xgen wf ls\")} 워크플로우 목록\n ${chalk.cyan(\"xgen wf run\")} <id> \"질문\" 워크플로우 실행\n ${chalk.cyan(\"xgen doc ls\")} 문서 목록\n ${chalk.cyan(\"xgen ont query\")} \"질문\" 온톨로지 질의\n`\n );\n\n// 커맨드 등록\nregisterConfigCommand(program);\nregisterLoginCommand(program);\nregisterWorkflowCommand(program);\nregisterChatCommand(program);\nregisterProviderCommand(program);\nregisterAgentCommand(program);\nregisterDocCommand(program);\nregisterOntologyCommand(program);\n\n// 대시보드 커맨드 (별도 프로세스로 실행 — stdin 충돌 방지)\nprogram\n .command(\"dash\")\n .alias(\"dashboard\")\n .description(\"XGEN TUI 대시보드\")\n .action(async () => {\n const { startInkDashboard } = await import(\"./dashboard/InkDashboard.js\");\n await startInkDashboard();\n });\n\n// 인자 없이 실행: 바로 AI 채팅 (Claude Code 스타일)\nif (process.argv.length <= 2) {\n agentRepl().catch((err) => {\n console.error(chalk.red(`오류: ${err.message}`));\n process.exit(1);\n });\n} else {\n program.parse();\n}\n","/**\n * xgen config — 설정 관리\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getConfig, setServer, getServer, setConfig } from \"../config/store.js\";\nimport { resetClient } from \"../api/client.js\";\nimport { printSuccess, printError, printKeyValue } from \"../utils/format.js\";\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"XGEN CLI 설정 관리\");\n\n config\n .command(\"set-server <url>\")\n .description(\"XGEN 서버 URL 설정\")\n .action((url: string) => {\n if (!url.startsWith(\"http://\") && !url.startsWith(\"https://\")) {\n printError(\"URL은 http:// 또는 https://로 시작해야 합니다\");\n process.exit(1);\n }\n setServer(url);\n resetClient();\n printSuccess(`서버 설정 완료: ${chalk.underline(url)}`);\n });\n\n config\n .command(\"get-server\")\n .description(\"현재 설정된 서버 URL 확인\")\n .action(() => {\n const server = getServer();\n if (server) {\n console.log(server);\n } else {\n printError(\"서버가 설정되지 않았습니다\");\n console.log(\" 설정: xgen config set-server <url>\");\n }\n });\n\n config\n .command(\"list\")\n .description(\"전체 설정 확인\")\n .action(() => {\n const cfg = getConfig();\n console.log(chalk.bold(\"\\nXGEN CLI 설정\"));\n console.log(chalk.gray(\"─\".repeat(40)));\n printKeyValue(\"서버\", cfg.server);\n printKeyValue(\"기본 워크플로우\", cfg.defaultWorkflow);\n printKeyValue(\"테마\", cfg.theme);\n printKeyValue(\"스트림 로그\", String(cfg.streamLogs));\n console.log();\n });\n\n config\n .command(\"set <key> <value>\")\n .description(\"설정 값 변경\")\n .action((key: string, value: string) => {\n const allowedKeys = [\"defaultWorkflow\", \"theme\", \"streamLogs\"];\n if (!allowedKeys.includes(key)) {\n printError(`알 수 없는 설정 키: ${key}`);\n console.log(` 사용 가능: ${allowedKeys.join(\", \")}`);\n process.exit(1);\n }\n\n const parsed = key === \"streamLogs\" ? value === \"true\" : value;\n setConfig({ [key]: parsed });\n printSuccess(`${key} = ${value}`);\n });\n}\n","/**\n * xgen login — 서버 로그인\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { apiLogin } from \"../api/auth.js\";\nimport { setAuth, requireServer, getAuth } from \"../config/store.js\";\nimport { printSuccess, printError, printHeader } from \"../utils/format.js\";\n\nfunction prompt(question: string, hidden = false): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n if (hidden) {\n // 비밀번호 입력 시 에코 숨김\n process.stdout.write(question);\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n if (stdin.isTTY) stdin.setRawMode(true);\n\n let password = \"\";\n const onData = (ch: Buffer) => {\n const c = ch.toString(\"utf8\");\n if (c === \"\\n\" || c === \"\\r\" || c === \"\\u0004\") {\n if (stdin.isTTY) stdin.setRawMode(wasRaw ?? false);\n stdin.removeListener(\"data\", onData);\n process.stdout.write(\"\\n\");\n rl.close();\n resolve(password);\n } else if (c === \"\\u0003\") {\n // Ctrl+C\n process.exit(0);\n } else if (c === \"\\u007F\" || c === \"\\b\") {\n // Backspace\n if (password.length > 0) {\n password = password.slice(0, -1);\n process.stdout.write(\"\\b \\b\");\n }\n } else {\n password += c;\n process.stdout.write(\"*\");\n }\n };\n stdin.on(\"data\", onData);\n } else {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n }\n });\n}\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command(\"login\")\n .description(\"XGEN 서버에 로그인\")\n .option(\"-e, --email <email>\", \"이메일\")\n .option(\"-p, --password <password>\", \"비밀번호\")\n .action(async (opts) => {\n const server = requireServer();\n\n printHeader(\"XGEN Login\");\n console.log(chalk.gray(`서버: ${server}\\n`));\n\n let email = opts.email;\n let password = opts.password;\n\n if (!email) {\n email = await prompt(chalk.white(\"이메일: \"));\n }\n if (!password) {\n password = await prompt(chalk.white(\"비밀번호: \"), true);\n }\n\n if (!email || !password) {\n printError(\"이메일과 비밀번호를 모두 입력하세요\");\n process.exit(1);\n }\n\n try {\n const result = await apiLogin(email, password);\n\n if (result.success && result.access_token) {\n setAuth({\n accessToken: result.access_token,\n refreshToken: result.refresh_token ?? \"\",\n userId: result.user_id ?? \"\",\n username: result.username ?? \"\",\n isAdmin: false,\n expiresAt: null,\n });\n\n console.log();\n printSuccess(`로그인 성공! ${chalk.bold(result.username ?? email)}`);\n } else {\n printError(result.message || \"로그인 실패\");\n process.exit(1);\n }\n } catch (err: unknown) {\n const msg =\n (err as { response?: { data?: { message?: string; detail?: string } } })\n ?.response?.data?.message ??\n (err as { response?: { data?: { detail?: string } } })\n ?.response?.data?.detail ??\n (err as Error).message;\n printError(`로그인 실패: ${msg}`);\n process.exit(1);\n }\n });\n\n program\n .command(\"logout\")\n .description(\"로그아웃\")\n .action(async () => {\n const { clearAuth } = await import(\"../config/store.js\");\n clearAuth();\n printSuccess(\"로그아웃 완료\");\n });\n\n program\n .command(\"whoami\")\n .description(\"현재 로그인된 사용자 정보\")\n .action(async () => {\n const auth = getAuth();\n if (!auth) {\n printError(\"로그인되지 않았습니다. xgen login 실행하세요\");\n process.exit(1);\n }\n\n const server = requireServer();\n console.log(chalk.bold(\"\\n현재 사용자\"));\n console.log(chalk.gray(\"─\".repeat(30)));\n console.log(` ${chalk.gray(\"서버:\")} ${server}`);\n console.log(` ${chalk.gray(\"사용자:\")} ${chalk.bold(auth.username)}`);\n console.log(` ${chalk.gray(\"User ID:\")} ${auth.userId}`);\n\n // 토큰 유효성 확인\n try {\n const { apiValidate } = await import(\"../api/auth.js\");\n const result = await apiValidate(auth.accessToken);\n if (result.valid) {\n console.log(` ${chalk.gray(\"상태:\")} ${chalk.green(\"활성\")}`);\n if (result.is_admin) {\n console.log(` ${chalk.gray(\"권한:\")} ${chalk.yellow(\"관리자\")}`);\n }\n if (result.user_type) {\n console.log(` ${chalk.gray(\"유형:\")} ${result.user_type}`);\n }\n } else {\n console.log(` ${chalk.gray(\"상태:\")} ${chalk.red(\"토큰 만료\")}`);\n }\n } catch {\n console.log(` ${chalk.gray(\"상태:\")} ${chalk.yellow(\"검증 불가 (서버 연결 실패)\")}`);\n }\n console.log();\n });\n}\n","/**\n * xgen workflow list — 워크플로우 목록 조회\n */\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { listWorkflows, getWorkflowListDetail } from \"../../api/workflow.js\";\nimport { printTable, printError, printHeader, truncate, formatDate } from \"../../utils/format.js\";\n\nexport async function workflowList(opts: { detail?: boolean }): Promise<void> {\n requireAuth();\n\n try {\n if (opts.detail) {\n const workflows = await getWorkflowListDetail();\n\n if (!workflows || workflows.length === 0) {\n console.log(chalk.yellow(\"\\n워크플로우가 없습니다.\\n\"));\n return;\n }\n\n printHeader(`워크플로우 목록 (${workflows.length}개)`);\n console.log();\n\n printTable(\n [\"#\", \"ID\", \"이름\", \"배포\", \"업데이트\"],\n workflows.map((w, i) => [\n String(i + 1),\n (w.workflow_id ?? w.id ?? \"-\").slice(0, 12),\n truncate(w.workflow_name ?? \"-\", 30),\n (w as Record<string, unknown>).is_deployed\n ? chalk.green(\"배포됨\")\n : chalk.gray(\"미배포\"),\n formatDate(w.updated_at),\n ])\n );\n } else {\n const workflows = await listWorkflows();\n\n if (!workflows || workflows.length === 0) {\n console.log(chalk.yellow(\"\\n워크플로우가 없습니다.\\n\"));\n return;\n }\n\n printHeader(`워크플로우 목록 (${workflows.length}개)`);\n console.log();\n\n printTable(\n [\"#\", \"ID\", \"이름\"],\n workflows.map((w, i) => [\n String(i + 1),\n (w.workflow_id ?? w.id ?? \"-\").slice(0, 12),\n w.workflow_name ?? \"-\",\n ])\n );\n }\n console.log();\n } catch (err: unknown) {\n const msg = (err as Error).message;\n printError(`워크플로우 목록 조회 실패: ${msg}`);\n process.exit(1);\n }\n}\n","/**\n * xgen workflow info <id> — 워크플로우 상세 정보\n */\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { getWorkflowDetail } from \"../../api/workflow.js\";\nimport { printError, printHeader, printKeyValue } from \"../../utils/format.js\";\n\nexport async function workflowInfo(workflowId: string): Promise<void> {\n requireAuth();\n\n try {\n const detail = await getWorkflowDetail(workflowId);\n\n printHeader(`워크플로우: ${detail.workflow_name ?? workflowId}`);\n console.log();\n\n printKeyValue(\"ID\", detail.id);\n printKeyValue(\"이름\", detail.workflow_name);\n printKeyValue(\"설명\", detail.description ?? \"(없음)\");\n\n if (detail.nodes && Array.isArray(detail.nodes)) {\n console.log();\n console.log(chalk.bold(\" 노드 구성:\"));\n for (const node of detail.nodes as Array<{ id: string; data?: { label?: string; type?: string } }>) {\n const label = node.data?.label ?? node.id;\n const type = node.data?.type ?? \"unknown\";\n console.log(` ${chalk.cyan(\"•\")} ${label} ${chalk.gray(`(${type})`)}`);\n }\n }\n\n if (detail.parameters && Object.keys(detail.parameters).length > 0) {\n console.log();\n console.log(chalk.bold(\" 파라미터:\"));\n for (const [key, val] of Object.entries(detail.parameters)) {\n console.log(` ${chalk.gray(key)}: ${JSON.stringify(val)}`);\n }\n }\n\n console.log();\n } catch (err: unknown) {\n const msg = (err as Error).message;\n printError(`워크플로우 조회 실패: ${msg}`);\n process.exit(1);\n }\n}\n","/**\n * xgen workflow run <id> — 워크플로우 실행\n */\nimport chalk from \"chalk\";\nimport { randomUUID } from \"node:crypto\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { executeWorkflowStream, getWorkflowDetail } from \"../../api/workflow.js\";\nimport { parseSSEStream } from \"../../utils/sse.js\";\nimport { printError, printHeader, printInfo } from \"../../utils/format.js\";\nimport { renderMarkdown } from \"../../utils/markdown.js\";\nimport type { SSEEvent } from \"../../api/types.js\";\n\nexport async function workflowRun(\n workflowId: string,\n input: string | undefined,\n opts: { interactive?: boolean; logs?: boolean }\n): Promise<void> {\n const auth = requireAuth();\n\n // 워크플로우 정보 가져오기\n let workflowName = workflowId;\n try {\n const detail = await getWorkflowDetail(workflowId);\n workflowName = detail.workflow_name ?? workflowId;\n } catch {\n // 이름 조회 실패해도 실행은 계속\n }\n\n // 인터랙티브 모드: 입력이 없으면 프롬���트\n if (!input) {\n if (opts.interactive || !process.stdin.isTTY) {\n const { createInterface } = await import(\"node:readline\");\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n input = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan(\"입력> \"), (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n } else {\n printError(\"입력값이 필요합니다. 사용법:\");\n console.log(' xgen workflow run <id> \"입력 텍스���\"');\n console.log(\" xgen workflow run -i <id>\");\n process.exit(1);\n }\n }\n\n if (!input) {\n printError(\"입력값이 비어있습니다\");\n process.exit(1);\n }\n\n const interactionId = `cli_${randomUUID().slice(0, 8)}`;\n\n printHeader(`실행: ${workflowName}`);\n printInfo(`입력: ${input}`);\n console.log();\n\n try {\n const stream = await executeWorkflowStream({\n workflow_id: workflowId,\n workflow_name: workflowName,\n input_data: input,\n interaction_id: interactionId,\n });\n\n let hasOutput = false;\n let fullResponse = \"\";\n\n await parseSSEStream(\n stream,\n (event: SSEEvent) => {\n switch (event.type) {\n case \"token\":\n if (event.content) {\n if (!hasOutput) {\n hasOutput = true;\n console.log();\n }\n process.stdout.write(event.content);\n fullResponse += event.content;\n }\n break;\n\n case \"log\":\n if (opts.logs && event.content) {\n process.stderr.write(chalk.gray(`[LOG] ${event.content}\\n`));\n }\n break;\n\n case \"node_status\":\n if (opts.logs) {\n const nodeName = event.node_name ?? event.node_id ?? \"?\";\n const status = event.status ?? \"?\";\n process.stderr.write(\n chalk.gray(`[노드] ${nodeName}: ${status}\\n`)\n );\n }\n break;\n\n case \"tool\":\n if (opts.logs) {\n process.stderr.write(chalk.gray(`[도구] ${JSON.stringify(event.data)}\\n`));\n }\n break;\n\n case \"complete\":\n break;\n\n case \"error\":\n console.log();\n printError(event.error ?? event.content ?? \"알 수 없는 오류\");\n break;\n\n default:\n // 알 수 없는 이벤트는 content가 있으면 출력\n if (event.content) {\n if (!hasOutput) {\n process.stdout.write(chalk.green(\"응답: \"));\n hasOutput = true;\n }\n process.stdout.write(event.content);\n }\n }\n },\n () => {\n if (hasOutput) {\n // 스트리밍 끝 — 마크다운이 있으면 렌더링된 버전도 표시\n console.log();\n if (fullResponse.includes(\"```\") || fullResponse.includes(\"**\")) {\n console.log(chalk.gray(\"─\".repeat(40)));\n console.log(renderMarkdown(fullResponse));\n }\n }\n console.log();\n console.log(chalk.gray(`세션: ${interactionId}`));\n },\n (err) => {\n console.log();\n printError(`스트리밍 오류: ${err.message}`);\n }\n );\n } catch (err: unknown) {\n const msg =\n (err as { response?: { data?: { detail?: string } } })?.response?.data\n ?.detail ?? (err as Error).message;\n printError(`실행 실패: ${msg}`);\n process.exit(1);\n }\n}\n","/**\n * SSE (Server-Sent Events) 파서\n * 워크플로우 스트리밍 응답 처리\n */\nimport type { SSEEvent } from \"../api/types.js\";\n\n/**\n * ReadableStream에서 SSE 이벤트를 파싱하여 콜백으로 전달\n */\nexport async function parseSSEStream(\n stream: NodeJS.ReadableStream,\n onEvent: (event: SSEEvent) => void,\n onDone?: () => void,\n onError?: (error: Error) => void\n): Promise<void> {\n let buffer = \"\";\n\n return new Promise<void>((resolve, reject) => {\n stream.on(\"data\", (chunk: Buffer) => {\n buffer += chunk.toString();\n\n // SSE 이벤트 파싱: 빈 줄로 구분\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n const lines = part.split(\"\\n\");\n let data = \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n data += line.slice(6);\n } else if (line.startsWith(\"data:\")) {\n data += line.slice(5);\n }\n }\n\n if (!data) continue;\n\n try {\n const event = JSON.parse(data) as SSEEvent;\n onEvent(event);\n } catch {\n // JSON 파싱 실패 시 텍스트로 처리\n onEvent({ type: \"token\", content: data });\n }\n }\n });\n\n stream.on(\"end\", () => {\n // 남은 버퍼 처리\n if (buffer.trim()) {\n const lines = buffer.split(\"\\n\");\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const event = JSON.parse(line.slice(6)) as SSEEvent;\n onEvent(event);\n } catch {\n onEvent({ type: \"token\", content: line.slice(6) });\n }\n }\n }\n }\n onDone?.();\n resolve();\n });\n\n stream.on(\"error\", (err: Error) => {\n onError?.(err);\n reject(err);\n });\n });\n}\n","/**\n * 터미널 마크다운 렌더링 — 가볍게\n * marked-terminal 안 쓰고 직접 처리 (의존성 최소화)\n */\nimport chalk from \"chalk\";\n\n/** 코드 블록 감지용 */\nconst CODE_BLOCK_RE = /```(\\w*)\\n([\\s\\S]*?)```/g;\nconst INLINE_CODE_RE = /`([^`]+)`/g;\nconst BOLD_RE = /\\*\\*(.+?)\\*\\*/g;\nconst HEADING_RE = /^(#{1,3})\\s+(.+)$/gm;\nconst LIST_RE = /^(\\s*)[-*]\\s+(.+)$/gm;\nconst LINK_RE = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n\nexport function renderMarkdown(text: string): string {\n let result = text;\n\n // 코드 블록: 박스로 표시\n result = result.replace(CODE_BLOCK_RE, (_match, lang, code) => {\n const trimmed = code.trimEnd();\n const header = lang ? chalk.gray(` ── ${lang} ──`) : chalk.gray(\" ── code ──\");\n const lines = trimmed.split(\"\\n\").map((l: string) => chalk.white(` ${l}`)).join(\"\\n\");\n return `\\n${header}\\n${lines}\\n${chalk.gray(\" ──────────\")}\\n`;\n });\n\n // 인라인 코드\n result = result.replace(INLINE_CODE_RE, (_m, code) => chalk.cyan(`\\`${code}\\``));\n\n // 볼드\n result = result.replace(BOLD_RE, (_m, text) => chalk.bold(text));\n\n // 헤딩\n result = result.replace(HEADING_RE, (_m, hashes, text) => {\n if (hashes.length === 1) return chalk.bold.underline(text);\n if (hashes.length === 2) return chalk.bold(text);\n return chalk.bold.dim(text);\n });\n\n // 리스트\n result = result.replace(LIST_RE, (_m, indent, text) => `${indent}${chalk.cyan(\"•\")} ${text}`);\n\n // 링크\n result = result.replace(LINK_RE, (_m, label, url) => `${chalk.blue.underline(label)} ${chalk.gray(`(${url})`)}`);\n\n return result;\n}\n","/**\n * xgen workflow history — 실행 이력 조회\n */\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { getIOLogs } from \"../../api/workflow.js\";\nimport { printError, printHeader, truncate, formatDate } from \"../../utils/format.js\";\n\nexport async function workflowHistory(\n workflowId?: string,\n workflowName?: string,\n opts: { limit?: number } = {}\n): Promise<void> {\n requireAuth();\n\n if (!workflowId || !workflowName) {\n console.log(chalk.yellow(\"\\n워크플로우 ID와 이름이 필요합니다.\\n 사용법: xgen wf history <workflow-id> <workflow-name>\\n\"));\n return;\n }\n\n const limit = opts.limit ?? 20;\n\n try {\n const logs = await getIOLogs(workflowId, workflowName, limit);\n\n if (!logs || logs.length === 0) {\n console.log(chalk.yellow(\"\\n실행 이력이 없습니다.\\n\"));\n return;\n }\n\n printHeader(`실행 이력 (최근 ${logs.length}건)`);\n console.log();\n\n for (const log of logs) {\n console.log(\n ` ${chalk.gray(formatDate(log.created_at))} ${chalk.cyan(log.interaction_id)}`\n );\n console.log(` ${chalk.white(\"입력:\")} ${truncate(log.input_data, 60)}`);\n console.log(\n ` ${chalk.green(\"출력:\")} ${truncate(log.output_data, 60)}`\n );\n if (log.execution_time) {\n console.log(\n ` ${chalk.gray(\"시간:\")} ${(log.execution_time / 1000).toFixed(1)}s`\n );\n }\n console.log();\n }\n } catch (err: unknown) {\n const msg = (err as Error).message;\n printError(`이력 조회 실패: ${msg}`);\n process.exit(1);\n }\n}\n","/**\n * xgen workflow — 워크플로우 커맨드 그룹\n */\nimport { Command } from \"commander\";\nimport { workflowList } from \"./list.js\";\nimport { workflowInfo } from \"./info.js\";\nimport { workflowRun } from \"./run.js\";\nimport { workflowHistory } from \"./history.js\";\n\nexport function registerWorkflowCommand(program: Command): void {\n const wf = program\n .command(\"workflow\")\n .alias(\"wf\")\n .description(\"워크플로우 관리 및 실행\");\n\n wf.command(\"list\")\n .alias(\"ls\")\n .description(\"워크플로우 목록 조회\")\n .option(\"-d, --detail\", \"상세 정보 포함\")\n .action((opts) => workflowList(opts));\n\n wf.command(\"info <workflow-id>\")\n .description(\"워크플로우 상세 정보\")\n .action((id) => workflowInfo(id));\n\n wf.command(\"run <workflow-id> [input]\")\n .description(\"워크플로우 실행\")\n .option(\"-i, --interactive\", \"인터랙티브 모드 (입력 프롬프트)\")\n .option(\"-l, --logs\", \"디버그 로그 표시\")\n .action((id, input, opts) => workflowRun(id, input, opts));\n\n wf.command(\"history [workflow-id]\")\n .description(\"실행 이력 조회\")\n .option(\"-n, --limit <number>\", \"조회 건수\", \"20\")\n .action((id, opts) => workflowHistory(id, { limit: parseInt(opts.limit) }));\n}\n","/**\n * xgen chat — 인터랙티브 터미널 모드\n *\n * Gemini CLI 스타일: 터미널 열면 바로 대화, 워크플로우 전환 가능\n *\n * 슬래시 커맨드:\n * /workflows — 워크플로우 목록 + 전환\n * /switch — 워크플로우 전환\n * /history — 최근 대화 이력\n * /clear — 화면 지우기\n * /help — 도움말\n * /exit — 종료\n */\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { randomUUID } from \"node:crypto\";\nimport { requireAuth, getAuth, getServer } from \"../config/store.js\";\nimport { listWorkflows, executeWorkflowStream, type Workflow } from \"../api/workflow.js\";\nimport { parseSSEStream } from \"../utils/sse.js\";\nimport { renderMarkdown } from \"../utils/markdown.js\";\nimport { printError } from \"../utils/format.js\";\nimport type { SSEEvent } from \"../api/types.js\";\n\nconst CHAT_BANNER = `\n${chalk.cyan(\"╭──────────────────────────────────────╮\")}\n${chalk.cyan(\"│\")} ${chalk.white.bold(\"XGEN\")} ${chalk.gray(\"— 워크플로우 AI 터미널\")} ${chalk.cyan(\"│\")}\n${chalk.cyan(\"│\")} ${chalk.gray(\"/help 도움말 /workflows 전환 /exit\")} ${chalk.cyan(\"│\")}\n${chalk.cyan(\"╰──────────────────────────────────────╯\")}`;\n\nfunction printHelp() {\n console.log(`\n${chalk.bold(\"슬래시 커맨드\")}\n ${chalk.cyan(\"/workflows\")} 워크플로우 목록 보기 & 전환\n ${chalk.cyan(\"/switch\")} 워크플로우 번호로 전환 (예: /switch 3)\n ${chalk.cyan(\"/history\")} 현재 세션 대화 이력\n ${chalk.cyan(\"/clear\")} 화면 지우기\n ${chalk.cyan(\"/info\")} 현재 연결 정보\n ${chalk.cyan(\"/help\")} 이 도움말\n ${chalk.cyan(\"/exit\")} 종료 (Ctrl+C도 가능)\n`);\n}\n\nasync function promptLine(rl: ReturnType<typeof createInterface>, promptStr: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(promptStr, (answer) => resolve(answer));\n });\n}\n\nexport async function chat(workflowId?: string): Promise<void> {\n const auth = requireAuth();\n const server = getServer();\n\n // 워크플로우 목록 로드\n let workflows: Workflow[] = [];\n try {\n workflows = await listWorkflows();\n } catch {\n printError(\"워크플로우 목록을 불러올 수 없습니다\");\n process.exit(1);\n }\n\n if (workflows.length === 0) {\n printError(\"사용 가능한 워크플로우가 없습니다\");\n process.exit(1);\n }\n\n // 워크플로우 선택\n let current: Workflow;\n if (workflowId) {\n const found = workflows.find((w) => w.id === workflowId || w.workflow_name === workflowId);\n current = found ?? { id: workflowId, workflow_name: workflowId };\n } else {\n // 첫 번째 또는 선택\n console.log(CHAT_BANNER);\n console.log(chalk.gray(` 서버: ${server} | 사용자: ${auth.username}\\n`));\n console.log(chalk.bold(\" 워크플로우 선택:\\n\"));\n workflows.forEach((w, i) => {\n console.log(` ${chalk.cyan(String(i + 1).padStart(3))} ${w.workflow_name}`);\n });\n console.log();\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await promptLine(rl, chalk.cyan(\" 번호> \"));\n rl.close();\n\n const idx = parseInt(answer.trim()) - 1;\n if (isNaN(idx) || idx < 0 || idx >= workflows.length) {\n current = workflows[0];\n } else {\n current = workflows[idx];\n }\n }\n\n // 세션 시작\n const sessionId = randomUUID().slice(0, 8);\n let turnCount = 0;\n const history: Array<{ role: string; content: string }> = [];\n\n console.log();\n console.log(chalk.cyan(\"─\".repeat(42)));\n console.log(chalk.white.bold(` ${current.workflow_name}`));\n console.log(chalk.cyan(\"─\".repeat(42)));\n console.log(chalk.gray(\" 메시지를 입력하세요. /help 로 도움말.\\n\"));\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const getPrompt = () => chalk.cyan(\"❯ \");\n\n const processInput = async (line: string) => {\n const input = line.trim();\n if (!input) return;\n\n // 슬래시 커맨드\n if (input.startsWith(\"/\")) {\n const [cmd, ...args] = input.slice(1).split(\" \");\n\n switch (cmd.toLowerCase()) {\n case \"exit\":\n case \"quit\":\n case \"q\":\n console.log(chalk.gray(\"\\n 종료합니다.\\n\"));\n rl.close();\n process.exit(0);\n break;\n\n case \"help\":\n case \"h\":\n printHelp();\n break;\n\n case \"clear\":\n case \"cls\":\n console.clear();\n console.log(chalk.white.bold(` ${current.workflow_name}`));\n console.log(chalk.cyan(\"─\".repeat(42)));\n break;\n\n case \"workflows\":\n case \"wf\":\n console.log();\n workflows.forEach((w, i) => {\n const marker = w.id === current.id ? chalk.green(\"▸\") : \" \";\n console.log(` ${marker} ${chalk.cyan(String(i + 1).padStart(2))} ${w.workflow_name}`);\n });\n console.log(chalk.gray(\"\\n /switch <번호> 로 전환\\n\"));\n break;\n\n case \"switch\":\n case \"sw\": {\n const num = parseInt(args[0]);\n if (isNaN(num) || num < 1 || num > workflows.length) {\n console.log(chalk.yellow(` 1~${workflows.length} 사이 번호를 입력하세요`));\n } else {\n current = workflows[num - 1];\n turnCount = 0;\n history.length = 0;\n console.log(chalk.green(`\\n 전환: ${current.workflow_name}\\n`));\n }\n break;\n }\n\n case \"history\":\n case \"hist\":\n if (history.length === 0) {\n console.log(chalk.gray(\" 대화 이력이 없습니다.\\n\"));\n } else {\n console.log();\n for (const h of history) {\n const label = h.role === \"user\" ? chalk.cyan(\"나\") : chalk.green(\"AI\");\n const text = h.content.length > 80 ? h.content.slice(0, 80) + \"...\" : h.content;\n console.log(` ${label}: ${text}`);\n }\n console.log();\n }\n break;\n\n case \"info\":\n console.log(`\n ${chalk.gray(\"서버:\")} ${server}\n ${chalk.gray(\"사용자:\")} ${auth.username}\n ${chalk.gray(\"워크플로우:\")} ${current.workflow_name}\n ${chalk.gray(\"세션:\")} ${sessionId}\n ${chalk.gray(\"턴:\")} ${turnCount}\n`);\n break;\n\n default:\n console.log(chalk.yellow(` 알 수 없는 커맨드: /${cmd}. /help 참고`));\n }\n\n rl.prompt();\n return;\n }\n\n // 워크플로우 실행\n turnCount++;\n const interactionId = `${sessionId}_t${turnCount}`;\n history.push({ role: \"user\", content: input });\n\n // 스피너 시작\n process.stdout.write(chalk.gray(\" thinking...\"));\n\n try {\n const stream = await executeWorkflowStream({\n workflow_id: current.id,\n workflow_name: current.workflow_name,\n input_data: input,\n interaction_id: interactionId,\n });\n\n // 스피너 지우기\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n\n let fullResponse = \"\";\n let hasOutput = false;\n\n await parseSSEStream(\n stream,\n (event: SSEEvent) => {\n if ((event.type === \"token\" || !event.type) && event.content) {\n if (!hasOutput) {\n hasOutput = true;\n console.log();\n }\n process.stdout.write(event.content);\n fullResponse += event.content;\n } else if (event.type === \"error\") {\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n printError(event.error ?? event.content ?? \"오류\");\n }\n },\n () => {\n if (hasOutput) {\n // 응답 끝 — 마크다운 렌더링은 전체 텍스트에 적용\n console.log();\n console.log();\n }\n if (fullResponse) {\n history.push({ role: \"assistant\", content: fullResponse });\n }\n },\n (err) => {\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n printError(`스트리밍 오류: ${err.message}`);\n }\n );\n } catch (err: unknown) {\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n const msg =\n (err as { response?: { data?: { detail?: string } } })?.response?.data\n ?.detail ?? (err as Error).message;\n printError(`실행 실패: ${msg}`);\n }\n\n rl.prompt();\n };\n\n rl.setPrompt(getPrompt());\n rl.prompt();\n\n rl.on(\"line\", (line) => {\n // async 처리 — 입력 비활성화 후 완료되면 다시 prompt\n processInput(line).then(() => {\n // prompt는 processInput 내부에서 호출\n });\n });\n\n rl.on(\"close\", () => {\n console.log(chalk.gray(\"\\n 종료합니다.\\n\"));\n process.exit(0);\n });\n\n // Ctrl+C 깔끔하게\n process.on(\"SIGINT\", () => {\n console.log(chalk.gray(\"\\n 종료합니다.\\n\"));\n process.exit(0);\n });\n}\n\nexport function registerChatCommand(program: import(\"commander\").Command): void {\n program\n .command(\"chat [workflow-id]\")\n .description(\"인터랙티브 대화 모드\")\n .action((workflowId) => chat(workflowId));\n}\n","/**\n * OPEN XGEN — AI 에이전트 (메인 인터페이스)\n * Claude Code / Gemini CLI 스타일 — 채팅이 곧 인터페이스\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { getDefaultProvider, getServer, getAuth, getEnvironments, getActiveEnvironment } from \"../config/store.js\";\nimport { createLLMClient, streamChat, type Message, type TokenUsage } from \"../agent/llm.js\";\nimport { getAllToolDefs, executeTool, getToolNames } from \"../agent/tools/index.js\";\nimport { definitions as xgenToolDefs, execute as xgenExecute, isXgenTool } from \"../agent/tools/xgen-api.js\";\nimport { McpManager, loadMcpConfig } from \"../mcp/client.js\";\nimport { guidedProviderSetup } from \"./provider.js\";\nimport { box, ask, welcome } from \"../utils/ui.js\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nfunction buildSystemPrompt(): string {\n const server = getServer();\n const auth = getAuth();\n const env = getActiveEnvironment();\n\n let prompt = `You are OPEN XGEN, a terminal AI agent. Act like Claude Code.\n\nABSOLUTE RULES — VIOLATING THESE IS FAILURE:\n1. NEVER show menus, numbered options, or \"다음 중 선택\" style responses. NEVER.\n2. NEVER ask \"무엇을 도와드릴까요\" or \"어떤 작업을 하시겠습니까\". NEVER.\n3. When the user asks something → call the tool IMMEDIATELY. No preamble.\n4. After tool results → show the data directly. One sentence summary max.\n5. If user says a number → it refers to the previous list item. Act on it.\n6. If user says \"실행\" → execute immediately with context you have. Don't ask for confirmation.\n7. If ambiguous → make your best guess and do it. Don't ask.\n8. Response language: match the user. Korean → Korean.\n9. Max response: 1-2 sentences + data. No filler, no explanations unless asked.\n10. You are NOT a menu system. You are a doer. Do, don't ask.\n\nEXAMPLES OF BAD RESPONSES (NEVER DO THIS):\n- \"다음과 같은 작업이 가능합니다: 1. 목록 2. 실행...\"\n- \"원하는 작업을 선택해 주세요\"\n- \"어떻게 도와드릴까요?\"\n- Any numbered list of options\n\nEXAMPLES OF GOOD RESPONSES:\n- User: \"워크플로우\" → [call xgen_workflow_list] → show list\n- User: \"6\" → [call xgen_workflow_run for item 6] → show result\n- User: \"컬렉션\" → [call xgen_collection_list] → show list\n- User: \"이 폴더 뭐있어\" → [call list_files] → show files`;\n\n if (server && auth) {\n prompt += `\n\nXGEN CONNECTED: ${server} as ${auth.username}\n\nYou have full access to XGEN platform. Available tools:\n\nWORKFLOW: xgen_workflow_list, xgen_workflow_run (모든 워크플로우 실행 가능, 배포 무관), xgen_workflow_info, xgen_execution_history, xgen_workflow_performance, xgen_workflow_store, xgen_workflow_generate (자연어로 워크플로우 자동 생성)\nDOCUMENTS: xgen_collection_list, xgen_document_list, xgen_document_upload\nNODES: xgen_node_list, xgen_node_search, xgen_node_categories\nPROMPTS: xgen_prompt_list\nTOOLS: xgen_tool_store, xgen_user_tools\nSCHEDULE: xgen_schedule_list\nTRACE: xgen_trace_list, xgen_interaction_list\nMCP: xgen_mcp_sessions\nONTOLOGY: xgen_graph_rag_query, xgen_graph_stats\nSERVER: xgen_server_status\n\nWhen user says a number → find it from previous list. \"실행\" → execute immediately.`;\n } else {\n prompt += `\\nXGEN: Not connected. User can run /connect to connect.`;\n }\n\n return prompt;\n}\n\n// ── 대화 이력 ──\nconst CONV_DIR = join(homedir(), \".xgen\", \"conversations\");\n\nfunction ensureConvDir(): void {\n if (!existsSync(CONV_DIR)) mkdirSync(CONV_DIR, { recursive: true });\n}\n\nfunction saveConversation(messages: Message[], name?: string): string {\n ensureConvDir();\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n const filename = `${name || ts}.json`;\n const filepath = join(CONV_DIR, filename);\n // system 프롬프트 제외하고 저장\n const toSave = messages.filter((m) => m.role !== \"system\");\n writeFileSync(filepath, JSON.stringify(toSave, null, 2), \"utf-8\");\n return filename;\n}\n\nfunction listConversations(): { name: string; date: string; msgs: number }[] {\n ensureConvDir();\n const files = readdirSync(CONV_DIR).filter((f) => f.endsWith(\".json\")).sort().reverse();\n return files.slice(0, 20).map((f) => {\n try {\n const data = JSON.parse(readFileSync(join(CONV_DIR, f), \"utf-8\")) as Message[];\n const userMsgs = data.filter((m) => m.role === \"user\").length;\n return { name: f.replace(\".json\", \"\"), date: f.slice(0, 10), msgs: userMsgs };\n } catch {\n return { name: f.replace(\".json\", \"\"), date: \"\", msgs: 0 };\n }\n });\n}\n\nfunction loadConversation(name: string): Message[] | null {\n const filepath = join(CONV_DIR, `${name}.json`);\n if (!existsSync(filepath)) return null;\n try {\n return JSON.parse(readFileSync(filepath, \"utf-8\")) as Message[];\n } catch {\n return null;\n }\n}\n\nlet mcpManager: McpManager | null = null;\n\n// 세션 토큰 추적\nconst sessionUsage = { prompt: 0, completion: 0, total: 0, calls: 0 };\n\nfunction formatTokens(n: number): string {\n if (n >= 1_000_000) return (n / 1_000_000).toFixed(1) + \"M\";\n if (n >= 1_000) return (n / 1_000).toFixed(1) + \"k\";\n return String(n);\n}\n\nfunction showUsage(usage: TokenUsage | null): void {\n if (!usage || usage.totalTokens === 0) return;\n sessionUsage.prompt += usage.promptTokens;\n sessionUsage.completion += usage.completionTokens;\n sessionUsage.total += usage.totalTokens;\n sessionUsage.calls++;\n console.log(chalk.gray(` tokens: ${formatTokens(usage.promptTokens)}→${formatTokens(usage.completionTokens)} (session: ${formatTokens(sessionUsage.total)})`));\n}\n\nexport async function agentRepl(): Promise<void> {\n // ── 로고 ──\n console.log(chalk.cyan(`\n ██████ ██████ ███████ ███ ██\n ██ ██ ██ ██ ██ ████ ██\n ██ ██ ██████ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██\n ██████ ██ ███████ ██ ████`) +\n chalk.white.bold(`\n ██ ██ ██████ ███████ ███ ██\n ██ ██ ██ ██ ████ ██\n ███ ██ ███ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██ ██\n ██ ██ ██████ ███████ ██ ████`));\n console.log();\n\n // ── 1단계: 프로바이더 ──\n let provider = getDefaultProvider();\n if (!provider) {\n provider = await guidedProviderSetup();\n if (!provider) process.exit(1);\n }\n\n // ── 2단계: XGEN 서버 연결 (미연결이면 자동 가이드) ──\n let server = getServer();\n let auth = getAuth();\n\n if (!server || !auth) {\n console.log(chalk.yellow(\" XGEN 서버에 연결되지 않았습니다.\"));\n console.log(chalk.gray(\" 연결하면 워크플로우, 컬렉션, 온톨로지 등 XGEN 기능을 사용할 수 있습니다.\\n\"));\n\n const { ask: askOnce } = await import(\"../utils/ui.js\");\n const doConnect = await askOnce(chalk.white(\" XGEN 서버에 연결할까요? (Y/n): \"));\n if (doConnect.toLowerCase() !== \"n\") {\n await connectServer();\n server = getServer();\n auth = getAuth();\n } else {\n console.log(chalk.gray(\" 나중에 /connect 로 연결할 수 있습니다.\\n\"));\n }\n } else {\n // 저장된 인증이 있으면 유효성 확인\n try {\n const { apiValidate } = await import(\"../api/auth.js\");\n const valid = await apiValidate(auth.accessToken);\n if (!valid.valid) {\n // 토큰 갱신 시도\n const { apiRefresh } = await import(\"../api/auth.js\");\n const refreshed = await apiRefresh(auth.refreshToken);\n if (refreshed.success && refreshed.access_token) {\n const { setAuth } = await import(\"../config/store.js\");\n setAuth({ ...auth, accessToken: refreshed.access_token });\n auth = getAuth();\n }\n }\n } catch {\n // 검증 실패해도 계속 (오프라인일 수 있음)\n }\n }\n\n const client = createLLMClient(provider);\n\n // 도구 조합: 기본 + XGEN + MCP\n const allTools: ChatCompletionTool[] = [...getAllToolDefs(), ...xgenToolDefs];\n const builtinNames = getToolNames();\n\n // MCP\n const mcpConfig = loadMcpConfig();\n if (mcpConfig && Object.keys(mcpConfig.mcpServers).length > 0) {\n mcpManager = new McpManager();\n try {\n await mcpManager.startAll(mcpConfig);\n if (mcpManager.serverCount > 0) allTools.push(...mcpManager.getAllTools());\n } catch { /* MCP 실패해도 계속 */ }\n }\n\n const messages: Message[] = [{ role: \"system\", content: buildSystemPrompt() }];\n\n // ── 헤더 ──\n const env = getActiveEnvironment();\n\n console.log(chalk.gray(` model ${provider.model}`));\n if (server && auth) {\n console.log(chalk.gray(` xgen ${chalk.green(\"●\")} ${auth.username}@${server.replace(\"https://\", \"\").replace(\"http://\", \"\")}`));\n } else {\n console.log(chalk.gray(` xgen ${chalk.red(\"○\")} 미연결`));\n }\n console.log(chalk.gray(` cwd ${process.cwd()}`));\n console.log();\n\n // XGEN 연결 시 자동으로 상태 요약 표시\n if (server && auth) {\n try {\n const [wfRes, colRes] = await Promise.allSettled([\n import(\"../api/workflow.js\").then((m) => m.getWorkflowListDetail()),\n import(\"../api/document.js\").then((m) => m.listCollections()),\n ]);\n const wfCount = wfRes.status === \"fulfilled\" ? wfRes.value.length : 0;\n const colCount = colRes.status === \"fulfilled\" ? colRes.value.length : 0;\n const deployed = wfRes.status === \"fulfilled\" ? wfRes.value.filter((w: Record<string, unknown>) => w.is_deployed).length : 0;\n console.log(chalk.gray(` ─────────────────────────────────`));\n console.log(chalk.gray(` 워크플로우 ${chalk.white(String(wfCount))}개 (배포 ${deployed}) · 컬렉션 ${chalk.white(String(colCount))}개`));\n console.log(chalk.gray(` ─────────────────────────────────`));\n console.log();\n console.log(chalk.gray(` \"워크플로우 목록\", \"컬렉션\", \"6번 실행\" 등 자유롭게 입력`));\n console.log(chalk.gray(` /dashboard 로 TUI 대시보드 · /help 전체 도움말`));\n } catch {\n console.log(chalk.gray(` 무엇이든 물어보세요. /help`));\n }\n } else {\n console.log(chalk.gray(` 무엇이든 물어보세요. /help`));\n }\n console.log();\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n let rlClosed = false;\n rl.on(\"close\", () => { rlClosed = true; });\n\n const askUser = (): Promise<string> =>\n new Promise((resolve) => {\n if (rlClosed) { resolve(\"/exit\"); return; }\n rl.question(chalk.cyan(\" ❯ \"), (a) => resolve(a?.trim() ?? \"/exit\"));\n });\n\n process.on(\"SIGINT\", () => {\n console.log(chalk.gray(\"\\n 👋\\n\"));\n mcpManager?.stopAll();\n rl.close();\n process.exit(0);\n });\n\n while (true) {\n const input = await askUser();\n if (!input) continue;\n\n // ── 슬래시 커맨드 ──\n if (input === \"/exit\" || input === \"exit\") {\n console.log(chalk.gray(\"\\n 👋\\n\"));\n mcpManager?.stopAll();\n rl.close();\n break;\n }\n\n if (input === \"/help\") {\n console.log(`\n ${chalk.bold(\"슬래시 커맨드\")}\n ${chalk.cyan(\"/connect\")} XGEN 서버 연결 + 로그인\n ${chalk.cyan(\"/env\")} 환경 전환 (본사/제주/롯데몰)\n ${chalk.cyan(\"/provider\")} 프로바이더 변경\n ${chalk.cyan(\"/dashboard\")} TUI 대시보드 (4분할 화면)\n ${chalk.cyan(\"/tools\")} 사용 가능한 도구 목록\n ${chalk.cyan(\"/status\")} 현재 연결 상태\n ${chalk.cyan(\"/save [이름]\")} 대화 저장\n ${chalk.cyan(\"/load\")} 이전 대화 불러오기\n ${chalk.cyan(\"/conversations\")} 저장된 대화 목록\n ${chalk.cyan(\"/usage\")} 토큰 사용량\n ${chalk.cyan(\"/clear\")} 대화 초기화\n ${chalk.cyan(\"/exit\")} 종료\n`);\n continue;\n }\n\n if (input === \"/clear\") {\n messages.length = 0;\n messages.push({ role: \"system\", content: buildSystemPrompt() });\n sessionUsage.prompt = 0; sessionUsage.completion = 0; sessionUsage.total = 0; sessionUsage.calls = 0;\n console.log(chalk.gray(\" 대화 초기화됨.\\n\"));\n continue;\n }\n\n if (input.startsWith(\"/save\")) {\n const name = input.slice(5).trim() || undefined;\n const filename = saveConversation(messages, name);\n console.log(chalk.green(` ✓ 저장됨: ${filename}\\n`));\n continue;\n }\n\n if (input === \"/conversations\" || input === \"/convs\") {\n const convs = listConversations();\n if (!convs.length) {\n console.log(chalk.gray(\"\\n 저장된 대화 없음.\\n\"));\n } else {\n console.log();\n convs.forEach((c, i) => {\n console.log(` ${chalk.cyan(`${i + 1}.`)} ${c.name} ${chalk.gray(`(${c.msgs}턴)`)}`);\n });\n console.log();\n }\n continue;\n }\n\n if (input === \"/load\") {\n const convs = listConversations();\n if (!convs.length) {\n console.log(chalk.gray(\"\\n 저장된 대화 없음.\\n\"));\n continue;\n }\n console.log();\n convs.forEach((c, i) => {\n console.log(` ${chalk.cyan(`${i + 1}.`)} ${c.name} ${chalk.gray(`(${c.msgs}턴)`)}`);\n });\n console.log();\n const choice = await askUser();\n const ci = parseInt(choice) - 1;\n if (ci >= 0 && ci < convs.length) {\n const loaded = loadConversation(convs[ci].name);\n if (loaded) {\n messages.length = 0;\n messages.push({ role: \"system\", content: buildSystemPrompt() });\n messages.push(...loaded);\n console.log(chalk.green(` ✓ \"${convs[ci].name}\" 불러옴 (${loaded.filter((m) => m.role === \"user\").length}턴)\\n`));\n }\n }\n continue;\n }\n\n if (input === \"/usage\") {\n console.log(`\\n ${chalk.bold(\"세션 토큰 사용량\")}`);\n console.log(` 프롬프트: ${formatTokens(sessionUsage.prompt)}`);\n console.log(` 응답: ${formatTokens(sessionUsage.completion)}`);\n console.log(` 합계: ${formatTokens(sessionUsage.total)}`);\n console.log(` API 호출: ${sessionUsage.calls}회\\n`);\n continue;\n }\n\n if (input === \"/status\") {\n const p = getDefaultProvider();\n const s = getServer();\n const a = getAuth();\n const e = getActiveEnvironment();\n console.log();\n console.log(` ${chalk.bold(\"프로바이더\")} ${p ? `${p.name} · ${p.model}` : chalk.red(\"미설정\")}`);\n console.log(` ${chalk.bold(\"서버\")} ${s && a ? `${a.username}@${s.replace(\"https://\", \"\")}` : chalk.red(\"미연결\")}`);\n console.log(` ${chalk.bold(\"환경\")} ${e?.name ?? \"없음\"} (${getEnvironments().length}개 등록)`);\n if (mcpManager?.serverCount) {\n console.log(` ${chalk.bold(\"MCP\")} ${mcpManager.getServerNames().join(\", \")}`);\n }\n console.log();\n continue;\n }\n\n if (input === \"/tools\") {\n console.log(`\\n ${chalk.bold(\"코딩\")} ${builtinNames.join(\", \")}`);\n console.log(` ${chalk.bold(\"XGEN\")} ${xgenToolDefs.map((t) => t.function.name).join(\", \")}`);\n if (mcpManager?.serverCount) {\n console.log(` ${chalk.bold(\"MCP\")} ${mcpManager.getAllTools().map((t) => t.function.name).join(\", \")}`);\n }\n console.log();\n continue;\n }\n\n if (input === \"/connect\") {\n rl.pause();\n await connectServer();\n rl.resume();\n messages[0] = { role: \"system\", content: buildSystemPrompt() };\n continue;\n }\n\n if (input === \"/env\") {\n rl.pause();\n await switchEnv();\n rl.resume();\n messages[0] = { role: \"system\", content: buildSystemPrompt() };\n continue;\n }\n\n if (input === \"/provider\") {\n rl.pause();\n const { guidedProviderSetup: setup } = await import(\"./provider.js\");\n await setup();\n rl.resume();\n console.log(chalk.gray(\" 프로바이더 변경됨. /exit 후 재시작하세요.\\n\"));\n continue;\n }\n\n if (input === \"/dashboard\" || input === \"/dash\") {\n console.log(chalk.gray(`\\n 대시보드는 별도로 실행하세요:`));\n console.log(chalk.white(` $ xgen dash\\n`));\n continue;\n }\n\n // ── AI 대화 ──\n messages.push({ role: \"user\", content: input });\n\n try {\n await runLoop(client, provider.model, messages, allTools);\n } catch (err) {\n const msg = (err as Error).message || String(err);\n if (msg.includes(\"401\") || msg.includes(\"API key\") || msg.includes(\"Unauthorized\")) {\n console.log(chalk.red(`\\n ✗ API 키가 유효하지 않습니다. /provider 로 재설정하세요.\\n`));\n } else if (msg.includes(\"429\") || msg.includes(\"rate limit\")) {\n console.log(chalk.yellow(`\\n ⚠ 요청 한도 초과. 잠시 후 다시 시도하세요.\\n`));\n } else if (msg.includes(\"ECONNREFUSED\") || msg.includes(\"ENOTFOUND\")) {\n console.log(chalk.red(`\\n ✗ 프로바이더 서버에 연결할 수 없습니다. URL/네트워크 확인.\\n`));\n } else {\n console.log(chalk.red(`\\n 오류: ${msg}\\n`));\n }\n messages.pop(); // 실패한 user 메시지 제거 (재시도 가능)\n }\n }\n}\n\nasync function runLoop(\n client: ReturnType<typeof createLLMClient>,\n model: string,\n messages: Message[],\n tools: ChatCompletionTool[]\n): Promise<void> {\n for (let i = 0; i < 20; i++) {\n let first = true;\n const result = await streamChat(client, model, messages, tools, (delta) => {\n if (first) { process.stdout.write(chalk.green(\"\\n \") + \"\"); first = false; }\n process.stdout.write(delta);\n });\n\n if (result.content) process.stdout.write(\"\\n\\n\");\n\n if (result.toolCalls.length === 0) {\n if (result.content) messages.push({ role: \"assistant\", content: result.content });\n showUsage(result.usage);\n return;\n }\n\n messages.push({\n role: \"assistant\",\n content: result.content || null,\n tool_calls: result.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n });\n\n for (const tc of result.toolCalls) {\n let args: Record<string, unknown>;\n try { args = JSON.parse(tc.arguments); } catch { args = {}; }\n\n const shortArgs = Object.entries(args).map(([k, v]) => {\n const s = String(v);\n return s.length > 40 ? s.slice(0, 40) + \"…\" : s;\n }).join(\", \");\n console.log(chalk.dim(` ┌ ${tc.name}(${shortArgs})`));\n\n let toolResult: string;\n if (isXgenTool(tc.name)) {\n toolResult = await xgenExecute(tc.name, args);\n } else if (mcpManager?.isMcpTool(tc.name)) {\n toolResult = await mcpManager.callTool(tc.name, args);\n } else {\n toolResult = await executeTool(tc.name, args);\n }\n\n const truncated = toolResult.length > 8000 ? toolResult.slice(0, 8000) + \"\\n…(truncated)\" : toolResult;\n // 도구 결과 미리보기 (1줄)\n const preview = toolResult.split(\"\\n\")[0].slice(0, 60);\n console.log(chalk.dim(` └ ${preview}${toolResult.length > 60 ? \"…\" : \"\"}`));\n messages.push({ role: \"tool\", tool_call_id: tc.id, content: truncated });\n }\n }\n console.log(chalk.yellow(\"\\n 최대 반복 횟수 도달.\\n\"));\n}\n\nasync function connectServer(): Promise<void> {\n const { setServer, setAuth } = await import(\"../config/store.js\");\n const { addEnvironment } = await import(\"../config/store.js\");\n\n console.log(chalk.bold(\"\\n XGEN 서버 연결\\n\"));\n\n const presets = [\n { id: \"hq\", name: \"xgen.x2bee.com\", url: \"https://xgen.x2bee.com\", email: \"admin@plateer.com\" },\n { id: \"jeju\", name: \"jeju-xgen.x2bee.com\", url: \"https://jeju-xgen.x2bee.com\", email: \"admin@plateer.com\" },\n { id: \"lotte\", name: \"lotteimall-xgen.x2bee.com\", url: \"https://lotteimall-xgen.x2bee.com\" },\n ];\n presets.forEach((p, i) => console.log(` ${chalk.cyan(`${i + 1}.`)} ${p.url}`));\n console.log(` ${chalk.cyan(\"4.\")} 직접 입력`);\n console.log();\n\n const choice = await ask(chalk.cyan(\" ❯ \"));\n let url: string;\n let email: string | undefined;\n const ci = parseInt(choice) - 1;\n if (ci >= 0 && ci < presets.length) {\n url = presets[ci].url;\n email = presets[ci].email;\n addEnvironment({ ...presets[ci], description: presets[ci].name });\n } else {\n url = await ask(chalk.white(\" URL: \"));\n if (!url) return;\n }\n\n setServer(url);\n console.log(chalk.green(` ✓ ${url}\\n`));\n\n const inputEmail = email || await ask(chalk.white(\" 이메일: \"));\n const pw = await ask(chalk.white(\" 비밀번호: \"));\n if (!inputEmail || !pw) return;\n\n try {\n const { apiLogin } = await import(\"../api/auth.js\");\n const result = await apiLogin(inputEmail, pw);\n if (result.success && result.access_token) {\n setAuth({ accessToken: result.access_token, refreshToken: result.refresh_token ?? \"\", userId: result.user_id ?? \"\", username: result.username ?? \"\", isAdmin: false, expiresAt: null });\n console.log(chalk.green(` ✓ ${result.username} 로그인됨\\n`));\n } else {\n console.log(chalk.red(` ✗ ${result.message}\\n`));\n }\n } catch (err) {\n console.log(chalk.red(` ✗ ${(err as Error).message}\\n`));\n }\n}\n\nasync function switchEnv(): Promise<void> {\n const { getEnvironments: getEnvs, switchEnvironment } = await import(\"../config/store.js\");\n const envs = getEnvs();\n if (!envs.length) {\n console.log(chalk.gray(\"\\n 환경 없음. /connect로 먼저 연결하세요.\\n\"));\n return;\n }\n const active = getActiveEnvironment();\n console.log();\n envs.forEach((e, i) => {\n const mark = e.id === active?.id ? chalk.green(\"● \") : \" \";\n console.log(` ${mark}${chalk.cyan(`${i + 1}.`)} ${e.name} ${chalk.gray(e.url)}`);\n });\n console.log();\n const ci = parseInt(await ask(chalk.cyan(\" ❯ \"))) - 1;\n if (ci >= 0 && ci < envs.length) {\n switchEnvironment(envs[ci].id);\n console.log(chalk.green(` ✓ ${envs[ci].name}\\n`));\n }\n}\n\nexport function registerAgentCommand(program: Command): void {\n program\n .command(\"agent\")\n .description(\"OPEN XGEN AI 에이전트\")\n .action(async () => { await agentRepl(); });\n}\n","/**\n * LLM 클라이언트 — OpenAI SDK 기반 멀티 프로바이더\n */\nimport OpenAI from \"openai\";\nimport type { ChatCompletionMessageParam, ChatCompletionTool } from \"openai/resources/chat/completions\";\nimport type { ProviderConfig } from \"../config/store.js\";\n\nexport type { ChatCompletionMessageParam as Message, ChatCompletionTool as ToolDef };\n\nexport function createLLMClient(provider: ProviderConfig): OpenAI {\n const opts: ConstructorParameters<typeof OpenAI>[0] = {\n apiKey: provider.apiKey || \"ollama\",\n };\n\n if (provider.baseUrl) {\n opts.baseURL = provider.baseUrl;\n }\n\n return new OpenAI(opts);\n}\n\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\nexport interface StreamResult {\n content: string;\n toolCalls: {\n id: string;\n name: string;\n arguments: string;\n }[];\n usage: TokenUsage | null;\n}\n\n/**\n * 스트리밍 채팅 — content를 실시간 출력하고 tool_calls를 수집\n */\nexport async function streamChat(\n client: OpenAI,\n model: string,\n messages: ChatCompletionMessageParam[],\n tools?: ChatCompletionTool[],\n onDelta?: (text: string) => void\n): Promise<StreamResult> {\n const params: OpenAI.ChatCompletionCreateParamsStreaming = {\n model,\n messages,\n stream: true,\n stream_options: { include_usage: true },\n };\n\n if (tools && tools.length > 0) {\n params.tools = tools;\n }\n\n const stream = await client.chat.completions.create(params);\n\n let content = \"\";\n let usage: TokenUsage | null = null;\n const toolCallMap = new Map<number, { id: string; name: string; arguments: string }>();\n\n for await (const chunk of stream) {\n // usage는 마지막 청크에 포함\n if (chunk.usage) {\n usage = {\n promptTokens: chunk.usage.prompt_tokens ?? 0,\n completionTokens: chunk.usage.completion_tokens ?? 0,\n totalTokens: chunk.usage.total_tokens ?? 0,\n };\n }\n\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n if (delta.content) {\n content += delta.content;\n onDelta?.(delta.content);\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n if (!toolCallMap.has(idx)) {\n toolCallMap.set(idx, { id: tc.id ?? \"\", name: tc.function?.name ?? \"\", arguments: \"\" });\n }\n const entry = toolCallMap.get(idx)!;\n if (tc.id) entry.id = tc.id;\n if (tc.function?.name) entry.name = tc.function.name;\n if (tc.function?.arguments) entry.arguments += tc.function.arguments;\n }\n }\n }\n\n return {\n content,\n toolCalls: [...toolCallMap.values()],\n usage,\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"file_read\",\n description: \"파일 내용을 읽습니다. 줄 번호가 포함됩니다.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"파일 경로\" },\n start_line: { type: \"number\", description: \"시작 줄 번호 (선택)\" },\n end_line: { type: \"number\", description: \"끝 줄 번호 (선택)\" },\n },\n required: [\"path\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = args.path as string;\n const startLine = (args.start_line as number) || 1;\n const endLine = args.end_line as number | undefined;\n\n try {\n const content = readFileSync(path, \"utf-8\");\n const lines = content.split(\"\\n\");\n const sliced = lines.slice(startLine - 1, endLine ?? lines.length);\n return sliced.map((line, i) => `${startLine + i}\\t${line}`).join(\"\\n\");\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","import { writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"file_write\",\n description: \"파일을 생성하거나 덮어씁니다.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"파일 경로\" },\n content: { type: \"string\", description: \"파일 내용\" },\n },\n required: [\"path\", \"content\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = args.path as string;\n const content = args.content as string;\n\n try {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, content, \"utf-8\");\n return `파일 작성 완료: ${path}`;\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"file_edit\",\n description: \"파일에서 특정 텍스트를 찾아 교체합니다.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"파일 경로\" },\n old_text: { type: \"string\", description: \"교체할 기존 텍스트\" },\n new_text: { type: \"string\", description: \"새 텍스트\" },\n },\n required: [\"path\", \"old_text\", \"new_text\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = args.path as string;\n const oldText = args.old_text as string;\n const newText = args.new_text as string;\n\n try {\n const content = readFileSync(path, \"utf-8\");\n if (!content.includes(oldText)) {\n return `Error: 텍스트를 찾을 수 없습니다`;\n }\n const updated = content.replace(oldText, newText);\n writeFileSync(path, updated, \"utf-8\");\n return `파일 수정 완료: ${path}`;\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","import { execSync } from \"node:child_process\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"bash\",\n description: \"셸 명령어를 실행합니다. stdout + stderr를 반환합니다.\",\n parameters: {\n type: \"object\",\n properties: {\n command: { type: \"string\", description: \"실행할 명령어\" },\n },\n required: [\"command\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const command = args.command as string;\n\n try {\n const output = execSync(command, {\n encoding: \"utf-8\",\n timeout: 30_000,\n maxBuffer: 1024 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return output || \"(no output)\";\n } catch (err) {\n const e = err as { stdout?: string; stderr?: string; message: string };\n return (e.stdout || \"\") + (e.stderr || \"\") || `Error: ${e.message}`;\n }\n}\n","import { execSync } from \"node:child_process\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"grep\",\n description: \"파일에서 패턴을 검색합니다 (재귀, 줄 번호 포함).\",\n parameters: {\n type: \"object\",\n properties: {\n pattern: { type: \"string\", description: \"검색 패턴 (정규식)\" },\n path: { type: \"string\", description: \"검색 디렉토리 또는 파일 (기본: .)\" },\n glob: { type: \"string\", description: \"파일 필터 (예: *.ts)\" },\n },\n required: [\"pattern\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const pattern = args.pattern as string;\n const path = (args.path as string) || \".\";\n const glob = args.glob as string | undefined;\n\n try {\n let cmd = `grep -rn --color=never \"${pattern.replace(/\"/g, '\\\\\"')}\" \"${path}\"`;\n if (glob) cmd += ` --include=\"${glob}\"`;\n cmd += \" | head -50\";\n\n const output = execSync(cmd, {\n encoding: \"utf-8\",\n timeout: 10_000,\n maxBuffer: 512 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return output || \"일치하는 결과 없음\";\n } catch {\n return \"일치하는 결과 없음\";\n }\n}\n","import { execSync } from \"node:child_process\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"list_files\",\n description: \"디렉토리의 파일/폴더 목록을 반환합니다. glob 패턴 지원.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"디렉토리 경로 (기본: .)\" },\n pattern: { type: \"string\", description: \"glob 패턴 (예: **/*.ts)\" },\n },\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = (args.path as string) || \".\";\n const pattern = args.pattern as string | undefined;\n\n try {\n let cmd: string;\n if (pattern) {\n cmd = `find \"${path}\" -name \"${pattern}\" -type f | head -100`;\n } else {\n cmd = `ls -la \"${path}\"`;\n }\n const output = execSync(cmd, {\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return output || \"(empty)\";\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","/**\n * Sandbox — 격리된 환경에서 코드 실행\n * npm (Node.js) / python 지원\n */\nimport { execSync } from \"node:child_process\";\nimport { mkdirSync, writeFileSync, existsSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nconst SANDBOX_DIR = join(tmpdir(), \"xgen-sandbox\");\n\nfunction ensureSandbox(): string {\n if (!existsSync(SANDBOX_DIR)) {\n mkdirSync(SANDBOX_DIR, { recursive: true });\n }\n return SANDBOX_DIR;\n}\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"sandbox_run\",\n description:\n \"격리된 샌드박스에서 코드를 실행합니다. Node.js 또는 Python 코드를 안전하게 실행할 수 있습니다. npm 패키지 설치도 가능합니다.\",\n parameters: {\n type: \"object\",\n properties: {\n language: {\n type: \"string\",\n enum: [\"javascript\", \"typescript\", \"python\"],\n description: \"실행할 언어\",\n },\n code: { type: \"string\", description: \"실행할 코드\" },\n packages: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"설치할 패키지 (npm 또는 pip)\",\n },\n },\n required: [\"language\", \"code\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const language = args.language as string;\n const code = args.code as string;\n const packages = (args.packages as string[]) ?? [];\n\n const dir = ensureSandbox();\n const runId = `run_${Date.now()}`;\n const runDir = join(dir, runId);\n mkdirSync(runDir, { recursive: true });\n\n try {\n // 패키지 설치\n if (packages.length > 0) {\n if (language === \"python\") {\n const pkgList = packages.join(\" \");\n execSync(`pip install ${pkgList}`, {\n cwd: runDir,\n encoding: \"utf-8\",\n timeout: 60_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } else {\n // Node.js — npm init + install\n execSync(\"npm init -y\", { cwd: runDir, encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n const pkgList = packages.join(\" \");\n execSync(`npm install ${pkgList}`, {\n cwd: runDir,\n encoding: \"utf-8\",\n timeout: 60_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n }\n }\n\n // 코드 실행\n let cmd: string;\n let filename: string;\n\n if (language === \"python\") {\n filename = \"script.py\";\n writeFileSync(join(runDir, filename), code, \"utf-8\");\n cmd = `python3 ${filename}`;\n } else if (language === \"typescript\") {\n filename = \"script.ts\";\n writeFileSync(join(runDir, filename), code, \"utf-8\");\n cmd = `npx tsx ${filename}`;\n } else {\n filename = \"script.mjs\";\n writeFileSync(join(runDir, filename), code, \"utf-8\");\n cmd = `node ${filename}`;\n }\n\n const output = execSync(cmd, {\n cwd: runDir,\n encoding: \"utf-8\",\n timeout: 30_000,\n maxBuffer: 1024 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n return output || \"(no output)\";\n } catch (err) {\n const e = err as { stdout?: string; stderr?: string; message: string };\n return (e.stdout || \"\") + (e.stderr || \"\") || `Error: ${e.message}`;\n } finally {\n // 정리\n try {\n rmSync(runDir, { recursive: true, force: true });\n } catch {\n // ignore cleanup errors\n }\n }\n}\n","/**\n * Agent 도구 레지스트리\n */\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\nimport * as fileRead from \"./file-read.js\";\nimport * as fileWrite from \"./file-write.js\";\nimport * as fileEdit from \"./file-edit.js\";\nimport * as bash from \"./bash.js\";\nimport * as grep from \"./grep.js\";\nimport * as listFiles from \"./list-files.js\";\nimport * as sandbox from \"./sandbox.js\";\n\ninterface Tool {\n definition: ChatCompletionTool;\n execute: (args: Record<string, unknown>) => Promise<string>;\n}\n\nconst tools: Tool[] = [fileRead, fileWrite, fileEdit, bash, grep, listFiles, sandbox];\n\nconst toolMap = new Map<string, Tool>();\nfor (const t of tools) {\n toolMap.set(t.definition.function.name, t);\n}\n\nexport function getAllToolDefs(): ChatCompletionTool[] {\n return tools.map((t) => t.definition);\n}\n\nexport async function executeTool(name: string, args: Record<string, unknown>): Promise<string> {\n const tool = toolMap.get(name);\n if (!tool) return `Unknown tool: ${name}`;\n return tool.execute(args);\n}\n\nexport function getToolNames(): string[] {\n return tools.map((t) => t.definition.function.name);\n}\n","/**\n * XGEN 플랫폼 API 도구 — AI 에이전트가 XGEN 전체 기능을 사용\n */\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\nimport { getAuth, getServer } from \"../../config/store.js\";\n\n// ── 도구 정의 ──\n\nexport const definitions: ChatCompletionTool[] = [\n // === 워크플로우 ===\n { type: \"function\", function: { name: \"xgen_workflow_list\", description: \"XGEN 워크플로우 전체 목록. 배포 상태 포함.\", parameters: { type: \"object\", properties: {} } } },\n { type: \"function\", function: { name: \"xgen_workflow_run\", description: \"워크플로우 실행. 배포/비배포 모두 가능.\", parameters: { type: \"object\", properties: { workflow_id: { type: \"string\" }, workflow_name: { type: \"string\" }, input_data: { type: \"string\", description: \"입력 메시지\" } }, required: [\"workflow_id\", \"workflow_name\", \"input_data\"] } } },\n { type: \"function\", function: { name: \"xgen_workflow_info\", description: \"워크플로우 상세 (노드, 엣지 구조).\", parameters: { type: \"object\", properties: { workflow_id: { type: \"string\" } }, required: [\"workflow_id\"] } } },\n { type: \"function\", function: { name: \"xgen_execution_history\", description: \"워크플로우 실행 이력.\", parameters: { type: \"object\", properties: { workflow_id: { type: \"string\" }, workflow_name: { type: \"string\" }, limit: { type: \"number\" } }, required: [\"workflow_id\", \"workflow_name\"] } } },\n { type: \"function\", function: { name: \"xgen_workflow_performance\", description: \"워크플로우 성능 통계 (노드별 처리 시간, 리소스 사용).\", parameters: { type: \"object\", properties: { workflow_id: { type: \"string\" }, workflow_name: { type: \"string\" } }, required: [\"workflow_id\", \"workflow_name\"] } } },\n { type: \"function\", function: { name: \"xgen_workflow_store\", description: \"공개 워크플로우 스토어 목록.\", parameters: { type: \"object\", properties: {} } } },\n { type: \"function\", function: { name: \"xgen_workflow_generate\", description: \"자연어 요구사항으로 워크플로우 자동 생성.\", parameters: { type: \"object\", properties: { requirements: { type: \"string\", description: \"생성할 워크플로우 요구사항\" } }, required: [\"requirements\"] } } },\n\n // === 문서/컬렉션 ===\n { type: \"function\", function: { name: \"xgen_collection_list\", description: \"문서 컬렉션(지식베이스) 목록.\", parameters: { type: \"object\", properties: {} } } },\n { type: \"function\", function: { name: \"xgen_document_list\", description: \"컬렉션의 문서 목록.\", parameters: { type: \"object\", properties: { collection_id: { type: \"string\" } } } } },\n { type: \"function\", function: { name: \"xgen_document_upload\", description: \"문서 업로드.\", parameters: { type: \"object\", properties: { file_path: { type: \"string\" }, collection_id: { type: \"string\" } }, required: [\"file_path\"] } } },\n\n // === 노드 ===\n { type: \"function\", function: { name: \"xgen_node_list\", description: \"XGEN 노드 전체 목록. 워크플로우 빌딩 블록.\", parameters: { type: \"object\", properties: {} } } },\n { type: \"function\", function: { name: \"xgen_node_search\", description: \"노드 검색 (이름, 설명 기반).\", parameters: { type: \"object\", properties: { query: { type: \"string\" } }, required: [\"query\"] } } },\n { type: \"function\", function: { name: \"xgen_node_categories\", description: \"노드 카테고리 목록.\", parameters: { type: \"object\", properties: {} } } },\n\n // === 프롬프트 ===\n { type: \"function\", function: { name: \"xgen_prompt_list\", description: \"프롬프트 라이브러리 목록.\", parameters: { type: \"object\", properties: { language: { type: \"string\", description: \"en 또는 ko\" } } } } },\n\n // === 도구/스킬 ===\n { type: \"function\", function: { name: \"xgen_tool_store\", description: \"공개 도구 스토어 목록.\", parameters: { type: \"object\", properties: {} } } },\n { type: \"function\", function: { name: \"xgen_user_tools\", description: \"내 도구 목록.\", parameters: { type: \"object\", properties: {} } } },\n\n // === 스케줄 ===\n { type: \"function\", function: { name: \"xgen_schedule_list\", description: \"워크플로우 스케줄 목록 (cron 작업).\", parameters: { type: \"object\", properties: {} } } },\n\n // === 트레이스/인터랙션 ===\n { type: \"function\", function: { name: \"xgen_trace_list\", description: \"워크플로우 실행 트레이스 목록.\", parameters: { type: \"object\", properties: { workflow_id: { type: \"string\" } } } } },\n { type: \"function\", function: { name: \"xgen_interaction_list\", description: \"워크플로우 인터랙션(실행 메타) 목록.\", parameters: { type: \"object\", properties: { workflow_id: { type: \"string\" }, limit: { type: \"number\" } } } } },\n\n // === MCP ===\n { type: \"function\", function: { name: \"xgen_mcp_sessions\", description: \"XGEN MCP 서버 세션 목록.\", parameters: { type: \"object\", properties: {} } } },\n\n // === GraphRAG ===\n { type: \"function\", function: { name: \"xgen_graph_rag_query\", description: \"GraphRAG 온톨로지 질의.\", parameters: { type: \"object\", properties: { query: { type: \"string\" }, graph_id: { type: \"string\" } }, required: [\"query\"] } } },\n { type: \"function\", function: { name: \"xgen_graph_stats\", description: \"온톨로지 그래프 통계.\", parameters: { type: \"object\", properties: { graph_id: { type: \"string\" } }, required: [\"graph_id\"] } } },\n\n // === 서버 ===\n { type: \"function\", function: { name: \"xgen_server_status\", description: \"XGEN 서버 연결 상태.\", parameters: { type: \"object\", properties: {} } } },\n];\n\n// ── 실행 ──\n\nexport async function execute(name: string, args: Record<string, unknown>): Promise<string> {\n const server = getServer();\n const auth = getAuth();\n if (!server || !auth) return \"XGEN 서버에 연결되어 있지 않습니다. /connect 명령으로 연결하세요.\";\n\n try {\n const fn = handlers[name];\n if (!fn) return `Unknown XGEN tool: ${name}`;\n return await fn(args);\n } catch (err) {\n return `XGEN API 오류: ${(err as Error).message}`;\n }\n}\n\nexport function isXgenTool(name: string): boolean {\n return name.startsWith(\"xgen_\");\n}\n\n// ── 핸들러 맵 ──\n\nconst handlers: Record<string, (args: Record<string, unknown>) => Promise<string>> = {\n xgen_workflow_list: async () => {\n const { getWorkflowListDetail } = await import(\"../../api/workflow.js\");\n const wfs = await getWorkflowListDetail();\n if (!wfs.length) return \"워크플로우 없음.\";\n return `총 ${wfs.length}개:\\n` + wfs.map((w, i) => {\n const d = (w as Record<string, unknown>).is_deployed ? \"●\" : \"○\";\n return `${d} ${i + 1}. ${w.workflow_name} | ${w.workflow_id ?? w.id}`;\n }).join(\"\\n\");\n },\n\n xgen_workflow_run: async (args) => {\n const { executeWorkflow } = await import(\"../../api/workflow.js\");\n const { randomUUID } = await import(\"node:crypto\");\n const auth = getAuth();\n const r = await executeWorkflow({\n workflow_id: args.workflow_id as string,\n workflow_name: args.workflow_name as string,\n input_data: args.input_data as string,\n interaction_id: `cli_${randomUUID().slice(0, 8)}`,\n user_id: auth?.userId ? parseInt(auth.userId) : 1,\n }) as Record<string, unknown>;\n return r.content ? String(r.content) : r.message ? String(r.message) : JSON.stringify(r, null, 2).slice(0, 2000);\n },\n\n xgen_workflow_info: async (args) => {\n const { getWorkflowDetail } = await import(\"../../api/workflow.js\");\n const d = await getWorkflowDetail(args.workflow_id as string);\n const nodes = (d.nodes as unknown[])?.length ?? 0;\n const edges = (d.edges as unknown[])?.length ?? 0;\n return `${d.workflow_name}\\nID: ${d.id}\\n노드: ${nodes}개 · 엣지: ${edges}개`;\n },\n\n xgen_execution_history: async (args) => {\n const { getIOLogs } = await import(\"../../api/workflow.js\");\n if (!args.workflow_id || !args.workflow_name) return \"workflow_id, workflow_name 필수.\";\n const logs = await getIOLogs(args.workflow_id as string, args.workflow_name as string, (args.limit as number) || 10);\n if (!logs.length) return \"실행 이력 없음.\";\n return logs.map((l, i) => `${i + 1}. [${l.created_at ?? \"\"}] 입력: ${(l.input_data ?? \"\").slice(0, 60)} → 출력: ${(l.output_data ?? \"\").slice(0, 60)}`).join(\"\\n\");\n },\n\n xgen_workflow_performance: async (args) => {\n const { getWorkflowPerformance } = await import(\"../../api/xgen-extra.js\");\n const p = await getWorkflowPerformance(args.workflow_id as string, args.workflow_name as string);\n return JSON.stringify(p, null, 2).slice(0, 2000);\n },\n\n xgen_workflow_store: async () => {\n const { listWorkflowStore } = await import(\"../../api/xgen-extra.js\");\n const wfs = await listWorkflowStore();\n if (!wfs.length) return \"공개 워크플로우 없음.\";\n return wfs.map((w: any, i: number) => `${i + 1}. ${w.workflow_name ?? w.name ?? \"이름없음\"}`).join(\"\\n\");\n },\n\n xgen_workflow_generate: async (args) => {\n const { generateWorkflow } = await import(\"../../api/xgen-extra.js\");\n const r = await generateWorkflow(args.requirements as string);\n return JSON.stringify(r, null, 2).slice(0, 3000);\n },\n\n xgen_collection_list: async () => {\n const { listCollections } = await import(\"../../api/document.js\");\n const cols = await listCollections();\n if (!cols.length) return \"컬렉션 없음.\";\n return `총 ${cols.length}개:\\n` + cols.map((c, i) =>\n `${i + 1}. ${c.collection_make_name} | ${c.total_documents}문서 ${c.total_chunks}청크${c.is_shared ? ` [공유:${c.share_group}]` : \"\"}`\n ).join(\"\\n\");\n },\n\n xgen_document_list: async (args) => {\n const { listDocuments } = await import(\"../../api/document.js\");\n const docs = await listDocuments(args.collection_id as string | undefined);\n if (!docs.length) return \"문서 없음.\";\n return docs.map((d, i) => `${i + 1}. ${d.name || d.file_name || \"이름없음\"} ${d.file_type ?? \"\"} ${d.status ?? \"\"}`).join(\"\\n\");\n },\n\n xgen_document_upload: async (args) => {\n const { uploadDocument } = await import(\"../../api/document.js\");\n const { existsSync } = await import(\"node:fs\");\n if (!args.file_path) return \"파일 경로 필요.\";\n if (!existsSync(args.file_path as string)) return `파일 없음: ${args.file_path}`;\n const r = await uploadDocument(args.file_path as string, args.collection_id as string | undefined);\n return `업로드 완료: ${JSON.stringify(r)}`;\n },\n\n xgen_node_list: async () => {\n const { listNodes } = await import(\"../../api/xgen-extra.js\");\n const nodes = await listNodes();\n if (!nodes.length) return \"노드 없음.\";\n return `총 ${nodes.length}개:\\n` + (nodes as any[]).slice(0, 50).map((n, i) =>\n `${i + 1}. ${n.nodeName ?? n.name ?? n.node_id ?? \"?\"} ${n.description ? \"— \" + String(n.description).slice(0, 40) : \"\"}`\n ).join(\"\\n\") + (nodes.length > 50 ? `\\n...(+${nodes.length - 50}개)` : \"\");\n },\n\n xgen_node_search: async (args) => {\n const { searchNodes } = await import(\"../../api/xgen-extra.js\");\n const nodes = await searchNodes(args.query as string);\n if (!nodes.length) return \"검색 결과 없음.\";\n return (nodes as any[]).map((n, i) =>\n `${i + 1}. ${n.nodeName ?? n.name ?? \"?\"} — ${(n.description ?? \"\").slice(0, 60)}`\n ).join(\"\\n\");\n },\n\n xgen_node_categories: async () => {\n const { getNodeCategories } = await import(\"../../api/xgen-extra.js\");\n const cats = await getNodeCategories();\n return (cats as any[]).map((c, i) => `${i + 1}. ${c.name ?? c.category ?? c}`).join(\"\\n\") || \"카테고리 없음.\";\n },\n\n xgen_prompt_list: async (args) => {\n const { listPrompts } = await import(\"../../api/xgen-extra.js\");\n const prompts = await listPrompts({ language: args.language as string | undefined });\n if (!(prompts as any[]).length) return \"프롬프트 없음.\";\n return (prompts as any[]).slice(0, 30).map((p, i) =>\n `${i + 1}. ${p.name ?? p.title ?? \"?\"} [${p.prompt_type ?? \"\"}] ${(p.content ?? \"\").slice(0, 40)}...`\n ).join(\"\\n\");\n },\n\n xgen_tool_store: async () => {\n const { listToolStore } = await import(\"../../api/xgen-extra.js\");\n const tools = await listToolStore();\n if (!(tools as any[]).length) return \"공개 도구 없음.\";\n return (tools as any[]).map((t, i) => `${i + 1}. ${t.name ?? t.tool_name ?? \"?\"} — ${(t.description ?? \"\").slice(0, 50)}`).join(\"\\n\");\n },\n\n xgen_user_tools: async () => {\n const { listUserTools } = await import(\"../../api/xgen-extra.js\");\n const tools = await listUserTools();\n if (!(tools as any[]).length) return \"내 도구 없음.\";\n return (tools as any[]).map((t, i) => `${i + 1}. ${t.name ?? t.tool_name ?? \"?\"}`).join(\"\\n\");\n },\n\n xgen_schedule_list: async () => {\n const { listSchedules } = await import(\"../../api/xgen-extra.js\");\n const sessions = await listSchedules();\n if (!(sessions as any[]).length) return \"스케줄 없음.\";\n return (sessions as any[]).map((s, i) => `${i + 1}. ${s.name ?? s.session_id ?? \"?\"} ${s.cron_expression ?? \"\"} [${s.status ?? \"?\"}]`).join(\"\\n\");\n },\n\n xgen_trace_list: async (args) => {\n const { listTraces } = await import(\"../../api/xgen-extra.js\");\n const data = await listTraces(args.workflow_id as string | undefined) as any;\n const traces = data.traces ?? data ?? [];\n if (!traces.length) return \"트레이스 없음.\";\n return traces.slice(0, 20).map((t: any, i: number) =>\n `${i + 1}. ${t.trace_id ?? t.id ?? \"?\"} [${t.status ?? \"?\"}] ${t.created_at ?? \"\"}`\n ).join(\"\\n\");\n },\n\n xgen_interaction_list: async (args) => {\n const { listInteractions } = await import(\"../../api/xgen-extra.js\");\n const items = await listInteractions(args.workflow_id as string | undefined, (args.limit as number) || 20);\n if (!(items as any[]).length) return \"인터랙션 없음.\";\n return (items as any[]).slice(0, 20).map((it: any, i: number) =>\n `${i + 1}. ${it.interaction_id ?? \"?\"} ${it.workflow_name ?? \"\"} [${it.status ?? \"?\"}]`\n ).join(\"\\n\");\n },\n\n xgen_mcp_sessions: async () => {\n const { listMcpSessions } = await import(\"../../api/xgen-extra.js\");\n const sessions = await listMcpSessions();\n if (!(sessions as any[]).length) return \"MCP 세션 없음.\";\n return (sessions as any[]).map((s: any, i: number) =>\n `${i + 1}. ${s.session_name ?? s.session_id ?? \"?\"} [${s.server_type ?? \"?\"}] ${s.status ?? \"\"}`\n ).join(\"\\n\");\n },\n\n xgen_graph_rag_query: async (args) => {\n const { queryGraphRAG } = await import(\"../../api/ontology.js\");\n if (!args.query) return \"질의 내용 필요.\";\n const r = await queryGraphRAG(args.query as string, args.graph_id as string | undefined);\n let out = `답변: ${r.answer ?? \"없음\"}`;\n if (r.sources?.length) out += `\\n출처: ${r.sources.join(\", \")}`;\n return out;\n },\n\n xgen_graph_stats: async (args) => {\n const { getGraphStats } = await import(\"../../api/ontology.js\");\n const s = await getGraphStats(args.graph_id as string);\n return `노드: ${s.total_nodes ?? 0} · 엣지: ${s.total_edges ?? 0} · 클래스: ${s.total_classes ?? 0} · 인스턴스: ${s.total_instances ?? 0}`;\n },\n\n xgen_server_status: async () => {\n const server = getServer();\n const auth = getAuth();\n return `서버: ${server}\\n사용자: ${auth?.username} (ID: ${auth?.userId})`;\n },\n};\n","/**\n * MCP (Model Context Protocol) 클라이언트\n * .mcp.json 설정을 읽어서 stdio MCP 서버와 통신\n */\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\ninterface McpServerConfig {\n type: \"stdio\";\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\ninterface McpConfig {\n mcpServers: Record<string, McpServerConfig>;\n}\n\ninterface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: number;\n method: string;\n params?: unknown;\n}\n\ninterface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: number;\n result?: unknown;\n error?: { code: number; message: string };\n}\n\ninterface McpTool {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\nexport class McpClient {\n private process: ChildProcess | null = null;\n private requestId = 0;\n private pending = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void }>();\n private serverName: string;\n private config: McpServerConfig;\n private tools: McpTool[] = [];\n\n constructor(serverName: string, config: McpServerConfig) {\n this.serverName = serverName;\n this.config = config;\n }\n\n async start(): Promise<void> {\n this.process = spawn(this.config.command, this.config.args ?? [], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, ...this.config.env },\n });\n\n const rl = createInterface({ input: this.process.stdout! });\n rl.on(\"line\", (line) => {\n try {\n const msg = JSON.parse(line) as JsonRpcResponse;\n if (msg.id !== undefined && this.pending.has(msg.id)) {\n const p = this.pending.get(msg.id)!;\n this.pending.delete(msg.id);\n if (msg.error) {\n p.reject(new Error(msg.error.message));\n } else {\n p.resolve(msg.result);\n }\n }\n } catch {\n // ignore non-JSON lines\n }\n });\n\n this.process.on(\"error\", (err) => {\n console.error(`MCP [${this.serverName}] 프로세스 오류:`, err.message);\n });\n\n // Initialize\n await this.send(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: \"open-xgen\", version: \"0.3.0\" },\n });\n\n await this.send(\"notifications/initialized\", {});\n }\n\n private send(method: string, params?: unknown): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const id = ++this.requestId;\n const request: JsonRpcRequest = { jsonrpc: \"2.0\", id, method, params };\n\n this.pending.set(id, { resolve, reject });\n\n const timeout = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`MCP 요청 타임아웃: ${method}`));\n }, 15_000);\n\n this.pending.set(id, {\n resolve: (v) => {\n clearTimeout(timeout);\n resolve(v);\n },\n reject: (e) => {\n clearTimeout(timeout);\n reject(e);\n },\n });\n\n this.process?.stdin?.write(JSON.stringify(request) + \"\\n\");\n });\n }\n\n async listTools(): Promise<McpTool[]> {\n const result = (await this.send(\"tools/list\", {})) as { tools: McpTool[] };\n this.tools = result.tools ?? [];\n return this.tools;\n }\n\n async callTool(name: string, args: Record<string, unknown>): Promise<string> {\n const result = (await this.send(\"tools/call\", { name, arguments: args })) as {\n content?: { type: string; text?: string }[];\n };\n return result.content?.map((c) => c.text ?? \"\").join(\"\\n\") ?? \"\";\n }\n\n getOpenAITools(): ChatCompletionTool[] {\n return this.tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: `mcp_${this.serverName}_${t.name}`,\n description: `[MCP:${this.serverName}] ${t.description ?? t.name}`,\n parameters: (t.inputSchema as Record<string, unknown>) ?? { type: \"object\", properties: {} },\n },\n }));\n }\n\n stop(): void {\n this.process?.kill();\n this.process = null;\n }\n}\n\n/**\n * .mcp.json에서 MCP 서버 설정 로드\n */\nexport function loadMcpConfig(dir?: string): McpConfig | null {\n const searchPaths = [\n dir ? join(dir, \".mcp.json\") : null,\n join(process.cwd(), \".mcp.json\"),\n join(process.env.HOME ?? \"\", \".mcp.json\"),\n ].filter(Boolean) as string[];\n\n for (const p of searchPaths) {\n if (existsSync(p)) {\n try {\n return JSON.parse(readFileSync(p, \"utf-8\")) as McpConfig;\n } catch {\n continue;\n }\n }\n }\n return null;\n}\n\n/**\n * 모든 MCP 서버 시작 + 도구 수집\n */\nexport class McpManager {\n private clients = new Map<string, McpClient>();\n\n async startAll(config: McpConfig): Promise<void> {\n for (const [name, serverConfig] of Object.entries(config.mcpServers)) {\n if (serverConfig.type !== \"stdio\") continue;\n try {\n const client = new McpClient(name, serverConfig);\n await client.start();\n await client.listTools();\n this.clients.set(name, client);\n } catch (err) {\n console.error(`MCP [${name}] 시작 실패:`, (err as Error).message);\n }\n }\n }\n\n getAllTools(): ChatCompletionTool[] {\n const tools: ChatCompletionTool[] = [];\n for (const client of this.clients.values()) {\n tools.push(...client.getOpenAITools());\n }\n return tools;\n }\n\n async callTool(fullName: string, args: Record<string, unknown>): Promise<string> {\n // fullName format: mcp_{serverName}_{toolName}\n const parts = fullName.split(\"_\");\n if (parts.length < 3 || parts[0] !== \"mcp\") return `Unknown MCP tool: ${fullName}`;\n\n const serverName = parts[1];\n const toolName = parts.slice(2).join(\"_\");\n const client = this.clients.get(serverName);\n if (!client) return `MCP 서버를 찾을 수 없습니다: ${serverName}`;\n\n return client.callTool(toolName, args);\n }\n\n isMcpTool(name: string): boolean {\n return name.startsWith(\"mcp_\");\n }\n\n stopAll(): void {\n for (const client of this.clients.values()) {\n client.stop();\n }\n this.clients.clear();\n }\n\n get serverCount(): number {\n return this.clients.size;\n }\n\n getServerNames(): string[] {\n return [...this.clients.keys()];\n }\n}\n","/**\n * xgen doc — 문서 관리\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../config/store.js\";\nimport { listDocuments, uploadDocument, getDocumentInfo } from \"../api/document.js\";\nimport { printTable, printError, printHeader, formatDate } from \"../utils/format.js\";\n\nexport function registerDocCommand(program: Command): void {\n const doc = program.command(\"doc\").description(\"문서 관리\");\n\n doc\n .command(\"list\")\n .alias(\"ls\")\n .description(\"문서 목록 조회\")\n .option(\"-c, --collection <id>\", \"컬렉션 ID\")\n .action(async (opts) => {\n requireAuth();\n try {\n const docs = await listDocuments(opts.collection);\n if (!docs.length) {\n console.log(chalk.yellow(\"\\n문서가 없습니다.\\n\"));\n return;\n }\n printHeader(`문서 목록 (${docs.length}개)`);\n console.log();\n printTable(\n [\"#\", \"ID\", \"파일명\", \"타입\", \"상태\", \"생성일\"],\n docs.map((d, i) => [\n String(i + 1),\n (d.document_id ?? d.id ?? \"-\").toString().slice(0, 10),\n d.file_name ?? d.name ?? \"-\",\n d.file_type ?? \"-\",\n d.status ?? \"-\",\n formatDate(d.created_at),\n ])\n );\n console.log();\n } catch (err) {\n printError(`문서 목록 조회 실패: ${(err as Error).message}`);\n }\n });\n\n doc\n .command(\"upload <file>\")\n .description(\"문서 업로드\")\n .option(\"-c, --collection <id>\", \"컬렉션 ID\")\n .option(\"-n, --name <name>\", \"파일명\")\n .action(async (file: string, opts) => {\n requireAuth();\n try {\n console.log(chalk.gray(`업로드 중: ${file}`));\n const result = await uploadDocument(file, opts.collection, opts.name);\n console.log(chalk.green(\"✓ 업로드 완료\"));\n console.log(chalk.gray(JSON.stringify(result, null, 2)));\n } catch (err) {\n printError(`업로드 실패: ${(err as Error).message}`);\n }\n });\n\n doc\n .command(\"info <id>\")\n .description(\"문서 상세 정보\")\n .action(async (id: string) => {\n requireAuth();\n try {\n const d = await getDocumentInfo(id);\n printHeader(\"문서 정보\");\n console.log(chalk.gray(JSON.stringify(d, null, 2)));\n } catch (err) {\n printError(`조회 실패: ${(err as Error).message}`);\n }\n });\n}\n","/**\n * xgen ontology — 온톨로지 GraphRAG 질의\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { requireAuth } from \"../config/store.js\";\nimport { queryGraphRAG, queryGraphRAGMultiTurn, getGraphStats } from \"../api/ontology.js\";\nimport { printError, printHeader } from \"../utils/format.js\";\nimport { randomUUID } from \"node:crypto\";\n\nexport function registerOntologyCommand(program: Command): void {\n const ont = program.command(\"ontology\").alias(\"ont\").description(\"온톨로지 GraphRAG 질의\");\n\n ont\n .command(\"query <question>\")\n .alias(\"q\")\n .description(\"GraphRAG 원샷 질의\")\n .option(\"-g, --graph <id>\", \"그래프 ID\")\n .option(\"--no-scs\", \"SCS 컨텍스트 비활성화\")\n .action(async (question: string, opts) => {\n requireAuth();\n try {\n console.log(chalk.gray(\"\\n질의 중...\\n\"));\n const result = await queryGraphRAG(question, opts.graph, { scs: opts.scs });\n\n if (result.answer) {\n console.log(chalk.bold(\"답변:\"));\n console.log(result.answer);\n }\n if (result.sources?.length) {\n console.log(chalk.bold(\"\\n출처:\"));\n result.sources.forEach((s) => console.log(chalk.gray(` - ${s}`)));\n }\n if (result.triples_used?.length) {\n console.log(chalk.bold(\"\\n사용된 트리플:\"));\n result.triples_used.forEach((t) => console.log(chalk.dim(` ${t}`)));\n }\n console.log();\n } catch (err) {\n printError(`질의 실패: ${(err as Error).message}`);\n }\n });\n\n ont\n .command(\"chat\")\n .description(\"멀티턴 GraphRAG 대화\")\n .option(\"-g, --graph <id>\", \"그래프 ID\")\n .action(async (opts) => {\n requireAuth();\n const sessionId = randomUUID();\n\n printHeader(\"Ontology Chat\");\n console.log(chalk.gray(\"멀티턴 GraphRAG 대화. exit로 종료.\\n\"));\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const ask = (): Promise<string> =>\n new Promise((resolve) => rl.question(chalk.green(\"❯ \"), (a) => resolve(a.trim())));\n\n while (true) {\n const input = await ask();\n if (!input) continue;\n if (input === \"exit\") {\n rl.close();\n break;\n }\n\n try {\n const result = await queryGraphRAGMultiTurn(input, sessionId, opts.graph);\n if (result.answer) console.log(`\\n${result.answer}\\n`);\n } catch (err) {\n console.log(chalk.red(`오류: ${(err as Error).message}\\n`));\n }\n }\n });\n\n ont\n .command(\"stats <graph-id>\")\n .description(\"그래프 통계\")\n .action(async (graphId: string) => {\n requireAuth();\n try {\n const stats = await getGraphStats(graphId);\n printHeader(\"그래프 통계\");\n console.log(chalk.gray(JSON.stringify(stats, null, 2)));\n console.log();\n } catch (err) {\n printError(`통계 조회 실패: ${(err as Error).message}`);\n }\n });\n}\n"],"mappings":"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","names":["server","axios","client","chalk","createInterface","chalk","client","program","client","client","client","tools","executeWorkflow","randomUUID","chalk","chalk","program","chalk","program","clearAuth","apiValidate","chalk","chalk","chalk","chalk","text","createInterface","chalk","chalk","program","chalk","createInterface","randomUUID","chalk","rl","createInterface","randomUUID","program","chalk","createInterface","existsSync","mkdirSync","readFileSync","writeFileSync","join","homedir","OpenAI","client","tools","readFileSync","definition","execute","writeFileSync","mkdirSync","definition","execute","readFileSync","writeFileSync","definition","execute","definition","execute","execSync","definition","execute","execSync","definition","execute","execSync","mkdirSync","writeFileSync","existsSync","join","execute","getWorkflowListDetail","executeWorkflow","randomUUID","getWorkflowDetail","getIOLogs","getWorkflowPerformance","listWorkflowStore","generateWorkflow","listCollections","listDocuments","uploadDocument","existsSync","listNodes","searchNodes","getNodeCategories","listPrompts","listToolStore","tools","listUserTools","listSchedules","listTraces","listInteractions","listMcpSessions","queryGraphRAG","getGraphStats","existsSync","readFileSync","join","createInterface","client","tools","prompt","join","homedir","existsSync","mkdirSync","writeFileSync","readFileSync","chalk","apiValidate","apiRefresh","setAuth","client","createInterface","tools","toolResult","execute","setServer","addEnvironment","apiLogin","switchEnvironment","program","chalk","program","chalk","createInterface","randomUUID","program","ask","chalk","startInkDashboard"]}