openxgen 0.3.2 → 0.4.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/commands/workflow/list.ts","../src/utils/sse.ts","../src/commands/chat.ts","../src/commands/provider.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/mcp/client.ts","../src/commands/home.ts","../src/commands/agent.ts","../src/index.ts","../src/commands/config.ts","../src/commands/login.ts","../src/commands/workflow/index.ts","../src/commands/workflow/info.ts","../src/commands/workflow/run.ts","../src/utils/markdown.ts","../src/commands/workflow/history.ts","../src/commands/doc.ts","../src/api/document.ts","../src/commands/ontology.ts","../src/api/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 if (!store.defaultId) 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// ── 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;\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 * 워크플로우 실행 (non-stream)\n */\nexport async function executeWorkflow(\n request: WorkflowExecuteRequest\n): Promise<unknown> {\n const client = getClient();\n const res = await client.post(\"/api/workflow/execute/based_id\", request);\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 limit = 20\n): Promise<IOLog[]> {\n const client = getClient();\n const params: Record<string, string | number> = { limit };\n if (workflowId) params.workflow_id = workflowId;\n\n const res = await client.get(\"/api/workflow/io_logs\", { params });\n return res.data;\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.deploy_status === \"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 * 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 * 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 * xgen provider — AI 프로바이더 관리 (가이드 설정)\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\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\";\n\nfunction prompt(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\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}\n\nconst PRESETS: ProviderPreset[] = [\n {\n label: \"OpenAI\",\n type: \"openai\",\n defaultModel: \"gpt-4o-mini\",\n models: [\"gpt-4o\", \"gpt-4o-mini\", \"gpt-4.1\", \"gpt-4.1-mini\", \"o3-mini\"],\n needsKey: true,\n keyHint: \"https://platform.openai.com/api-keys 에서 발급\",\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: [\"gemini-2.0-flash\", \"gemini-2.5-pro-preview-06-05\", \"gemini-2.5-flash-preview-05-20\"],\n needsKey: true,\n keyHint: \"https://aistudio.google.com/apikey 에서 발급\",\n },\n {\n label: \"Ollama (로컬)\",\n type: \"ollama\",\n baseUrl: \"http://localhost:11434/v1\",\n defaultModel: \"llama3.1\",\n models: [\"llama3.1\", \"llama3.2\", \"codellama\", \"mistral\", \"qwen2.5-coder\"],\n needsKey: false,\n keyHint: \"https://ollama.ai 에서 설치\",\n },\n {\n label: \"Anthropic (Claude)\",\n type: \"anthropic\",\n baseUrl: \"https://api.anthropic.com/v1\",\n defaultModel: \"claude-sonnet-4-20250514\",\n models: [\"claude-sonnet-4-20250514\", \"claude-opus-4-20250514\", \"claude-haiku-4-5-20251001\"],\n needsKey: true,\n keyHint: \"https://console.anthropic.com/settings/keys 에서 발급\",\n },\n {\n label: \"Custom (OpenAI 호환 서버)\",\n type: \"custom\",\n defaultModel: \"gpt-4o-mini\",\n models: [],\n needsKey: true,\n keyHint: \"서버에서 발급받은 API Key\",\n },\n];\n\n/**\n * 가이드 설정 — 에이전트에서 프로바이더 없을 때 자동 호출됨\n */\nexport async function guidedProviderSetup(): Promise<ProviderConfig | null> {\n console.log(chalk.cyan.bold(\"\\n ⚡ OPEN XGEN — 프로바이더 설정\\n\"));\n console.log(chalk.gray(\" AI 에이전트를 사용하려면 프로바이더를 설정하세요.\\n\"));\n\n // 1. 프로바이더 선택\n console.log(chalk.bold(\" 프로바이더 선택:\\n\"));\n PRESETS.forEach((p, i) => {\n console.log(` ${chalk.cyan(`${i + 1})`)} ${p.label} ${chalk.gray(`— ${p.defaultModel}`)}`);\n });\n console.log();\n\n const choice = await prompt(chalk.white(\" 번호 선택: \"));\n const idx = parseInt(choice) - 1;\n if (isNaN(idx) || idx < 0 || idx >= PRESETS.length) {\n printError(\"잘못된 선택입니다.\");\n return null;\n }\n\n const preset = PRESETS[idx];\n console.log(chalk.green(`\\n ✓ ${preset.label} 선택됨\\n`));\n\n // 2. API Key\n let apiKey = \"\";\n if (preset.needsKey) {\n console.log(chalk.gray(` ${preset.keyHint}\\n`));\n apiKey = await prompt(chalk.white(\" API Key: \"));\n if (!apiKey) {\n printError(\"API Key가 필요합니다.\");\n return null;\n }\n }\n\n // 3. Base URL (custom / ollama)\n let baseUrl = preset.baseUrl;\n if (preset.type === \"custom\") {\n const url = await prompt(chalk.white(\" Base URL: \"));\n if (!url) {\n printError(\"Base URL이 필요합니다.\");\n return null;\n }\n baseUrl = url;\n } else if (preset.type === \"ollama\") {\n const url = await prompt(chalk.white(` Base URL [${preset.baseUrl}]: `));\n if (url) baseUrl = url;\n }\n\n // 4. 모델 선택\n let model = preset.defaultModel;\n if (preset.models.length > 0) {\n console.log(chalk.bold(\"\\n 모델 선택:\\n\"));\n preset.models.forEach((m, i) => {\n const isDefault = m === preset.defaultModel ? chalk.gray(\" (기본)\") : \"\";\n console.log(` ${chalk.cyan(`${i + 1})`)} ${m}${isDefault}`);\n });\n console.log(` ${chalk.cyan(`${preset.models.length + 1})`)} 직접 입력`);\n console.log();\n\n const defaultIdx = preset.models.indexOf(preset.defaultModel);\n const mc = await prompt(chalk.white(` 번호 선택 [${defaultIdx + 1}]: `));\n if (!mc) {\n // 엔터 → 기본 모델\n model = preset.defaultModel;\n } else {\n const mi = parseInt(mc) - 1;\n if (!isNaN(mi) && mi >= 0 && mi < preset.models.length) {\n model = preset.models[mi];\n } else if (parseInt(mc) === preset.models.length + 1) {\n model = (await prompt(chalk.white(\" 모델 이름: \"))) || preset.defaultModel;\n } else {\n model = preset.defaultModel;\n }\n }\n } else {\n model = (await prompt(chalk.white(` 모델 이름 [${preset.defaultModel}]: `))) || preset.defaultModel;\n }\n\n console.log(chalk.green(`\\n ✓ 모델: ${model}`));\n\n // 5. 연결 테스트\n console.log(chalk.gray(\"\\n 연결 테스트 중...\"));\n const provider: ProviderConfig = {\n id: preset.type,\n name: preset.label,\n type: preset.type,\n baseUrl,\n apiKey,\n model,\n };\n\n try {\n const client = new OpenAI({\n apiKey: apiKey || \"ollama\",\n baseURL: baseUrl,\n });\n const res = await client.chat.completions.create({\n model,\n messages: [{ role: \"user\", content: \"Hi\" }],\n max_tokens: 5,\n });\n if (res.choices[0]) {\n console.log(chalk.green(\" ✓ 연결 성공!\\n\"));\n }\n } catch (err) {\n console.log(chalk.yellow(` ⚠ 연결 테스트 실패: ${(err as Error).message}`));\n console.log(chalk.gray(\" 설정은 저장됩니다. 나중에 다시 시도하세요.\\n\"));\n }\n\n // 6. 저장\n addProvider(provider);\n console.log(chalk.green.bold(` ✓ ${preset.label} (${model}) 설정 완료!\\n`));\n console.log(chalk.gray(` 이제 ${chalk.cyan(\"xgen agent\")} 또는 ${chalk.cyan(\"xgen\")} 으로 시작하세요.\\n`));\n\n return provider;\n}\n\nexport function registerProviderCommand(program: Command): void {\n const prov = program.command(\"provider\").description(\"AI 프로바이더 관리\");\n\n prov\n .command(\"add\")\n .description(\"프로바이더 추가 (가이드 설정)\")\n .action(async () => {\n await guidedProviderSetup();\n });\n\n prov\n .command(\"list\")\n .alias(\"ls\")\n .description(\"프로바이더 목록\")\n .action(() => {\n const providers = getProviders();\n const defaultP = getDefaultProvider();\n\n if (providers.length === 0) {\n console.log(chalk.yellow(\"\\n 프로바이더가 없습니다.\"));\n console.log(` ${chalk.cyan(\"xgen provider add\")} 로 추가하세요.\\n`);\n return;\n }\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,\n p.name,\n p.type,\n p.model,\n ])\n );\n console.log();\n });\n\n prov\n .command(\"remove <id>\")\n .description(\"프로바이더 제거\")\n .action((id: string) => {\n if (removeProvider(id)) {\n printSuccess(`프로바이더 제거: ${id}`);\n } else {\n printError(`프로바이더를 찾을 수 없습니다: ${id}`);\n }\n });\n\n prov\n .command(\"use <id>\")\n .description(\"기본 프로바이더 설정\")\n .action((id: string) => {\n if (setDefaultProvider(id)) {\n printSuccess(`기본 프로바이더: ${id}`);\n } else {\n printError(`프로바이더를 찾을 수 없습니다: ${id}`);\n }\n });\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 StreamResult {\n content: string;\n toolCalls: {\n id: string;\n name: string;\n arguments: string;\n }[];\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 };\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 const toolCallMap = new Map<number, { id: string; name: string; arguments: string }>();\n\n for await (const chunk of stream) {\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 };\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 * 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 * OPEN XGEN 메인 홈 — xgen 치면 나오는 인터랙티브 메뉴\n */\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { getAuth, getServer, getDefaultProvider } from \"../config/store.js\";\nimport { agentRepl } from \"./agent.js\";\nimport { chat } from \"./chat.js\";\nimport { guidedProviderSetup } from \"./provider.js\";\n\nfunction prompt(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\nfunction showStatus(): void {\n const provider = getDefaultProvider();\n const server = getServer();\n const auth = getAuth();\n\n console.log(chalk.gray(\" ─────────────────────────────────\"));\n console.log(chalk.gray(\" 상태:\"));\n\n if (provider) {\n console.log(` AI 에이전트 ${chalk.green(\"●\")} ${provider.name} (${provider.model})`);\n } else {\n console.log(` AI 에이전트 ${chalk.red(\"○\")} 미설정`);\n }\n\n if (server && auth) {\n console.log(` XGEN 서버 ${chalk.green(\"●\")} ${server} (${auth.username})`);\n } else if (server) {\n console.log(` XGEN 서버 ${chalk.yellow(\"○\")} ${server} (로그인 필요)`);\n } else {\n console.log(` XGEN 서버 ${chalk.red(\"○\")} 미설정`);\n }\n console.log(chalk.gray(\" ─────────────────────────────────\\n\"));\n}\n\nexport async function homeMenu(): Promise<void> {\n const provider = getDefaultProvider();\n const server = getServer();\n const auth = getAuth();\n\n console.log(chalk.cyan(`\n ██████ ██████ ███████ ███ ██\n ██ ██ ██ ██ ██ ████ ██\n ██ ██ ██████ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██\n ██████ ██ ███████ ██ ████`));\n console.log(chalk.white.bold(`\n ██ ██ ██████ ███████ ███ ██\n ██ ██ ██ ██ ████ ██\n ███ ██ ███ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██ ██\n ██ ██ ██████ ███████ ██ ████`));\n console.log(chalk.gray(` v0.3.0\\n`));\n\n showStatus();\n\n while (true) {\n // 메뉴 항목 동적 구성\n const items: { key: string; label: string; available: boolean; action: () => Promise<void> }[] = [];\n\n items.push({\n key: \"1\",\n label: provider\n ? `AI 에이전트 시작 ${chalk.gray(`(${provider.name})`)}`\n : `AI 에이전트 설정 + 시작`,\n available: true,\n action: async () => { await agentRepl(); },\n });\n\n if (server && auth) {\n items.push({\n key: \"2\",\n label: `워크플로우 채팅 ${chalk.gray(`(${auth.username}@${server.replace(\"https://\",\"\")})`)}`,\n available: true,\n action: async () => { await chat(); },\n });\n items.push({\n key: \"3\",\n label: \"워크플로우 목록\",\n available: true,\n action: async () => {\n const { workflowList } = await import(\"./workflow/list.js\");\n await workflowList({ detail: false });\n return;\n },\n });\n } else {\n items.push({\n key: \"2\",\n label: \"XGEN 서버 연결 + 로그인\",\n available: true,\n action: async () => { await serverSetup(); },\n });\n }\n\n items.push({\n key: String(items.length + 1),\n label: \"프로바이더 관리\",\n available: true,\n action: async () => { await providerMenu(); },\n });\n\n items.push({\n key: String(items.length + 1),\n label: \"설정 보기\",\n available: true,\n action: async () => {\n showStatus();\n const cfg = await import(\"../config/store.js\");\n const config = cfg.getConfig();\n console.log(chalk.gray(\" 설정 파일: ~/.xgen/\\n\"));\n console.log(chalk.gray(` 서버: ${config.server ?? \"(없음)\"}`));\n console.log(chalk.gray(` 테마: ${config.theme}`));\n console.log(chalk.gray(` 스트림 로그: ${config.streamLogs}\\n`));\n },\n });\n\n items.push({\n key: \"q\",\n label: \"종료\",\n available: true,\n action: async () => { process.exit(0); },\n });\n\n // 메뉴 출력\n console.log(chalk.bold(\" 뭘 하시겠습니까?\\n\"));\n for (const item of items) {\n console.log(` ${chalk.cyan(item.key + \")\")} ${item.label}`);\n }\n console.log();\n\n const choice = await prompt(chalk.white(\" 선택: \"));\n\n if (choice === \"q\" || choice === \"exit\") {\n console.log(chalk.gray(\"\\n 안녕히.\\n\"));\n break;\n }\n\n const selected = items.find((i) => i.key === choice);\n if (!selected) {\n console.log(chalk.red(\" 잘못된 선택입니다.\\n\"));\n continue;\n }\n\n try {\n await selected.action();\n } catch (err) {\n console.log(chalk.red(`\\n 오류: ${(err as Error).message}\\n`));\n }\n\n // 에이전트나 채팅에서 돌아오면 다시 메뉴\n console.log();\n showStatus();\n }\n}\n\nasync function serverSetup(): Promise<void> {\n console.log(chalk.cyan.bold(\"\\n XGEN 서버 연결\\n\"));\n\n const currentServer = getServer();\n const urlInput = await prompt(\n chalk.white(` 서버 URL${currentServer ? ` [${currentServer}]` : \"\"}: `)\n );\n const url = urlInput || currentServer;\n\n if (!url) {\n console.log(chalk.red(\" URL이 필요합니다.\\n\"));\n return;\n }\n\n const { setServer } = await import(\"../config/store.js\");\n setServer(url);\n console.log(chalk.green(` ✓ 서버 설정: ${url}\\n`));\n\n // 로그인\n console.log(chalk.bold(\" 로그인\\n\"));\n const email = await prompt(chalk.white(\" 이메일: \"));\n const password = await prompt(chalk.white(\" 비밀번호: \"));\n\n if (!email || !password) {\n console.log(chalk.red(\" 이메일과 비밀번호가 필요합니다.\\n\"));\n return;\n }\n\n try {\n const { apiLogin } = await import(\"../api/auth.js\");\n const { setAuth } = await import(\"../config/store.js\");\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 console.log(chalk.green(` ✓ 로그인 성공! ${result.username ?? email}\\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 providerMenu(): Promise<void> {\n const { getProviders, getDefaultProvider: getDefault } = await import(\"../config/store.js\");\n const providers = getProviders();\n const defaultP = getDefault();\n\n console.log(chalk.cyan.bold(\"\\n 프로바이더 관리\\n\"));\n\n if (providers.length > 0) {\n for (const p of providers) {\n const mark = p.id === defaultP?.id ? chalk.green(\"● \") : chalk.gray(\" \");\n console.log(` ${mark}${p.name} ${chalk.gray(`(${p.type} — ${p.model})`)}`);\n }\n console.log();\n }\n\n console.log(` ${chalk.cyan(\"1)\")} 새 프로바이더 추가`);\n if (providers.length > 1) {\n console.log(` ${chalk.cyan(\"2)\")} 기본 프로바이더 변경`);\n }\n if (providers.length > 0) {\n console.log(` ${chalk.cyan(\"3)\")} 프로바이더 삭제`);\n }\n console.log(` ${chalk.cyan(\"b)\")} 돌아가기`);\n console.log();\n\n const choice = await prompt(chalk.white(\" 선택: \"));\n\n if (choice === \"1\") {\n await guidedProviderSetup();\n } else if (choice === \"2\" && providers.length > 1) {\n console.log();\n providers.forEach((p, i) => {\n console.log(` ${chalk.cyan(`${i + 1})`)} ${p.name} (${p.model})`);\n });\n console.log();\n const pc = await prompt(chalk.white(\" 번호: \"));\n const pi = parseInt(pc) - 1;\n if (pi >= 0 && pi < providers.length) {\n const { setDefaultProvider: setDef } = await import(\"../config/store.js\");\n setDef(providers[pi].id);\n console.log(chalk.green(` ✓ 기본 프로바이더: ${providers[pi].name}\\n`));\n }\n } else if (choice === \"3\" && providers.length > 0) {\n console.log();\n providers.forEach((p, i) => {\n console.log(` ${chalk.cyan(`${i + 1})`)} ${p.name} (${p.model})`);\n });\n console.log();\n const dc = await prompt(chalk.white(\" 삭제할 번호: \"));\n const di = parseInt(dc) - 1;\n if (di >= 0 && di < providers.length) {\n const { removeProvider: rmProv } = await import(\"../config/store.js\");\n rmProv(providers[di].id);\n console.log(chalk.green(` ✓ 삭제됨: ${providers[di].name}\\n`));\n }\n }\n}\n","/**\n * xgen agent — OPEN XGEN AI 코딩 에이전트\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { getDefaultProvider } from \"../config/store.js\";\nimport { createLLMClient, streamChat, type Message } from \"../agent/llm.js\";\nimport { getAllToolDefs, executeTool, getToolNames } from \"../agent/tools/index.js\";\nimport { McpManager, loadMcpConfig } from \"../mcp/client.js\";\nimport { printError } from \"../utils/format.js\";\nimport { guidedProviderSetup } from \"./provider.js\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nconst SYSTEM_PROMPT = `You are OPEN XGEN Agent, an AI coding assistant running in the user's terminal.\nYou have access to tools for reading/writing files, executing commands, searching code, and running sandboxed code.\nYou can also use MCP (Model Context Protocol) tools if available.\nAlways respond in the same language as the user.\nWhen using tools, be concise about what you're doing.\nFor file edits, show what you changed briefly.\nFor sandbox_run, you can install npm/pip packages and run isolated code.`;\n\nlet mcpManager: McpManager | null = null;\n\nexport async function agentRepl(): Promise<void> {\n let provider = getDefaultProvider();\n if (!provider) {\n // 프로바이더 없으면 자동 가이드 설정\n provider = await guidedProviderSetup();\n if (!provider) {\n process.exit(1);\n }\n }\n\n const client = createLLMClient(provider);\n\n // 기본 도구\n const builtinTools = getAllToolDefs();\n const allTools: ChatCompletionTool[] = [...builtinTools];\n const allToolNames = [...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) {\n const mcpTools = mcpManager.getAllTools();\n allTools.push(...mcpTools);\n allToolNames.push(...mcpTools.map((t) => t.function.name));\n }\n } catch {\n // MCP 실패해도 계속 진행\n }\n }\n\n const messages: Message[] = [{ role: \"system\", content: SYSTEM_PROMPT }];\n\n // 헤더\n console.log(chalk.cyan.bold(\"\\n OPEN XGEN Agent\"));\n console.log(chalk.gray(\" ─────────────────────────────\"));\n console.log(chalk.gray(` 프로바이더: ${provider.name} (${provider.model})`));\n console.log(chalk.gray(` 도구: ${getToolNames().join(\", \")}`));\n if (mcpManager && mcpManager.serverCount > 0) {\n console.log(chalk.gray(` MCP: ${mcpManager.getServerNames().join(\", \")} (${mcpManager.getAllTools().length}개 도구)`));\n }\n console.log(chalk.gray(` 커맨드: /tools /provider /model /mcp /clear /home /exit`));\n console.log();\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 // Ctrl+C 처리\n process.on(\"SIGINT\", () => {\n console.log(chalk.gray(\"\\n종료합니다.\"));\n mcpManager?.stopAll();\n rl.close();\n process.exit(0);\n });\n\n while (true) {\n const input = await ask();\n if (!input) continue;\n\n // 슬래시 커맨드\n if (input === \"exit\" || input === \"/exit\") {\n console.log(chalk.gray(\"종료합니다.\"));\n mcpManager?.stopAll();\n rl.close();\n break;\n }\n if (input === \"/clear\") {\n messages.length = 1;\n console.log(chalk.gray(\"대화 초기화됨.\\n\"));\n continue;\n }\n if (input === \"/tools\") {\n console.log(chalk.bold(\"\\n내장 도구:\"), getToolNames().join(\", \"));\n if (mcpManager && mcpManager.serverCount > 0) {\n console.log(chalk.bold(\"MCP 도구:\"), mcpManager.getAllTools().map((t) => t.function.name).join(\", \"));\n }\n console.log();\n continue;\n }\n if (input === \"/provider\") {\n console.log(chalk.gray(`현재: ${provider.name} (${provider.model})`));\n console.log(chalk.gray(`변경: xgen provider add / xgen provider use <id>\\n`));\n continue;\n }\n if (input === \"/model\") {\n const { getProviders: gp } = await import(\"../config/store.js\");\n const all = gp();\n if (all.length > 0) {\n console.log(chalk.bold(\"\\n 등록된 프로바이더:\\n\"));\n all.forEach((p, i) => {\n const mark = p.id === provider.id ? chalk.green(\"● \") : \" \";\n console.log(` ${mark}${i + 1}) ${p.name} (${p.model})`);\n });\n console.log(chalk.gray(\"\\n 변경하려면 exit 후 xgen provider use <id>\\n\"));\n }\n continue;\n }\n if (input === \"/home\" || input === \"/menu\") {\n console.log(chalk.gray(\"에이전트를 종료하고 홈으로 돌아갑니다.\"));\n mcpManager?.stopAll();\n rl.close();\n const { homeMenu } = await import(\"./home.js\");\n await homeMenu();\n return;\n }\n if (input === \"/mcp\") {\n if (mcpManager && mcpManager.serverCount > 0) {\n console.log(chalk.bold(\"\\nMCP 서버:\"), mcpManager.getServerNames().join(\", \"));\n console.log(chalk.gray(\"도구:\"), mcpManager.getAllTools().map((t) => t.function.name).join(\", \"));\n } else {\n console.log(chalk.gray(\"MCP 서버 없음. .mcp.json을 프로젝트 루트에 추가하세요.\"));\n }\n console.log();\n continue;\n }\n\n messages.push({ role: \"user\", content: input });\n\n try {\n await runAgentLoop(client, provider.model, messages, allTools);\n } catch (err) {\n console.log(chalk.red(`\\n오류: ${(err as Error).message}\\n`));\n }\n }\n}\n\nasync function runAgentLoop(\n client: ReturnType<typeof createLLMClient>,\n model: string,\n messages: Message[],\n tools: ChatCompletionTool[]\n): Promise<void> {\n const MAX_ITERATIONS = 20;\n\n for (let i = 0; i < MAX_ITERATIONS; i++) {\n const result = await streamChat(client, model, messages, tools, (delta) => {\n process.stdout.write(delta);\n });\n\n if (result.content) {\n process.stdout.write(\"\\n\\n\");\n }\n\n if (result.toolCalls.length === 0) {\n if (result.content) {\n messages.push({ role: \"assistant\", content: result.content });\n }\n return;\n }\n\n // assistant 메시지 추가\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 // 도구 실행\n for (const tc of result.toolCalls) {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(tc.arguments);\n } catch {\n args = {};\n }\n\n console.log(chalk.gray(` ⚙ ${tc.name}(`), chalk.dim(summarizeArgs(args)), chalk.gray(\")\"));\n\n let toolResult: string;\n 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 =\n toolResult.length > 4000 ? toolResult.slice(0, 4000) + \"\\n...(truncated)\" : toolResult;\n\n messages.push({\n role: \"tool\",\n tool_call_id: tc.id,\n content: truncated,\n });\n }\n }\n\n console.log(chalk.yellow(\"\\n최대 반복 횟수에 도달했습니다.\\n\"));\n}\n\nfunction summarizeArgs(args: Record<string, unknown>): string {\n const parts: string[] = [];\n for (const [k, v] of Object.entries(args)) {\n const s = String(v);\n parts.push(`${k}: ${s.length > 40 ? s.slice(0, 40) + \"...\" : s}`);\n }\n return parts.join(\", \");\n}\n\nexport function registerAgentCommand(program: Command): void {\n program\n .command(\"agent\")\n .description(\"OPEN XGEN AI 코딩 에이전트\")\n .action(async () => {\n await agentRepl();\n });\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\";\nimport { homeMenu } from \"./commands/home.js\";\n\nconst VERSION = \"0.3.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// 인자 없이 실행: 홈 메뉴\nif (process.argv.length <= 2) {\n homeMenu().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 — 워크플로우 커맨드 그룹\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 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 * 터미널 마크다운 렌더링 — 가볍게\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 opts: { limit?: number } = {}\n): Promise<void> {\n requireAuth();\n\n const limit = opts.limit ?? 20;\n\n try {\n const logs = await getIOLogs(workflowId, 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 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 * 문서 API\n */\nimport { getClient } from \"./client.js\";\nimport { createReadStream, statSync } from \"node:fs\";\nimport { basename } from \"node:path\";\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 listDocuments(collectionId?: string): Promise<Document[]> {\n const client = getClient();\n const params: Record<string, string> = {};\n if (collectionId) params.collection_id = collectionId;\n\n const res = await client.get(\"/api/documents/list\", { params });\n return res.data.documents ?? res.data ?? [];\n}\n\nexport async function uploadDocument(\n filePath: string,\n collectionId?: string,\n name?: string\n): Promise<unknown> {\n const client = getClient();\n const stat = statSync(filePath);\n const fileName = name || basename(filePath);\n\n const FormData = (await import(\"node:buffer\")).Blob ? globalThis.FormData : null;\n if (!FormData) throw new Error(\"FormData not available\");\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/documents/upload\", form, {\n headers: { \"Content-Type\": \"multipart/form-data\" },\n maxBodyLength: stat.size + 1024 * 1024,\n });\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/documents/${docId}`);\n return res.data;\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","/**\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"],"mappings":"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","names":["server","axios","client","chalk","chalk","createInterface","randomUUID","rl","program","chalk","createInterface","prompt","client","program","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","existsSync","readFileSync","join","createInterface","init_client","client","tools","chalk","createInterface","prompt","workflowList","setServer","apiLogin","setAuth","getProviders","chalk","createInterface","client","homeMenu","tools","program","init_client","chalk","chalk","program","chalk","program","clearAuth","apiValidate","chalk","chalk","chalk","text","createInterface","chalk","chalk","program","chalk","client","program","chalk","chalk","createInterface","client","randomUUID","program","chalk","createInterface","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/commands/workflow/list.ts","../src/utils/sse.ts","../src/commands/chat.ts","../src/commands/provider.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/mcp/client.ts","../src/utils/ui.ts","../src/commands/home.ts","../src/commands/agent.ts","../src/index.ts","../src/commands/config.ts","../src/commands/login.ts","../src/commands/workflow/index.ts","../src/commands/workflow/info.ts","../src/commands/workflow/run.ts","../src/utils/markdown.ts","../src/commands/workflow/history.ts","../src/commands/doc.ts","../src/api/document.ts","../src/commands/ontology.ts","../src/api/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 if (!store.defaultId) 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// ── 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;\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 * 워크플로우 실행 (non-stream)\n */\nexport async function executeWorkflow(\n request: WorkflowExecuteRequest\n): Promise<unknown> {\n const client = getClient();\n const res = await client.post(\"/api/workflow/execute/based_id\", request);\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 limit = 20\n): Promise<IOLog[]> {\n const client = getClient();\n const params: Record<string, string | number> = { limit };\n if (workflowId) params.workflow_id = workflowId;\n\n const res = await client.get(\"/api/workflow/io_logs\", { params });\n return res.data;\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.deploy_status === \"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 * 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 * 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 * xgen provider — AI 프로바이더 관리 (가이드 설정)\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\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\";\n\nfunction prompt(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\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}\n\nconst PRESETS: ProviderPreset[] = [\n {\n label: \"OpenAI\",\n type: \"openai\",\n defaultModel: \"gpt-4o-mini\",\n models: [\"gpt-4o\", \"gpt-4o-mini\", \"gpt-4.1\", \"gpt-4.1-mini\", \"o3-mini\"],\n needsKey: true,\n keyHint: \"https://platform.openai.com/api-keys 에서 발급\",\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: [\"gemini-2.0-flash\", \"gemini-2.5-pro-preview-06-05\", \"gemini-2.5-flash-preview-05-20\"],\n needsKey: true,\n keyHint: \"https://aistudio.google.com/apikey 에서 발급\",\n },\n {\n label: \"Ollama (로컬)\",\n type: \"ollama\",\n baseUrl: \"http://localhost:11434/v1\",\n defaultModel: \"llama3.1\",\n models: [\"llama3.1\", \"llama3.2\", \"codellama\", \"mistral\", \"qwen2.5-coder\"],\n needsKey: false,\n keyHint: \"https://ollama.ai 에서 설치\",\n },\n {\n label: \"Anthropic (Claude)\",\n type: \"anthropic\",\n baseUrl: \"https://api.anthropic.com/v1\",\n defaultModel: \"claude-sonnet-4-20250514\",\n models: [\"claude-sonnet-4-20250514\", \"claude-opus-4-20250514\", \"claude-haiku-4-5-20251001\"],\n needsKey: true,\n keyHint: \"https://console.anthropic.com/settings/keys 에서 발급\",\n },\n {\n label: \"Custom (OpenAI 호환 서버)\",\n type: \"custom\",\n defaultModel: \"gpt-4o-mini\",\n models: [],\n needsKey: true,\n keyHint: \"서버에서 발급받은 API Key\",\n },\n];\n\n/**\n * 가이드 설정 — 에이전트에서 프로바이더 없을 때 자동 호출됨\n */\nexport async function guidedProviderSetup(): Promise<ProviderConfig | null> {\n console.log(chalk.cyan.bold(\"\\n ⚡ OPEN XGEN — 프로바이더 설정\\n\"));\n console.log(chalk.gray(\" AI 에이전트를 사용하려면 프로바이더를 설정하세요.\\n\"));\n\n // 1. 프로바이더 선택\n console.log(chalk.bold(\" 프로바이더 선택:\\n\"));\n PRESETS.forEach((p, i) => {\n console.log(` ${chalk.cyan(`${i + 1})`)} ${p.label} ${chalk.gray(`— ${p.defaultModel}`)}`);\n });\n console.log();\n\n const choice = await prompt(chalk.white(\" 번호 선택: \"));\n const idx = parseInt(choice) - 1;\n if (isNaN(idx) || idx < 0 || idx >= PRESETS.length) {\n printError(\"잘못된 선택입니다.\");\n return null;\n }\n\n const preset = PRESETS[idx];\n console.log(chalk.green(`\\n ✓ ${preset.label} 선택됨\\n`));\n\n // 2. API Key\n let apiKey = \"\";\n if (preset.needsKey) {\n console.log(chalk.gray(` ${preset.keyHint}\\n`));\n apiKey = await prompt(chalk.white(\" API Key: \"));\n if (!apiKey) {\n printError(\"API Key가 필요합니다.\");\n return null;\n }\n }\n\n // 3. Base URL (custom / ollama)\n let baseUrl = preset.baseUrl;\n if (preset.type === \"custom\") {\n const url = await prompt(chalk.white(\" Base URL: \"));\n if (!url) {\n printError(\"Base URL이 필요합니다.\");\n return null;\n }\n baseUrl = url;\n } else if (preset.type === \"ollama\") {\n const url = await prompt(chalk.white(` Base URL [${preset.baseUrl}]: `));\n if (url) baseUrl = url;\n }\n\n // 4. 모델 선택\n let model = preset.defaultModel;\n if (preset.models.length > 0) {\n console.log(chalk.bold(\"\\n 모델 선택:\\n\"));\n preset.models.forEach((m, i) => {\n const isDefault = m === preset.defaultModel ? chalk.gray(\" (기본)\") : \"\";\n console.log(` ${chalk.cyan(`${i + 1})`)} ${m}${isDefault}`);\n });\n console.log(` ${chalk.cyan(`${preset.models.length + 1})`)} 직접 입력`);\n console.log();\n\n const defaultIdx = preset.models.indexOf(preset.defaultModel);\n const mc = await prompt(chalk.white(` 번호 선택 [${defaultIdx + 1}]: `));\n if (!mc) {\n // 엔터 → 기본 모델\n model = preset.defaultModel;\n } else {\n const mi = parseInt(mc) - 1;\n if (!isNaN(mi) && mi >= 0 && mi < preset.models.length) {\n model = preset.models[mi];\n } else if (parseInt(mc) === preset.models.length + 1) {\n model = (await prompt(chalk.white(\" 모델 이름: \"))) || preset.defaultModel;\n } else {\n model = preset.defaultModel;\n }\n }\n } else {\n model = (await prompt(chalk.white(` 모델 이름 [${preset.defaultModel}]: `))) || preset.defaultModel;\n }\n\n console.log(chalk.green(`\\n ✓ 모델: ${model}`));\n\n // 5. 연결 테스트\n console.log(chalk.gray(\"\\n 연결 테스트 중...\"));\n const provider: ProviderConfig = {\n id: preset.type,\n name: preset.label,\n type: preset.type,\n baseUrl,\n apiKey,\n model,\n };\n\n try {\n const client = new OpenAI({\n apiKey: apiKey || \"ollama\",\n baseURL: baseUrl,\n });\n const res = await client.chat.completions.create({\n model,\n messages: [{ role: \"user\", content: \"Hi\" }],\n max_tokens: 5,\n });\n if (res.choices[0]) {\n console.log(chalk.green(\" ✓ 연결 성공!\\n\"));\n }\n } catch (err) {\n console.log(chalk.yellow(` ⚠ 연결 테스트 실패: ${(err as Error).message}`));\n console.log(chalk.gray(\" 설정은 저장됩니다. 나중에 다시 시도하세요.\\n\"));\n }\n\n // 6. 저장\n addProvider(provider);\n console.log(chalk.green.bold(` ✓ ${preset.label} (${model}) 설정 완료!\\n`));\n console.log(chalk.gray(` 이제 ${chalk.cyan(\"xgen agent\")} 또는 ${chalk.cyan(\"xgen\")} 으로 시작하세요.\\n`));\n\n return provider;\n}\n\nexport function registerProviderCommand(program: Command): void {\n const prov = program.command(\"provider\").description(\"AI 프로바이더 관리\");\n\n prov\n .command(\"add\")\n .description(\"프로바이더 추가 (가이드 설정)\")\n .action(async () => {\n await guidedProviderSetup();\n });\n\n prov\n .command(\"list\")\n .alias(\"ls\")\n .description(\"프로바이더 목록\")\n .action(() => {\n const providers = getProviders();\n const defaultP = getDefaultProvider();\n\n if (providers.length === 0) {\n console.log(chalk.yellow(\"\\n 프로바이더가 없습니다.\"));\n console.log(` ${chalk.cyan(\"xgen provider add\")} 로 추가하세요.\\n`);\n return;\n }\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,\n p.name,\n p.type,\n p.model,\n ])\n );\n console.log();\n });\n\n prov\n .command(\"remove <id>\")\n .description(\"프로바이더 제거\")\n .action((id: string) => {\n if (removeProvider(id)) {\n printSuccess(`프로바이더 제거: ${id}`);\n } else {\n printError(`프로바이더를 찾을 수 없습니다: ${id}`);\n }\n });\n\n prov\n .command(\"use <id>\")\n .description(\"기본 프로바이더 설정\")\n .action((id: string) => {\n if (setDefaultProvider(id)) {\n printSuccess(`기본 프로바이더: ${id}`);\n } else {\n printError(`프로바이더를 찾을 수 없습니다: ${id}`);\n }\n });\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 StreamResult {\n content: string;\n toolCalls: {\n id: string;\n name: string;\n arguments: string;\n }[];\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 };\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 const toolCallMap = new Map<number, { id: string; name: string; arguments: string }>();\n\n for await (const chunk of stream) {\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 };\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 * 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 * 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 * OPEN XGEN 홈 — 메인 인터랙티브 허브\n */\nimport chalk from \"chalk\";\nimport { getAuth, getServer, getDefaultProvider, getProviders } from \"../config/store.js\";\nimport { welcome, box, divider, statusDot, menu, ask } from \"../utils/ui.js\";\nimport { agentRepl } from \"./agent.js\";\nimport { chat } from \"./chat.js\";\nimport { guidedProviderSetup } from \"./provider.js\";\n\nfunction showStatus(): void {\n const provider = getDefaultProvider();\n const server = getServer();\n const auth = getAuth();\n\n console.log(divider(\"상태\"));\n console.log();\n\n if (provider) {\n console.log(statusDot(true, chalk.bold(\"AI 에이전트\"), `${provider.name} · ${provider.model}`));\n } else {\n console.log(statusDot(false, \"AI 에이전트\", \"미설정\"));\n }\n\n if (server && auth) {\n console.log(statusDot(true, chalk.bold(\"XGEN 서버\"), `${auth.username} · ${server.replace(\"https://\", \"\")}`));\n } else if (server) {\n console.log(statusDot(false, \"XGEN 서버\", `${server.replace(\"https://\", \"\")} · 로그인 필요`));\n } else {\n console.log(statusDot(false, \"XGEN 서버\", \"미연결\"));\n }\n console.log();\n}\n\nexport async function homeMenu(): Promise<void> {\n console.log(welcome());\n console.log(chalk.gray(\" v0.3.2\\n\"));\n\n showStatus();\n\n while (true) {\n const provider = getDefaultProvider();\n const server = getServer();\n const auth = getAuth();\n const hasServer = !!(server && auth);\n\n // 동적 메뉴 구성\n const items: { label: string; hint: string; action: () => Promise<boolean> }[] = [];\n\n // AI 에이전트\n items.push({\n label: provider\n ? `${chalk.bold(\"AI 에이전트\")} ${chalk.gray(`(${provider.model})`)}`\n : chalk.bold(\"AI 에이전트 시작하기\"),\n hint: provider ? \"대화 시작\" : \"프로바이더 설정 → 바로 시작\",\n action: async () => {\n await agentRepl();\n console.log();\n showStatus();\n return false;\n },\n });\n\n // 워크플로우\n if (hasServer) {\n items.push({\n label: chalk.bold(\"워크플로우 채팅\"),\n hint: `${auth!.username}@${server!.replace(\"https://\", \"\")}`,\n action: async () => {\n await chat();\n console.log();\n showStatus();\n return false;\n },\n });\n\n items.push({\n label: \"워크플로우 목록\",\n hint: \"조회\",\n action: async () => {\n const { workflowList } = await import(\"./workflow/list.js\");\n await workflowList({ detail: false });\n return false;\n },\n });\n }\n\n // 서버 연결\n items.push({\n label: hasServer ? \"XGEN 서버 재설정\" : chalk.bold(\"XGEN 서버 연결\"),\n hint: hasServer ? \"서버 변경 / 재로그인\" : \"서버 URL + 로그인\",\n action: async () => {\n await serverSetup();\n showStatus();\n return false;\n },\n });\n\n // 프로바이더 관리\n items.push({\n label: \"프로바이더 관리\",\n hint: `${getProviders().length}개 등록됨`,\n action: async () => {\n await providerMenu();\n showStatus();\n return false;\n },\n });\n\n // 메뉴 출력\n console.log(divider(\"메뉴\"));\n for (let i = 0; i < items.length; i++) {\n const num = chalk.cyan.bold(` ${String(i + 1).padStart(2)}.`);\n console.log(` ${num} ${items[i].label}`);\n console.log(` ${chalk.gray(items[i].hint)}`);\n }\n console.log(` ${chalk.gray(\" q. 종료\")}`);\n console.log();\n\n const choice = await ask(chalk.cyan(\" ❯ \"));\n\n if (choice === \"q\" || choice === \"exit\" || choice === \"\") {\n if (choice === \"\") continue;\n console.log(chalk.gray(\"\\n 👋 다음에 또.\\n\"));\n break;\n }\n\n const idx = parseInt(choice) - 1;\n if (isNaN(idx) || idx < 0 || idx >= items.length) {\n console.log(chalk.red(` 잘못된 입력입니다.\\n`));\n continue;\n }\n\n try {\n const shouldExit = await items[idx].action();\n if (shouldExit) break;\n } catch (err) {\n console.log(chalk.red(`\\n 오류: ${(err as Error).message}\\n`));\n }\n }\n}\n\nasync function serverSetup(): Promise<void> {\n console.log();\n console.log(box([\"XGEN 서버 연결\"], \"cyan\"));\n console.log();\n\n const currentServer = getServer();\n const urlInput = await ask(\n chalk.white(` 서버 URL${currentServer ? chalk.gray(` [${currentServer}]`) : \"\"}: `)\n );\n const url = urlInput || currentServer;\n\n if (!url) {\n console.log(chalk.red(\" URL이 필요합니다.\\n\"));\n return;\n }\n\n const { setServer } = await import(\"../config/store.js\");\n setServer(url);\n console.log(chalk.green(` ✓ 서버: ${url}\\n`));\n\n // 로그인\n console.log(chalk.bold(\" 로그인\"));\n console.log();\n const email = await ask(chalk.white(\" 이메일: \"));\n const password = await ask(chalk.white(\" 비밀번호: \"));\n\n if (!email || !password) {\n console.log(chalk.red(\" 이메일과 비밀번호가 필요합니다.\\n\"));\n return;\n }\n\n try {\n const { apiLogin } = await import(\"../api/auth.js\");\n const { setAuth } = await import(\"../config/store.js\");\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 console.log(chalk.green(`\\n ✓ 로그인 성공! ${chalk.bold(result.username ?? email)}\\n`));\n } else {\n console.log(chalk.red(`\\n ✗ ${result.message}\\n`));\n }\n } catch (err) {\n console.log(chalk.red(`\\n ✗ ${(err as Error).message}\\n`));\n }\n}\n\nasync function providerMenu(): Promise<void> {\n const providers = getProviders();\n const defaultP = getDefaultProvider();\n\n console.log();\n console.log(box([\"프로바이더 관리\"], \"cyan\"));\n console.log();\n\n if (providers.length > 0) {\n for (const p of providers) {\n const mark = p.id === defaultP?.id ? chalk.green(\"● \") : chalk.gray(\" \");\n console.log(` ${mark}${chalk.bold(p.name)} ${chalk.gray(`${p.type} · ${p.model}`)}`);\n }\n console.log();\n } else {\n console.log(chalk.gray(\" 등록된 프로바이더가 없습니다.\\n\"));\n }\n\n const items = [\"새로 추가\"];\n if (providers.length > 1) items.push(\"기본 변경\");\n if (providers.length > 0) items.push(\"삭제\");\n items.push(\"돌아가기\");\n\n items.forEach((item, i) => {\n console.log(` ${chalk.cyan(`${i + 1}.`)} ${item}`);\n });\n console.log();\n\n const choice = await ask(chalk.cyan(\" ❯ \"));\n const ci = parseInt(choice);\n\n if (ci === 1) {\n await guidedProviderSetup();\n } else if (items[ci - 1] === \"기본 변경\") {\n console.log();\n providers.forEach((p, i) => {\n console.log(` ${chalk.cyan(`${i + 1}.`)} ${p.name} (${p.model})`);\n });\n console.log();\n const pc = await ask(chalk.cyan(\" ❯ \"));\n const pi = parseInt(pc) - 1;\n if (pi >= 0 && pi < providers.length) {\n const { setDefaultProvider } = await import(\"../config/store.js\");\n setDefaultProvider(providers[pi].id);\n console.log(chalk.green(` ✓ 기본: ${providers[pi].name}\\n`));\n }\n } else if (items[ci - 1] === \"삭제\") {\n console.log();\n providers.forEach((p, i) => {\n console.log(` ${chalk.cyan(`${i + 1}.`)} ${p.name} (${p.model})`);\n });\n console.log();\n const dc = await ask(chalk.white(\" 삭제할 번호: \"));\n const di = parseInt(dc) - 1;\n if (di >= 0 && di < providers.length) {\n const { removeProvider } = await import(\"../config/store.js\");\n removeProvider(providers[di].id);\n console.log(chalk.green(` ✓ 삭제: ${providers[di].name}\\n`));\n }\n }\n}\n","/**\n * xgen agent — OPEN XGEN AI 코딩 에이전트\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { getDefaultProvider } from \"../config/store.js\";\nimport { createLLMClient, streamChat, type Message } from \"../agent/llm.js\";\nimport { getAllToolDefs, executeTool, getToolNames } from \"../agent/tools/index.js\";\nimport { McpManager, loadMcpConfig } from \"../mcp/client.js\";\nimport { printError } from \"../utils/format.js\";\nimport { guidedProviderSetup } from \"./provider.js\";\nimport { box, divider, statusDot } from \"../utils/ui.js\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nconst SYSTEM_PROMPT = `You are OPEN XGEN Agent, an AI coding assistant running in the user's terminal.\nYou have access to tools for reading/writing files, executing commands, searching code, and running sandboxed code.\nYou can also use MCP (Model Context Protocol) tools if available.\nAlways respond in the same language as the user.\nWhen using tools, be concise about what you're doing.\nFor file edits, show what you changed briefly.\nFor sandbox_run, you can install npm/pip packages and run isolated code.`;\n\nlet mcpManager: McpManager | null = null;\n\nexport async function agentRepl(): Promise<void> {\n let provider = getDefaultProvider();\n if (!provider) {\n // 프로바이더 없으면 자동 가이드 설정\n provider = await guidedProviderSetup();\n if (!provider) {\n process.exit(1);\n }\n }\n\n const client = createLLMClient(provider);\n\n // 기본 도구\n const builtinTools = getAllToolDefs();\n const allTools: ChatCompletionTool[] = [...builtinTools];\n const allToolNames = [...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) {\n const mcpTools = mcpManager.getAllTools();\n allTools.push(...mcpTools);\n allToolNames.push(...mcpTools.map((t) => t.function.name));\n }\n } catch {\n // MCP 실패해도 계속 진행\n }\n }\n\n const messages: Message[] = [{ role: \"system\", content: SYSTEM_PROMPT }];\n\n // 헤더\n console.log();\n console.log(box([\n `${chalk.bold(\"OPEN XGEN Agent\")}`,\n ``,\n `${chalk.gray(\"프로바이더\")} ${provider.name} ${chalk.gray(\"·\")} ${provider.model}`,\n `${chalk.gray(\"도구\")} ${getToolNames().length}개 내장${mcpManager && mcpManager.serverCount > 0 ? ` + ${mcpManager.getAllTools().length}개 MCP` : \"\"}`,\n ``,\n `${chalk.gray(\"무엇이든 물어보세요. 파일 읽기/쓰기, 코드 실행, 검색 가능.\")}`,\n `${chalk.gray(\"/help 도움말 · /home 홈 · /exit 종료\")}`,\n ]));\n console.log();\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const askUser = (): Promise<string> =>\n new Promise((resolve) => rl.question(chalk.cyan.bold(\" ❯ \"), (a) => resolve(a.trim())));\n\n // Ctrl+C 처리\n process.on(\"SIGINT\", () => {\n console.log(chalk.gray(\"\\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 mcpManager?.stopAll();\n rl.close();\n break;\n }\n if (input === \"/help\") {\n console.log();\n console.log(chalk.bold(\" 슬래시 커맨드\"));\n console.log(chalk.gray(\" ─────────────────────────────\"));\n console.log(` ${chalk.cyan(\"/tools\")} 사용 가능한 도구 목록`);\n console.log(` ${chalk.cyan(\"/provider\")} 현재 프로바이더 정보`);\n console.log(` ${chalk.cyan(\"/model\")} 등록된 프로바이더 목록`);\n console.log(` ${chalk.cyan(\"/mcp\")} MCP 서버 상태`);\n console.log(` ${chalk.cyan(\"/clear\")} 대화 초기화`);\n console.log(` ${chalk.cyan(\"/home\")} 홈 메뉴로 돌아가기`);\n console.log(` ${chalk.cyan(\"/exit\")} 종료`);\n console.log();\n continue;\n }\n if (input === \"/clear\") {\n messages.length = 1;\n console.log(chalk.gray(\" 대화 초기화됨.\\n\"));\n continue;\n }\n if (input === \"/tools\") {\n console.log(chalk.bold(\"\\n내장 도구:\"), getToolNames().join(\", \"));\n if (mcpManager && mcpManager.serverCount > 0) {\n console.log(chalk.bold(\"MCP 도구:\"), mcpManager.getAllTools().map((t) => t.function.name).join(\", \"));\n }\n console.log();\n continue;\n }\n if (input === \"/provider\") {\n console.log(chalk.gray(`현재: ${provider.name} (${provider.model})`));\n console.log(chalk.gray(`변경: xgen provider add / xgen provider use <id>\\n`));\n continue;\n }\n if (input === \"/model\") {\n const { getProviders: gp } = await import(\"../config/store.js\");\n const all = gp();\n if (all.length > 0) {\n console.log(chalk.bold(\"\\n 등록된 프로바이더:\\n\"));\n all.forEach((p, i) => {\n const mark = p.id === provider.id ? chalk.green(\"● \") : \" \";\n console.log(` ${mark}${i + 1}) ${p.name} (${p.model})`);\n });\n console.log(chalk.gray(\"\\n 변경하려면 exit 후 xgen provider use <id>\\n\"));\n }\n continue;\n }\n if (input === \"/home\" || input === \"/menu\") {\n console.log(chalk.gray(\"에이전트를 종료하고 홈으로 돌아갑니다.\"));\n mcpManager?.stopAll();\n rl.close();\n const { homeMenu } = await import(\"./home.js\");\n await homeMenu();\n return;\n }\n if (input === \"/mcp\") {\n if (mcpManager && mcpManager.serverCount > 0) {\n console.log(chalk.bold(\"\\nMCP 서버:\"), mcpManager.getServerNames().join(\", \"));\n console.log(chalk.gray(\"도구:\"), mcpManager.getAllTools().map((t) => t.function.name).join(\", \"));\n } else {\n console.log(chalk.gray(\"MCP 서버 없음. .mcp.json을 프로젝트 루트에 추가하세요.\"));\n }\n console.log();\n continue;\n }\n\n messages.push({ role: \"user\", content: input });\n\n try {\n await runAgentLoop(client, provider.model, messages, allTools);\n } catch (err) {\n console.log(chalk.red(`\\n오류: ${(err as Error).message}\\n`));\n }\n }\n}\n\nasync function runAgentLoop(\n client: ReturnType<typeof createLLMClient>,\n model: string,\n messages: Message[],\n tools: ChatCompletionTool[]\n): Promise<void> {\n const MAX_ITERATIONS = 20;\n\n for (let i = 0; i < MAX_ITERATIONS; i++) {\n // AI 응답 시작\n let first = true;\n const result = await streamChat(client, model, messages, tools, (delta) => {\n if (first) {\n process.stdout.write(chalk.green(\"\\n AI ›\") + \" \");\n first = false;\n }\n process.stdout.write(delta);\n });\n\n if (result.content) {\n process.stdout.write(\"\\n\\n\");\n }\n\n if (result.toolCalls.length === 0) {\n if (result.content) {\n messages.push({ role: \"assistant\", content: result.content });\n }\n return;\n }\n\n // assistant 메시지 추가\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 // 도구 실행\n for (const tc of result.toolCalls) {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(tc.arguments);\n } catch {\n args = {};\n }\n\n console.log(chalk.gray(` ⚙ `) + chalk.white.bold(tc.name) + chalk.gray(` ${summarizeArgs(args)}`));\n\n let toolResult: string;\n 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 =\n toolResult.length > 4000 ? toolResult.slice(0, 4000) + \"\\n...(truncated)\" : toolResult;\n\n messages.push({\n role: \"tool\",\n tool_call_id: tc.id,\n content: truncated,\n });\n }\n }\n\n console.log(chalk.yellow(\"\\n최대 반복 횟수에 도달했습니다.\\n\"));\n}\n\nfunction summarizeArgs(args: Record<string, unknown>): string {\n const parts: string[] = [];\n for (const [k, v] of Object.entries(args)) {\n const s = String(v);\n parts.push(`${k}: ${s.length > 40 ? s.slice(0, 40) + \"...\" : s}`);\n }\n return parts.join(\", \");\n}\n\nexport function registerAgentCommand(program: Command): void {\n program\n .command(\"agent\")\n .description(\"OPEN XGEN AI 코딩 에이전트\")\n .action(async () => {\n await agentRepl();\n });\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\";\nimport { homeMenu } from \"./commands/home.js\";\n\nconst VERSION = \"0.3.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// 인자 없이 실행: 홈 메뉴\nif (process.argv.length <= 2) {\n homeMenu().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 — 워크플로우 커맨드 그룹\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 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 * 터미널 마크다운 렌더링 — 가볍게\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 opts: { limit?: number } = {}\n): Promise<void> {\n requireAuth();\n\n const limit = opts.limit ?? 20;\n\n try {\n const logs = await getIOLogs(workflowId, 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 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 * 문서 API\n */\nimport { getClient } from \"./client.js\";\nimport { createReadStream, statSync } from \"node:fs\";\nimport { basename } from \"node:path\";\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 listDocuments(collectionId?: string): Promise<Document[]> {\n const client = getClient();\n const params: Record<string, string> = {};\n if (collectionId) params.collection_id = collectionId;\n\n const res = await client.get(\"/api/documents/list\", { params });\n return res.data.documents ?? res.data ?? [];\n}\n\nexport async function uploadDocument(\n filePath: string,\n collectionId?: string,\n name?: string\n): Promise<unknown> {\n const client = getClient();\n const stat = statSync(filePath);\n const fileName = name || basename(filePath);\n\n const FormData = (await import(\"node:buffer\")).Blob ? globalThis.FormData : null;\n if (!FormData) throw new Error(\"FormData not available\");\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/documents/upload\", form, {\n headers: { \"Content-Type\": \"multipart/form-data\" },\n maxBodyLength: stat.size + 1024 * 1024,\n });\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/documents/${docId}`);\n return res.data;\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","/**\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"],"mappings":"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","names":["server","axios","client","chalk","chalk","createInterface","randomUUID","rl","program","chalk","createInterface","prompt","client","program","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","existsSync","readFileSync","join","createInterface","init_client","client","tools","chalk","createInterface","chalk","workflowList","setServer","apiLogin","setAuth","setDefaultProvider","removeProvider","chalk","createInterface","client","homeMenu","tools","program","init_client","chalk","chalk","program","chalk","program","clearAuth","apiValidate","chalk","chalk","chalk","text","createInterface","chalk","chalk","program","chalk","client","program","chalk","chalk","createInterface","client","randomUUID","program","chalk","createInterface","ask","chalk"]}