openxgen 1.3.2 → 1.3.3
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 +19 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2651,11 +2651,22 @@ EXAMPLES OF GOOD RESPONSES:
|
|
|
2651
2651
|
prompt2 += `
|
|
2652
2652
|
|
|
2653
2653
|
XGEN CONNECTED: ${server} as ${auth.username} (${env?.name ?? "default"})
|
|
2654
|
-
|
|
2655
|
-
|
|
2654
|
+
|
|
2655
|
+
XGEN CAPABILITIES (use these tools naturally):
|
|
2656
|
+
- xgen_workflow_list: \uC6CC\uD06C\uD50C\uB85C\uC6B0 \uC804\uCCB4 \uBAA9\uB85D. \uBC30\uD3EC \uC0C1\uD0DC, ID, deploy_key \uD3EC\uD568.
|
|
2657
|
+
- xgen_workflow_run: \uC6CC\uD06C\uD50C\uB85C\uC6B0 \uC2E4\uD589. deploy_key \uD544\uC694(\uBC30\uD3EC\uB41C \uAC83\uB9CC \uC2E4\uD589 \uAC00\uB2A5). \uC0AC\uC6A9\uC790\uAC00 \uBC88\uD638\uB098 \uC774\uB984 \uB9D0\uD558\uBA74 \uC774\uC804 \uBAA9\uB85D\uC5D0\uC11C \uCC3E\uC544\uC11C \uBC14\uB85C \uC2E4\uD589.
|
|
2658
|
+
- xgen_workflow_info: \uC6CC\uD06C\uD50C\uB85C\uC6B0 \uC0C1\uC138 (\uB178\uB4DC, \uC5E3\uC9C0 \uC218 \uB4F1). user_id=1 \uD544\uC694.
|
|
2659
|
+
- xgen_collection_list: \uBB38\uC11C \uCEEC\uB809\uC158 \uBAA9\uB85D (RAG \uC9C0\uC2DD\uBCA0\uC774\uC2A4). \uBB38\uC11C \uC218, \uCCAD\uD06C \uC218 \uD3EC\uD568.
|
|
2660
|
+
- xgen_execution_history: \uCD5C\uADFC \uC2E4\uD589 \uC774\uB825.
|
|
2661
|
+
- xgen_server_status: \uC11C\uBC84 \uC5F0\uACB0 \uC0C1\uD0DC.
|
|
2662
|
+
|
|
2663
|
+
WORKFLOW EXECUTION NOTES:
|
|
2664
|
+
- \uBC30\uD3EC\uB41C \uC6CC\uD06C\uD50C\uB85C\uC6B0\uB9CC \uC2E4\uD589 \uAC00\uB2A5. deploy_key\uAC00 \uC788\uC5B4\uC57C \uD568.
|
|
2665
|
+
- \uC2E4\uD589 \uC2DC input_data\uC5D0 \uC0AC\uC6A9\uC790 \uBA54\uC2DC\uC9C0\uB97C \uB123\uC74C.
|
|
2666
|
+
- \uC2E4\uD589 \uACB0\uACFC\uC758 content\uAC00 \uC751\uB2F5.`;
|
|
2656
2667
|
} else {
|
|
2657
2668
|
prompt2 += `
|
|
2658
|
-
XGEN: Not connected.
|
|
2669
|
+
XGEN: Not connected. User can run /connect to connect.`;
|
|
2659
2670
|
}
|
|
2660
2671
|
return prompt2;
|
|
2661
2672
|
}
|
|
@@ -2827,9 +2838,9 @@ async function runLoop(client2, model, messages, tools2) {
|
|
|
2827
2838
|
}
|
|
2828
2839
|
const shortArgs = Object.entries(args).map(([k, v]) => {
|
|
2829
2840
|
const s = String(v);
|
|
2830
|
-
return
|
|
2831
|
-
}).join(" ");
|
|
2832
|
-
console.log(chalk12.
|
|
2841
|
+
return s.length > 40 ? s.slice(0, 40) + "\u2026" : s;
|
|
2842
|
+
}).join(", ");
|
|
2843
|
+
console.log(chalk12.dim(` \u250C ${tc.name}(${shortArgs})`));
|
|
2833
2844
|
let toolResult;
|
|
2834
2845
|
if (isXgenTool(tc.name)) {
|
|
2835
2846
|
toolResult = await execute8(tc.name, args);
|
|
@@ -2839,6 +2850,8 @@ async function runLoop(client2, model, messages, tools2) {
|
|
|
2839
2850
|
toolResult = await executeTool(tc.name, args);
|
|
2840
2851
|
}
|
|
2841
2852
|
const truncated = toolResult.length > 4e3 ? toolResult.slice(0, 4e3) + "\n\u2026(truncated)" : toolResult;
|
|
2853
|
+
const preview = toolResult.split("\n")[0].slice(0, 60);
|
|
2854
|
+
console.log(chalk12.dim(` \u2514 ${preview}${toolResult.length > 60 ? "\u2026" : ""}`));
|
|
2842
2855
|
messages.push({ role: "tool", tool_call_id: tc.id, content: truncated });
|
|
2843
2856
|
}
|
|
2844
2857
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/store.ts","../src/api/client.ts","../src/utils/format.ts","../src/api/auth.ts","../src/api/workflow.ts","../src/utils/ui.ts","../src/commands/provider.ts","../src/agent/llm.ts","../src/api/document.ts","../src/dashboard/tui.ts","../src/index.ts","../src/commands/config.ts","../src/commands/login.ts","../src/commands/workflow/list.ts","../src/commands/workflow/info.ts","../src/commands/workflow/run.ts","../src/utils/sse.ts","../src/utils/markdown.ts","../src/commands/workflow/history.ts","../src/commands/workflow/index.ts","../src/commands/chat.ts","../src/commands/agent.ts","../src/agent/tools/file-read.ts","../src/agent/tools/file-write.ts","../src/agent/tools/file-edit.ts","../src/agent/tools/bash.ts","../src/agent/tools/grep.ts","../src/agent/tools/list-files.ts","../src/agent/tools/sandbox.ts","../src/agent/tools/index.ts","../src/agent/tools/xgen-api.ts","../src/mcp/client.ts","../src/commands/doc.ts","../src/commands/ontology.ts","../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 store.defaultId = provider.id; // 항상 새로 추가한 걸 기본으로\n writeJson(PROVIDERS_FILE, store, true);\n}\n\nexport function removeProvider(id: string): boolean {\n const store = getProvidersStore();\n const before = store.providers.length;\n store.providers = store.providers.filter((p) => p.id !== id);\n if (store.defaultId === id) {\n store.defaultId = store.providers[0]?.id ?? null;\n }\n writeJson(PROVIDERS_FILE, store, true);\n return store.providers.length < before;\n}\n\nexport function getDefaultProvider(): ProviderConfig | null {\n const store = getProvidersStore();\n if (!store.defaultId) return store.providers[0] ?? null;\n return store.providers.find((p) => p.id === store.defaultId) ?? null;\n}\n\nexport function setDefaultProvider(id: string): boolean {\n const store = getProvidersStore();\n const exists = store.providers.some((p) => p.id === id);\n if (!exists) return false;\n store.defaultId = id;\n writeJson(PROVIDERS_FILE, store, true);\n return true;\n}\n\n// ── Environments ──\n\nexport interface XgenEnvironment {\n id: string;\n name: string;\n url: string;\n email?: string;\n description?: string;\n}\n\nconst ENVIRONMENTS_FILE = join(XGEN_DIR, \"environments.json\");\n\ninterface EnvStore {\n environments: XgenEnvironment[];\n activeId: string | null;\n}\n\nconst DEFAULT_ENV_STORE: EnvStore = { environments: [], activeId: null };\n\nexport function getEnvStore(): EnvStore {\n return { ...DEFAULT_ENV_STORE, ...readJson(ENVIRONMENTS_FILE, DEFAULT_ENV_STORE) };\n}\n\nexport function getEnvironments(): XgenEnvironment[] {\n return getEnvStore().environments;\n}\n\nexport function addEnvironment(env: XgenEnvironment): void {\n const store = getEnvStore();\n store.environments = store.environments.filter((e) => e.id !== env.id);\n store.environments.push(env);\n if (!store.activeId) store.activeId = env.id;\n writeJson(ENVIRONMENTS_FILE, store);\n}\n\nexport function removeEnvironment(id: string): boolean {\n const store = getEnvStore();\n const before = store.environments.length;\n store.environments = store.environments.filter((e) => e.id !== id);\n if (store.activeId === id) store.activeId = store.environments[0]?.id ?? null;\n writeJson(ENVIRONMENTS_FILE, store);\n return store.environments.length < before;\n}\n\nexport function switchEnvironment(id: string): boolean {\n const store = getEnvStore();\n const env = store.environments.find((e) => e.id === id);\n if (!env) return false;\n store.activeId = id;\n writeJson(ENVIRONMENTS_FILE, store);\n // 서버 URL도 같이 변경\n setServer(env.url);\n return true;\n}\n\nexport function getActiveEnvironment(): XgenEnvironment | null {\n const store = getEnvStore();\n if (!store.activeId) return null;\n return store.environments.find((e) => e.id === store.activeId) ?? null;\n}\n\n// ── Helpers ──\n\nexport function requireServer(): string {\n const server = getServer();\n if (!server) {\n console.error(\"서버가 설정되지 않았습니다. 먼저 실행하세요:\");\n console.error(\" xgen config set-server <url>\");\n process.exit(1);\n }\n return server;\n}\n\nexport function requireAuth(): XgenAuth {\n const auth = getAuth();\n if (!auth) {\n console.error(\"로그인이 필요합니다. 먼저 실행하세요:\");\n console.error(\" xgen login\");\n process.exit(1);\n }\n return auth;\n}\n","/**\n * XGEN API 클라이언트\n * axios 인스턴스 + 토큰 자동 갱신 인터셉터\n */\nimport axios, { type AxiosInstance, type InternalAxiosRequestConfig } from \"axios\";\nimport {\n getAccessToken,\n getRefreshToken,\n getServer,\n setAuth,\n getAuth,\n clearAuth,\n} from \"../config/store.js\";\n\nlet client: AxiosInstance | null = null;\n\nexport function getClient(): AxiosInstance {\n if (client) return client;\n\n const server = getServer();\n if (!server) {\n throw new Error(\"서버가 설정되지 않았습니다. xgen config set-server <url>\");\n }\n\n client = axios.create({\n baseURL: server,\n timeout: 120_000,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // Request 인터셉터: 토큰 자동 추가\n client.interceptors.request.use((config: InternalAxiosRequestConfig) => {\n const token = getAccessToken();\n if (token && config.headers) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n });\n\n // Response 인터셉터: 401 시 토큰 갱신\n client.interceptors.response.use(\n (response) => response,\n async (error) => {\n const originalRequest = error.config;\n\n if (\n error.response?.status === 401 &&\n !originalRequest._retry &&\n getRefreshToken()\n ) {\n originalRequest._retry = true;\n\n try {\n const refreshToken = getRefreshToken()!;\n const server = getServer()!;\n const res = await axios.post(`${server}/api/auth/refresh`, {\n refresh_token: refreshToken,\n });\n\n if (res.data.success && res.data.access_token) {\n const auth = getAuth()!;\n setAuth({\n ...auth,\n accessToken: res.data.access_token,\n });\n\n originalRequest.headers.Authorization = `Bearer ${res.data.access_token}`;\n return client!(originalRequest);\n }\n } catch {\n clearAuth();\n console.error(\"\\n세션이 만료되었습니다. 다시 로그인하세요: xgen login\");\n process.exit(1);\n }\n }\n\n return Promise.reject(error);\n }\n );\n\n return client;\n}\n\n/** 클라이언트 리셋 (서버 변경 시) */\nexport function resetClient(): void {\n client = null;\n}\n","/**\n * 출력 포맷팅 유틸리티\n */\nimport chalk from \"chalk\";\n\nexport function printHeader(text: string): void {\n const line = \"─\".repeat(Math.max(text.length + 4, 40));\n console.log(chalk.cyan(line));\n console.log(chalk.cyan.bold(` ${text}`));\n console.log(chalk.cyan(line));\n}\n\nexport function printSuccess(text: string): void {\n console.log(chalk.green(`✓ ${text}`));\n}\n\nexport function printError(text: string): void {\n console.error(chalk.red(`✗ ${text}`));\n}\n\nexport function printWarning(text: string): void {\n console.log(chalk.yellow(`⚠ ${text}`));\n}\n\nexport function printInfo(text: string): void {\n console.log(chalk.blue(`ℹ ${text}`));\n}\n\nexport function printKeyValue(key: string, value: string | number | boolean | null | undefined): void {\n console.log(` ${chalk.gray(key + \":\")} ${value ?? chalk.dim(\"(없음)\")}`);\n}\n\nexport function printTable(headers: string[], rows: string[][]): void {\n // 각 컬럼의 최대 너비 계산\n const widths = headers.map((h, i) => {\n const colMax = rows.reduce((max, row) => Math.max(max, (row[i] ?? \"\").length), 0);\n return Math.max(h.length, colMax);\n });\n\n // 헤더 출력\n const headerLine = headers.map((h, i) => h.padEnd(widths[i])).join(\" \");\n console.log(chalk.bold(headerLine));\n console.log(chalk.gray(\"─\".repeat(headerLine.length)));\n\n // 행 출력\n for (const row of rows) {\n const line = row.map((cell, i) => (cell ?? \"\").padEnd(widths[i])).join(\" \");\n console.log(line);\n }\n}\n\nexport function truncate(text: string, maxLen = 50): string {\n if (text.length <= maxLen) return text;\n return text.slice(0, maxLen - 3) + \"...\";\n}\n\nexport function formatDate(dateStr?: string | null): string {\n if (!dateStr) return \"-\";\n try {\n const d = new Date(dateStr);\n return d.toLocaleDateString(\"ko-KR\") + \" \" + d.toLocaleTimeString(\"ko-KR\", { hour: \"2-digit\", minute: \"2-digit\" });\n } catch {\n return dateStr;\n }\n}\n","/**\n * 인증 API\n */\nimport axios from \"axios\";\nimport { createHash } from \"node:crypto\";\nimport { getServer } from \"../config/store.js\";\n\nexport interface LoginResult {\n success: boolean;\n message: string;\n access_token?: string;\n refresh_token?: string;\n token_type: string;\n user_id?: string;\n username?: string;\n}\n\nexport interface ValidateResult {\n valid: boolean;\n user_id?: string;\n username?: string;\n is_admin?: boolean;\n user_type?: string;\n available_user_sections?: string;\n new_access_token?: string;\n}\n\nexport async function apiLogin(\n email: string,\n password: string\n): Promise<LoginResult> {\n const server = getServer();\n if (!server) throw new Error(\"서버가 설정되지 않았습니다\");\n\n const hashedPassword = createHash(\"sha256\").update(password).digest(\"hex\");\n\n const res = await axios.post(`${server}/api/auth/login`, {\n email,\n password: hashedPassword,\n });\n\n return res.data;\n}\n\nexport async function apiValidate(\n accessToken: string\n): Promise<ValidateResult> {\n const server = getServer();\n if (!server) throw new Error(\"서버가 설정되지 않았습니다\");\n\n const res = await axios.get(`${server}/api/auth/validate`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n return res.data;\n}\n\nexport async function apiRefresh(\n refreshToken: string\n): Promise<{ success: boolean; access_token?: string }> {\n const server = getServer();\n if (!server) throw new Error(\"서버가 설정되지 않았습니다\");\n\n const res = await axios.post(`${server}/api/auth/refresh`, {\n refresh_token: refreshToken,\n });\n\n return res.data;\n}\n","/**\n * 워크플로우 API\n */\nimport { getClient } from \"./client.js\";\n\nexport interface Workflow {\n id?: string;\n workflow_id?: string;\n workflow_name: string;\n description?: string;\n created_at?: string;\n updated_at?: string;\n deploy_status?: string;\n version?: string;\n}\n\nexport interface WorkflowDetail {\n id: string;\n workflow_name: string;\n description?: string;\n nodes?: unknown[];\n edges?: unknown[];\n parameters?: Record<string, unknown>;\n}\n\nexport interface WorkflowExecuteRequest {\n workflow_id: string;\n workflow_name: string;\n input_data: string;\n interaction_id: string;\n parameters?: Record<string, unknown>;\n}\n\nexport interface IOLog {\n interaction_id: string;\n input_data: string;\n output_data: string;\n created_at: string;\n execution_time?: number;\n}\n\nexport async function listWorkflows(userId?: string): Promise<Workflow[]> {\n const client = getClient();\n const params: Record<string, string> = {};\n if (userId) params.user_id = userId;\n\n const res = await client.get(\"/api/workflow/list\", { params });\n return res.data.workflows ?? res.data;\n}\n\nexport async function getWorkflowDetail(workflowId: string): Promise<WorkflowDetail> {\n const client = getClient();\n const res = await client.get(`/api/workflow/load/${workflowId}`);\n return res.data;\n}\n\nexport async function getWorkflowListDetail(): Promise<Workflow[]> {\n const client = getClient();\n const res = await client.get(\"/api/workflow/list/detail\");\n return res.data.workflows ?? res.data;\n}\n\n/**\n * 워크플로우 스트리밍 실행\n * SSE 응답을 반환 — 호출자가 직접 파싱\n */\nexport async function executeWorkflowStream(\n request: WorkflowExecuteRequest\n): Promise<NodeJS.ReadableStream> {\n const client = getClient();\n const res = await client.post(\"/api/workflow/execute/based_id/stream\", request, {\n responseType: \"stream\",\n headers: {\n Accept: \"text/event-stream\",\n },\n });\n\n return res.data;\n}\n\n/**\n * 워크플로우 실행 (non-stream, deploy 엔드포인트)\n * K3s Istio 환경에서 based_id/stream은 Next.js로 라우팅되어 CLI 접근 불가\n * deploy/result 엔드포인트 사용\n */\nexport async function executeWorkflow(\n request: WorkflowExecuteRequest & { deploy_key?: string }\n): Promise<unknown> {\n const client = getClient();\n // deploy_key가 있으면 deploy 엔드포인트, 없으면 based_id\n if (request.deploy_key) {\n const res = await client.post(\"/api/workflow/execute/deploy/result\", request);\n return res.data;\n }\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 * OPEN XGEN UI 유틸리티 — 터미널 UI 컴포넌트\n */\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\n\nconst W = Math.min(process.stdout.columns || 60, 70);\n\n// ── 박스 ──\n\nexport function box(lines: string[], color: \"cyan\" | \"green\" | \"yellow\" | \"gray\" = \"cyan\"): string {\n const c = chalk[color];\n const inner = W - 4;\n const top = c(\" ╭\" + \"─\".repeat(inner) + \"╮\");\n const bot = c(\" ╰\" + \"─\".repeat(inner) + \"╯\");\n const body = lines.map((line) => {\n const clean = line.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n const pad = Math.max(0, inner - clean.length);\n return c(\" │ \") + line + \" \".repeat(pad) + c(\" │\");\n });\n return [top, ...body, bot].join(\"\\n\");\n}\n\n// ── 구분선 ──\n\nexport function divider(label?: string): string {\n if (label) {\n const rest = W - label.length - 6;\n return chalk.gray(` ── ${label} ${\"─\".repeat(Math.max(0, rest))}`);\n }\n return chalk.gray(\" \" + \"─\".repeat(W - 2));\n}\n\n// ── 상태 표시 ──\n\nexport function statusDot(active: boolean, label: string, detail?: string): string {\n const dot = active ? chalk.green(\"●\") : chalk.gray(\"○\");\n const d = detail ? chalk.gray(` ${detail}`) : \"\";\n return ` ${dot} ${label}${d}`;\n}\n\n// ── 번호 메뉴 ──\n\nexport interface MenuItem {\n label: string;\n hint?: string;\n disabled?: boolean;\n}\n\nexport function menu(items: MenuItem[], opts?: { title?: string }): string {\n const lines: string[] = [];\n if (opts?.title) {\n lines.push(\"\");\n lines.push(chalk.bold(` ${opts.title}`));\n lines.push(\"\");\n }\n items.forEach((item, i) => {\n const num = chalk.cyan.bold(` ${String(i + 1).padStart(2)}.`);\n const hint = item.hint ? chalk.gray(` — ${item.hint}`) : \"\";\n const label = item.disabled ? chalk.gray(item.label) : item.label;\n lines.push(` ${num} ${label}${hint}`);\n });\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n// ── 프롬프트 ──\n\nexport function ask(question: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\n// ── 채팅 메시지 ──\n\nexport function userMsg(text: string): string {\n return `\\n ${chalk.blue.bold(\"You\")} ${chalk.gray(\"›\")} ${text}`;\n}\n\nexport function aiMsg(name: string): string {\n return `\\n ${chalk.green.bold(name)} ${chalk.gray(\"›\")} `;\n}\n\nexport function toolCall(name: string, summary: string): string {\n return chalk.gray(` ⚙ ${chalk.white(name)} ${summary}`);\n}\n\nexport function toolResult(text: string): string {\n const lines = text.split(\"\\n\").slice(0, 5);\n return lines.map((l) => chalk.gray(` │ ${l}`)).join(\"\\n\");\n}\n\n// ── 환영 메시지 ──\n\nexport function welcome(): string {\n const logo = chalk.cyan(`\n ██████ ██████ ███████ ███ ██\n ██ ██ ██ ██ ██ ████ ██\n ██ ██ ██████ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██\n ██████ ██ ███████ ██ ████`) +\n chalk.white.bold(`\n ██ ██ ██████ ███████ ███ ██\n ██ ██ ██ ██ ████ ██\n ███ ██ ███ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██ ██\n ██ ██ ██████ ███████ ██ ████`);\n\n return logo;\n}\n\n// ── 진행 표시 ──\n\nexport function spinner(): { update: (text: string) => void; stop: () => void } {\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n let i = 0;\n let text = \"\";\n const interval = setInterval(() => {\n process.stdout.write(`\\r ${chalk.cyan(frames[i++ % frames.length])} ${chalk.gray(text)}`);\n }, 80);\n\n return {\n update(t: string) { text = t; },\n stop() {\n clearInterval(interval);\n process.stdout.write(\"\\r\" + \" \".repeat(W) + \"\\r\");\n },\n };\n}\n","/**\n * xgen provider — AI 프로바이더 관리\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport OpenAI from \"openai\";\nimport {\n addProvider,\n getProviders,\n removeProvider,\n getDefaultProvider,\n setDefaultProvider,\n type ProviderConfig,\n} from \"../config/store.js\";\nimport { printSuccess, printError, printTable } from \"../utils/format.js\";\nimport { ask, box } from \"../utils/ui.js\";\n\ninterface ProviderPreset {\n label: string;\n type: ProviderConfig[\"type\"];\n baseUrl?: string;\n defaultModel: string;\n models: string[];\n needsKey: boolean;\n keyHint: string;\n envKey?: string;\n}\n\nconst PRESETS: ProviderPreset[] = [\n {\n label: \"OpenAI\",\n type: \"openai\",\n defaultModel: \"gpt-4o-mini\",\n models: [\n \"gpt-4o\", \"gpt-4o-mini\",\n \"gpt-4.1\", \"gpt-4.1-mini\", \"gpt-4.1-nano\",\n \"o3-mini\", \"o4-mini\",\n \"gpt-3.5-turbo\",\n ],\n needsKey: true,\n keyHint: \"https://platform.openai.com/api-keys\",\n envKey: \"OPENAI_API_KEY\",\n },\n {\n label: \"Google Gemini\",\n type: \"gemini\",\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n defaultModel: \"gemini-2.0-flash\",\n models: [\n \"gemini-2.5-pro-preview-06-05\",\n \"gemini-2.5-flash-preview-05-20\",\n \"gemini-2.0-flash\",\n \"gemini-2.0-flash-lite\",\n \"gemini-1.5-pro\",\n \"gemini-1.5-flash\",\n ],\n needsKey: true,\n keyHint: \"https://aistudio.google.com/apikey\",\n envKey: \"GEMINI_API_KEY\",\n },\n {\n label: \"Anthropic (Claude)\",\n type: \"anthropic\",\n baseUrl: \"https://api.anthropic.com/v1\",\n defaultModel: \"claude-sonnet-4-20250514\",\n models: [\n \"claude-opus-4-20250514\",\n \"claude-sonnet-4-20250514\",\n \"claude-haiku-4-5-20251001\",\n \"claude-3.5-sonnet-20241022\",\n ],\n needsKey: true,\n keyHint: \"https://console.anthropic.com/settings/keys\",\n envKey: \"ANTHROPIC_API_KEY\",\n },\n {\n label: \"Ollama (로컬 무료)\",\n type: \"ollama\",\n baseUrl: \"http://localhost:11434/v1\",\n defaultModel: \"llama3.1\",\n models: [\n \"llama3.1\", \"llama3.2\", \"llama3.3\",\n \"codellama\", \"deepseek-coder-v2\",\n \"qwen2.5-coder\", \"qwen2.5\",\n \"mistral\", \"mixtral\",\n \"phi3\", \"gemma2\",\n ],\n needsKey: false,\n keyHint: \"https://ollama.ai 설치 후 ollama pull <모델>\",\n },\n {\n label: \"Groq (빠른 추론)\",\n type: \"custom\",\n baseUrl: \"https://api.groq.com/openai/v1\",\n defaultModel: \"llama-3.3-70b-versatile\",\n models: [\n \"llama-3.3-70b-versatile\",\n \"llama-3.1-8b-instant\",\n \"mixtral-8x7b-32768\",\n \"gemma2-9b-it\",\n ],\n needsKey: true,\n keyHint: \"https://console.groq.com/keys\",\n envKey: \"GROQ_API_KEY\",\n },\n {\n label: \"Together AI\",\n type: \"custom\",\n baseUrl: \"https://api.together.xyz/v1\",\n defaultModel: \"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo\",\n models: [\n \"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo\",\n \"meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo\",\n \"mistralai/Mixtral-8x7B-Instruct-v0.1\",\n \"Qwen/Qwen2.5-72B-Instruct-Turbo\",\n ],\n needsKey: true,\n keyHint: \"https://api.together.xyz/settings/api-keys\",\n envKey: \"TOGETHER_API_KEY\",\n },\n {\n label: \"OpenRouter (멀티 모델)\",\n type: \"custom\",\n baseUrl: \"https://openrouter.ai/api/v1\",\n defaultModel: \"openai/gpt-4o-mini\",\n models: [\n \"openai/gpt-4o\", \"openai/gpt-4o-mini\",\n \"anthropic/claude-sonnet-4\", \"anthropic/claude-haiku-4.5\",\n \"google/gemini-2.0-flash-exp\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"deepseek/deepseek-chat-v3\",\n ],\n needsKey: true,\n keyHint: \"https://openrouter.ai/keys\",\n envKey: \"OPENROUTER_API_KEY\",\n },\n {\n label: \"DeepSeek\",\n type: \"custom\",\n baseUrl: \"https://api.deepseek.com/v1\",\n defaultModel: \"deepseek-chat\",\n models: [\n \"deepseek-chat\",\n \"deepseek-coder\",\n \"deepseek-reasoner\",\n ],\n needsKey: true,\n keyHint: \"https://platform.deepseek.com/api_keys\",\n envKey: \"DEEPSEEK_API_KEY\",\n },\n {\n label: \"기타 (OpenAI 호환 서버)\",\n type: \"custom\",\n defaultModel: \"gpt-4o-mini\",\n models: [],\n needsKey: true,\n keyHint: \"서버에서 발급받은 API Key\",\n },\n];\n\n/**\n * 환경변수에서 API 키 자동 감지\n */\nfunction detectEnvKey(preset: ProviderPreset): string | null {\n if (!preset.envKey) return null;\n return process.env[preset.envKey] ?? null;\n}\n\n/**\n * 가이드 설정\n */\nexport async function guidedProviderSetup(): Promise<ProviderConfig | null> {\n console.log();\n console.log(box([\"OPEN XGEN — 프로바이더 설정\", \"\", chalk.gray(\"AI 에이전트에 사용할 LLM을 선택하세요.\")]));\n console.log();\n\n // 프로바이더 목록\n console.log(chalk.bold(\" 프로바이더 선택:\\n\"));\n PRESETS.forEach((p, i) => {\n const envDetected = detectEnvKey(p);\n const envTag = envDetected ? chalk.green(\" [키 감지됨]\") : \"\";\n const free = !p.needsKey ? chalk.green(\" [무료]\") : \"\";\n console.log(` ${chalk.cyan(`${String(i + 1).padStart(2)}.`)} ${p.label}${free}${envTag}`);\n console.log(` ${chalk.gray(p.defaultModel)}`);\n });\n console.log();\n\n const choice = await ask(chalk.cyan(\" 번호: \"));\n const idx = parseInt(choice) - 1;\n if (isNaN(idx) || idx < 0 || idx >= PRESETS.length) {\n console.log(chalk.red(\" 잘못된 선택.\\n\"));\n return null;\n }\n\n const preset = PRESETS[idx];\n console.log(chalk.green(`\\n ✓ ${preset.label}\\n`));\n\n // API Key (환경변수 자동감지)\n let apiKey = \"\";\n if (preset.needsKey) {\n const envKey = detectEnvKey(preset);\n if (envKey) {\n console.log(chalk.green(` API Key 자동 감지 (${preset.envKey})`));\n const useEnv = await ask(chalk.white(` 이 키를 사용할까요? (Y/n): `));\n if (useEnv.toLowerCase() !== \"n\") {\n apiKey = envKey;\n }\n }\n if (!apiKey) {\n console.log(chalk.gray(` 발급: ${preset.keyHint}\\n`));\n apiKey = await ask(chalk.white(\" API Key: \"));\n if (!apiKey) {\n console.log(chalk.red(\" API Key 필요.\\n\"));\n return null;\n }\n }\n }\n\n // Base URL\n let baseUrl = preset.baseUrl;\n if (preset.label === \"기타 (OpenAI 호환 서버)\") {\n baseUrl = await ask(chalk.white(\" Base URL: \"));\n if (!baseUrl) {\n console.log(chalk.red(\" URL 필요.\\n\"));\n return null;\n }\n }\n\n // 모델 선택\n let model = preset.defaultModel;\n if (preset.models.length > 0) {\n console.log(chalk.bold(\"\\n 모델:\\n\"));\n const defaultIdx = preset.models.indexOf(preset.defaultModel);\n preset.models.forEach((m, i) => {\n const tag = i === defaultIdx ? chalk.green(\" ← 추천\") : \"\";\n console.log(` ${chalk.cyan(`${String(i + 1).padStart(2)}.`)} ${m}${tag}`);\n });\n console.log(` ${chalk.cyan(`${String(preset.models.length + 1).padStart(2)}.`)} 직접 입력`);\n console.log();\n\n const mc = await ask(chalk.cyan(` 번호 [${defaultIdx + 1}]: `));\n if (!mc || mc === String(defaultIdx + 1)) {\n model = preset.defaultModel;\n } else {\n const mi = parseInt(mc) - 1;\n if (mi >= 0 && mi < preset.models.length) {\n model = preset.models[mi];\n } else if (parseInt(mc) === preset.models.length + 1) {\n model = (await ask(chalk.white(\" 모델명: \"))) || preset.defaultModel;\n }\n }\n } else if (preset.label === \"기타 (OpenAI 호환 서버)\") {\n model = (await ask(chalk.white(` 모델명 [${preset.defaultModel}]: `))) || preset.defaultModel;\n }\n\n console.log(chalk.green(`\\n ✓ ${preset.label} · ${model}`));\n\n // 연결 테스트\n console.log(chalk.gray(\" 연결 테스트 중...\\n\"));\n const provider: ProviderConfig = {\n id: preset.label.toLowerCase().replace(/[^a-z0-9]/g, \"-\").replace(/-+/g, \"-\"),\n name: preset.label,\n type: preset.type,\n baseUrl,\n apiKey,\n model,\n };\n\n try {\n const client = new OpenAI({ apiKey: apiKey || \"ollama\", baseURL: baseUrl });\n await client.chat.completions.create({\n model,\n messages: [{ role: \"user\", content: \"Hi\" }],\n max_tokens: 5,\n });\n console.log(chalk.green(\" ✓ 연결 성공!\\n\"));\n } catch (err) {\n console.log(chalk.yellow(` ⚠ 테스트 실패: ${(err as Error).message}`));\n console.log(chalk.gray(\" 설정은 저장됩니다.\\n\"));\n }\n\n addProvider(provider);\n console.log(chalk.green.bold(` ✓ 설정 완료! ${preset.label} (${model})\\n`));\n\n return provider;\n}\n\nexport function registerProviderCommand(program: Command): void {\n const prov = program.command(\"provider\").description(\"AI 프로바이더 관리\");\n\n prov.command(\"add\").description(\"프로바이더 추가\").action(async () => {\n await guidedProviderSetup();\n });\n\n prov.command(\"list\").alias(\"ls\").description(\"프로바이더 목록\").action(() => {\n const providers = getProviders();\n const defaultP = getDefaultProvider();\n if (providers.length === 0) {\n console.log(chalk.yellow(\"\\n 프로바이더 없음. xgen provider add\\n\"));\n return;\n }\n console.log(chalk.cyan.bold(`\\n 프로바이더 (${providers.length}개)\\n`));\n printTable(\n [\"\", \"ID\", \"이름\", \"타입\", \"모델\"],\n providers.map((p) => [\n p.id === defaultP?.id ? chalk.green(\"●\") : \" \",\n p.id, p.name, p.type, p.model,\n ])\n );\n console.log();\n });\n\n prov.command(\"remove <id>\").description(\"프로바이더 제거\").action((id: string) => {\n removeProvider(id) ? printSuccess(`제거: ${id}`) : printError(`없음: ${id}`);\n });\n\n prov.command(\"use <id>\").description(\"기본 프로바이더 설정\").action((id: string) => {\n setDefaultProvider(id) ? printSuccess(`기본: ${id}`) : printError(`없음: ${id}`);\n });\n}\n","/**\n * 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","/**\n * 문서/컬렉션 API — 실제 작동하는 엔드포인트\n */\nimport { getClient } from \"./client.js\";\n\nexport interface Collection {\n id: number;\n collection_make_name: string;\n collection_name: string;\n description?: string;\n total_documents: number;\n total_chunks: number;\n is_shared: boolean;\n share_group?: string;\n init_embedding_model?: string;\n created_at?: string;\n}\n\nexport interface Document {\n id?: string;\n document_id?: string;\n name?: string;\n file_name?: string;\n file_type?: string;\n status?: string;\n created_at?: string;\n file_size?: number;\n}\n\nexport async function listCollections(): Promise<Collection[]> {\n const client = getClient();\n const res = await client.get(\"/api/retrieval/collections\");\n return Array.isArray(res.data) ? res.data : res.data.collections ?? [];\n}\n\nexport async function listDocuments(collectionId?: string): Promise<Document[]> {\n const client = getClient();\n try {\n const params: Record<string, string> = {};\n if (collectionId) params.collection_id = collectionId;\n const res = await client.get(\"/api/retrieval/documents/list\", { params });\n return res.data.documents ?? res.data ?? [];\n } catch {\n return [];\n }\n}\n\nexport async function uploadDocument(\n filePath: string,\n collectionId?: string,\n name?: string\n): Promise<unknown> {\n const client = getClient();\n const { createReadStream, statSync } = await import(\"node:fs\");\n const { basename } = await import(\"node:path\");\n const stat = statSync(filePath);\n const fileName = name || basename(filePath);\n\n const form = new FormData();\n const fileBlob = new Blob([createReadStream(filePath) as unknown as BlobPart]);\n form.append(\"file\", fileBlob, fileName);\n if (collectionId) form.append(\"collection_id\", collectionId);\n\n const res = await client.post(\"/api/retrieval/documents/upload\", form, {\n headers: { \"Content-Type\": \"multipart/form-data\" },\n maxBodyLength: stat.size + 1024 * 1024,\n });\n return res.data;\n}\n\nexport async function getDocumentInfo(docId: string): Promise<Document> {\n const client = getClient();\n const res = await client.get(`/api/retrieval/documents/${docId}`);\n return res.data;\n}\n","/**\n * OPEN XGEN TUI 대시보드 — blessed 기반 화면 분할\n *\n * ┌─────────────────────┬──────────────────────┐\n * │ 워크플로우 목록 │ 상세 정보 / 실행 │\n * │ (화살표 선택) │ │\n * │ │ │\n * ├─────────────────────┼──────────────────────┤\n * │ 컬렉션 / 문서 │ AI 채팅 │\n * │ │ (입력 + 응답) │\n * │ │ │\n * └─────────────────────┴──────────────────────┘\n * [Tab: 패널 전환] [Enter: 선택/실행] [q: 종료]\n */\nimport blessed from \"blessed\";\nimport { getServer, getAuth, getDefaultProvider, getActiveEnvironment } from \"../config/store.js\";\n\n// 타입\ninterface WfItem {\n name: string;\n id: string;\n deployed: boolean;\n deployKey?: string;\n nodeCount?: number;\n}\n\ninterface ColItem {\n name: string;\n docs: number;\n chunks: number;\n shared: boolean;\n group?: string;\n}\n\nexport async function startTui(): Promise<void> {\n const screen = blessed.screen({\n smartCSR: true,\n title: \"OPEN XGEN\",\n fullUnicode: true,\n });\n\n const provider = getDefaultProvider();\n const server = getServer();\n const auth = getAuth();\n const env = getActiveEnvironment();\n\n // ── 헤더 ──\n const header = blessed.box({\n top: 0, left: 0, width: \"100%\", height: 3,\n content: `{center}{bold}OPEN XGEN{/bold} ${provider?.model ?? \"AI 미설정\"} · ${auth?.username ?? \"미연결\"}@${env?.name ?? server?.replace(\"https://\", \"\") ?? \"\"}{/center}`,\n tags: true,\n style: { fg: \"white\", bg: \"blue\" },\n });\n\n // ── 왼쪽 상단: 워크플로우 ──\n const wfPanel = blessed.list({\n top: 3, left: 0, width: \"50%\", height: \"50%-2\",\n label: \" 워크플로우 \",\n border: { type: \"line\" },\n style: {\n border: { fg: \"cyan\" },\n selected: { fg: \"black\", bg: \"cyan\" },\n item: { fg: \"white\" },\n label: { fg: \"cyan\", bold: true },\n },\n keys: true,\n vi: true,\n mouse: true,\n scrollbar: { ch: \"│\", style: { fg: \"cyan\" } },\n tags: true,\n });\n\n // ── 오른쪽 상단: 상세/실행 결과 ──\n const detailPanel = blessed.box({\n top: 3, left: \"50%\", width: \"50%\", height: \"50%-2\",\n label: \" 상세 \",\n border: { type: \"line\" },\n scrollable: true,\n alwaysScroll: true,\n mouse: true,\n tags: true,\n style: {\n border: { fg: \"green\" },\n label: { fg: \"green\", bold: true },\n },\n });\n\n // ── 왼쪽 하단: 컬렉션 ──\n const colPanel = blessed.list({\n top: \"50%+1\", left: 0, width: \"50%\", height: \"50%-4\",\n label: \" 컬렉션 (문서) \",\n border: { type: \"line\" },\n style: {\n border: { fg: \"yellow\" },\n selected: { fg: \"black\", bg: \"yellow\" },\n item: { fg: \"white\" },\n label: { fg: \"yellow\", bold: true },\n },\n keys: true,\n vi: true,\n mouse: true,\n tags: true,\n });\n\n // ── 오른쪽 하단: AI 채팅 ──\n const chatLog = blessed.log({\n top: \"50%+1\", left: \"50%\", width: \"50%\", height: \"50%-7\",\n label: \" AI 채팅 \",\n border: { type: \"line\" },\n scrollable: true,\n alwaysScroll: true,\n mouse: true,\n tags: true,\n style: {\n border: { fg: \"magenta\" },\n label: { fg: \"magenta\", bold: true },\n },\n });\n\n // ── 채팅 입력 ──\n const chatInput = blessed.textbox({\n bottom: 3, left: \"50%\", width: \"50%\", height: 3,\n label: \" 입력 \",\n border: { type: \"line\" },\n inputOnFocus: true,\n style: {\n border: { fg: \"magenta\" },\n label: { fg: \"magenta\" },\n },\n });\n\n // ── 상태 바 ──\n const statusBar = blessed.box({\n bottom: 0, left: 0, width: \"100%\", height: 3,\n content: \" {bold}Tab{/bold}:패널전환 {bold}Enter{/bold}:선택 {bold}r{/bold}:새로고침 {bold}c{/bold}:채팅 {bold}q{/bold}:종료 {bold}↑↓{/bold}:이동\",\n tags: true,\n style: { fg: \"white\", bg: \"gray\" },\n });\n\n screen.append(header);\n screen.append(wfPanel);\n screen.append(detailPanel);\n screen.append(colPanel);\n screen.append(chatLog);\n screen.append(chatInput);\n screen.append(statusBar);\n\n // ── 데이터 ──\n let workflows: WfItem[] = [];\n let collections: ColItem[] = [];\n\n async function loadData(): Promise<void> {\n if (!server || !auth) {\n wfPanel.setItems([\"서버 미연결 — q 종료 후 xgen agent → /connect\"]);\n colPanel.setItems([\"서버 미연결\"]);\n screen.render();\n return;\n }\n\n statusBar.setContent(\" 로딩 중...\");\n screen.render();\n\n try {\n const { getWorkflowListDetail } = await import(\"../api/workflow.js\");\n const wfs = await getWorkflowListDetail();\n workflows = wfs.map((w) => ({\n name: w.workflow_name,\n id: (w.workflow_id ?? w.id ?? \"\").toString(),\n deployed: !!(w as Record<string, unknown>).is_deployed,\n deployKey: (w as Record<string, unknown>).deploy_key as string | undefined,\n nodeCount: (w as Record<string, unknown>).node_count as number | undefined,\n }));\n wfPanel.setItems(workflows.map((w) => {\n const tag = w.deployed ? \"{green-fg}[배포]{/green-fg}\" : \"\";\n return ` ${w.name} ${tag}`;\n }));\n } catch (err) {\n wfPanel.setItems([`오류: ${(err as Error).message}`]);\n }\n\n try {\n const { listCollections } = await import(\"../api/document.js\");\n const cols = await listCollections();\n collections = cols.map((c) => ({\n name: c.collection_make_name,\n docs: c.total_documents,\n chunks: c.total_chunks,\n shared: c.is_shared,\n group: c.share_group ?? undefined,\n }));\n colPanel.setItems(collections.map((c) => {\n const shared = c.shared ? `{yellow-fg}[${c.group}]{/yellow-fg}` : \"\";\n return ` ${c.name} ${shared} — ${c.docs}문서 ${c.chunks}청크`;\n }));\n } catch {\n colPanel.setItems([\"컬렉션 로드 실패\"]);\n }\n\n statusBar.setContent(\" {bold}Tab{/bold}:패널전환 {bold}Enter{/bold}:선택 {bold}r{/bold}:새로고침 {bold}c{/bold}:채팅 {bold}q{/bold}:종료 {bold}↑↓{/bold}:이동\");\n screen.render();\n }\n\n // ── 워크플로우 선택 시 상세 표시 ──\n wfPanel.on(\"select item\", (_item: unknown, index: number) => {\n const w = workflows[index];\n if (!w) return;\n detailPanel.setContent([\n `{bold}${w.name}{/bold}`,\n \"\",\n `ID: ${w.id}`,\n `배포: ${w.deployed ? \"{green-fg}Yes{/green-fg}\" : \"No\"}`,\n w.deployKey ? `Deploy Key: ${w.deployKey}` : \"\",\n w.nodeCount ? `노드: ${w.nodeCount}개` : \"\",\n \"\",\n w.deployed ? \"{green-fg}Enter로 실행{/green-fg}\" : \"{gray-fg}미배포 — 실행 불가{/gray-fg}\",\n ].filter(Boolean).join(\"\\n\"));\n screen.render();\n });\n\n // ── 워크플로우 실행 (Enter) ──\n wfPanel.on(\"select\", async (_item: unknown, index: number) => {\n const w = workflows[index];\n if (!w || !w.deployed || !w.deployKey) {\n detailPanel.setContent(\"{red-fg}배포된 워크플로우만 실행 가능합니다.{/red-fg}\");\n screen.render();\n return;\n }\n detailPanel.setContent(`{yellow-fg}${w.name} 실행 중...{/yellow-fg}`);\n screen.render();\n\n try {\n const { executeWorkflow } = await import(\"../api/workflow.js\");\n const { randomUUID } = await import(\"node:crypto\");\n const result = await executeWorkflow({\n workflow_id: w.id,\n workflow_name: w.name,\n input_data: \"테스트 실행\",\n interaction_id: `cli_${randomUUID().slice(0, 8)}`,\n deploy_key: w.deployKey,\n }) as Record<string, unknown>;\n\n if (result.content) {\n detailPanel.setContent(`{green-fg}결과:{/green-fg}\\n\\n${String(result.content).slice(0, 500)}`);\n } else if (result.error) {\n detailPanel.setContent(`{red-fg}오류:{/red-fg} ${result.error}`);\n } else {\n detailPanel.setContent(JSON.stringify(result, null, 2).slice(0, 500));\n }\n } catch (err) {\n detailPanel.setContent(`{red-fg}실행 실패:{/red-fg} ${(err as Error).message}`);\n }\n screen.render();\n });\n\n // ── 컬렉션 선택 ──\n colPanel.on(\"select item\", (_item: unknown, index: number) => {\n const c = collections[index];\n if (!c) return;\n detailPanel.setContent([\n `{bold}${c.name}{/bold}`,\n \"\",\n `문서: ${c.docs}개`,\n `청크: ${c.chunks}개`,\n `공유: ${c.shared ? `Yes (${c.group})` : \"No\"}`,\n ].join(\"\\n\"));\n screen.render();\n });\n\n // ── 채팅 ──\n chatInput.on(\"submit\", async (value: string) => {\n if (!value.trim()) { chatInput.clearValue(); chatInput.focus(); screen.render(); return; }\n chatLog.log(`{blue-fg}You:{/blue-fg} ${value}`);\n chatInput.clearValue();\n screen.render();\n\n try {\n const provider = getDefaultProvider();\n if (!provider) {\n chatLog.log(\"{red-fg}프로바이더 미설정{/red-fg}\");\n chatInput.focus();\n screen.render();\n return;\n }\n\n const { createLLMClient, streamChat } = await import(\"../agent/llm.js\");\n const client = createLLMClient(provider);\n const result = await streamChat(client, provider.model, [\n { role: \"system\", content: \"You are OPEN XGEN. Be concise. Respond in Korean. Max 3 sentences.\" },\n { role: \"user\", content: value },\n ]);\n chatLog.log(`{green-fg}AI:{/green-fg} ${result.content || \"(no response)\"}`);\n } catch (err) {\n chatLog.log(`{red-fg}오류:{/red-fg} ${(err as Error).message}`);\n }\n\n chatInput.focus();\n screen.render();\n });\n\n // ── 키바인딩 ──\n const panels = [wfPanel, colPanel, chatInput];\n let activePanel = 0;\n\n function focusPanel(idx: number): void {\n activePanel = idx;\n panels[idx].focus();\n screen.render();\n }\n\n screen.key([\"tab\"], () => {\n activePanel = (activePanel + 1) % panels.length;\n focusPanel(activePanel);\n });\n\n screen.key([\"S-tab\"], () => {\n activePanel = (activePanel - 1 + panels.length) % panels.length;\n focusPanel(activePanel);\n });\n\n screen.key([\"r\"], async () => { await loadData(); });\n screen.key([\"c\"], () => { focusPanel(2); });\n screen.key([\"q\", \"C-c\"], () => { screen.destroy(); process.exit(0); });\n\n // ── 자동 새로고침 (30초마다) ──\n setInterval(async () => {\n try { await loadData(); } catch { /* ignore */ }\n }, 30_000);\n\n // 초기 로드\n await loadData();\n focusPanel(0);\n screen.render();\n}\n","#!/usr/bin/env node\n/**\n * XGEN CLI — XGEN 2.0 플랫폼 + AI 코딩 에이전트\n *\n * xgen → 설정에 따라 에이전트 또는 채팅 모드\n * xgen agent → AI 코딩 에이전트\n * xgen chat → XGEN 워크플로우 채팅\n * xgen wf run → 워크플로우 실행\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerLoginCommand } from \"./commands/login.js\";\nimport { registerWorkflowCommand } from \"./commands/workflow/index.js\";\nimport { registerChatCommand, chat } from \"./commands/chat.js\";\nimport { registerProviderCommand } from \"./commands/provider.js\";\nimport { registerAgentCommand, agentRepl } from \"./commands/agent.js\";\nimport { registerDocCommand } from \"./commands/doc.js\";\nimport { registerOntologyCommand } from \"./commands/ontology.js\";\nimport { getAuth, getServer, getDefaultProvider } from \"./config/store.js\";\n\nconst VERSION = \"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// 인자 없이 실행: 바로 AI 채팅 (Claude Code 스타일)\nif (process.argv.length <= 2) {\n agentRepl().catch((err) => {\n console.error(chalk.red(`오류: ${err.message}`));\n process.exit(1);\n });\n} else {\n program.parse();\n}\n","/**\n * xgen config — 설정 관리\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getConfig, setServer, getServer, setConfig } from \"../config/store.js\";\nimport { resetClient } from \"../api/client.js\";\nimport { printSuccess, printError, printKeyValue } from \"../utils/format.js\";\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"XGEN CLI 설정 관리\");\n\n config\n .command(\"set-server <url>\")\n .description(\"XGEN 서버 URL 설정\")\n .action((url: string) => {\n if (!url.startsWith(\"http://\") && !url.startsWith(\"https://\")) {\n printError(\"URL은 http:// 또는 https://로 시작해야 합니다\");\n process.exit(1);\n }\n setServer(url);\n resetClient();\n printSuccess(`서버 설정 완료: ${chalk.underline(url)}`);\n });\n\n config\n .command(\"get-server\")\n .description(\"현재 설정된 서버 URL 확인\")\n .action(() => {\n const server = getServer();\n if (server) {\n console.log(server);\n } else {\n printError(\"서버가 설정되지 않았습니다\");\n console.log(\" 설정: xgen config set-server <url>\");\n }\n });\n\n config\n .command(\"list\")\n .description(\"전체 설정 확인\")\n .action(() => {\n const cfg = getConfig();\n console.log(chalk.bold(\"\\nXGEN CLI 설정\"));\n console.log(chalk.gray(\"─\".repeat(40)));\n printKeyValue(\"서버\", cfg.server);\n printKeyValue(\"기본 워크플로우\", cfg.defaultWorkflow);\n printKeyValue(\"테마\", cfg.theme);\n printKeyValue(\"스트림 로그\", String(cfg.streamLogs));\n console.log();\n });\n\n config\n .command(\"set <key> <value>\")\n .description(\"설정 값 변경\")\n .action((key: string, value: string) => {\n const allowedKeys = [\"defaultWorkflow\", \"theme\", \"streamLogs\"];\n if (!allowedKeys.includes(key)) {\n printError(`알 수 없는 설정 키: ${key}`);\n console.log(` 사용 가능: ${allowedKeys.join(\", \")}`);\n process.exit(1);\n }\n\n const parsed = key === \"streamLogs\" ? value === \"true\" : value;\n setConfig({ [key]: parsed });\n printSuccess(`${key} = ${value}`);\n });\n}\n","/**\n * xgen login — 서버 로그인\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { apiLogin } from \"../api/auth.js\";\nimport { setAuth, requireServer, getAuth } from \"../config/store.js\";\nimport { printSuccess, printError, printHeader } from \"../utils/format.js\";\n\nfunction prompt(question: string, hidden = false): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n if (hidden) {\n // 비밀번호 입력 시 에코 숨김\n process.stdout.write(question);\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n if (stdin.isTTY) stdin.setRawMode(true);\n\n let password = \"\";\n const onData = (ch: Buffer) => {\n const c = ch.toString(\"utf8\");\n if (c === \"\\n\" || c === \"\\r\" || c === \"\\u0004\") {\n if (stdin.isTTY) stdin.setRawMode(wasRaw ?? false);\n stdin.removeListener(\"data\", onData);\n process.stdout.write(\"\\n\");\n rl.close();\n resolve(password);\n } else if (c === \"\\u0003\") {\n // Ctrl+C\n process.exit(0);\n } else if (c === \"\\u007F\" || c === \"\\b\") {\n // Backspace\n if (password.length > 0) {\n password = password.slice(0, -1);\n process.stdout.write(\"\\b \\b\");\n }\n } else {\n password += c;\n process.stdout.write(\"*\");\n }\n };\n stdin.on(\"data\", onData);\n } else {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n }\n });\n}\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command(\"login\")\n .description(\"XGEN 서버에 로그인\")\n .option(\"-e, --email <email>\", \"이메일\")\n .option(\"-p, --password <password>\", \"비밀번호\")\n .action(async (opts) => {\n const server = requireServer();\n\n printHeader(\"XGEN Login\");\n console.log(chalk.gray(`서버: ${server}\\n`));\n\n let email = opts.email;\n let password = opts.password;\n\n if (!email) {\n email = await prompt(chalk.white(\"이메일: \"));\n }\n if (!password) {\n password = await prompt(chalk.white(\"비밀번호: \"), true);\n }\n\n if (!email || !password) {\n printError(\"이메일과 비밀번호를 모두 입력하세요\");\n process.exit(1);\n }\n\n try {\n const result = await apiLogin(email, password);\n\n if (result.success && result.access_token) {\n setAuth({\n accessToken: result.access_token,\n refreshToken: result.refresh_token ?? \"\",\n userId: result.user_id ?? \"\",\n username: result.username ?? \"\",\n isAdmin: false,\n expiresAt: null,\n });\n\n console.log();\n printSuccess(`로그인 성공! ${chalk.bold(result.username ?? email)}`);\n } else {\n printError(result.message || \"로그인 실패\");\n process.exit(1);\n }\n } catch (err: unknown) {\n const msg =\n (err as { response?: { data?: { message?: string; detail?: string } } })\n ?.response?.data?.message ??\n (err as { response?: { data?: { detail?: string } } })\n ?.response?.data?.detail ??\n (err as Error).message;\n printError(`로그인 실패: ${msg}`);\n process.exit(1);\n }\n });\n\n program\n .command(\"logout\")\n .description(\"로그아웃\")\n .action(async () => {\n const { clearAuth } = await import(\"../config/store.js\");\n clearAuth();\n printSuccess(\"로그아웃 완료\");\n });\n\n program\n .command(\"whoami\")\n .description(\"현재 로그인된 사용자 정보\")\n .action(async () => {\n const auth = getAuth();\n if (!auth) {\n printError(\"로그인되지 않았습니다. xgen login 실행하세요\");\n process.exit(1);\n }\n\n const server = requireServer();\n console.log(chalk.bold(\"\\n현재 사용자\"));\n console.log(chalk.gray(\"─\".repeat(30)));\n console.log(` ${chalk.gray(\"서버:\")} ${server}`);\n console.log(` ${chalk.gray(\"사용자:\")} ${chalk.bold(auth.username)}`);\n console.log(` ${chalk.gray(\"User ID:\")} ${auth.userId}`);\n\n // 토큰 유효성 확인\n try {\n const { apiValidate } = await import(\"../api/auth.js\");\n const result = await apiValidate(auth.accessToken);\n if (result.valid) {\n console.log(` ${chalk.gray(\"상태:\")} ${chalk.green(\"활성\")}`);\n if (result.is_admin) {\n console.log(` ${chalk.gray(\"권한:\")} ${chalk.yellow(\"관리자\")}`);\n }\n if (result.user_type) {\n console.log(` ${chalk.gray(\"유형:\")} ${result.user_type}`);\n }\n } else {\n console.log(` ${chalk.gray(\"상태:\")} ${chalk.red(\"토큰 만료\")}`);\n }\n } catch {\n console.log(` ${chalk.gray(\"상태:\")} ${chalk.yellow(\"검증 불가 (서버 연결 실패)\")}`);\n }\n console.log();\n });\n}\n","/**\n * xgen workflow list — 워크플로우 목록 조회\n */\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { listWorkflows, getWorkflowListDetail } from \"../../api/workflow.js\";\nimport { printTable, printError, printHeader, truncate, formatDate } from \"../../utils/format.js\";\n\nexport async function workflowList(opts: { detail?: boolean }): Promise<void> {\n requireAuth();\n\n try {\n if (opts.detail) {\n const workflows = await getWorkflowListDetail();\n\n if (!workflows || workflows.length === 0) {\n console.log(chalk.yellow(\"\\n워크플로우가 없습니다.\\n\"));\n return;\n }\n\n printHeader(`워크플로우 목록 (${workflows.length}개)`);\n console.log();\n\n printTable(\n [\"#\", \"ID\", \"이름\", \"배포\", \"업데이트\"],\n workflows.map((w, i) => [\n String(i + 1),\n (w.workflow_id ?? w.id ?? \"-\").slice(0, 12),\n truncate(w.workflow_name ?? \"-\", 30),\n (w as Record<string, unknown>).is_deployed\n ? chalk.green(\"배포됨\")\n : chalk.gray(\"미배포\"),\n formatDate(w.updated_at),\n ])\n );\n } else {\n const workflows = await listWorkflows();\n\n if (!workflows || workflows.length === 0) {\n console.log(chalk.yellow(\"\\n워크플로우가 없습니다.\\n\"));\n return;\n }\n\n printHeader(`워크플로우 목록 (${workflows.length}개)`);\n console.log();\n\n printTable(\n [\"#\", \"ID\", \"이름\"],\n workflows.map((w, i) => [\n String(i + 1),\n (w.workflow_id ?? w.id ?? \"-\").slice(0, 12),\n w.workflow_name ?? \"-\",\n ])\n );\n }\n console.log();\n } catch (err: unknown) {\n const msg = (err as Error).message;\n printError(`워크플로우 목록 조회 실패: ${msg}`);\n process.exit(1);\n }\n}\n","/**\n * xgen workflow info <id> — 워크플로우 상세 정보\n */\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { getWorkflowDetail } from \"../../api/workflow.js\";\nimport { printError, printHeader, printKeyValue } from \"../../utils/format.js\";\n\nexport async function workflowInfo(workflowId: string): Promise<void> {\n requireAuth();\n\n try {\n const detail = await getWorkflowDetail(workflowId);\n\n printHeader(`워크플로우: ${detail.workflow_name ?? workflowId}`);\n console.log();\n\n printKeyValue(\"ID\", detail.id);\n printKeyValue(\"이름\", detail.workflow_name);\n printKeyValue(\"설명\", detail.description ?? \"(없음)\");\n\n if (detail.nodes && Array.isArray(detail.nodes)) {\n console.log();\n console.log(chalk.bold(\" 노드 구성:\"));\n for (const node of detail.nodes as Array<{ id: string; data?: { label?: string; type?: string } }>) {\n const label = node.data?.label ?? node.id;\n const type = node.data?.type ?? \"unknown\";\n console.log(` ${chalk.cyan(\"•\")} ${label} ${chalk.gray(`(${type})`)}`);\n }\n }\n\n if (detail.parameters && Object.keys(detail.parameters).length > 0) {\n console.log();\n console.log(chalk.bold(\" 파라미터:\"));\n for (const [key, val] of Object.entries(detail.parameters)) {\n console.log(` ${chalk.gray(key)}: ${JSON.stringify(val)}`);\n }\n }\n\n console.log();\n } catch (err: unknown) {\n const msg = (err as Error).message;\n printError(`워크플로우 조회 실패: ${msg}`);\n process.exit(1);\n }\n}\n","/**\n * xgen workflow run <id> — 워크플로우 실행\n */\nimport chalk from \"chalk\";\nimport { randomUUID } from \"node:crypto\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { executeWorkflowStream, getWorkflowDetail } from \"../../api/workflow.js\";\nimport { parseSSEStream } from \"../../utils/sse.js\";\nimport { printError, printHeader, printInfo } from \"../../utils/format.js\";\nimport { renderMarkdown } from \"../../utils/markdown.js\";\nimport type { SSEEvent } from \"../../api/types.js\";\n\nexport async function workflowRun(\n workflowId: string,\n input: string | undefined,\n opts: { interactive?: boolean; logs?: boolean }\n): Promise<void> {\n const auth = requireAuth();\n\n // 워크플로우 정보 가져오기\n let workflowName = workflowId;\n try {\n const detail = await getWorkflowDetail(workflowId);\n workflowName = detail.workflow_name ?? workflowId;\n } catch {\n // 이름 조회 실패해도 실행은 계속\n }\n\n // 인터랙티브 모드: 입력이 없으면 프롬���트\n if (!input) {\n if (opts.interactive || !process.stdin.isTTY) {\n const { createInterface } = await import(\"node:readline\");\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n input = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan(\"입력> \"), (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n } else {\n printError(\"입력값이 필요합니다. 사용법:\");\n console.log(' xgen workflow run <id> \"입력 텍스���\"');\n console.log(\" xgen workflow run -i <id>\");\n process.exit(1);\n }\n }\n\n if (!input) {\n printError(\"입력값이 비어있습니다\");\n process.exit(1);\n }\n\n const interactionId = `cli_${randomUUID().slice(0, 8)}`;\n\n printHeader(`실행: ${workflowName}`);\n printInfo(`입력: ${input}`);\n console.log();\n\n try {\n const stream = await executeWorkflowStream({\n workflow_id: workflowId,\n workflow_name: workflowName,\n input_data: input,\n interaction_id: interactionId,\n });\n\n let hasOutput = false;\n let fullResponse = \"\";\n\n await parseSSEStream(\n stream,\n (event: SSEEvent) => {\n switch (event.type) {\n case \"token\":\n if (event.content) {\n if (!hasOutput) {\n hasOutput = true;\n console.log();\n }\n process.stdout.write(event.content);\n fullResponse += event.content;\n }\n break;\n\n case \"log\":\n if (opts.logs && event.content) {\n process.stderr.write(chalk.gray(`[LOG] ${event.content}\\n`));\n }\n break;\n\n case \"node_status\":\n if (opts.logs) {\n const nodeName = event.node_name ?? event.node_id ?? \"?\";\n const status = event.status ?? \"?\";\n process.stderr.write(\n chalk.gray(`[노드] ${nodeName}: ${status}\\n`)\n );\n }\n break;\n\n case \"tool\":\n if (opts.logs) {\n process.stderr.write(chalk.gray(`[도구] ${JSON.stringify(event.data)}\\n`));\n }\n break;\n\n case \"complete\":\n break;\n\n case \"error\":\n console.log();\n printError(event.error ?? event.content ?? \"알 수 없는 오류\");\n break;\n\n default:\n // 알 수 없는 이벤트는 content가 있으면 출력\n if (event.content) {\n if (!hasOutput) {\n process.stdout.write(chalk.green(\"응답: \"));\n hasOutput = true;\n }\n process.stdout.write(event.content);\n }\n }\n },\n () => {\n if (hasOutput) {\n // 스트리밍 끝 — 마크다운이 있으면 렌더링된 버전도 표시\n console.log();\n if (fullResponse.includes(\"```\") || fullResponse.includes(\"**\")) {\n console.log(chalk.gray(\"─\".repeat(40)));\n console.log(renderMarkdown(fullResponse));\n }\n }\n console.log();\n console.log(chalk.gray(`세션: ${interactionId}`));\n },\n (err) => {\n console.log();\n printError(`스트리밍 오류: ${err.message}`);\n }\n );\n } catch (err: unknown) {\n const msg =\n (err as { response?: { data?: { detail?: string } } })?.response?.data\n ?.detail ?? (err as Error).message;\n printError(`실행 실패: ${msg}`);\n process.exit(1);\n }\n}\n","/**\n * SSE (Server-Sent Events) 파서\n * 워크플로우 스트리밍 응답 처리\n */\nimport type { SSEEvent } from \"../api/types.js\";\n\n/**\n * ReadableStream에서 SSE 이벤트를 파싱하여 콜백으로 전달\n */\nexport async function parseSSEStream(\n stream: NodeJS.ReadableStream,\n onEvent: (event: SSEEvent) => void,\n onDone?: () => void,\n onError?: (error: Error) => void\n): Promise<void> {\n let buffer = \"\";\n\n return new Promise<void>((resolve, reject) => {\n stream.on(\"data\", (chunk: Buffer) => {\n buffer += chunk.toString();\n\n // SSE 이벤트 파싱: 빈 줄로 구분\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n const lines = part.split(\"\\n\");\n let data = \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n data += line.slice(6);\n } else if (line.startsWith(\"data:\")) {\n data += line.slice(5);\n }\n }\n\n if (!data) continue;\n\n try {\n const event = JSON.parse(data) as SSEEvent;\n onEvent(event);\n } catch {\n // JSON 파싱 실패 시 텍스트로 처리\n onEvent({ type: \"token\", content: data });\n }\n }\n });\n\n stream.on(\"end\", () => {\n // 남은 버퍼 처리\n if (buffer.trim()) {\n const lines = buffer.split(\"\\n\");\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const event = JSON.parse(line.slice(6)) as SSEEvent;\n onEvent(event);\n } catch {\n onEvent({ type: \"token\", content: line.slice(6) });\n }\n }\n }\n }\n onDone?.();\n resolve();\n });\n\n stream.on(\"error\", (err: Error) => {\n onError?.(err);\n reject(err);\n });\n });\n}\n","/**\n * 터미널 마크다운 렌더링 — 가볍게\n * marked-terminal 안 쓰고 직접 처리 (의존성 최소화)\n */\nimport chalk from \"chalk\";\n\n/** 코드 블록 감지용 */\nconst CODE_BLOCK_RE = /```(\\w*)\\n([\\s\\S]*?)```/g;\nconst INLINE_CODE_RE = /`([^`]+)`/g;\nconst BOLD_RE = /\\*\\*(.+?)\\*\\*/g;\nconst HEADING_RE = /^(#{1,3})\\s+(.+)$/gm;\nconst LIST_RE = /^(\\s*)[-*]\\s+(.+)$/gm;\nconst LINK_RE = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n\nexport function renderMarkdown(text: string): string {\n let result = text;\n\n // 코드 블록: 박스로 표시\n result = result.replace(CODE_BLOCK_RE, (_match, lang, code) => {\n const trimmed = code.trimEnd();\n const header = lang ? chalk.gray(` ── ${lang} ──`) : chalk.gray(\" ── code ──\");\n const lines = trimmed.split(\"\\n\").map((l: string) => chalk.white(` ${l}`)).join(\"\\n\");\n return `\\n${header}\\n${lines}\\n${chalk.gray(\" ──────────\")}\\n`;\n });\n\n // 인라인 코드\n result = result.replace(INLINE_CODE_RE, (_m, code) => chalk.cyan(`\\`${code}\\``));\n\n // 볼드\n result = result.replace(BOLD_RE, (_m, text) => chalk.bold(text));\n\n // 헤딩\n result = result.replace(HEADING_RE, (_m, hashes, text) => {\n if (hashes.length === 1) return chalk.bold.underline(text);\n if (hashes.length === 2) return chalk.bold(text);\n return chalk.bold.dim(text);\n });\n\n // 리스트\n result = result.replace(LIST_RE, (_m, indent, text) => `${indent}${chalk.cyan(\"•\")} ${text}`);\n\n // 링크\n result = result.replace(LINK_RE, (_m, label, url) => `${chalk.blue.underline(label)} ${chalk.gray(`(${url})`)}`);\n\n return result;\n}\n","/**\n * xgen workflow history — 실행 이력 조회\n */\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { getIOLogs } from \"../../api/workflow.js\";\nimport { printError, printHeader, truncate, formatDate } from \"../../utils/format.js\";\n\nexport async function workflowHistory(\n workflowId?: string,\n 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 workflow — 워크플로우 커맨드 그룹\n */\nimport { Command } from \"commander\";\nimport { workflowList } from \"./list.js\";\nimport { workflowInfo } from \"./info.js\";\nimport { workflowRun } from \"./run.js\";\nimport { workflowHistory } from \"./history.js\";\n\nexport function registerWorkflowCommand(program: Command): void {\n const wf = program\n .command(\"workflow\")\n .alias(\"wf\")\n .description(\"워크플로우 관리 및 실행\");\n\n wf.command(\"list\")\n .alias(\"ls\")\n .description(\"워크플로우 목록 조회\")\n .option(\"-d, --detail\", \"상세 정보 포함\")\n .action((opts) => workflowList(opts));\n\n wf.command(\"info <workflow-id>\")\n .description(\"워크플로우 상세 정보\")\n .action((id) => workflowInfo(id));\n\n wf.command(\"run <workflow-id> [input]\")\n .description(\"워크플로우 실행\")\n .option(\"-i, --interactive\", \"인터랙티브 모드 (입력 프롬프트)\")\n .option(\"-l, --logs\", \"디버그 로그 표시\")\n .action((id, input, opts) => workflowRun(id, input, opts));\n\n wf.command(\"history [workflow-id]\")\n .description(\"실행 이력 조회\")\n .option(\"-n, --limit <number>\", \"조회 건수\", \"20\")\n .action((id, opts) => workflowHistory(id, { limit: parseInt(opts.limit) }));\n}\n","/**\n * xgen chat — 인터랙티브 터미널 모드\n *\n * Gemini CLI 스타일: 터미널 열면 바로 대화, 워크플로우 전환 가능\n *\n * 슬래시 커맨드:\n * /workflows — 워크플로우 목록 + 전환\n * /switch — 워크플로우 전환\n * /history — 최근 대화 이력\n * /clear — 화면 지우기\n * /help — 도움말\n * /exit — 종료\n */\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { randomUUID } from \"node:crypto\";\nimport { requireAuth, getAuth, getServer } from \"../config/store.js\";\nimport { listWorkflows, executeWorkflowStream, type Workflow } from \"../api/workflow.js\";\nimport { parseSSEStream } from \"../utils/sse.js\";\nimport { renderMarkdown } from \"../utils/markdown.js\";\nimport { printError } from \"../utils/format.js\";\nimport type { SSEEvent } from \"../api/types.js\";\n\nconst CHAT_BANNER = `\n${chalk.cyan(\"╭──────────────────────────────────────╮\")}\n${chalk.cyan(\"│\")} ${chalk.white.bold(\"XGEN\")} ${chalk.gray(\"— 워크플로우 AI 터미널\")} ${chalk.cyan(\"│\")}\n${chalk.cyan(\"│\")} ${chalk.gray(\"/help 도움말 /workflows 전환 /exit\")} ${chalk.cyan(\"│\")}\n${chalk.cyan(\"╰──────────────────────────────────────╯\")}`;\n\nfunction printHelp() {\n console.log(`\n${chalk.bold(\"슬래시 커맨드\")}\n ${chalk.cyan(\"/workflows\")} 워크플로우 목록 보기 & 전환\n ${chalk.cyan(\"/switch\")} 워크플로우 번호로 전환 (예: /switch 3)\n ${chalk.cyan(\"/history\")} 현재 세션 대화 이력\n ${chalk.cyan(\"/clear\")} 화면 지우기\n ${chalk.cyan(\"/info\")} 현재 연결 정보\n ${chalk.cyan(\"/help\")} 이 도움말\n ${chalk.cyan(\"/exit\")} 종료 (Ctrl+C도 가능)\n`);\n}\n\nasync function promptLine(rl: ReturnType<typeof createInterface>, promptStr: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(promptStr, (answer) => resolve(answer));\n });\n}\n\nexport async function chat(workflowId?: string): Promise<void> {\n const auth = requireAuth();\n const server = getServer();\n\n // 워크플로우 목록 로드\n let workflows: Workflow[] = [];\n try {\n workflows = await listWorkflows();\n } catch {\n printError(\"워크플로우 목록을 불러올 수 없습니다\");\n process.exit(1);\n }\n\n if (workflows.length === 0) {\n printError(\"사용 가능한 워크플로우가 없습니다\");\n process.exit(1);\n }\n\n // 워크플로우 선택\n let current: Workflow;\n if (workflowId) {\n const found = workflows.find((w) => w.id === workflowId || w.workflow_name === workflowId);\n current = found ?? { id: workflowId, workflow_name: workflowId };\n } else {\n // 첫 번째 또는 선택\n console.log(CHAT_BANNER);\n console.log(chalk.gray(` 서버: ${server} | 사용자: ${auth.username}\\n`));\n console.log(chalk.bold(\" 워크플로우 선택:\\n\"));\n workflows.forEach((w, i) => {\n console.log(` ${chalk.cyan(String(i + 1).padStart(3))} ${w.workflow_name}`);\n });\n console.log();\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await promptLine(rl, chalk.cyan(\" 번호> \"));\n rl.close();\n\n const idx = parseInt(answer.trim()) - 1;\n if (isNaN(idx) || idx < 0 || idx >= workflows.length) {\n current = workflows[0];\n } else {\n current = workflows[idx];\n }\n }\n\n // 세션 시작\n const sessionId = randomUUID().slice(0, 8);\n let turnCount = 0;\n const history: Array<{ role: string; content: string }> = [];\n\n console.log();\n console.log(chalk.cyan(\"─\".repeat(42)));\n console.log(chalk.white.bold(` ${current.workflow_name}`));\n console.log(chalk.cyan(\"─\".repeat(42)));\n console.log(chalk.gray(\" 메시지를 입력하세요. /help 로 도움말.\\n\"));\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const getPrompt = () => chalk.cyan(\"❯ \");\n\n const processInput = async (line: string) => {\n const input = line.trim();\n if (!input) return;\n\n // 슬래시 커맨드\n if (input.startsWith(\"/\")) {\n const [cmd, ...args] = input.slice(1).split(\" \");\n\n switch (cmd.toLowerCase()) {\n case \"exit\":\n case \"quit\":\n case \"q\":\n console.log(chalk.gray(\"\\n 종료합니다.\\n\"));\n rl.close();\n process.exit(0);\n break;\n\n case \"help\":\n case \"h\":\n printHelp();\n break;\n\n case \"clear\":\n case \"cls\":\n console.clear();\n console.log(chalk.white.bold(` ${current.workflow_name}`));\n console.log(chalk.cyan(\"─\".repeat(42)));\n break;\n\n case \"workflows\":\n case \"wf\":\n console.log();\n workflows.forEach((w, i) => {\n const marker = w.id === current.id ? chalk.green(\"▸\") : \" \";\n console.log(` ${marker} ${chalk.cyan(String(i + 1).padStart(2))} ${w.workflow_name}`);\n });\n console.log(chalk.gray(\"\\n /switch <번호> 로 전환\\n\"));\n break;\n\n case \"switch\":\n case \"sw\": {\n const num = parseInt(args[0]);\n if (isNaN(num) || num < 1 || num > workflows.length) {\n console.log(chalk.yellow(` 1~${workflows.length} 사이 번호를 입력하세요`));\n } else {\n current = workflows[num - 1];\n turnCount = 0;\n history.length = 0;\n console.log(chalk.green(`\\n 전환: ${current.workflow_name}\\n`));\n }\n break;\n }\n\n case \"history\":\n case \"hist\":\n if (history.length === 0) {\n console.log(chalk.gray(\" 대화 이력이 없습니다.\\n\"));\n } else {\n console.log();\n for (const h of history) {\n const label = h.role === \"user\" ? chalk.cyan(\"나\") : chalk.green(\"AI\");\n const text = h.content.length > 80 ? h.content.slice(0, 80) + \"...\" : h.content;\n console.log(` ${label}: ${text}`);\n }\n console.log();\n }\n break;\n\n case \"info\":\n console.log(`\n ${chalk.gray(\"서버:\")} ${server}\n ${chalk.gray(\"사용자:\")} ${auth.username}\n ${chalk.gray(\"워크플로우:\")} ${current.workflow_name}\n ${chalk.gray(\"세션:\")} ${sessionId}\n ${chalk.gray(\"턴:\")} ${turnCount}\n`);\n break;\n\n default:\n console.log(chalk.yellow(` 알 수 없는 커맨드: /${cmd}. /help 참고`));\n }\n\n rl.prompt();\n return;\n }\n\n // 워크플로우 실행\n turnCount++;\n const interactionId = `${sessionId}_t${turnCount}`;\n history.push({ role: \"user\", content: input });\n\n // 스피너 시작\n process.stdout.write(chalk.gray(\" thinking...\"));\n\n try {\n const stream = await executeWorkflowStream({\n workflow_id: current.id,\n workflow_name: current.workflow_name,\n input_data: input,\n interaction_id: interactionId,\n });\n\n // 스피너 지우기\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n\n let fullResponse = \"\";\n let hasOutput = false;\n\n await parseSSEStream(\n stream,\n (event: SSEEvent) => {\n if ((event.type === \"token\" || !event.type) && event.content) {\n if (!hasOutput) {\n hasOutput = true;\n console.log();\n }\n process.stdout.write(event.content);\n fullResponse += event.content;\n } else if (event.type === \"error\") {\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n printError(event.error ?? event.content ?? \"오류\");\n }\n },\n () => {\n if (hasOutput) {\n // 응답 끝 — 마크다운 렌더링은 전체 텍스트에 적용\n console.log();\n console.log();\n }\n if (fullResponse) {\n history.push({ role: \"assistant\", content: fullResponse });\n }\n },\n (err) => {\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n printError(`스트리밍 오류: ${err.message}`);\n }\n );\n } catch (err: unknown) {\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n const msg =\n (err as { response?: { data?: { detail?: string } } })?.response?.data\n ?.detail ?? (err as Error).message;\n printError(`실행 실패: ${msg}`);\n }\n\n rl.prompt();\n };\n\n rl.setPrompt(getPrompt());\n rl.prompt();\n\n rl.on(\"line\", (line) => {\n // async 처리 — 입력 비활성화 후 완료되면 다시 prompt\n processInput(line).then(() => {\n // prompt는 processInput 내부에서 호출\n });\n });\n\n rl.on(\"close\", () => {\n console.log(chalk.gray(\"\\n 종료합니다.\\n\"));\n process.exit(0);\n });\n\n // Ctrl+C 깔끔하게\n process.on(\"SIGINT\", () => {\n console.log(chalk.gray(\"\\n 종료합니다.\\n\"));\n process.exit(0);\n });\n}\n\nexport function registerChatCommand(program: import(\"commander\").Command): void {\n program\n .command(\"chat [workflow-id]\")\n .description(\"인터랙티브 대화 모드\")\n .action((workflowId) => chat(workflowId));\n}\n","/**\n * OPEN XGEN — AI 에이전트 (메인 인터페이스)\n * Claude Code / Gemini CLI 스타일 — 채팅이 곧 인터페이스\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { getDefaultProvider, getServer, getAuth, getEnvironments, getActiveEnvironment } from \"../config/store.js\";\nimport { createLLMClient, streamChat, type Message } from \"../agent/llm.js\";\nimport { getAllToolDefs, executeTool, getToolNames } from \"../agent/tools/index.js\";\nimport { definitions as xgenToolDefs, execute as xgenExecute, isXgenTool } from \"../agent/tools/xgen-api.js\";\nimport { McpManager, loadMcpConfig } from \"../mcp/client.js\";\nimport { guidedProviderSetup } from \"./provider.js\";\nimport { box, ask, welcome } from \"../utils/ui.js\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nfunction buildSystemPrompt(): string {\n const server = getServer();\n const auth = getAuth();\n const env = getActiveEnvironment();\n\n let prompt = `You are OPEN XGEN, a terminal AI agent. Act like Claude Code.\n\nABSOLUTE RULES — VIOLATING THESE IS FAILURE:\n1. NEVER show menus, numbered options, or \"다음 중 선택\" style responses. NEVER.\n2. NEVER ask \"무엇을 도와드릴까요\" or \"어떤 작업을 하시겠습니까\". NEVER.\n3. When the user asks something → call the tool IMMEDIATELY. No preamble.\n4. After tool results → show the data directly. One sentence summary max.\n5. If user says a number → it refers to the previous list item. Act on it.\n6. If user says \"실행\" → execute immediately with context you have. Don't ask for confirmation.\n7. If ambiguous → make your best guess and do it. Don't ask.\n8. Response language: match the user. Korean → Korean.\n9. Max response: 1-2 sentences + data. No filler, no explanations unless asked.\n10. You are NOT a menu system. You are a doer. Do, don't ask.\n\nEXAMPLES OF BAD RESPONSES (NEVER DO THIS):\n- \"다음과 같은 작업이 가능합니다: 1. 목록 2. 실행...\"\n- \"원하는 작업을 선택해 주세요\"\n- \"어떻게 도와드릴까요?\"\n- Any numbered list of options\n\nEXAMPLES OF GOOD RESPONSES:\n- User: \"워크플로우\" → [call xgen_workflow_list] → show list\n- User: \"6\" → [call xgen_workflow_run for item 6] → show result\n- User: \"컬렉션\" → [call xgen_collection_list] → show list\n- User: \"이 폴더 뭐있어\" → [call list_files] → show files`;\n\n if (server && auth) {\n prompt += `\n\nXGEN CONNECTED: ${server} as ${auth.username} (${env?.name ?? \"default\"})\n- Workflow execute uses deploy_key for deployed workflows.\n- If workflow execution returns 404, it means the Istio routing blocks direct stream access. Use deploy endpoint.`;\n } else {\n prompt += `\\nXGEN: Not connected. Tell user to run /connect.`;\n }\n\n return prompt;\n}\n\nlet mcpManager: McpManager | null = null;\n\nexport async function agentRepl(): Promise<void> {\n // 프로바이더 확인/설정\n let provider = getDefaultProvider();\n if (!provider) {\n provider = await guidedProviderSetup();\n if (!provider) process.exit(1);\n }\n\n const client = createLLMClient(provider);\n\n // 도구 조합: 기본 + XGEN + MCP\n const allTools: ChatCompletionTool[] = [...getAllToolDefs(), ...xgenToolDefs];\n const builtinNames = getToolNames();\n\n // MCP\n const mcpConfig = loadMcpConfig();\n if (mcpConfig && Object.keys(mcpConfig.mcpServers).length > 0) {\n mcpManager = new McpManager();\n try {\n await mcpManager.startAll(mcpConfig);\n if (mcpManager.serverCount > 0) allTools.push(...mcpManager.getAllTools());\n } catch { /* MCP 실패해도 계속 */ }\n }\n\n const messages: Message[] = [{ role: \"system\", content: buildSystemPrompt() }];\n\n // ── 헤더 ──\n const server = getServer();\n const auth = getAuth();\n const env = getActiveEnvironment();\n\n const W = Math.min(process.stdout.columns || 60, 60);\n const line = chalk.cyan(\"─\".repeat(W));\n\n console.log(`\\n${line}`);\n console.log(chalk.cyan.bold(\" ✦ OPEN XGEN\"));\n console.log(line);\n console.log();\n console.log(chalk.gray(` model ${provider.model}`));\n if (server && auth) {\n console.log(chalk.gray(` xgen ${chalk.green(\"●\")} ${auth.username}@${(env?.name ?? server).replace(\"https://\", \"\")}`));\n }\n console.log(chalk.gray(` cwd ${process.cwd()}`));\n console.log();\n console.log(chalk.gray(` 무엇이든 물어보세요. /help`));\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(\" ❯ \"), (a) => resolve(a.trim())));\n\n process.on(\"SIGINT\", () => {\n console.log(chalk.gray(\"\\n 👋\\n\"));\n mcpManager?.stopAll();\n rl.close();\n process.exit(0);\n });\n\n while (true) {\n const input = await askUser();\n if (!input) continue;\n\n // ── 슬래시 커맨드 ──\n if (input === \"/exit\" || input === \"exit\") {\n console.log(chalk.gray(\"\\n 👋\\n\"));\n mcpManager?.stopAll();\n rl.close();\n break;\n }\n\n if (input === \"/help\") {\n console.log(`\n ${chalk.bold(\"슬래시 커맨드\")}\n ${chalk.cyan(\"/connect\")} XGEN 서버 연결 + 로그인\n ${chalk.cyan(\"/env\")} 환경 전환 (본사/제주/롯데몰)\n ${chalk.cyan(\"/provider\")} 프로바이더 변경\n ${chalk.cyan(\"/dashboard\")} TUI 대시보드 (4분할 화면)\n ${chalk.cyan(\"/tools\")} 사용 가능한 도구 목록\n ${chalk.cyan(\"/status\")} 현재 연결 상태\n ${chalk.cyan(\"/clear\")} 대화 초기화\n ${chalk.cyan(\"/exit\")} 종료\n`);\n continue;\n }\n\n if (input === \"/clear\") {\n messages.length = 0;\n messages.push({ role: \"system\", content: buildSystemPrompt() });\n console.log(chalk.gray(\" 대화 초기화됨.\\n\"));\n continue;\n }\n\n if (input === \"/status\") {\n const p = getDefaultProvider();\n const s = getServer();\n const a = getAuth();\n const e = getActiveEnvironment();\n console.log();\n console.log(` ${chalk.bold(\"프로바이더\")} ${p ? `${p.name} · ${p.model}` : chalk.red(\"미설정\")}`);\n console.log(` ${chalk.bold(\"서버\")} ${s && a ? `${a.username}@${s.replace(\"https://\", \"\")}` : chalk.red(\"미연결\")}`);\n console.log(` ${chalk.bold(\"환경\")} ${e?.name ?? \"없음\"} (${getEnvironments().length}개 등록)`);\n if (mcpManager?.serverCount) {\n console.log(` ${chalk.bold(\"MCP\")} ${mcpManager.getServerNames().join(\", \")}`);\n }\n console.log();\n continue;\n }\n\n if (input === \"/tools\") {\n console.log(`\\n ${chalk.bold(\"코딩\")} ${builtinNames.join(\", \")}`);\n console.log(` ${chalk.bold(\"XGEN\")} ${xgenToolDefs.map((t) => t.function.name).join(\", \")}`);\n if (mcpManager?.serverCount) {\n console.log(` ${chalk.bold(\"MCP\")} ${mcpManager.getAllTools().map((t) => t.function.name).join(\", \")}`);\n }\n console.log();\n continue;\n }\n\n if (input === \"/connect\") {\n await connectServer();\n // 시스템 프롬프트 갱신\n messages[0] = { role: \"system\", content: buildSystemPrompt() };\n continue;\n }\n\n if (input === \"/env\") {\n await switchEnv();\n messages[0] = { role: \"system\", content: buildSystemPrompt() };\n continue;\n }\n\n if (input === \"/provider\") {\n const { guidedProviderSetup: setup } = await import(\"./provider.js\");\n await setup();\n console.log(chalk.gray(\" 프로바이더 변경됨. /exit 후 재시작하세요.\\n\"));\n continue;\n }\n\n if (input === \"/dashboard\" || input === \"/dash\") {\n console.log(chalk.gray(\" 대시보드 열기...\\n\"));\n mcpManager?.stopAll();\n rl.close();\n if (process.stdin.isTTY) process.stdin.setRawMode?.(false);\n const { startTui } = await import(\"../dashboard/tui.js\");\n await startTui();\n return; // TUI 종료 후 CLI도 종료\n }\n\n // ── AI 대화 ──\n messages.push({ role: \"user\", content: input });\n\n try {\n await runLoop(client, provider.model, messages, allTools);\n } catch (err) {\n console.log(chalk.red(`\\n 오류: ${(err as Error).message}\\n`));\n }\n }\n}\n\nasync function runLoop(\n client: ReturnType<typeof createLLMClient>,\n model: string,\n messages: Message[],\n tools: ChatCompletionTool[]\n): Promise<void> {\n for (let i = 0; i < 20; i++) {\n let first = true;\n const result = await streamChat(client, model, messages, tools, (delta) => {\n if (first) { process.stdout.write(chalk.green(\"\\n \") + \"\"); first = false; }\n process.stdout.write(delta);\n });\n\n if (result.content) process.stdout.write(\"\\n\\n\");\n\n if (result.toolCalls.length === 0) {\n if (result.content) messages.push({ role: \"assistant\", content: result.content });\n return;\n }\n\n messages.push({\n role: \"assistant\",\n content: result.content || null,\n tool_calls: result.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n });\n\n for (const tc of result.toolCalls) {\n let args: Record<string, unknown>;\n try { args = JSON.parse(tc.arguments); } catch { args = {}; }\n\n const shortArgs = Object.entries(args).map(([k, v]) => {\n const s = String(v);\n return `${k}=${s.length > 30 ? s.slice(0, 30) + \"…\" : s}`;\n }).join(\" \");\n console.log(chalk.gray(` ⚙ ${chalk.white(tc.name)} ${shortArgs}`));\n\n let toolResult: string;\n if (isXgenTool(tc.name)) {\n toolResult = await xgenExecute(tc.name, args);\n } else if (mcpManager?.isMcpTool(tc.name)) {\n toolResult = await mcpManager.callTool(tc.name, args);\n } else {\n toolResult = await executeTool(tc.name, args);\n }\n\n const truncated = toolResult.length > 4000 ? toolResult.slice(0, 4000) + \"\\n…(truncated)\" : toolResult;\n messages.push({ role: \"tool\", tool_call_id: tc.id, content: truncated });\n }\n }\n console.log(chalk.yellow(\"\\n 최대 반복 횟수 도달.\\n\"));\n}\n\nasync function connectServer(): Promise<void> {\n const { setServer, setAuth } = await import(\"../config/store.js\");\n const { addEnvironment } = await import(\"../config/store.js\");\n\n console.log(chalk.bold(\"\\n XGEN 서버 연결\\n\"));\n\n const presets = [\n { id: \"hq\", name: \"본사\", url: \"https://xgen.x2bee.com\", email: \"admin@plateer.com\" },\n { id: \"jeju\", name: \"제주\", url: \"https://jeju-xgen.x2bee.com\", email: \"admin@plateer.com\" },\n { id: \"lotte\", name: \"롯데몰\", url: \"https://lotteimall-xgen.x2bee.com\" },\n ];\n presets.forEach((p, i) => console.log(` ${chalk.cyan(`${i + 1}.`)} ${p.name} ${chalk.gray(p.url)}`));\n console.log(` ${chalk.cyan(\"4.\")} 직접 입력`);\n console.log();\n\n const choice = await ask(chalk.cyan(\" ❯ \"));\n let url: string;\n let email: string | undefined;\n const ci = parseInt(choice) - 1;\n if (ci >= 0 && ci < presets.length) {\n url = presets[ci].url;\n email = presets[ci].email;\n addEnvironment({ ...presets[ci], description: presets[ci].name });\n } else {\n url = await ask(chalk.white(\" URL: \"));\n if (!url) return;\n }\n\n setServer(url);\n console.log(chalk.green(` ✓ ${url}\\n`));\n\n const inputEmail = email || await ask(chalk.white(\" 이메일: \"));\n const pw = await ask(chalk.white(\" 비밀번호: \"));\n if (!inputEmail || !pw) return;\n\n try {\n const { apiLogin } = await import(\"../api/auth.js\");\n const result = await apiLogin(inputEmail, pw);\n if (result.success && result.access_token) {\n setAuth({ accessToken: result.access_token, refreshToken: result.refresh_token ?? \"\", userId: result.user_id ?? \"\", username: result.username ?? \"\", isAdmin: false, expiresAt: null });\n console.log(chalk.green(` ✓ ${result.username} 로그인됨\\n`));\n } else {\n console.log(chalk.red(` ✗ ${result.message}\\n`));\n }\n } catch (err) {\n console.log(chalk.red(` ✗ ${(err as Error).message}\\n`));\n }\n}\n\nasync function switchEnv(): Promise<void> {\n const { getEnvironments: getEnvs, switchEnvironment } = await import(\"../config/store.js\");\n const envs = getEnvs();\n if (!envs.length) {\n console.log(chalk.gray(\"\\n 환경 없음. /connect로 먼저 연결하세요.\\n\"));\n return;\n }\n const active = getActiveEnvironment();\n console.log();\n envs.forEach((e, i) => {\n const mark = e.id === active?.id ? chalk.green(\"● \") : \" \";\n console.log(` ${mark}${chalk.cyan(`${i + 1}.`)} ${e.name} ${chalk.gray(e.url)}`);\n });\n console.log();\n const ci = parseInt(await ask(chalk.cyan(\" ❯ \"))) - 1;\n if (ci >= 0 && ci < envs.length) {\n switchEnvironment(envs[ci].id);\n console.log(chalk.green(` ✓ ${envs[ci].name}\\n`));\n }\n}\n\nexport function registerAgentCommand(program: Command): void {\n program\n .command(\"agent\")\n .description(\"OPEN XGEN AI 에이전트\")\n .action(async () => { await agentRepl(); });\n}\n","import { readFileSync } from \"node:fs\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"file_read\",\n description: \"파일 내용을 읽습니다. 줄 번호가 포함됩니다.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"파일 경로\" },\n start_line: { type: \"number\", description: \"시작 줄 번호 (선택)\" },\n end_line: { type: \"number\", description: \"끝 줄 번호 (선택)\" },\n },\n required: [\"path\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = args.path as string;\n const startLine = (args.start_line as number) || 1;\n const endLine = args.end_line as number | undefined;\n\n try {\n const content = readFileSync(path, \"utf-8\");\n const lines = content.split(\"\\n\");\n const sliced = lines.slice(startLine - 1, endLine ?? lines.length);\n return sliced.map((line, i) => `${startLine + i}\\t${line}`).join(\"\\n\");\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","import { writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"file_write\",\n description: \"파일을 생성하거나 덮어씁니다.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"파일 경로\" },\n content: { type: \"string\", description: \"파일 내용\" },\n },\n required: [\"path\", \"content\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = args.path as string;\n const content = args.content as string;\n\n try {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, content, \"utf-8\");\n return `파일 작성 완료: ${path}`;\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"file_edit\",\n description: \"파일에서 특정 텍스트를 찾아 교체합니다.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"파일 경로\" },\n old_text: { type: \"string\", description: \"교체할 기존 텍스트\" },\n new_text: { type: \"string\", description: \"새 텍스트\" },\n },\n required: [\"path\", \"old_text\", \"new_text\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = args.path as string;\n const oldText = args.old_text as string;\n const newText = args.new_text as string;\n\n try {\n const content = readFileSync(path, \"utf-8\");\n if (!content.includes(oldText)) {\n return `Error: 텍스트를 찾을 수 없습니다`;\n }\n const updated = content.replace(oldText, newText);\n writeFileSync(path, updated, \"utf-8\");\n return `파일 수정 완료: ${path}`;\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","import { execSync } from \"node:child_process\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"bash\",\n description: \"셸 명령어를 실행합니다. stdout + stderr를 반환합니다.\",\n parameters: {\n type: \"object\",\n properties: {\n command: { type: \"string\", description: \"실행할 명령어\" },\n },\n required: [\"command\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const command = args.command as string;\n\n try {\n const output = execSync(command, {\n encoding: \"utf-8\",\n timeout: 30_000,\n maxBuffer: 1024 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return output || \"(no output)\";\n } catch (err) {\n const e = err as { stdout?: string; stderr?: string; message: string };\n return (e.stdout || \"\") + (e.stderr || \"\") || `Error: ${e.message}`;\n }\n}\n","import { execSync } from \"node:child_process\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"grep\",\n description: \"파일에서 패턴을 검색합니다 (재귀, 줄 번호 포함).\",\n parameters: {\n type: \"object\",\n properties: {\n pattern: { type: \"string\", description: \"검색 패턴 (정규식)\" },\n path: { type: \"string\", description: \"검색 디렉토리 또는 파일 (기본: .)\" },\n glob: { type: \"string\", description: \"파일 필터 (예: *.ts)\" },\n },\n required: [\"pattern\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const pattern = args.pattern as string;\n const path = (args.path as string) || \".\";\n const glob = args.glob as string | undefined;\n\n try {\n let cmd = `grep -rn --color=never \"${pattern.replace(/\"/g, '\\\\\"')}\" \"${path}\"`;\n if (glob) cmd += ` --include=\"${glob}\"`;\n cmd += \" | head -50\";\n\n const output = execSync(cmd, {\n encoding: \"utf-8\",\n timeout: 10_000,\n maxBuffer: 512 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return output || \"일치하는 결과 없음\";\n } catch {\n return \"일치하는 결과 없음\";\n }\n}\n","import { execSync } from \"node:child_process\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"list_files\",\n description: \"디렉토리의 파일/폴더 목록을 반환합니다. glob 패턴 지원.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"디렉토리 경로 (기본: .)\" },\n pattern: { type: \"string\", description: \"glob 패턴 (예: **/*.ts)\" },\n },\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = (args.path as string) || \".\";\n const pattern = args.pattern as string | undefined;\n\n try {\n let cmd: string;\n if (pattern) {\n cmd = `find \"${path}\" -name \"${pattern}\" -type f | head -100`;\n } else {\n cmd = `ls -la \"${path}\"`;\n }\n const output = execSync(cmd, {\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return output || \"(empty)\";\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","/**\n * Sandbox — 격리된 환경에서 코드 실행\n * npm (Node.js) / python 지원\n */\nimport { execSync } from \"node:child_process\";\nimport { mkdirSync, writeFileSync, existsSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nconst SANDBOX_DIR = join(tmpdir(), \"xgen-sandbox\");\n\nfunction ensureSandbox(): string {\n if (!existsSync(SANDBOX_DIR)) {\n mkdirSync(SANDBOX_DIR, { recursive: true });\n }\n return SANDBOX_DIR;\n}\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"sandbox_run\",\n description:\n \"격리된 샌드박스에서 코드를 실행합니다. Node.js 또는 Python 코드를 안전하게 실행할 수 있습니다. npm 패키지 설치도 가능합니다.\",\n parameters: {\n type: \"object\",\n properties: {\n language: {\n type: \"string\",\n enum: [\"javascript\", \"typescript\", \"python\"],\n description: \"실행할 언어\",\n },\n code: { type: \"string\", description: \"실행할 코드\" },\n packages: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"설치할 패키지 (npm 또는 pip)\",\n },\n },\n required: [\"language\", \"code\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const language = args.language as string;\n const code = args.code as string;\n const packages = (args.packages as string[]) ?? [];\n\n const dir = ensureSandbox();\n const runId = `run_${Date.now()}`;\n const runDir = join(dir, runId);\n mkdirSync(runDir, { recursive: true });\n\n try {\n // 패키지 설치\n if (packages.length > 0) {\n if (language === \"python\") {\n const pkgList = packages.join(\" \");\n execSync(`pip install ${pkgList}`, {\n cwd: runDir,\n encoding: \"utf-8\",\n timeout: 60_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } else {\n // Node.js — npm init + install\n execSync(\"npm init -y\", { cwd: runDir, encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n const pkgList = packages.join(\" \");\n execSync(`npm install ${pkgList}`, {\n cwd: runDir,\n encoding: \"utf-8\",\n timeout: 60_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n }\n }\n\n // 코드 실행\n let cmd: string;\n let filename: string;\n\n if (language === \"python\") {\n filename = \"script.py\";\n writeFileSync(join(runDir, filename), code, \"utf-8\");\n cmd = `python3 ${filename}`;\n } else if (language === \"typescript\") {\n filename = \"script.ts\";\n writeFileSync(join(runDir, filename), code, \"utf-8\");\n cmd = `npx tsx ${filename}`;\n } else {\n filename = \"script.mjs\";\n writeFileSync(join(runDir, filename), code, \"utf-8\");\n cmd = `node ${filename}`;\n }\n\n const output = execSync(cmd, {\n cwd: runDir,\n encoding: \"utf-8\",\n timeout: 30_000,\n maxBuffer: 1024 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n return output || \"(no output)\";\n } catch (err) {\n const e = err as { stdout?: string; stderr?: string; message: string };\n return (e.stdout || \"\") + (e.stderr || \"\") || `Error: ${e.message}`;\n } finally {\n // 정리\n try {\n rmSync(runDir, { recursive: true, force: true });\n } catch {\n // ignore cleanup errors\n }\n }\n}\n","/**\n * Agent 도구 레지스트리\n */\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\nimport * as fileRead from \"./file-read.js\";\nimport * as fileWrite from \"./file-write.js\";\nimport * as fileEdit from \"./file-edit.js\";\nimport * as bash from \"./bash.js\";\nimport * as grep from \"./grep.js\";\nimport * as listFiles from \"./list-files.js\";\nimport * as sandbox from \"./sandbox.js\";\n\ninterface Tool {\n definition: ChatCompletionTool;\n execute: (args: Record<string, unknown>) => Promise<string>;\n}\n\nconst tools: Tool[] = [fileRead, fileWrite, fileEdit, bash, grep, listFiles, sandbox];\n\nconst toolMap = new Map<string, Tool>();\nfor (const t of tools) {\n toolMap.set(t.definition.function.name, t);\n}\n\nexport function getAllToolDefs(): ChatCompletionTool[] {\n return tools.map((t) => t.definition);\n}\n\nexport async function executeTool(name: string, args: Record<string, unknown>): Promise<string> {\n const tool = toolMap.get(name);\n if (!tool) return `Unknown tool: ${name}`;\n return tool.execute(args);\n}\n\nexport function getToolNames(): string[] {\n return tools.map((t) => t.definition.function.name);\n}\n","/**\n * XGEN 플랫폼 API 도구 — AI 에이전트가 XGEN 기능을 사용할 수 있게\n */\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\nimport { getAuth, getServer } from \"../../config/store.js\";\n\n// ── 도구 정의 ──\n\nexport const definitions: ChatCompletionTool[] = [\n {\n type: \"function\",\n function: {\n name: \"xgen_workflow_list\",\n description: \"XGEN 서버에서 워크플로우 목록을 가져옵니다.\",\n parameters: { type: \"object\", properties: {} },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"xgen_workflow_run\",\n description: \"XGEN 워크플로우를 실행합니다. 배포된 워크플로우만 실행 가능.\",\n parameters: {\n type: \"object\",\n properties: {\n workflow_id: { type: \"string\", description: \"워크플로우 ID\" },\n workflow_name: { type: \"string\", description: \"워크플로우 이름\" },\n input_data: { type: \"string\", description: \"입력 메시지\" },\n deploy_key: { type: \"string\", description: \"배포 키 (배포된 워크플로우)\" },\n },\n required: [\"workflow_id\", \"workflow_name\", \"input_data\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"xgen_workflow_info\",\n description: \"특정 워크플로우의 상세 정보(노드, 엣지 등)를 가져옵니다.\",\n parameters: {\n type: \"object\",\n properties: {\n workflow_id: { type: \"string\", description: \"워크플로우 ID\" },\n },\n required: [\"workflow_id\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"xgen_collection_list\",\n description: \"XGEN 서버의 문서 컬렉션(지식베이스) 목록을 가져옵니다. 문서 수, 청크 수, 공유 상태 등 포함.\",\n parameters: { type: \"object\", properties: {} },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"xgen_server_status\",\n description: \"XGEN 서버 상태를 확인합니다.\",\n parameters: { type: \"object\", properties: {} },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"xgen_execution_history\",\n description: \"워크플로우 실행 이력을 가져옵니다.\",\n parameters: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"가져올 이력 수 (기본 10)\" },\n },\n },\n },\n },\n];\n\n// ── 도구 실행 ──\n\nexport async function execute(name: string, args: Record<string, unknown>): Promise<string> {\n const server = getServer();\n const auth = getAuth();\n\n if (!server || !auth) {\n return \"XGEN 서버에 연결되어 있지 않습니다. /connect 명령으로 연결하세요.\";\n }\n\n try {\n switch (name) {\n case \"xgen_workflow_list\":\n return await workflowList();\n case \"xgen_workflow_run\":\n return await workflowRun(args);\n case \"xgen_workflow_info\":\n return await workflowInfo(args);\n case \"xgen_collection_list\":\n return await collectionList();\n case \"xgen_server_status\":\n return await serverStatus();\n case \"xgen_execution_history\":\n return await executionHistory(args);\n default:\n return `Unknown XGEN tool: ${name}`;\n }\n } catch (err) {\n return `XGEN API 오류: ${(err as Error).message}`;\n }\n}\n\nexport function isXgenTool(name: string): boolean {\n return name.startsWith(\"xgen_\");\n}\n\n// ── 내부 구현 ──\n\nasync function workflowList(): Promise<string> {\n const { getWorkflowListDetail } = await import(\"../../api/workflow.js\");\n const wfs = await getWorkflowListDetail();\n if (!wfs.length) return \"워크플로우 없음.\";\n return wfs.map((w, i) => {\n const deployed = (w as Record<string, unknown>).is_deployed;\n const dk = (w as Record<string, unknown>).deploy_key;\n const tag = deployed ? \" [배포됨]\" : \"\";\n return `${i + 1}. ${w.workflow_name}${tag}\\n ID: ${w.workflow_id ?? w.id}\\n deploy_key: ${dk || \"없음\"}`;\n }).join(\"\\n\");\n}\n\nasync function workflowRun(args: Record<string, unknown>): Promise<string> {\n const { executeWorkflow } = await import(\"../../api/workflow.js\");\n const { randomUUID } = await import(\"node:crypto\");\n const result = await executeWorkflow({\n workflow_id: args.workflow_id as string,\n workflow_name: args.workflow_name as string,\n input_data: args.input_data as string,\n interaction_id: `cli_${randomUUID().slice(0, 8)}`,\n deploy_key: args.deploy_key as string | undefined,\n }) as Record<string, unknown>;\n if (result.content) return String(result.content);\n if (result.success === false) return `오류: ${result.error ?? result.message}`;\n return JSON.stringify(result, null, 2).slice(0, 2000);\n}\n\nasync function workflowInfo(args: Record<string, unknown>): Promise<string> {\n const { getWorkflowDetail } = await import(\"../../api/workflow.js\");\n const detail = await getWorkflowDetail(args.workflow_id as string);\n const nodes = (detail.nodes as unknown[])?.length ?? 0;\n const edges = (detail.edges as unknown[])?.length ?? 0;\n return `워크플로우: ${detail.workflow_name}\\nID: ${detail.id}\\n노드: ${nodes}개\\n엣지: ${edges}개`;\n}\n\nasync function collectionList(): Promise<string> {\n const { listCollections } = await import(\"../../api/document.js\");\n const cols = await listCollections();\n if (!cols.length) return \"컬렉션 없음.\";\n return cols.map((c, i) => {\n const shared = c.is_shared ? ` [공유:${c.share_group}]` : \"\";\n return `${i + 1}. ${c.collection_make_name}${shared}\\n 문서: ${c.total_documents}개 · 청크: ${c.total_chunks}개 · 모델: ${c.init_embedding_model ?? \"-\"}`;\n }).join(\"\\n\");\n}\n\nasync function serverStatus(): Promise<string> {\n const server = getServer();\n const auth = getAuth();\n return `서버: ${server}\\n사용자: ${auth?.username}\\nUser ID: ${auth?.userId}`;\n}\n\nasync function executionHistory(args: Record<string, unknown>): Promise<string> {\n const { getIOLogs } = await import(\"../../api/workflow.js\");\n const limit = (args.limit as number) || 10;\n const logs = await getIOLogs(undefined, limit);\n if (!logs.length) return \"실행 이력 없음.\";\n return logs.map((l, i) =>\n `${i + 1}. [${l.created_at ?? \"\"}]\\n 입력: ${(l.input_data ?? \"\").slice(0, 80)}\\n 출력: ${(l.output_data ?? \"\").slice(0, 80)}`\n ).join(\"\\n\");\n}\n","/**\n * MCP (Model Context Protocol) 클라이언트\n * .mcp.json 설정을 읽어서 stdio MCP 서버와 통신\n */\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\ninterface McpServerConfig {\n type: \"stdio\";\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\ninterface McpConfig {\n mcpServers: Record<string, McpServerConfig>;\n}\n\ninterface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: number;\n method: string;\n params?: unknown;\n}\n\ninterface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: number;\n result?: unknown;\n error?: { code: number; message: string };\n}\n\ninterface McpTool {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\nexport class McpClient {\n private process: ChildProcess | null = null;\n private requestId = 0;\n private pending = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void }>();\n private serverName: string;\n private config: McpServerConfig;\n private tools: McpTool[] = [];\n\n constructor(serverName: string, config: McpServerConfig) {\n this.serverName = serverName;\n this.config = config;\n }\n\n async start(): Promise<void> {\n this.process = spawn(this.config.command, this.config.args ?? [], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, ...this.config.env },\n });\n\n const rl = createInterface({ input: this.process.stdout! });\n rl.on(\"line\", (line) => {\n try {\n const msg = JSON.parse(line) as JsonRpcResponse;\n if (msg.id !== undefined && this.pending.has(msg.id)) {\n const p = this.pending.get(msg.id)!;\n this.pending.delete(msg.id);\n if (msg.error) {\n p.reject(new Error(msg.error.message));\n } else {\n p.resolve(msg.result);\n }\n }\n } catch {\n // ignore non-JSON lines\n }\n });\n\n this.process.on(\"error\", (err) => {\n console.error(`MCP [${this.serverName}] 프로세스 오류:`, err.message);\n });\n\n // Initialize\n await this.send(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: \"open-xgen\", version: \"0.3.0\" },\n });\n\n await this.send(\"notifications/initialized\", {});\n }\n\n private send(method: string, params?: unknown): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const id = ++this.requestId;\n const request: JsonRpcRequest = { jsonrpc: \"2.0\", id, method, params };\n\n this.pending.set(id, { resolve, reject });\n\n const timeout = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`MCP 요청 타임아웃: ${method}`));\n }, 15_000);\n\n this.pending.set(id, {\n resolve: (v) => {\n clearTimeout(timeout);\n resolve(v);\n },\n reject: (e) => {\n clearTimeout(timeout);\n reject(e);\n },\n });\n\n this.process?.stdin?.write(JSON.stringify(request) + \"\\n\");\n });\n }\n\n async listTools(): Promise<McpTool[]> {\n const result = (await this.send(\"tools/list\", {})) as { tools: McpTool[] };\n this.tools = result.tools ?? [];\n return this.tools;\n }\n\n async callTool(name: string, args: Record<string, unknown>): Promise<string> {\n const result = (await this.send(\"tools/call\", { name, arguments: args })) as {\n content?: { type: string; text?: string }[];\n };\n return result.content?.map((c) => c.text ?? \"\").join(\"\\n\") ?? \"\";\n }\n\n getOpenAITools(): ChatCompletionTool[] {\n return this.tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: `mcp_${this.serverName}_${t.name}`,\n description: `[MCP:${this.serverName}] ${t.description ?? t.name}`,\n parameters: (t.inputSchema as Record<string, unknown>) ?? { type: \"object\", properties: {} },\n },\n }));\n }\n\n stop(): void {\n this.process?.kill();\n this.process = null;\n }\n}\n\n/**\n * .mcp.json에서 MCP 서버 설정 로드\n */\nexport function loadMcpConfig(dir?: string): McpConfig | null {\n const searchPaths = [\n dir ? join(dir, \".mcp.json\") : null,\n join(process.cwd(), \".mcp.json\"),\n join(process.env.HOME ?? \"\", \".mcp.json\"),\n ].filter(Boolean) as string[];\n\n for (const p of searchPaths) {\n if (existsSync(p)) {\n try {\n return JSON.parse(readFileSync(p, \"utf-8\")) as McpConfig;\n } catch {\n continue;\n }\n }\n }\n return null;\n}\n\n/**\n * 모든 MCP 서버 시작 + 도구 수집\n */\nexport class McpManager {\n private clients = new Map<string, McpClient>();\n\n async startAll(config: McpConfig): Promise<void> {\n for (const [name, serverConfig] of Object.entries(config.mcpServers)) {\n if (serverConfig.type !== \"stdio\") continue;\n try {\n const client = new McpClient(name, serverConfig);\n await client.start();\n await client.listTools();\n this.clients.set(name, client);\n } catch (err) {\n console.error(`MCP [${name}] 시작 실패:`, (err as Error).message);\n }\n }\n }\n\n getAllTools(): ChatCompletionTool[] {\n const tools: ChatCompletionTool[] = [];\n for (const client of this.clients.values()) {\n tools.push(...client.getOpenAITools());\n }\n return tools;\n }\n\n async callTool(fullName: string, args: Record<string, unknown>): Promise<string> {\n // fullName format: mcp_{serverName}_{toolName}\n const parts = fullName.split(\"_\");\n if (parts.length < 3 || parts[0] !== \"mcp\") return `Unknown MCP tool: ${fullName}`;\n\n const serverName = parts[1];\n const toolName = parts.slice(2).join(\"_\");\n const client = this.clients.get(serverName);\n if (!client) return `MCP 서버를 찾을 수 없습니다: ${serverName}`;\n\n return client.callTool(toolName, args);\n }\n\n isMcpTool(name: string): boolean {\n return name.startsWith(\"mcp_\");\n }\n\n stopAll(): void {\n for (const client of this.clients.values()) {\n client.stop();\n }\n this.clients.clear();\n }\n\n get serverCount(): number {\n return this.clients.size;\n }\n\n getServerNames(): string[] {\n return [...this.clients.keys()];\n }\n}\n","/**\n * xgen doc — 문서 관리\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../config/store.js\";\nimport { listDocuments, uploadDocument, getDocumentInfo } from \"../api/document.js\";\nimport { printTable, printError, printHeader, formatDate } from \"../utils/format.js\";\n\nexport function registerDocCommand(program: Command): void {\n const doc = program.command(\"doc\").description(\"문서 관리\");\n\n doc\n .command(\"list\")\n .alias(\"ls\")\n .description(\"문서 목록 조회\")\n .option(\"-c, --collection <id>\", \"컬렉션 ID\")\n .action(async (opts) => {\n requireAuth();\n try {\n const docs = await listDocuments(opts.collection);\n if (!docs.length) {\n console.log(chalk.yellow(\"\\n문서가 없습니다.\\n\"));\n return;\n }\n printHeader(`문서 목록 (${docs.length}개)`);\n console.log();\n printTable(\n [\"#\", \"ID\", \"파일명\", \"타입\", \"상태\", \"생성일\"],\n docs.map((d, i) => [\n String(i + 1),\n (d.document_id ?? d.id ?? \"-\").toString().slice(0, 10),\n d.file_name ?? d.name ?? \"-\",\n d.file_type ?? \"-\",\n d.status ?? \"-\",\n formatDate(d.created_at),\n ])\n );\n console.log();\n } catch (err) {\n printError(`문서 목록 조회 실패: ${(err as Error).message}`);\n }\n });\n\n doc\n .command(\"upload <file>\")\n .description(\"문서 업로드\")\n .option(\"-c, --collection <id>\", \"컬렉션 ID\")\n .option(\"-n, --name <name>\", \"파일명\")\n .action(async (file: string, opts) => {\n requireAuth();\n try {\n console.log(chalk.gray(`업로드 중: ${file}`));\n const result = await uploadDocument(file, opts.collection, opts.name);\n console.log(chalk.green(\"✓ 업로드 완료\"));\n console.log(chalk.gray(JSON.stringify(result, null, 2)));\n } catch (err) {\n printError(`업로드 실패: ${(err as Error).message}`);\n }\n });\n\n doc\n .command(\"info <id>\")\n .description(\"문서 상세 정보\")\n .action(async (id: string) => {\n requireAuth();\n try {\n const d = await getDocumentInfo(id);\n printHeader(\"문서 정보\");\n console.log(chalk.gray(JSON.stringify(d, null, 2)));\n } catch (err) {\n printError(`조회 실패: ${(err as Error).message}`);\n }\n });\n}\n","/**\n * xgen ontology — 온톨로지 GraphRAG 질의\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { requireAuth } from \"../config/store.js\";\nimport { queryGraphRAG, queryGraphRAGMultiTurn, getGraphStats } from \"../api/ontology.js\";\nimport { printError, printHeader } from \"../utils/format.js\";\nimport { randomUUID } from \"node:crypto\";\n\nexport function registerOntologyCommand(program: Command): void {\n const ont = program.command(\"ontology\").alias(\"ont\").description(\"온톨로지 GraphRAG 질의\");\n\n ont\n .command(\"query <question>\")\n .alias(\"q\")\n .description(\"GraphRAG 원샷 질의\")\n .option(\"-g, --graph <id>\", \"그래프 ID\")\n .option(\"--no-scs\", \"SCS 컨텍스트 비활성화\")\n .action(async (question: string, opts) => {\n requireAuth();\n try {\n console.log(chalk.gray(\"\\n질의 중...\\n\"));\n const result = await queryGraphRAG(question, opts.graph, { scs: opts.scs });\n\n if (result.answer) {\n console.log(chalk.bold(\"답변:\"));\n console.log(result.answer);\n }\n if (result.sources?.length) {\n console.log(chalk.bold(\"\\n출처:\"));\n result.sources.forEach((s) => console.log(chalk.gray(` - ${s}`)));\n }\n if (result.triples_used?.length) {\n console.log(chalk.bold(\"\\n사용된 트리플:\"));\n result.triples_used.forEach((t) => console.log(chalk.dim(` ${t}`)));\n }\n console.log();\n } catch (err) {\n printError(`질의 실패: ${(err as Error).message}`);\n }\n });\n\n ont\n .command(\"chat\")\n .description(\"멀티턴 GraphRAG 대화\")\n .option(\"-g, --graph <id>\", \"그래프 ID\")\n .action(async (opts) => {\n requireAuth();\n const sessionId = randomUUID();\n\n printHeader(\"Ontology Chat\");\n console.log(chalk.gray(\"멀티턴 GraphRAG 대화. exit로 종료.\\n\"));\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const ask = (): Promise<string> =>\n new Promise((resolve) => rl.question(chalk.green(\"❯ \"), (a) => resolve(a.trim())));\n\n while (true) {\n const input = await ask();\n if (!input) continue;\n if (input === \"exit\") {\n rl.close();\n break;\n }\n\n try {\n const result = await queryGraphRAGMultiTurn(input, sessionId, opts.graph);\n if (result.answer) console.log(`\\n${result.answer}\\n`);\n } catch (err) {\n console.log(chalk.red(`오류: ${(err as Error).message}\\n`));\n }\n }\n });\n\n ont\n .command(\"stats <graph-id>\")\n .description(\"그래프 통계\")\n .action(async (graphId: string) => {\n requireAuth();\n try {\n const stats = await getGraphStats(graphId);\n printHeader(\"그래프 통계\");\n console.log(chalk.gray(JSON.stringify(stats, null, 2)));\n console.log();\n } catch (err) {\n printError(`통계 조회 실패: ${(err as Error).message}`);\n }\n });\n}\n","/**\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","res","chalk","createInterface","chalk","client","program","OpenAI","client","tools","client","getWorkflowListDetail","listCollections","executeWorkflow","randomUUID","provider","createLLMClient","streamChat","client","chalk","chalk","program","chalk","program","clearAuth","apiValidate","chalk","chalk","chalk","chalk","text","createInterface","chalk","chalk","program","chalk","createInterface","randomUUID","chalk","rl","createInterface","randomUUID","program","chalk","createInterface","readFileSync","definition","execute","writeFileSync","mkdirSync","definition","execute","readFileSync","writeFileSync","definition","execute","definition","execute","execSync","definition","execute","execSync","definition","execute","execSync","mkdirSync","writeFileSync","existsSync","join","execute","workflowList","workflowRun","workflowInfo","getWorkflowListDetail","executeWorkflow","randomUUID","getWorkflowDetail","listCollections","getIOLogs","existsSync","readFileSync","join","createInterface","client","tools","prompt","client","W","chalk","createInterface","startTui","tools","execute","setServer","setAuth","addEnvironment","apiLogin","switchEnvironment","program","chalk","program","chalk","createInterface","client","randomUUID","program","chalk","createInterface","ask","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/store.ts","../src/api/client.ts","../src/utils/format.ts","../src/api/auth.ts","../src/api/workflow.ts","../src/utils/ui.ts","../src/commands/provider.ts","../src/agent/llm.ts","../src/api/document.ts","../src/dashboard/tui.ts","../src/index.ts","../src/commands/config.ts","../src/commands/login.ts","../src/commands/workflow/list.ts","../src/commands/workflow/info.ts","../src/commands/workflow/run.ts","../src/utils/sse.ts","../src/utils/markdown.ts","../src/commands/workflow/history.ts","../src/commands/workflow/index.ts","../src/commands/chat.ts","../src/commands/agent.ts","../src/agent/tools/file-read.ts","../src/agent/tools/file-write.ts","../src/agent/tools/file-edit.ts","../src/agent/tools/bash.ts","../src/agent/tools/grep.ts","../src/agent/tools/list-files.ts","../src/agent/tools/sandbox.ts","../src/agent/tools/index.ts","../src/agent/tools/xgen-api.ts","../src/mcp/client.ts","../src/commands/doc.ts","../src/commands/ontology.ts","../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 store.defaultId = provider.id; // 항상 새로 추가한 걸 기본으로\n writeJson(PROVIDERS_FILE, store, true);\n}\n\nexport function removeProvider(id: string): boolean {\n const store = getProvidersStore();\n const before = store.providers.length;\n store.providers = store.providers.filter((p) => p.id !== id);\n if (store.defaultId === id) {\n store.defaultId = store.providers[0]?.id ?? null;\n }\n writeJson(PROVIDERS_FILE, store, true);\n return store.providers.length < before;\n}\n\nexport function getDefaultProvider(): ProviderConfig | null {\n const store = getProvidersStore();\n if (!store.defaultId) return store.providers[0] ?? null;\n return store.providers.find((p) => p.id === store.defaultId) ?? null;\n}\n\nexport function setDefaultProvider(id: string): boolean {\n const store = getProvidersStore();\n const exists = store.providers.some((p) => p.id === id);\n if (!exists) return false;\n store.defaultId = id;\n writeJson(PROVIDERS_FILE, store, true);\n return true;\n}\n\n// ── Environments ──\n\nexport interface XgenEnvironment {\n id: string;\n name: string;\n url: string;\n email?: string;\n description?: string;\n}\n\nconst ENVIRONMENTS_FILE = join(XGEN_DIR, \"environments.json\");\n\ninterface EnvStore {\n environments: XgenEnvironment[];\n activeId: string | null;\n}\n\nconst DEFAULT_ENV_STORE: EnvStore = { environments: [], activeId: null };\n\nexport function getEnvStore(): EnvStore {\n return { ...DEFAULT_ENV_STORE, ...readJson(ENVIRONMENTS_FILE, DEFAULT_ENV_STORE) };\n}\n\nexport function getEnvironments(): XgenEnvironment[] {\n return getEnvStore().environments;\n}\n\nexport function addEnvironment(env: XgenEnvironment): void {\n const store = getEnvStore();\n store.environments = store.environments.filter((e) => e.id !== env.id);\n store.environments.push(env);\n if (!store.activeId) store.activeId = env.id;\n writeJson(ENVIRONMENTS_FILE, store);\n}\n\nexport function removeEnvironment(id: string): boolean {\n const store = getEnvStore();\n const before = store.environments.length;\n store.environments = store.environments.filter((e) => e.id !== id);\n if (store.activeId === id) store.activeId = store.environments[0]?.id ?? null;\n writeJson(ENVIRONMENTS_FILE, store);\n return store.environments.length < before;\n}\n\nexport function switchEnvironment(id: string): boolean {\n const store = getEnvStore();\n const env = store.environments.find((e) => e.id === id);\n if (!env) return false;\n store.activeId = id;\n writeJson(ENVIRONMENTS_FILE, store);\n // 서버 URL도 같이 변경\n setServer(env.url);\n return true;\n}\n\nexport function getActiveEnvironment(): XgenEnvironment | null {\n const store = getEnvStore();\n if (!store.activeId) return null;\n return store.environments.find((e) => e.id === store.activeId) ?? null;\n}\n\n// ── Helpers ──\n\nexport function requireServer(): string {\n const server = getServer();\n if (!server) {\n console.error(\"서버가 설정되지 않았습니다. 먼저 실행하세요:\");\n console.error(\" xgen config set-server <url>\");\n process.exit(1);\n }\n return server;\n}\n\nexport function requireAuth(): XgenAuth {\n const auth = getAuth();\n if (!auth) {\n console.error(\"로그인이 필요합니다. 먼저 실행하세요:\");\n console.error(\" xgen login\");\n process.exit(1);\n }\n return auth;\n}\n","/**\n * XGEN API 클라이언트\n * axios 인스턴스 + 토큰 자동 갱신 인터셉터\n */\nimport axios, { type AxiosInstance, type InternalAxiosRequestConfig } from \"axios\";\nimport {\n getAccessToken,\n getRefreshToken,\n getServer,\n setAuth,\n getAuth,\n clearAuth,\n} from \"../config/store.js\";\n\nlet client: AxiosInstance | null = null;\n\nexport function getClient(): AxiosInstance {\n if (client) return client;\n\n const server = getServer();\n if (!server) {\n throw new Error(\"서버가 설정되지 않았습니다. xgen config set-server <url>\");\n }\n\n client = axios.create({\n baseURL: server,\n timeout: 120_000,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // Request 인터셉터: 토큰 자동 추가\n client.interceptors.request.use((config: InternalAxiosRequestConfig) => {\n const token = getAccessToken();\n if (token && config.headers) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n });\n\n // Response 인터셉터: 401 시 토큰 갱신\n client.interceptors.response.use(\n (response) => response,\n async (error) => {\n const originalRequest = error.config;\n\n if (\n error.response?.status === 401 &&\n !originalRequest._retry &&\n getRefreshToken()\n ) {\n originalRequest._retry = true;\n\n try {\n const refreshToken = getRefreshToken()!;\n const server = getServer()!;\n const res = await axios.post(`${server}/api/auth/refresh`, {\n refresh_token: refreshToken,\n });\n\n if (res.data.success && res.data.access_token) {\n const auth = getAuth()!;\n setAuth({\n ...auth,\n accessToken: res.data.access_token,\n });\n\n originalRequest.headers.Authorization = `Bearer ${res.data.access_token}`;\n return client!(originalRequest);\n }\n } catch {\n clearAuth();\n console.error(\"\\n세션이 만료되었습니다. 다시 로그인하세요: xgen login\");\n process.exit(1);\n }\n }\n\n return Promise.reject(error);\n }\n );\n\n return client;\n}\n\n/** 클라이언트 리셋 (서버 변경 시) */\nexport function resetClient(): void {\n client = null;\n}\n","/**\n * 출력 포맷팅 유틸리티\n */\nimport chalk from \"chalk\";\n\nexport function printHeader(text: string): void {\n const line = \"─\".repeat(Math.max(text.length + 4, 40));\n console.log(chalk.cyan(line));\n console.log(chalk.cyan.bold(` ${text}`));\n console.log(chalk.cyan(line));\n}\n\nexport function printSuccess(text: string): void {\n console.log(chalk.green(`✓ ${text}`));\n}\n\nexport function printError(text: string): void {\n console.error(chalk.red(`✗ ${text}`));\n}\n\nexport function printWarning(text: string): void {\n console.log(chalk.yellow(`⚠ ${text}`));\n}\n\nexport function printInfo(text: string): void {\n console.log(chalk.blue(`ℹ ${text}`));\n}\n\nexport function printKeyValue(key: string, value: string | number | boolean | null | undefined): void {\n console.log(` ${chalk.gray(key + \":\")} ${value ?? chalk.dim(\"(없음)\")}`);\n}\n\nexport function printTable(headers: string[], rows: string[][]): void {\n // 각 컬럼의 최대 너비 계산\n const widths = headers.map((h, i) => {\n const colMax = rows.reduce((max, row) => Math.max(max, (row[i] ?? \"\").length), 0);\n return Math.max(h.length, colMax);\n });\n\n // 헤더 출력\n const headerLine = headers.map((h, i) => h.padEnd(widths[i])).join(\" \");\n console.log(chalk.bold(headerLine));\n console.log(chalk.gray(\"─\".repeat(headerLine.length)));\n\n // 행 출력\n for (const row of rows) {\n const line = row.map((cell, i) => (cell ?? \"\").padEnd(widths[i])).join(\" \");\n console.log(line);\n }\n}\n\nexport function truncate(text: string, maxLen = 50): string {\n if (text.length <= maxLen) return text;\n return text.slice(0, maxLen - 3) + \"...\";\n}\n\nexport function formatDate(dateStr?: string | null): string {\n if (!dateStr) return \"-\";\n try {\n const d = new Date(dateStr);\n return d.toLocaleDateString(\"ko-KR\") + \" \" + d.toLocaleTimeString(\"ko-KR\", { hour: \"2-digit\", minute: \"2-digit\" });\n } catch {\n return dateStr;\n }\n}\n","/**\n * 인증 API\n */\nimport axios from \"axios\";\nimport { createHash } from \"node:crypto\";\nimport { getServer } from \"../config/store.js\";\n\nexport interface LoginResult {\n success: boolean;\n message: string;\n access_token?: string;\n refresh_token?: string;\n token_type: string;\n user_id?: string;\n username?: string;\n}\n\nexport interface ValidateResult {\n valid: boolean;\n user_id?: string;\n username?: string;\n is_admin?: boolean;\n user_type?: string;\n available_user_sections?: string;\n new_access_token?: string;\n}\n\nexport async function apiLogin(\n email: string,\n password: string\n): Promise<LoginResult> {\n const server = getServer();\n if (!server) throw new Error(\"서버가 설정되지 않았습니다\");\n\n const hashedPassword = createHash(\"sha256\").update(password).digest(\"hex\");\n\n const res = await axios.post(`${server}/api/auth/login`, {\n email,\n password: hashedPassword,\n });\n\n return res.data;\n}\n\nexport async function apiValidate(\n accessToken: string\n): Promise<ValidateResult> {\n const server = getServer();\n if (!server) throw new Error(\"서버가 설정되지 않았습니다\");\n\n const res = await axios.get(`${server}/api/auth/validate`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n return res.data;\n}\n\nexport async function apiRefresh(\n refreshToken: string\n): Promise<{ success: boolean; access_token?: string }> {\n const server = getServer();\n if (!server) throw new Error(\"서버가 설정되지 않았습니다\");\n\n const res = await axios.post(`${server}/api/auth/refresh`, {\n refresh_token: refreshToken,\n });\n\n return res.data;\n}\n","/**\n * 워크플로우 API\n */\nimport { getClient } from \"./client.js\";\n\nexport interface Workflow {\n id?: string;\n workflow_id?: string;\n workflow_name: string;\n description?: string;\n created_at?: string;\n updated_at?: string;\n deploy_status?: string;\n version?: string;\n}\n\nexport interface WorkflowDetail {\n id: string;\n workflow_name: string;\n description?: string;\n nodes?: unknown[];\n edges?: unknown[];\n parameters?: Record<string, unknown>;\n}\n\nexport interface WorkflowExecuteRequest {\n workflow_id: string;\n workflow_name: string;\n input_data: string;\n interaction_id: string;\n parameters?: Record<string, unknown>;\n}\n\nexport interface IOLog {\n interaction_id: string;\n input_data: string;\n output_data: string;\n created_at: string;\n execution_time?: number;\n}\n\nexport async function listWorkflows(userId?: string): Promise<Workflow[]> {\n const client = getClient();\n const params: Record<string, string> = {};\n if (userId) params.user_id = userId;\n\n const res = await client.get(\"/api/workflow/list\", { params });\n return res.data.workflows ?? res.data;\n}\n\nexport async function getWorkflowDetail(workflowId: string): Promise<WorkflowDetail> {\n const client = getClient();\n const res = await client.get(`/api/workflow/load/${workflowId}`);\n return res.data;\n}\n\nexport async function getWorkflowListDetail(): Promise<Workflow[]> {\n const client = getClient();\n const res = await client.get(\"/api/workflow/list/detail\");\n return res.data.workflows ?? res.data;\n}\n\n/**\n * 워크플로우 스트리밍 실행\n * SSE 응답을 반환 — 호출자가 직접 파싱\n */\nexport async function executeWorkflowStream(\n request: WorkflowExecuteRequest\n): Promise<NodeJS.ReadableStream> {\n const client = getClient();\n const res = await client.post(\"/api/workflow/execute/based_id/stream\", request, {\n responseType: \"stream\",\n headers: {\n Accept: \"text/event-stream\",\n },\n });\n\n return res.data;\n}\n\n/**\n * 워크플로우 실행 (non-stream, deploy 엔드포인트)\n * K3s Istio 환경에서 based_id/stream은 Next.js로 라우팅되어 CLI 접근 불가\n * deploy/result 엔드포인트 사용\n */\nexport async function executeWorkflow(\n request: WorkflowExecuteRequest & { deploy_key?: string }\n): Promise<unknown> {\n const client = getClient();\n // deploy_key가 있으면 deploy 엔드포인트, 없으면 based_id\n if (request.deploy_key) {\n const res = await client.post(\"/api/workflow/execute/deploy/result\", request);\n return res.data;\n }\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 * OPEN XGEN UI 유틸리티 — 터미널 UI 컴포넌트\n */\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\n\nconst W = Math.min(process.stdout.columns || 60, 70);\n\n// ── 박스 ──\n\nexport function box(lines: string[], color: \"cyan\" | \"green\" | \"yellow\" | \"gray\" = \"cyan\"): string {\n const c = chalk[color];\n const inner = W - 4;\n const top = c(\" ╭\" + \"─\".repeat(inner) + \"╮\");\n const bot = c(\" ╰\" + \"─\".repeat(inner) + \"╯\");\n const body = lines.map((line) => {\n const clean = line.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n const pad = Math.max(0, inner - clean.length);\n return c(\" │ \") + line + \" \".repeat(pad) + c(\" │\");\n });\n return [top, ...body, bot].join(\"\\n\");\n}\n\n// ── 구분선 ──\n\nexport function divider(label?: string): string {\n if (label) {\n const rest = W - label.length - 6;\n return chalk.gray(` ── ${label} ${\"─\".repeat(Math.max(0, rest))}`);\n }\n return chalk.gray(\" \" + \"─\".repeat(W - 2));\n}\n\n// ── 상태 표시 ──\n\nexport function statusDot(active: boolean, label: string, detail?: string): string {\n const dot = active ? chalk.green(\"●\") : chalk.gray(\"○\");\n const d = detail ? chalk.gray(` ${detail}`) : \"\";\n return ` ${dot} ${label}${d}`;\n}\n\n// ── 번호 메뉴 ──\n\nexport interface MenuItem {\n label: string;\n hint?: string;\n disabled?: boolean;\n}\n\nexport function menu(items: MenuItem[], opts?: { title?: string }): string {\n const lines: string[] = [];\n if (opts?.title) {\n lines.push(\"\");\n lines.push(chalk.bold(` ${opts.title}`));\n lines.push(\"\");\n }\n items.forEach((item, i) => {\n const num = chalk.cyan.bold(` ${String(i + 1).padStart(2)}.`);\n const hint = item.hint ? chalk.gray(` — ${item.hint}`) : \"\";\n const label = item.disabled ? chalk.gray(item.label) : item.label;\n lines.push(` ${num} ${label}${hint}`);\n });\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n// ── 프롬프트 ──\n\nexport function ask(question: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\n// ── 채팅 메시지 ──\n\nexport function userMsg(text: string): string {\n return `\\n ${chalk.blue.bold(\"You\")} ${chalk.gray(\"›\")} ${text}`;\n}\n\nexport function aiMsg(name: string): string {\n return `\\n ${chalk.green.bold(name)} ${chalk.gray(\"›\")} `;\n}\n\nexport function toolCall(name: string, summary: string): string {\n return chalk.gray(` ⚙ ${chalk.white(name)} ${summary}`);\n}\n\nexport function toolResult(text: string): string {\n const lines = text.split(\"\\n\").slice(0, 5);\n return lines.map((l) => chalk.gray(` │ ${l}`)).join(\"\\n\");\n}\n\n// ── 환영 메시지 ──\n\nexport function welcome(): string {\n const logo = chalk.cyan(`\n ██████ ██████ ███████ ███ ██\n ██ ██ ██ ██ ██ ████ ██\n ██ ██ ██████ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██\n ██████ ██ ███████ ██ ████`) +\n chalk.white.bold(`\n ██ ██ ██████ ███████ ███ ██\n ██ ██ ██ ██ ████ ██\n ███ ██ ███ █████ ██ ██ ██\n ██ ██ ██ ██ ██ ██ ██ ██\n ██ ██ ██████ ███████ ██ ████`);\n\n return logo;\n}\n\n// ── 진행 표시 ──\n\nexport function spinner(): { update: (text: string) => void; stop: () => void } {\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n let i = 0;\n let text = \"\";\n const interval = setInterval(() => {\n process.stdout.write(`\\r ${chalk.cyan(frames[i++ % frames.length])} ${chalk.gray(text)}`);\n }, 80);\n\n return {\n update(t: string) { text = t; },\n stop() {\n clearInterval(interval);\n process.stdout.write(\"\\r\" + \" \".repeat(W) + \"\\r\");\n },\n };\n}\n","/**\n * xgen provider — AI 프로바이더 관리\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport OpenAI from \"openai\";\nimport {\n addProvider,\n getProviders,\n removeProvider,\n getDefaultProvider,\n setDefaultProvider,\n type ProviderConfig,\n} from \"../config/store.js\";\nimport { printSuccess, printError, printTable } from \"../utils/format.js\";\nimport { ask, box } from \"../utils/ui.js\";\n\ninterface ProviderPreset {\n label: string;\n type: ProviderConfig[\"type\"];\n baseUrl?: string;\n defaultModel: string;\n models: string[];\n needsKey: boolean;\n keyHint: string;\n envKey?: string;\n}\n\nconst PRESETS: ProviderPreset[] = [\n {\n label: \"OpenAI\",\n type: \"openai\",\n defaultModel: \"gpt-4o-mini\",\n models: [\n \"gpt-4o\", \"gpt-4o-mini\",\n \"gpt-4.1\", \"gpt-4.1-mini\", \"gpt-4.1-nano\",\n \"o3-mini\", \"o4-mini\",\n \"gpt-3.5-turbo\",\n ],\n needsKey: true,\n keyHint: \"https://platform.openai.com/api-keys\",\n envKey: \"OPENAI_API_KEY\",\n },\n {\n label: \"Google Gemini\",\n type: \"gemini\",\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n defaultModel: \"gemini-2.0-flash\",\n models: [\n \"gemini-2.5-pro-preview-06-05\",\n \"gemini-2.5-flash-preview-05-20\",\n \"gemini-2.0-flash\",\n \"gemini-2.0-flash-lite\",\n \"gemini-1.5-pro\",\n \"gemini-1.5-flash\",\n ],\n needsKey: true,\n keyHint: \"https://aistudio.google.com/apikey\",\n envKey: \"GEMINI_API_KEY\",\n },\n {\n label: \"Anthropic (Claude)\",\n type: \"anthropic\",\n baseUrl: \"https://api.anthropic.com/v1\",\n defaultModel: \"claude-sonnet-4-20250514\",\n models: [\n \"claude-opus-4-20250514\",\n \"claude-sonnet-4-20250514\",\n \"claude-haiku-4-5-20251001\",\n \"claude-3.5-sonnet-20241022\",\n ],\n needsKey: true,\n keyHint: \"https://console.anthropic.com/settings/keys\",\n envKey: \"ANTHROPIC_API_KEY\",\n },\n {\n label: \"Ollama (로컬 무료)\",\n type: \"ollama\",\n baseUrl: \"http://localhost:11434/v1\",\n defaultModel: \"llama3.1\",\n models: [\n \"llama3.1\", \"llama3.2\", \"llama3.3\",\n \"codellama\", \"deepseek-coder-v2\",\n \"qwen2.5-coder\", \"qwen2.5\",\n \"mistral\", \"mixtral\",\n \"phi3\", \"gemma2\",\n ],\n needsKey: false,\n keyHint: \"https://ollama.ai 설치 후 ollama pull <모델>\",\n },\n {\n label: \"Groq (빠른 추론)\",\n type: \"custom\",\n baseUrl: \"https://api.groq.com/openai/v1\",\n defaultModel: \"llama-3.3-70b-versatile\",\n models: [\n \"llama-3.3-70b-versatile\",\n \"llama-3.1-8b-instant\",\n \"mixtral-8x7b-32768\",\n \"gemma2-9b-it\",\n ],\n needsKey: true,\n keyHint: \"https://console.groq.com/keys\",\n envKey: \"GROQ_API_KEY\",\n },\n {\n label: \"Together AI\",\n type: \"custom\",\n baseUrl: \"https://api.together.xyz/v1\",\n defaultModel: \"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo\",\n models: [\n \"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo\",\n \"meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo\",\n \"mistralai/Mixtral-8x7B-Instruct-v0.1\",\n \"Qwen/Qwen2.5-72B-Instruct-Turbo\",\n ],\n needsKey: true,\n keyHint: \"https://api.together.xyz/settings/api-keys\",\n envKey: \"TOGETHER_API_KEY\",\n },\n {\n label: \"OpenRouter (멀티 모델)\",\n type: \"custom\",\n baseUrl: \"https://openrouter.ai/api/v1\",\n defaultModel: \"openai/gpt-4o-mini\",\n models: [\n \"openai/gpt-4o\", \"openai/gpt-4o-mini\",\n \"anthropic/claude-sonnet-4\", \"anthropic/claude-haiku-4.5\",\n \"google/gemini-2.0-flash-exp\",\n \"meta-llama/llama-3.3-70b-instruct\",\n \"deepseek/deepseek-chat-v3\",\n ],\n needsKey: true,\n keyHint: \"https://openrouter.ai/keys\",\n envKey: \"OPENROUTER_API_KEY\",\n },\n {\n label: \"DeepSeek\",\n type: \"custom\",\n baseUrl: \"https://api.deepseek.com/v1\",\n defaultModel: \"deepseek-chat\",\n models: [\n \"deepseek-chat\",\n \"deepseek-coder\",\n \"deepseek-reasoner\",\n ],\n needsKey: true,\n keyHint: \"https://platform.deepseek.com/api_keys\",\n envKey: \"DEEPSEEK_API_KEY\",\n },\n {\n label: \"기타 (OpenAI 호환 서버)\",\n type: \"custom\",\n defaultModel: \"gpt-4o-mini\",\n models: [],\n needsKey: true,\n keyHint: \"서버에서 발급받은 API Key\",\n },\n];\n\n/**\n * 환경변수에서 API 키 자동 감지\n */\nfunction detectEnvKey(preset: ProviderPreset): string | null {\n if (!preset.envKey) return null;\n return process.env[preset.envKey] ?? null;\n}\n\n/**\n * 가이드 설정\n */\nexport async function guidedProviderSetup(): Promise<ProviderConfig | null> {\n console.log();\n console.log(box([\"OPEN XGEN — 프로바이더 설정\", \"\", chalk.gray(\"AI 에이전트에 사용할 LLM을 선택하세요.\")]));\n console.log();\n\n // 프로바이더 목록\n console.log(chalk.bold(\" 프로바이더 선택:\\n\"));\n PRESETS.forEach((p, i) => {\n const envDetected = detectEnvKey(p);\n const envTag = envDetected ? chalk.green(\" [키 감지됨]\") : \"\";\n const free = !p.needsKey ? chalk.green(\" [무료]\") : \"\";\n console.log(` ${chalk.cyan(`${String(i + 1).padStart(2)}.`)} ${p.label}${free}${envTag}`);\n console.log(` ${chalk.gray(p.defaultModel)}`);\n });\n console.log();\n\n const choice = await ask(chalk.cyan(\" 번호: \"));\n const idx = parseInt(choice) - 1;\n if (isNaN(idx) || idx < 0 || idx >= PRESETS.length) {\n console.log(chalk.red(\" 잘못된 선택.\\n\"));\n return null;\n }\n\n const preset = PRESETS[idx];\n console.log(chalk.green(`\\n ✓ ${preset.label}\\n`));\n\n // API Key (환경변수 자동감지)\n let apiKey = \"\";\n if (preset.needsKey) {\n const envKey = detectEnvKey(preset);\n if (envKey) {\n console.log(chalk.green(` API Key 자동 감지 (${preset.envKey})`));\n const useEnv = await ask(chalk.white(` 이 키를 사용할까요? (Y/n): `));\n if (useEnv.toLowerCase() !== \"n\") {\n apiKey = envKey;\n }\n }\n if (!apiKey) {\n console.log(chalk.gray(` 발급: ${preset.keyHint}\\n`));\n apiKey = await ask(chalk.white(\" API Key: \"));\n if (!apiKey) {\n console.log(chalk.red(\" API Key 필요.\\n\"));\n return null;\n }\n }\n }\n\n // Base URL\n let baseUrl = preset.baseUrl;\n if (preset.label === \"기타 (OpenAI 호환 서버)\") {\n baseUrl = await ask(chalk.white(\" Base URL: \"));\n if (!baseUrl) {\n console.log(chalk.red(\" URL 필요.\\n\"));\n return null;\n }\n }\n\n // 모델 선택\n let model = preset.defaultModel;\n if (preset.models.length > 0) {\n console.log(chalk.bold(\"\\n 모델:\\n\"));\n const defaultIdx = preset.models.indexOf(preset.defaultModel);\n preset.models.forEach((m, i) => {\n const tag = i === defaultIdx ? chalk.green(\" ← 추천\") : \"\";\n console.log(` ${chalk.cyan(`${String(i + 1).padStart(2)}.`)} ${m}${tag}`);\n });\n console.log(` ${chalk.cyan(`${String(preset.models.length + 1).padStart(2)}.`)} 직접 입력`);\n console.log();\n\n const mc = await ask(chalk.cyan(` 번호 [${defaultIdx + 1}]: `));\n if (!mc || mc === String(defaultIdx + 1)) {\n model = preset.defaultModel;\n } else {\n const mi = parseInt(mc) - 1;\n if (mi >= 0 && mi < preset.models.length) {\n model = preset.models[mi];\n } else if (parseInt(mc) === preset.models.length + 1) {\n model = (await ask(chalk.white(\" 모델명: \"))) || preset.defaultModel;\n }\n }\n } else if (preset.label === \"기타 (OpenAI 호환 서버)\") {\n model = (await ask(chalk.white(` 모델명 [${preset.defaultModel}]: `))) || preset.defaultModel;\n }\n\n console.log(chalk.green(`\\n ✓ ${preset.label} · ${model}`));\n\n // 연결 테스트\n console.log(chalk.gray(\" 연결 테스트 중...\\n\"));\n const provider: ProviderConfig = {\n id: preset.label.toLowerCase().replace(/[^a-z0-9]/g, \"-\").replace(/-+/g, \"-\"),\n name: preset.label,\n type: preset.type,\n baseUrl,\n apiKey,\n model,\n };\n\n try {\n const client = new OpenAI({ apiKey: apiKey || \"ollama\", baseURL: baseUrl });\n await client.chat.completions.create({\n model,\n messages: [{ role: \"user\", content: \"Hi\" }],\n max_tokens: 5,\n });\n console.log(chalk.green(\" ✓ 연결 성공!\\n\"));\n } catch (err) {\n console.log(chalk.yellow(` ⚠ 테스트 실패: ${(err as Error).message}`));\n console.log(chalk.gray(\" 설정은 저장됩니다.\\n\"));\n }\n\n addProvider(provider);\n console.log(chalk.green.bold(` ✓ 설정 완료! ${preset.label} (${model})\\n`));\n\n return provider;\n}\n\nexport function registerProviderCommand(program: Command): void {\n const prov = program.command(\"provider\").description(\"AI 프로바이더 관리\");\n\n prov.command(\"add\").description(\"프로바이더 추가\").action(async () => {\n await guidedProviderSetup();\n });\n\n prov.command(\"list\").alias(\"ls\").description(\"프로바이더 목록\").action(() => {\n const providers = getProviders();\n const defaultP = getDefaultProvider();\n if (providers.length === 0) {\n console.log(chalk.yellow(\"\\n 프로바이더 없음. xgen provider add\\n\"));\n return;\n }\n console.log(chalk.cyan.bold(`\\n 프로바이더 (${providers.length}개)\\n`));\n printTable(\n [\"\", \"ID\", \"이름\", \"타입\", \"모델\"],\n providers.map((p) => [\n p.id === defaultP?.id ? chalk.green(\"●\") : \" \",\n p.id, p.name, p.type, p.model,\n ])\n );\n console.log();\n });\n\n prov.command(\"remove <id>\").description(\"프로바이더 제거\").action((id: string) => {\n removeProvider(id) ? printSuccess(`제거: ${id}`) : printError(`없음: ${id}`);\n });\n\n prov.command(\"use <id>\").description(\"기본 프로바이더 설정\").action((id: string) => {\n setDefaultProvider(id) ? printSuccess(`기본: ${id}`) : printError(`없음: ${id}`);\n });\n}\n","/**\n * 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","/**\n * 문서/컬렉션 API — 실제 작동하는 엔드포인트\n */\nimport { getClient } from \"./client.js\";\n\nexport interface Collection {\n id: number;\n collection_make_name: string;\n collection_name: string;\n description?: string;\n total_documents: number;\n total_chunks: number;\n is_shared: boolean;\n share_group?: string;\n init_embedding_model?: string;\n created_at?: string;\n}\n\nexport interface Document {\n id?: string;\n document_id?: string;\n name?: string;\n file_name?: string;\n file_type?: string;\n status?: string;\n created_at?: string;\n file_size?: number;\n}\n\nexport async function listCollections(): Promise<Collection[]> {\n const client = getClient();\n const res = await client.get(\"/api/retrieval/collections\");\n return Array.isArray(res.data) ? res.data : res.data.collections ?? [];\n}\n\nexport async function listDocuments(collectionId?: string): Promise<Document[]> {\n const client = getClient();\n try {\n const params: Record<string, string> = {};\n if (collectionId) params.collection_id = collectionId;\n const res = await client.get(\"/api/retrieval/documents/list\", { params });\n return res.data.documents ?? res.data ?? [];\n } catch {\n return [];\n }\n}\n\nexport async function uploadDocument(\n filePath: string,\n collectionId?: string,\n name?: string\n): Promise<unknown> {\n const client = getClient();\n const { createReadStream, statSync } = await import(\"node:fs\");\n const { basename } = await import(\"node:path\");\n const stat = statSync(filePath);\n const fileName = name || basename(filePath);\n\n const form = new FormData();\n const fileBlob = new Blob([createReadStream(filePath) as unknown as BlobPart]);\n form.append(\"file\", fileBlob, fileName);\n if (collectionId) form.append(\"collection_id\", collectionId);\n\n const res = await client.post(\"/api/retrieval/documents/upload\", form, {\n headers: { \"Content-Type\": \"multipart/form-data\" },\n maxBodyLength: stat.size + 1024 * 1024,\n });\n return res.data;\n}\n\nexport async function getDocumentInfo(docId: string): Promise<Document> {\n const client = getClient();\n const res = await client.get(`/api/retrieval/documents/${docId}`);\n return res.data;\n}\n","/**\n * OPEN XGEN TUI 대시보드 — blessed 기반 화면 분할\n *\n * ┌─────────────────────┬──────────────────────┐\n * │ 워크플로우 목록 │ 상세 정보 / 실행 │\n * │ (화살표 선택) │ │\n * │ │ │\n * ├─────────────────────┼──────────────────────┤\n * │ 컬렉션 / 문서 │ AI 채팅 │\n * │ │ (입력 + 응답) │\n * │ │ │\n * └─────────────────────┴──────────────────────┘\n * [Tab: 패널 전환] [Enter: 선택/실행] [q: 종료]\n */\nimport blessed from \"blessed\";\nimport { getServer, getAuth, getDefaultProvider, getActiveEnvironment } from \"../config/store.js\";\n\n// 타입\ninterface WfItem {\n name: string;\n id: string;\n deployed: boolean;\n deployKey?: string;\n nodeCount?: number;\n}\n\ninterface ColItem {\n name: string;\n docs: number;\n chunks: number;\n shared: boolean;\n group?: string;\n}\n\nexport async function startTui(): Promise<void> {\n const screen = blessed.screen({\n smartCSR: true,\n title: \"OPEN XGEN\",\n fullUnicode: true,\n });\n\n const provider = getDefaultProvider();\n const server = getServer();\n const auth = getAuth();\n const env = getActiveEnvironment();\n\n // ── 헤더 ──\n const header = blessed.box({\n top: 0, left: 0, width: \"100%\", height: 3,\n content: `{center}{bold}OPEN XGEN{/bold} ${provider?.model ?? \"AI 미설정\"} · ${auth?.username ?? \"미연결\"}@${env?.name ?? server?.replace(\"https://\", \"\") ?? \"\"}{/center}`,\n tags: true,\n style: { fg: \"white\", bg: \"blue\" },\n });\n\n // ── 왼쪽 상단: 워크플로우 ──\n const wfPanel = blessed.list({\n top: 3, left: 0, width: \"50%\", height: \"50%-2\",\n label: \" 워크플로우 \",\n border: { type: \"line\" },\n style: {\n border: { fg: \"cyan\" },\n selected: { fg: \"black\", bg: \"cyan\" },\n item: { fg: \"white\" },\n label: { fg: \"cyan\", bold: true },\n },\n keys: true,\n vi: true,\n mouse: true,\n scrollbar: { ch: \"│\", style: { fg: \"cyan\" } },\n tags: true,\n });\n\n // ── 오른쪽 상단: 상세/실행 결과 ──\n const detailPanel = blessed.box({\n top: 3, left: \"50%\", width: \"50%\", height: \"50%-2\",\n label: \" 상세 \",\n border: { type: \"line\" },\n scrollable: true,\n alwaysScroll: true,\n mouse: true,\n tags: true,\n style: {\n border: { fg: \"green\" },\n label: { fg: \"green\", bold: true },\n },\n });\n\n // ── 왼쪽 하단: 컬렉션 ──\n const colPanel = blessed.list({\n top: \"50%+1\", left: 0, width: \"50%\", height: \"50%-4\",\n label: \" 컬렉션 (문서) \",\n border: { type: \"line\" },\n style: {\n border: { fg: \"yellow\" },\n selected: { fg: \"black\", bg: \"yellow\" },\n item: { fg: \"white\" },\n label: { fg: \"yellow\", bold: true },\n },\n keys: true,\n vi: true,\n mouse: true,\n tags: true,\n });\n\n // ── 오른쪽 하단: AI 채팅 ──\n const chatLog = blessed.log({\n top: \"50%+1\", left: \"50%\", width: \"50%\", height: \"50%-7\",\n label: \" AI 채팅 \",\n border: { type: \"line\" },\n scrollable: true,\n alwaysScroll: true,\n mouse: true,\n tags: true,\n style: {\n border: { fg: \"magenta\" },\n label: { fg: \"magenta\", bold: true },\n },\n });\n\n // ── 채팅 입력 ──\n const chatInput = blessed.textbox({\n bottom: 3, left: \"50%\", width: \"50%\", height: 3,\n label: \" 입력 \",\n border: { type: \"line\" },\n inputOnFocus: true,\n style: {\n border: { fg: \"magenta\" },\n label: { fg: \"magenta\" },\n },\n });\n\n // ── 상태 바 ──\n const statusBar = blessed.box({\n bottom: 0, left: 0, width: \"100%\", height: 3,\n content: \" {bold}Tab{/bold}:패널전환 {bold}Enter{/bold}:선택 {bold}r{/bold}:새로고침 {bold}c{/bold}:채팅 {bold}q{/bold}:종료 {bold}↑↓{/bold}:이동\",\n tags: true,\n style: { fg: \"white\", bg: \"gray\" },\n });\n\n screen.append(header);\n screen.append(wfPanel);\n screen.append(detailPanel);\n screen.append(colPanel);\n screen.append(chatLog);\n screen.append(chatInput);\n screen.append(statusBar);\n\n // ── 데이터 ──\n let workflows: WfItem[] = [];\n let collections: ColItem[] = [];\n\n async function loadData(): Promise<void> {\n if (!server || !auth) {\n wfPanel.setItems([\"서버 미연결 — q 종료 후 xgen agent → /connect\"]);\n colPanel.setItems([\"서버 미연결\"]);\n screen.render();\n return;\n }\n\n statusBar.setContent(\" 로딩 중...\");\n screen.render();\n\n try {\n const { getWorkflowListDetail } = await import(\"../api/workflow.js\");\n const wfs = await getWorkflowListDetail();\n workflows = wfs.map((w) => ({\n name: w.workflow_name,\n id: (w.workflow_id ?? w.id ?? \"\").toString(),\n deployed: !!(w as Record<string, unknown>).is_deployed,\n deployKey: (w as Record<string, unknown>).deploy_key as string | undefined,\n nodeCount: (w as Record<string, unknown>).node_count as number | undefined,\n }));\n wfPanel.setItems(workflows.map((w) => {\n const tag = w.deployed ? \"{green-fg}[배포]{/green-fg}\" : \"\";\n return ` ${w.name} ${tag}`;\n }));\n } catch (err) {\n wfPanel.setItems([`오류: ${(err as Error).message}`]);\n }\n\n try {\n const { listCollections } = await import(\"../api/document.js\");\n const cols = await listCollections();\n collections = cols.map((c) => ({\n name: c.collection_make_name,\n docs: c.total_documents,\n chunks: c.total_chunks,\n shared: c.is_shared,\n group: c.share_group ?? undefined,\n }));\n colPanel.setItems(collections.map((c) => {\n const shared = c.shared ? `{yellow-fg}[${c.group}]{/yellow-fg}` : \"\";\n return ` ${c.name} ${shared} — ${c.docs}문서 ${c.chunks}청크`;\n }));\n } catch {\n colPanel.setItems([\"컬렉션 로드 실패\"]);\n }\n\n statusBar.setContent(\" {bold}Tab{/bold}:패널전환 {bold}Enter{/bold}:선택 {bold}r{/bold}:새로고침 {bold}c{/bold}:채팅 {bold}q{/bold}:종료 {bold}↑↓{/bold}:이동\");\n screen.render();\n }\n\n // ── 워크플로우 선택 시 상세 표시 ──\n wfPanel.on(\"select item\", (_item: unknown, index: number) => {\n const w = workflows[index];\n if (!w) return;\n detailPanel.setContent([\n `{bold}${w.name}{/bold}`,\n \"\",\n `ID: ${w.id}`,\n `배포: ${w.deployed ? \"{green-fg}Yes{/green-fg}\" : \"No\"}`,\n w.deployKey ? `Deploy Key: ${w.deployKey}` : \"\",\n w.nodeCount ? `노드: ${w.nodeCount}개` : \"\",\n \"\",\n w.deployed ? \"{green-fg}Enter로 실행{/green-fg}\" : \"{gray-fg}미배포 — 실행 불가{/gray-fg}\",\n ].filter(Boolean).join(\"\\n\"));\n screen.render();\n });\n\n // ── 워크플로우 실행 (Enter) ──\n wfPanel.on(\"select\", async (_item: unknown, index: number) => {\n const w = workflows[index];\n if (!w || !w.deployed || !w.deployKey) {\n detailPanel.setContent(\"{red-fg}배포된 워크플로우만 실행 가능합니다.{/red-fg}\");\n screen.render();\n return;\n }\n detailPanel.setContent(`{yellow-fg}${w.name} 실행 중...{/yellow-fg}`);\n screen.render();\n\n try {\n const { executeWorkflow } = await import(\"../api/workflow.js\");\n const { randomUUID } = await import(\"node:crypto\");\n const result = await executeWorkflow({\n workflow_id: w.id,\n workflow_name: w.name,\n input_data: \"테스트 실행\",\n interaction_id: `cli_${randomUUID().slice(0, 8)}`,\n deploy_key: w.deployKey,\n }) as Record<string, unknown>;\n\n if (result.content) {\n detailPanel.setContent(`{green-fg}결과:{/green-fg}\\n\\n${String(result.content).slice(0, 500)}`);\n } else if (result.error) {\n detailPanel.setContent(`{red-fg}오류:{/red-fg} ${result.error}`);\n } else {\n detailPanel.setContent(JSON.stringify(result, null, 2).slice(0, 500));\n }\n } catch (err) {\n detailPanel.setContent(`{red-fg}실행 실패:{/red-fg} ${(err as Error).message}`);\n }\n screen.render();\n });\n\n // ── 컬렉션 선택 ──\n colPanel.on(\"select item\", (_item: unknown, index: number) => {\n const c = collections[index];\n if (!c) return;\n detailPanel.setContent([\n `{bold}${c.name}{/bold}`,\n \"\",\n `문서: ${c.docs}개`,\n `청크: ${c.chunks}개`,\n `공유: ${c.shared ? `Yes (${c.group})` : \"No\"}`,\n ].join(\"\\n\"));\n screen.render();\n });\n\n // ── 채팅 ──\n chatInput.on(\"submit\", async (value: string) => {\n if (!value.trim()) { chatInput.clearValue(); chatInput.focus(); screen.render(); return; }\n chatLog.log(`{blue-fg}You:{/blue-fg} ${value}`);\n chatInput.clearValue();\n screen.render();\n\n try {\n const provider = getDefaultProvider();\n if (!provider) {\n chatLog.log(\"{red-fg}프로바이더 미설정{/red-fg}\");\n chatInput.focus();\n screen.render();\n return;\n }\n\n const { createLLMClient, streamChat } = await import(\"../agent/llm.js\");\n const client = createLLMClient(provider);\n const result = await streamChat(client, provider.model, [\n { role: \"system\", content: \"You are OPEN XGEN. Be concise. Respond in Korean. Max 3 sentences.\" },\n { role: \"user\", content: value },\n ]);\n chatLog.log(`{green-fg}AI:{/green-fg} ${result.content || \"(no response)\"}`);\n } catch (err) {\n chatLog.log(`{red-fg}오류:{/red-fg} ${(err as Error).message}`);\n }\n\n chatInput.focus();\n screen.render();\n });\n\n // ── 키바인딩 ──\n const panels = [wfPanel, colPanel, chatInput];\n let activePanel = 0;\n\n function focusPanel(idx: number): void {\n activePanel = idx;\n panels[idx].focus();\n screen.render();\n }\n\n screen.key([\"tab\"], () => {\n activePanel = (activePanel + 1) % panels.length;\n focusPanel(activePanel);\n });\n\n screen.key([\"S-tab\"], () => {\n activePanel = (activePanel - 1 + panels.length) % panels.length;\n focusPanel(activePanel);\n });\n\n screen.key([\"r\"], async () => { await loadData(); });\n screen.key([\"c\"], () => { focusPanel(2); });\n screen.key([\"q\", \"C-c\"], () => { screen.destroy(); process.exit(0); });\n\n // ── 자동 새로고침 (30초마다) ──\n setInterval(async () => {\n try { await loadData(); } catch { /* ignore */ }\n }, 30_000);\n\n // 초기 로드\n await loadData();\n focusPanel(0);\n screen.render();\n}\n","#!/usr/bin/env node\n/**\n * XGEN CLI — XGEN 2.0 플랫폼 + AI 코딩 에이전트\n *\n * xgen → 설정에 따라 에이전트 또는 채팅 모드\n * xgen agent → AI 코딩 에이전트\n * xgen chat → XGEN 워크플로우 채팅\n * xgen wf run → 워크플로우 실행\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerLoginCommand } from \"./commands/login.js\";\nimport { registerWorkflowCommand } from \"./commands/workflow/index.js\";\nimport { registerChatCommand, chat } from \"./commands/chat.js\";\nimport { registerProviderCommand } from \"./commands/provider.js\";\nimport { registerAgentCommand, agentRepl } from \"./commands/agent.js\";\nimport { registerDocCommand } from \"./commands/doc.js\";\nimport { registerOntologyCommand } from \"./commands/ontology.js\";\nimport { getAuth, getServer, getDefaultProvider } from \"./config/store.js\";\n\nconst VERSION = \"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// 인자 없이 실행: 바로 AI 채팅 (Claude Code 스타일)\nif (process.argv.length <= 2) {\n agentRepl().catch((err) => {\n console.error(chalk.red(`오류: ${err.message}`));\n process.exit(1);\n });\n} else {\n program.parse();\n}\n","/**\n * xgen config — 설정 관리\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getConfig, setServer, getServer, setConfig } from \"../config/store.js\";\nimport { resetClient } from \"../api/client.js\";\nimport { printSuccess, printError, printKeyValue } from \"../utils/format.js\";\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"XGEN CLI 설정 관리\");\n\n config\n .command(\"set-server <url>\")\n .description(\"XGEN 서버 URL 설정\")\n .action((url: string) => {\n if (!url.startsWith(\"http://\") && !url.startsWith(\"https://\")) {\n printError(\"URL은 http:// 또는 https://로 시작해야 합니다\");\n process.exit(1);\n }\n setServer(url);\n resetClient();\n printSuccess(`서버 설정 완료: ${chalk.underline(url)}`);\n });\n\n config\n .command(\"get-server\")\n .description(\"현재 설정된 서버 URL 확인\")\n .action(() => {\n const server = getServer();\n if (server) {\n console.log(server);\n } else {\n printError(\"서버가 설정되지 않았습니다\");\n console.log(\" 설정: xgen config set-server <url>\");\n }\n });\n\n config\n .command(\"list\")\n .description(\"전체 설정 확인\")\n .action(() => {\n const cfg = getConfig();\n console.log(chalk.bold(\"\\nXGEN CLI 설정\"));\n console.log(chalk.gray(\"─\".repeat(40)));\n printKeyValue(\"서버\", cfg.server);\n printKeyValue(\"기본 워크플로우\", cfg.defaultWorkflow);\n printKeyValue(\"테마\", cfg.theme);\n printKeyValue(\"스트림 로그\", String(cfg.streamLogs));\n console.log();\n });\n\n config\n .command(\"set <key> <value>\")\n .description(\"설정 값 변경\")\n .action((key: string, value: string) => {\n const allowedKeys = [\"defaultWorkflow\", \"theme\", \"streamLogs\"];\n if (!allowedKeys.includes(key)) {\n printError(`알 수 없는 설정 키: ${key}`);\n console.log(` 사용 가능: ${allowedKeys.join(\", \")}`);\n process.exit(1);\n }\n\n const parsed = key === \"streamLogs\" ? value === \"true\" : value;\n setConfig({ [key]: parsed });\n printSuccess(`${key} = ${value}`);\n });\n}\n","/**\n * xgen login — 서버 로그인\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { apiLogin } from \"../api/auth.js\";\nimport { setAuth, requireServer, getAuth } from \"../config/store.js\";\nimport { printSuccess, printError, printHeader } from \"../utils/format.js\";\n\nfunction prompt(question: string, hidden = false): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n if (hidden) {\n // 비밀번호 입력 시 에코 숨김\n process.stdout.write(question);\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n if (stdin.isTTY) stdin.setRawMode(true);\n\n let password = \"\";\n const onData = (ch: Buffer) => {\n const c = ch.toString(\"utf8\");\n if (c === \"\\n\" || c === \"\\r\" || c === \"\\u0004\") {\n if (stdin.isTTY) stdin.setRawMode(wasRaw ?? false);\n stdin.removeListener(\"data\", onData);\n process.stdout.write(\"\\n\");\n rl.close();\n resolve(password);\n } else if (c === \"\\u0003\") {\n // Ctrl+C\n process.exit(0);\n } else if (c === \"\\u007F\" || c === \"\\b\") {\n // Backspace\n if (password.length > 0) {\n password = password.slice(0, -1);\n process.stdout.write(\"\\b \\b\");\n }\n } else {\n password += c;\n process.stdout.write(\"*\");\n }\n };\n stdin.on(\"data\", onData);\n } else {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n }\n });\n}\n\nexport function registerLoginCommand(program: Command): void {\n program\n .command(\"login\")\n .description(\"XGEN 서버에 로그인\")\n .option(\"-e, --email <email>\", \"이메일\")\n .option(\"-p, --password <password>\", \"비밀번호\")\n .action(async (opts) => {\n const server = requireServer();\n\n printHeader(\"XGEN Login\");\n console.log(chalk.gray(`서버: ${server}\\n`));\n\n let email = opts.email;\n let password = opts.password;\n\n if (!email) {\n email = await prompt(chalk.white(\"이메일: \"));\n }\n if (!password) {\n password = await prompt(chalk.white(\"비밀번호: \"), true);\n }\n\n if (!email || !password) {\n printError(\"이메일과 비밀번호를 모두 입력하세요\");\n process.exit(1);\n }\n\n try {\n const result = await apiLogin(email, password);\n\n if (result.success && result.access_token) {\n setAuth({\n accessToken: result.access_token,\n refreshToken: result.refresh_token ?? \"\",\n userId: result.user_id ?? \"\",\n username: result.username ?? \"\",\n isAdmin: false,\n expiresAt: null,\n });\n\n console.log();\n printSuccess(`로그인 성공! ${chalk.bold(result.username ?? email)}`);\n } else {\n printError(result.message || \"로그인 실패\");\n process.exit(1);\n }\n } catch (err: unknown) {\n const msg =\n (err as { response?: { data?: { message?: string; detail?: string } } })\n ?.response?.data?.message ??\n (err as { response?: { data?: { detail?: string } } })\n ?.response?.data?.detail ??\n (err as Error).message;\n printError(`로그인 실패: ${msg}`);\n process.exit(1);\n }\n });\n\n program\n .command(\"logout\")\n .description(\"로그아웃\")\n .action(async () => {\n const { clearAuth } = await import(\"../config/store.js\");\n clearAuth();\n printSuccess(\"로그아웃 완료\");\n });\n\n program\n .command(\"whoami\")\n .description(\"현재 로그인된 사용자 정보\")\n .action(async () => {\n const auth = getAuth();\n if (!auth) {\n printError(\"로그인되지 않았습니다. xgen login 실행하세요\");\n process.exit(1);\n }\n\n const server = requireServer();\n console.log(chalk.bold(\"\\n현재 사용자\"));\n console.log(chalk.gray(\"─\".repeat(30)));\n console.log(` ${chalk.gray(\"서버:\")} ${server}`);\n console.log(` ${chalk.gray(\"사용자:\")} ${chalk.bold(auth.username)}`);\n console.log(` ${chalk.gray(\"User ID:\")} ${auth.userId}`);\n\n // 토큰 유효성 확인\n try {\n const { apiValidate } = await import(\"../api/auth.js\");\n const result = await apiValidate(auth.accessToken);\n if (result.valid) {\n console.log(` ${chalk.gray(\"상태:\")} ${chalk.green(\"활성\")}`);\n if (result.is_admin) {\n console.log(` ${chalk.gray(\"권한:\")} ${chalk.yellow(\"관리자\")}`);\n }\n if (result.user_type) {\n console.log(` ${chalk.gray(\"유형:\")} ${result.user_type}`);\n }\n } else {\n console.log(` ${chalk.gray(\"상태:\")} ${chalk.red(\"토큰 만료\")}`);\n }\n } catch {\n console.log(` ${chalk.gray(\"상태:\")} ${chalk.yellow(\"검증 불가 (서버 연결 실패)\")}`);\n }\n console.log();\n });\n}\n","/**\n * xgen workflow list — 워크플로우 목록 조회\n */\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { listWorkflows, getWorkflowListDetail } from \"../../api/workflow.js\";\nimport { printTable, printError, printHeader, truncate, formatDate } from \"../../utils/format.js\";\n\nexport async function workflowList(opts: { detail?: boolean }): Promise<void> {\n requireAuth();\n\n try {\n if (opts.detail) {\n const workflows = await getWorkflowListDetail();\n\n if (!workflows || workflows.length === 0) {\n console.log(chalk.yellow(\"\\n워크플로우가 없습니다.\\n\"));\n return;\n }\n\n printHeader(`워크플로우 목록 (${workflows.length}개)`);\n console.log();\n\n printTable(\n [\"#\", \"ID\", \"이름\", \"배포\", \"업데이트\"],\n workflows.map((w, i) => [\n String(i + 1),\n (w.workflow_id ?? w.id ?? \"-\").slice(0, 12),\n truncate(w.workflow_name ?? \"-\", 30),\n (w as Record<string, unknown>).is_deployed\n ? chalk.green(\"배포됨\")\n : chalk.gray(\"미배포\"),\n formatDate(w.updated_at),\n ])\n );\n } else {\n const workflows = await listWorkflows();\n\n if (!workflows || workflows.length === 0) {\n console.log(chalk.yellow(\"\\n워크플로우가 없습니다.\\n\"));\n return;\n }\n\n printHeader(`워크플로우 목록 (${workflows.length}개)`);\n console.log();\n\n printTable(\n [\"#\", \"ID\", \"이름\"],\n workflows.map((w, i) => [\n String(i + 1),\n (w.workflow_id ?? w.id ?? \"-\").slice(0, 12),\n w.workflow_name ?? \"-\",\n ])\n );\n }\n console.log();\n } catch (err: unknown) {\n const msg = (err as Error).message;\n printError(`워크플로우 목록 조회 실패: ${msg}`);\n process.exit(1);\n }\n}\n","/**\n * xgen workflow info <id> — 워크플로우 상세 정보\n */\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { getWorkflowDetail } from \"../../api/workflow.js\";\nimport { printError, printHeader, printKeyValue } from \"../../utils/format.js\";\n\nexport async function workflowInfo(workflowId: string): Promise<void> {\n requireAuth();\n\n try {\n const detail = await getWorkflowDetail(workflowId);\n\n printHeader(`워크플로우: ${detail.workflow_name ?? workflowId}`);\n console.log();\n\n printKeyValue(\"ID\", detail.id);\n printKeyValue(\"이름\", detail.workflow_name);\n printKeyValue(\"설명\", detail.description ?? \"(없음)\");\n\n if (detail.nodes && Array.isArray(detail.nodes)) {\n console.log();\n console.log(chalk.bold(\" 노드 구성:\"));\n for (const node of detail.nodes as Array<{ id: string; data?: { label?: string; type?: string } }>) {\n const label = node.data?.label ?? node.id;\n const type = node.data?.type ?? \"unknown\";\n console.log(` ${chalk.cyan(\"•\")} ${label} ${chalk.gray(`(${type})`)}`);\n }\n }\n\n if (detail.parameters && Object.keys(detail.parameters).length > 0) {\n console.log();\n console.log(chalk.bold(\" 파라미터:\"));\n for (const [key, val] of Object.entries(detail.parameters)) {\n console.log(` ${chalk.gray(key)}: ${JSON.stringify(val)}`);\n }\n }\n\n console.log();\n } catch (err: unknown) {\n const msg = (err as Error).message;\n printError(`워크플로우 조회 실패: ${msg}`);\n process.exit(1);\n }\n}\n","/**\n * xgen workflow run <id> — 워크플로우 실행\n */\nimport chalk from \"chalk\";\nimport { randomUUID } from \"node:crypto\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { executeWorkflowStream, getWorkflowDetail } from \"../../api/workflow.js\";\nimport { parseSSEStream } from \"../../utils/sse.js\";\nimport { printError, printHeader, printInfo } from \"../../utils/format.js\";\nimport { renderMarkdown } from \"../../utils/markdown.js\";\nimport type { SSEEvent } from \"../../api/types.js\";\n\nexport async function workflowRun(\n workflowId: string,\n input: string | undefined,\n opts: { interactive?: boolean; logs?: boolean }\n): Promise<void> {\n const auth = requireAuth();\n\n // 워크플로우 정보 가져오기\n let workflowName = workflowId;\n try {\n const detail = await getWorkflowDetail(workflowId);\n workflowName = detail.workflow_name ?? workflowId;\n } catch {\n // 이름 조회 실패해도 실행은 계속\n }\n\n // 인터랙티브 모드: 입력이 없으면 프롬���트\n if (!input) {\n if (opts.interactive || !process.stdin.isTTY) {\n const { createInterface } = await import(\"node:readline\");\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n input = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan(\"입력> \"), (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n } else {\n printError(\"입력값이 필요합니다. 사용법:\");\n console.log(' xgen workflow run <id> \"입력 텍스���\"');\n console.log(\" xgen workflow run -i <id>\");\n process.exit(1);\n }\n }\n\n if (!input) {\n printError(\"입력값이 비어있습니다\");\n process.exit(1);\n }\n\n const interactionId = `cli_${randomUUID().slice(0, 8)}`;\n\n printHeader(`실행: ${workflowName}`);\n printInfo(`입력: ${input}`);\n console.log();\n\n try {\n const stream = await executeWorkflowStream({\n workflow_id: workflowId,\n workflow_name: workflowName,\n input_data: input,\n interaction_id: interactionId,\n });\n\n let hasOutput = false;\n let fullResponse = \"\";\n\n await parseSSEStream(\n stream,\n (event: SSEEvent) => {\n switch (event.type) {\n case \"token\":\n if (event.content) {\n if (!hasOutput) {\n hasOutput = true;\n console.log();\n }\n process.stdout.write(event.content);\n fullResponse += event.content;\n }\n break;\n\n case \"log\":\n if (opts.logs && event.content) {\n process.stderr.write(chalk.gray(`[LOG] ${event.content}\\n`));\n }\n break;\n\n case \"node_status\":\n if (opts.logs) {\n const nodeName = event.node_name ?? event.node_id ?? \"?\";\n const status = event.status ?? \"?\";\n process.stderr.write(\n chalk.gray(`[노드] ${nodeName}: ${status}\\n`)\n );\n }\n break;\n\n case \"tool\":\n if (opts.logs) {\n process.stderr.write(chalk.gray(`[도구] ${JSON.stringify(event.data)}\\n`));\n }\n break;\n\n case \"complete\":\n break;\n\n case \"error\":\n console.log();\n printError(event.error ?? event.content ?? \"알 수 없는 오류\");\n break;\n\n default:\n // 알 수 없는 이벤트는 content가 있으면 출력\n if (event.content) {\n if (!hasOutput) {\n process.stdout.write(chalk.green(\"응답: \"));\n hasOutput = true;\n }\n process.stdout.write(event.content);\n }\n }\n },\n () => {\n if (hasOutput) {\n // 스트리밍 끝 — 마크다운이 있으면 렌더링된 버전도 표시\n console.log();\n if (fullResponse.includes(\"```\") || fullResponse.includes(\"**\")) {\n console.log(chalk.gray(\"─\".repeat(40)));\n console.log(renderMarkdown(fullResponse));\n }\n }\n console.log();\n console.log(chalk.gray(`세션: ${interactionId}`));\n },\n (err) => {\n console.log();\n printError(`스트리밍 오류: ${err.message}`);\n }\n );\n } catch (err: unknown) {\n const msg =\n (err as { response?: { data?: { detail?: string } } })?.response?.data\n ?.detail ?? (err as Error).message;\n printError(`실행 실패: ${msg}`);\n process.exit(1);\n }\n}\n","/**\n * SSE (Server-Sent Events) 파서\n * 워크플로우 스트리밍 응답 처리\n */\nimport type { SSEEvent } from \"../api/types.js\";\n\n/**\n * ReadableStream에서 SSE 이벤트를 파싱하여 콜백으로 전달\n */\nexport async function parseSSEStream(\n stream: NodeJS.ReadableStream,\n onEvent: (event: SSEEvent) => void,\n onDone?: () => void,\n onError?: (error: Error) => void\n): Promise<void> {\n let buffer = \"\";\n\n return new Promise<void>((resolve, reject) => {\n stream.on(\"data\", (chunk: Buffer) => {\n buffer += chunk.toString();\n\n // SSE 이벤트 파싱: 빈 줄로 구분\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n const lines = part.split(\"\\n\");\n let data = \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n data += line.slice(6);\n } else if (line.startsWith(\"data:\")) {\n data += line.slice(5);\n }\n }\n\n if (!data) continue;\n\n try {\n const event = JSON.parse(data) as SSEEvent;\n onEvent(event);\n } catch {\n // JSON 파싱 실패 시 텍스트로 처리\n onEvent({ type: \"token\", content: data });\n }\n }\n });\n\n stream.on(\"end\", () => {\n // 남은 버퍼 처리\n if (buffer.trim()) {\n const lines = buffer.split(\"\\n\");\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const event = JSON.parse(line.slice(6)) as SSEEvent;\n onEvent(event);\n } catch {\n onEvent({ type: \"token\", content: line.slice(6) });\n }\n }\n }\n }\n onDone?.();\n resolve();\n });\n\n stream.on(\"error\", (err: Error) => {\n onError?.(err);\n reject(err);\n });\n });\n}\n","/**\n * 터미널 마크다운 렌더링 — 가볍게\n * marked-terminal 안 쓰고 직접 처리 (의존성 최소화)\n */\nimport chalk from \"chalk\";\n\n/** 코드 블록 감지용 */\nconst CODE_BLOCK_RE = /```(\\w*)\\n([\\s\\S]*?)```/g;\nconst INLINE_CODE_RE = /`([^`]+)`/g;\nconst BOLD_RE = /\\*\\*(.+?)\\*\\*/g;\nconst HEADING_RE = /^(#{1,3})\\s+(.+)$/gm;\nconst LIST_RE = /^(\\s*)[-*]\\s+(.+)$/gm;\nconst LINK_RE = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n\nexport function renderMarkdown(text: string): string {\n let result = text;\n\n // 코드 블록: 박스로 표시\n result = result.replace(CODE_BLOCK_RE, (_match, lang, code) => {\n const trimmed = code.trimEnd();\n const header = lang ? chalk.gray(` ── ${lang} ──`) : chalk.gray(\" ── code ──\");\n const lines = trimmed.split(\"\\n\").map((l: string) => chalk.white(` ${l}`)).join(\"\\n\");\n return `\\n${header}\\n${lines}\\n${chalk.gray(\" ──────────\")}\\n`;\n });\n\n // 인라인 코드\n result = result.replace(INLINE_CODE_RE, (_m, code) => chalk.cyan(`\\`${code}\\``));\n\n // 볼드\n result = result.replace(BOLD_RE, (_m, text) => chalk.bold(text));\n\n // 헤딩\n result = result.replace(HEADING_RE, (_m, hashes, text) => {\n if (hashes.length === 1) return chalk.bold.underline(text);\n if (hashes.length === 2) return chalk.bold(text);\n return chalk.bold.dim(text);\n });\n\n // 리스트\n result = result.replace(LIST_RE, (_m, indent, text) => `${indent}${chalk.cyan(\"•\")} ${text}`);\n\n // 링크\n result = result.replace(LINK_RE, (_m, label, url) => `${chalk.blue.underline(label)} ${chalk.gray(`(${url})`)}`);\n\n return result;\n}\n","/**\n * xgen workflow history — 실행 이력 조회\n */\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../../config/store.js\";\nimport { getIOLogs } from \"../../api/workflow.js\";\nimport { printError, printHeader, truncate, formatDate } from \"../../utils/format.js\";\n\nexport async function workflowHistory(\n workflowId?: string,\n 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 workflow — 워크플로우 커맨드 그룹\n */\nimport { Command } from \"commander\";\nimport { workflowList } from \"./list.js\";\nimport { workflowInfo } from \"./info.js\";\nimport { workflowRun } from \"./run.js\";\nimport { workflowHistory } from \"./history.js\";\n\nexport function registerWorkflowCommand(program: Command): void {\n const wf = program\n .command(\"workflow\")\n .alias(\"wf\")\n .description(\"워크플로우 관리 및 실행\");\n\n wf.command(\"list\")\n .alias(\"ls\")\n .description(\"워크플로우 목록 조회\")\n .option(\"-d, --detail\", \"상세 정보 포함\")\n .action((opts) => workflowList(opts));\n\n wf.command(\"info <workflow-id>\")\n .description(\"워크플로우 상세 정보\")\n .action((id) => workflowInfo(id));\n\n wf.command(\"run <workflow-id> [input]\")\n .description(\"워크플로우 실행\")\n .option(\"-i, --interactive\", \"인터랙티브 모드 (입력 프롬프트)\")\n .option(\"-l, --logs\", \"디버그 로그 표시\")\n .action((id, input, opts) => workflowRun(id, input, opts));\n\n wf.command(\"history [workflow-id]\")\n .description(\"실행 이력 조회\")\n .option(\"-n, --limit <number>\", \"조회 건수\", \"20\")\n .action((id, opts) => workflowHistory(id, { limit: parseInt(opts.limit) }));\n}\n","/**\n * xgen chat — 인터랙티브 터미널 모드\n *\n * Gemini CLI 스타일: 터미널 열면 바로 대화, 워크플로우 전환 가능\n *\n * 슬래시 커맨드:\n * /workflows — 워크플로우 목록 + 전환\n * /switch — 워크플로우 전환\n * /history — 최근 대화 이력\n * /clear — 화면 지우기\n * /help — 도움말\n * /exit — 종료\n */\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { randomUUID } from \"node:crypto\";\nimport { requireAuth, getAuth, getServer } from \"../config/store.js\";\nimport { listWorkflows, executeWorkflowStream, type Workflow } from \"../api/workflow.js\";\nimport { parseSSEStream } from \"../utils/sse.js\";\nimport { renderMarkdown } from \"../utils/markdown.js\";\nimport { printError } from \"../utils/format.js\";\nimport type { SSEEvent } from \"../api/types.js\";\n\nconst CHAT_BANNER = `\n${chalk.cyan(\"╭──────────────────────────────────────╮\")}\n${chalk.cyan(\"│\")} ${chalk.white.bold(\"XGEN\")} ${chalk.gray(\"— 워크플로우 AI 터미널\")} ${chalk.cyan(\"│\")}\n${chalk.cyan(\"│\")} ${chalk.gray(\"/help 도움말 /workflows 전환 /exit\")} ${chalk.cyan(\"│\")}\n${chalk.cyan(\"╰──────────────────────────────────────╯\")}`;\n\nfunction printHelp() {\n console.log(`\n${chalk.bold(\"슬래시 커맨드\")}\n ${chalk.cyan(\"/workflows\")} 워크플로우 목록 보기 & 전환\n ${chalk.cyan(\"/switch\")} 워크플로우 번호로 전환 (예: /switch 3)\n ${chalk.cyan(\"/history\")} 현재 세션 대화 이력\n ${chalk.cyan(\"/clear\")} 화면 지우기\n ${chalk.cyan(\"/info\")} 현재 연결 정보\n ${chalk.cyan(\"/help\")} 이 도움말\n ${chalk.cyan(\"/exit\")} 종료 (Ctrl+C도 가능)\n`);\n}\n\nasync function promptLine(rl: ReturnType<typeof createInterface>, promptStr: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(promptStr, (answer) => resolve(answer));\n });\n}\n\nexport async function chat(workflowId?: string): Promise<void> {\n const auth = requireAuth();\n const server = getServer();\n\n // 워크플로우 목록 로드\n let workflows: Workflow[] = [];\n try {\n workflows = await listWorkflows();\n } catch {\n printError(\"워크플로우 목록을 불러올 수 없습니다\");\n process.exit(1);\n }\n\n if (workflows.length === 0) {\n printError(\"사용 가능한 워크플로우가 없습니다\");\n process.exit(1);\n }\n\n // 워크플로우 선택\n let current: Workflow;\n if (workflowId) {\n const found = workflows.find((w) => w.id === workflowId || w.workflow_name === workflowId);\n current = found ?? { id: workflowId, workflow_name: workflowId };\n } else {\n // 첫 번째 또는 선택\n console.log(CHAT_BANNER);\n console.log(chalk.gray(` 서버: ${server} | 사용자: ${auth.username}\\n`));\n console.log(chalk.bold(\" 워크플로우 선택:\\n\"));\n workflows.forEach((w, i) => {\n console.log(` ${chalk.cyan(String(i + 1).padStart(3))} ${w.workflow_name}`);\n });\n console.log();\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await promptLine(rl, chalk.cyan(\" 번호> \"));\n rl.close();\n\n const idx = parseInt(answer.trim()) - 1;\n if (isNaN(idx) || idx < 0 || idx >= workflows.length) {\n current = workflows[0];\n } else {\n current = workflows[idx];\n }\n }\n\n // 세션 시작\n const sessionId = randomUUID().slice(0, 8);\n let turnCount = 0;\n const history: Array<{ role: string; content: string }> = [];\n\n console.log();\n console.log(chalk.cyan(\"─\".repeat(42)));\n console.log(chalk.white.bold(` ${current.workflow_name}`));\n console.log(chalk.cyan(\"─\".repeat(42)));\n console.log(chalk.gray(\" 메시지를 입력하세요. /help 로 도움말.\\n\"));\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const getPrompt = () => chalk.cyan(\"❯ \");\n\n const processInput = async (line: string) => {\n const input = line.trim();\n if (!input) return;\n\n // 슬래시 커맨드\n if (input.startsWith(\"/\")) {\n const [cmd, ...args] = input.slice(1).split(\" \");\n\n switch (cmd.toLowerCase()) {\n case \"exit\":\n case \"quit\":\n case \"q\":\n console.log(chalk.gray(\"\\n 종료합니다.\\n\"));\n rl.close();\n process.exit(0);\n break;\n\n case \"help\":\n case \"h\":\n printHelp();\n break;\n\n case \"clear\":\n case \"cls\":\n console.clear();\n console.log(chalk.white.bold(` ${current.workflow_name}`));\n console.log(chalk.cyan(\"─\".repeat(42)));\n break;\n\n case \"workflows\":\n case \"wf\":\n console.log();\n workflows.forEach((w, i) => {\n const marker = w.id === current.id ? chalk.green(\"▸\") : \" \";\n console.log(` ${marker} ${chalk.cyan(String(i + 1).padStart(2))} ${w.workflow_name}`);\n });\n console.log(chalk.gray(\"\\n /switch <번호> 로 전환\\n\"));\n break;\n\n case \"switch\":\n case \"sw\": {\n const num = parseInt(args[0]);\n if (isNaN(num) || num < 1 || num > workflows.length) {\n console.log(chalk.yellow(` 1~${workflows.length} 사이 번호를 입력하세요`));\n } else {\n current = workflows[num - 1];\n turnCount = 0;\n history.length = 0;\n console.log(chalk.green(`\\n 전환: ${current.workflow_name}\\n`));\n }\n break;\n }\n\n case \"history\":\n case \"hist\":\n if (history.length === 0) {\n console.log(chalk.gray(\" 대화 이력이 없습니다.\\n\"));\n } else {\n console.log();\n for (const h of history) {\n const label = h.role === \"user\" ? chalk.cyan(\"나\") : chalk.green(\"AI\");\n const text = h.content.length > 80 ? h.content.slice(0, 80) + \"...\" : h.content;\n console.log(` ${label}: ${text}`);\n }\n console.log();\n }\n break;\n\n case \"info\":\n console.log(`\n ${chalk.gray(\"서버:\")} ${server}\n ${chalk.gray(\"사용자:\")} ${auth.username}\n ${chalk.gray(\"워크플로우:\")} ${current.workflow_name}\n ${chalk.gray(\"세션:\")} ${sessionId}\n ${chalk.gray(\"턴:\")} ${turnCount}\n`);\n break;\n\n default:\n console.log(chalk.yellow(` 알 수 없는 커맨드: /${cmd}. /help 참고`));\n }\n\n rl.prompt();\n return;\n }\n\n // 워크플로우 실행\n turnCount++;\n const interactionId = `${sessionId}_t${turnCount}`;\n history.push({ role: \"user\", content: input });\n\n // 스피너 시작\n process.stdout.write(chalk.gray(\" thinking...\"));\n\n try {\n const stream = await executeWorkflowStream({\n workflow_id: current.id,\n workflow_name: current.workflow_name,\n input_data: input,\n interaction_id: interactionId,\n });\n\n // 스피너 지우기\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n\n let fullResponse = \"\";\n let hasOutput = false;\n\n await parseSSEStream(\n stream,\n (event: SSEEvent) => {\n if ((event.type === \"token\" || !event.type) && event.content) {\n if (!hasOutput) {\n hasOutput = true;\n console.log();\n }\n process.stdout.write(event.content);\n fullResponse += event.content;\n } else if (event.type === \"error\") {\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n printError(event.error ?? event.content ?? \"오류\");\n }\n },\n () => {\n if (hasOutput) {\n // 응답 끝 — 마크다운 렌더링은 전체 텍스트에 적용\n console.log();\n console.log();\n }\n if (fullResponse) {\n history.push({ role: \"assistant\", content: fullResponse });\n }\n },\n (err) => {\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n printError(`스트리밍 오류: ${err.message}`);\n }\n );\n } catch (err: unknown) {\n process.stdout.write(\"\\r\" + \" \".repeat(20) + \"\\r\");\n const msg =\n (err as { response?: { data?: { detail?: string } } })?.response?.data\n ?.detail ?? (err as Error).message;\n printError(`실행 실패: ${msg}`);\n }\n\n rl.prompt();\n };\n\n rl.setPrompt(getPrompt());\n rl.prompt();\n\n rl.on(\"line\", (line) => {\n // async 처리 — 입력 비활성화 후 완료되면 다시 prompt\n processInput(line).then(() => {\n // prompt는 processInput 내부에서 호출\n });\n });\n\n rl.on(\"close\", () => {\n console.log(chalk.gray(\"\\n 종료합니다.\\n\"));\n process.exit(0);\n });\n\n // Ctrl+C 깔끔하게\n process.on(\"SIGINT\", () => {\n console.log(chalk.gray(\"\\n 종료합니다.\\n\"));\n process.exit(0);\n });\n}\n\nexport function registerChatCommand(program: import(\"commander\").Command): void {\n program\n .command(\"chat [workflow-id]\")\n .description(\"인터랙티브 대화 모드\")\n .action((workflowId) => chat(workflowId));\n}\n","/**\n * OPEN XGEN — AI 에이전트 (메인 인터페이스)\n * Claude Code / Gemini CLI 스타일 — 채팅이 곧 인터페이스\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { getDefaultProvider, getServer, getAuth, getEnvironments, getActiveEnvironment } from \"../config/store.js\";\nimport { createLLMClient, streamChat, type Message } from \"../agent/llm.js\";\nimport { getAllToolDefs, executeTool, getToolNames } from \"../agent/tools/index.js\";\nimport { definitions as xgenToolDefs, execute as xgenExecute, isXgenTool } from \"../agent/tools/xgen-api.js\";\nimport { McpManager, loadMcpConfig } from \"../mcp/client.js\";\nimport { guidedProviderSetup } from \"./provider.js\";\nimport { box, ask, welcome } from \"../utils/ui.js\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nfunction buildSystemPrompt(): string {\n const server = getServer();\n const auth = getAuth();\n const env = getActiveEnvironment();\n\n let prompt = `You are OPEN XGEN, a terminal AI agent. Act like Claude Code.\n\nABSOLUTE RULES — VIOLATING THESE IS FAILURE:\n1. NEVER show menus, numbered options, or \"다음 중 선택\" style responses. NEVER.\n2. NEVER ask \"무엇을 도와드릴까요\" or \"어떤 작업을 하시겠습니까\". NEVER.\n3. When the user asks something → call the tool IMMEDIATELY. No preamble.\n4. After tool results → show the data directly. One sentence summary max.\n5. If user says a number → it refers to the previous list item. Act on it.\n6. If user says \"실행\" → execute immediately with context you have. Don't ask for confirmation.\n7. If ambiguous → make your best guess and do it. Don't ask.\n8. Response language: match the user. Korean → Korean.\n9. Max response: 1-2 sentences + data. No filler, no explanations unless asked.\n10. You are NOT a menu system. You are a doer. Do, don't ask.\n\nEXAMPLES OF BAD RESPONSES (NEVER DO THIS):\n- \"다음과 같은 작업이 가능합니다: 1. 목록 2. 실행...\"\n- \"원하는 작업을 선택해 주세요\"\n- \"어떻게 도와드릴까요?\"\n- Any numbered list of options\n\nEXAMPLES OF GOOD RESPONSES:\n- User: \"워크플로우\" → [call xgen_workflow_list] → show list\n- User: \"6\" → [call xgen_workflow_run for item 6] → show result\n- User: \"컬렉션\" → [call xgen_collection_list] → show list\n- User: \"이 폴더 뭐있어\" → [call list_files] → show files`;\n\n if (server && auth) {\n prompt += `\n\nXGEN CONNECTED: ${server} as ${auth.username} (${env?.name ?? \"default\"})\n\nXGEN CAPABILITIES (use these tools naturally):\n- xgen_workflow_list: 워크플로우 전체 목록. 배포 상태, ID, deploy_key 포함.\n- xgen_workflow_run: 워크플로우 실행. deploy_key 필요(배포된 것만 실행 가능). 사용자가 번호나 이름 말하면 이전 목록에서 찾아서 바로 실행.\n- xgen_workflow_info: 워크플로우 상세 (노드, 엣지 수 등). user_id=1 필요.\n- xgen_collection_list: 문서 컬렉션 목록 (RAG 지식베이스). 문서 수, 청크 수 포함.\n- xgen_execution_history: 최근 실행 이력.\n- xgen_server_status: 서버 연결 상태.\n\nWORKFLOW EXECUTION NOTES:\n- 배포된 워크플로우만 실행 가능. deploy_key가 있어야 함.\n- 실행 시 input_data에 사용자 메시지를 넣음.\n- 실행 결과의 content가 응답.`;\n } else {\n prompt += `\\nXGEN: Not connected. User can run /connect to connect.`;\n }\n\n return prompt;\n}\n\nlet mcpManager: McpManager | null = null;\n\nexport async function agentRepl(): Promise<void> {\n // 프로바이더 확인/설정\n let provider = getDefaultProvider();\n if (!provider) {\n provider = await guidedProviderSetup();\n if (!provider) process.exit(1);\n }\n\n const client = createLLMClient(provider);\n\n // 도구 조합: 기본 + XGEN + MCP\n const allTools: ChatCompletionTool[] = [...getAllToolDefs(), ...xgenToolDefs];\n const builtinNames = getToolNames();\n\n // MCP\n const mcpConfig = loadMcpConfig();\n if (mcpConfig && Object.keys(mcpConfig.mcpServers).length > 0) {\n mcpManager = new McpManager();\n try {\n await mcpManager.startAll(mcpConfig);\n if (mcpManager.serverCount > 0) allTools.push(...mcpManager.getAllTools());\n } catch { /* MCP 실패해도 계속 */ }\n }\n\n const messages: Message[] = [{ role: \"system\", content: buildSystemPrompt() }];\n\n // ── 헤더 ──\n const server = getServer();\n const auth = getAuth();\n const env = getActiveEnvironment();\n\n const W = Math.min(process.stdout.columns || 60, 60);\n const line = chalk.cyan(\"─\".repeat(W));\n\n console.log(`\\n${line}`);\n console.log(chalk.cyan.bold(\" ✦ OPEN XGEN\"));\n console.log(line);\n console.log();\n console.log(chalk.gray(` model ${provider.model}`));\n if (server && auth) {\n console.log(chalk.gray(` xgen ${chalk.green(\"●\")} ${auth.username}@${(env?.name ?? server).replace(\"https://\", \"\")}`));\n }\n console.log(chalk.gray(` cwd ${process.cwd()}`));\n console.log();\n console.log(chalk.gray(` 무엇이든 물어보세요. /help`));\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(\" ❯ \"), (a) => resolve(a.trim())));\n\n process.on(\"SIGINT\", () => {\n console.log(chalk.gray(\"\\n 👋\\n\"));\n mcpManager?.stopAll();\n rl.close();\n process.exit(0);\n });\n\n while (true) {\n const input = await askUser();\n if (!input) continue;\n\n // ── 슬래시 커맨드 ──\n if (input === \"/exit\" || input === \"exit\") {\n console.log(chalk.gray(\"\\n 👋\\n\"));\n mcpManager?.stopAll();\n rl.close();\n break;\n }\n\n if (input === \"/help\") {\n console.log(`\n ${chalk.bold(\"슬래시 커맨드\")}\n ${chalk.cyan(\"/connect\")} XGEN 서버 연결 + 로그인\n ${chalk.cyan(\"/env\")} 환경 전환 (본사/제주/롯데몰)\n ${chalk.cyan(\"/provider\")} 프로바이더 변경\n ${chalk.cyan(\"/dashboard\")} TUI 대시보드 (4분할 화면)\n ${chalk.cyan(\"/tools\")} 사용 가능한 도구 목록\n ${chalk.cyan(\"/status\")} 현재 연결 상태\n ${chalk.cyan(\"/clear\")} 대화 초기화\n ${chalk.cyan(\"/exit\")} 종료\n`);\n continue;\n }\n\n if (input === \"/clear\") {\n messages.length = 0;\n messages.push({ role: \"system\", content: buildSystemPrompt() });\n console.log(chalk.gray(\" 대화 초기화됨.\\n\"));\n continue;\n }\n\n if (input === \"/status\") {\n const p = getDefaultProvider();\n const s = getServer();\n const a = getAuth();\n const e = getActiveEnvironment();\n console.log();\n console.log(` ${chalk.bold(\"프로바이더\")} ${p ? `${p.name} · ${p.model}` : chalk.red(\"미설정\")}`);\n console.log(` ${chalk.bold(\"서버\")} ${s && a ? `${a.username}@${s.replace(\"https://\", \"\")}` : chalk.red(\"미연결\")}`);\n console.log(` ${chalk.bold(\"환경\")} ${e?.name ?? \"없음\"} (${getEnvironments().length}개 등록)`);\n if (mcpManager?.serverCount) {\n console.log(` ${chalk.bold(\"MCP\")} ${mcpManager.getServerNames().join(\", \")}`);\n }\n console.log();\n continue;\n }\n\n if (input === \"/tools\") {\n console.log(`\\n ${chalk.bold(\"코딩\")} ${builtinNames.join(\", \")}`);\n console.log(` ${chalk.bold(\"XGEN\")} ${xgenToolDefs.map((t) => t.function.name).join(\", \")}`);\n if (mcpManager?.serverCount) {\n console.log(` ${chalk.bold(\"MCP\")} ${mcpManager.getAllTools().map((t) => t.function.name).join(\", \")}`);\n }\n console.log();\n continue;\n }\n\n if (input === \"/connect\") {\n await connectServer();\n // 시스템 프롬프트 갱신\n messages[0] = { role: \"system\", content: buildSystemPrompt() };\n continue;\n }\n\n if (input === \"/env\") {\n await switchEnv();\n messages[0] = { role: \"system\", content: buildSystemPrompt() };\n continue;\n }\n\n if (input === \"/provider\") {\n const { guidedProviderSetup: setup } = await import(\"./provider.js\");\n await setup();\n console.log(chalk.gray(\" 프로바이더 변경됨. /exit 후 재시작하세요.\\n\"));\n continue;\n }\n\n if (input === \"/dashboard\" || input === \"/dash\") {\n console.log(chalk.gray(\" 대시보드 열기...\\n\"));\n mcpManager?.stopAll();\n rl.close();\n if (process.stdin.isTTY) process.stdin.setRawMode?.(false);\n const { startTui } = await import(\"../dashboard/tui.js\");\n await startTui();\n return; // TUI 종료 후 CLI도 종료\n }\n\n // ── AI 대화 ──\n messages.push({ role: \"user\", content: input });\n\n try {\n await runLoop(client, provider.model, messages, allTools);\n } catch (err) {\n console.log(chalk.red(`\\n 오류: ${(err as Error).message}\\n`));\n }\n }\n}\n\nasync function runLoop(\n client: ReturnType<typeof createLLMClient>,\n model: string,\n messages: Message[],\n tools: ChatCompletionTool[]\n): Promise<void> {\n for (let i = 0; i < 20; i++) {\n let first = true;\n const result = await streamChat(client, model, messages, tools, (delta) => {\n if (first) { process.stdout.write(chalk.green(\"\\n \") + \"\"); first = false; }\n process.stdout.write(delta);\n });\n\n if (result.content) process.stdout.write(\"\\n\\n\");\n\n if (result.toolCalls.length === 0) {\n if (result.content) messages.push({ role: \"assistant\", content: result.content });\n return;\n }\n\n messages.push({\n role: \"assistant\",\n content: result.content || null,\n tool_calls: result.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: tc.arguments },\n })),\n });\n\n for (const tc of result.toolCalls) {\n let args: Record<string, unknown>;\n try { args = JSON.parse(tc.arguments); } catch { args = {}; }\n\n const shortArgs = Object.entries(args).map(([k, v]) => {\n const s = String(v);\n return s.length > 40 ? s.slice(0, 40) + \"…\" : s;\n }).join(\", \");\n console.log(chalk.dim(` ┌ ${tc.name}(${shortArgs})`));\n\n let toolResult: string;\n if (isXgenTool(tc.name)) {\n toolResult = await xgenExecute(tc.name, args);\n } else if (mcpManager?.isMcpTool(tc.name)) {\n toolResult = await mcpManager.callTool(tc.name, args);\n } else {\n toolResult = await executeTool(tc.name, args);\n }\n\n const truncated = toolResult.length > 4000 ? toolResult.slice(0, 4000) + \"\\n…(truncated)\" : toolResult;\n // 도구 결과 미리보기 (1줄)\n const preview = toolResult.split(\"\\n\")[0].slice(0, 60);\n console.log(chalk.dim(` └ ${preview}${toolResult.length > 60 ? \"…\" : \"\"}`));\n messages.push({ role: \"tool\", tool_call_id: tc.id, content: truncated });\n }\n }\n console.log(chalk.yellow(\"\\n 최대 반복 횟수 도달.\\n\"));\n}\n\nasync function connectServer(): Promise<void> {\n const { setServer, setAuth } = await import(\"../config/store.js\");\n const { addEnvironment } = await import(\"../config/store.js\");\n\n console.log(chalk.bold(\"\\n XGEN 서버 연결\\n\"));\n\n const presets = [\n { id: \"hq\", name: \"본사\", url: \"https://xgen.x2bee.com\", email: \"admin@plateer.com\" },\n { id: \"jeju\", name: \"제주\", url: \"https://jeju-xgen.x2bee.com\", email: \"admin@plateer.com\" },\n { id: \"lotte\", name: \"롯데몰\", url: \"https://lotteimall-xgen.x2bee.com\" },\n ];\n presets.forEach((p, i) => console.log(` ${chalk.cyan(`${i + 1}.`)} ${p.name} ${chalk.gray(p.url)}`));\n console.log(` ${chalk.cyan(\"4.\")} 직접 입력`);\n console.log();\n\n const choice = await ask(chalk.cyan(\" ❯ \"));\n let url: string;\n let email: string | undefined;\n const ci = parseInt(choice) - 1;\n if (ci >= 0 && ci < presets.length) {\n url = presets[ci].url;\n email = presets[ci].email;\n addEnvironment({ ...presets[ci], description: presets[ci].name });\n } else {\n url = await ask(chalk.white(\" URL: \"));\n if (!url) return;\n }\n\n setServer(url);\n console.log(chalk.green(` ✓ ${url}\\n`));\n\n const inputEmail = email || await ask(chalk.white(\" 이메일: \"));\n const pw = await ask(chalk.white(\" 비밀번호: \"));\n if (!inputEmail || !pw) return;\n\n try {\n const { apiLogin } = await import(\"../api/auth.js\");\n const result = await apiLogin(inputEmail, pw);\n if (result.success && result.access_token) {\n setAuth({ accessToken: result.access_token, refreshToken: result.refresh_token ?? \"\", userId: result.user_id ?? \"\", username: result.username ?? \"\", isAdmin: false, expiresAt: null });\n console.log(chalk.green(` ✓ ${result.username} 로그인됨\\n`));\n } else {\n console.log(chalk.red(` ✗ ${result.message}\\n`));\n }\n } catch (err) {\n console.log(chalk.red(` ✗ ${(err as Error).message}\\n`));\n }\n}\n\nasync function switchEnv(): Promise<void> {\n const { getEnvironments: getEnvs, switchEnvironment } = await import(\"../config/store.js\");\n const envs = getEnvs();\n if (!envs.length) {\n console.log(chalk.gray(\"\\n 환경 없음. /connect로 먼저 연결하세요.\\n\"));\n return;\n }\n const active = getActiveEnvironment();\n console.log();\n envs.forEach((e, i) => {\n const mark = e.id === active?.id ? chalk.green(\"● \") : \" \";\n console.log(` ${mark}${chalk.cyan(`${i + 1}.`)} ${e.name} ${chalk.gray(e.url)}`);\n });\n console.log();\n const ci = parseInt(await ask(chalk.cyan(\" ❯ \"))) - 1;\n if (ci >= 0 && ci < envs.length) {\n switchEnvironment(envs[ci].id);\n console.log(chalk.green(` ✓ ${envs[ci].name}\\n`));\n }\n}\n\nexport function registerAgentCommand(program: Command): void {\n program\n .command(\"agent\")\n .description(\"OPEN XGEN AI 에이전트\")\n .action(async () => { await agentRepl(); });\n}\n","import { readFileSync } from \"node:fs\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"file_read\",\n description: \"파일 내용을 읽습니다. 줄 번호가 포함됩니다.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"파일 경로\" },\n start_line: { type: \"number\", description: \"시작 줄 번호 (선택)\" },\n end_line: { type: \"number\", description: \"끝 줄 번호 (선택)\" },\n },\n required: [\"path\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = args.path as string;\n const startLine = (args.start_line as number) || 1;\n const endLine = args.end_line as number | undefined;\n\n try {\n const content = readFileSync(path, \"utf-8\");\n const lines = content.split(\"\\n\");\n const sliced = lines.slice(startLine - 1, endLine ?? lines.length);\n return sliced.map((line, i) => `${startLine + i}\\t${line}`).join(\"\\n\");\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","import { writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"file_write\",\n description: \"파일을 생성하거나 덮어씁니다.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"파일 경로\" },\n content: { type: \"string\", description: \"파일 내용\" },\n },\n required: [\"path\", \"content\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = args.path as string;\n const content = args.content as string;\n\n try {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, content, \"utf-8\");\n return `파일 작성 완료: ${path}`;\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"file_edit\",\n description: \"파일에서 특정 텍스트를 찾아 교체합니다.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"파일 경로\" },\n old_text: { type: \"string\", description: \"교체할 기존 텍스트\" },\n new_text: { type: \"string\", description: \"새 텍스트\" },\n },\n required: [\"path\", \"old_text\", \"new_text\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = args.path as string;\n const oldText = args.old_text as string;\n const newText = args.new_text as string;\n\n try {\n const content = readFileSync(path, \"utf-8\");\n if (!content.includes(oldText)) {\n return `Error: 텍스트를 찾을 수 없습니다`;\n }\n const updated = content.replace(oldText, newText);\n writeFileSync(path, updated, \"utf-8\");\n return `파일 수정 완료: ${path}`;\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","import { execSync } from \"node:child_process\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"bash\",\n description: \"셸 명령어를 실행합니다. stdout + stderr를 반환합니다.\",\n parameters: {\n type: \"object\",\n properties: {\n command: { type: \"string\", description: \"실행할 명령어\" },\n },\n required: [\"command\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const command = args.command as string;\n\n try {\n const output = execSync(command, {\n encoding: \"utf-8\",\n timeout: 30_000,\n maxBuffer: 1024 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return output || \"(no output)\";\n } catch (err) {\n const e = err as { stdout?: string; stderr?: string; message: string };\n return (e.stdout || \"\") + (e.stderr || \"\") || `Error: ${e.message}`;\n }\n}\n","import { execSync } from \"node:child_process\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"grep\",\n description: \"파일에서 패턴을 검색합니다 (재귀, 줄 번호 포함).\",\n parameters: {\n type: \"object\",\n properties: {\n pattern: { type: \"string\", description: \"검색 패턴 (정규식)\" },\n path: { type: \"string\", description: \"검색 디렉토리 또는 파일 (기본: .)\" },\n glob: { type: \"string\", description: \"파일 필터 (예: *.ts)\" },\n },\n required: [\"pattern\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const pattern = args.pattern as string;\n const path = (args.path as string) || \".\";\n const glob = args.glob as string | undefined;\n\n try {\n let cmd = `grep -rn --color=never \"${pattern.replace(/\"/g, '\\\\\"')}\" \"${path}\"`;\n if (glob) cmd += ` --include=\"${glob}\"`;\n cmd += \" | head -50\";\n\n const output = execSync(cmd, {\n encoding: \"utf-8\",\n timeout: 10_000,\n maxBuffer: 512 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return output || \"일치하는 결과 없음\";\n } catch {\n return \"일치하는 결과 없음\";\n }\n}\n","import { execSync } from \"node:child_process\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"list_files\",\n description: \"디렉토리의 파일/폴더 목록을 반환합니다. glob 패턴 지원.\",\n parameters: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"디렉토리 경로 (기본: .)\" },\n pattern: { type: \"string\", description: \"glob 패턴 (예: **/*.ts)\" },\n },\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const path = (args.path as string) || \".\";\n const pattern = args.pattern as string | undefined;\n\n try {\n let cmd: string;\n if (pattern) {\n cmd = `find \"${path}\" -name \"${pattern}\" -type f | head -100`;\n } else {\n cmd = `ls -la \"${path}\"`;\n }\n const output = execSync(cmd, {\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return output || \"(empty)\";\n } catch (err) {\n return `Error: ${(err as Error).message}`;\n }\n}\n","/**\n * Sandbox — 격리된 환경에서 코드 실행\n * npm (Node.js) / python 지원\n */\nimport { execSync } from \"node:child_process\";\nimport { mkdirSync, writeFileSync, existsSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\nconst SANDBOX_DIR = join(tmpdir(), \"xgen-sandbox\");\n\nfunction ensureSandbox(): string {\n if (!existsSync(SANDBOX_DIR)) {\n mkdirSync(SANDBOX_DIR, { recursive: true });\n }\n return SANDBOX_DIR;\n}\n\nexport const definition: ChatCompletionTool = {\n type: \"function\",\n function: {\n name: \"sandbox_run\",\n description:\n \"격리된 샌드박스에서 코드를 실행합니다. Node.js 또는 Python 코드를 안전하게 실행할 수 있습니다. npm 패키지 설치도 가능합니다.\",\n parameters: {\n type: \"object\",\n properties: {\n language: {\n type: \"string\",\n enum: [\"javascript\", \"typescript\", \"python\"],\n description: \"실행할 언어\",\n },\n code: { type: \"string\", description: \"실행할 코드\" },\n packages: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"설치할 패키지 (npm 또는 pip)\",\n },\n },\n required: [\"language\", \"code\"],\n },\n },\n};\n\nexport async function execute(args: Record<string, unknown>): Promise<string> {\n const language = args.language as string;\n const code = args.code as string;\n const packages = (args.packages as string[]) ?? [];\n\n const dir = ensureSandbox();\n const runId = `run_${Date.now()}`;\n const runDir = join(dir, runId);\n mkdirSync(runDir, { recursive: true });\n\n try {\n // 패키지 설치\n if (packages.length > 0) {\n if (language === \"python\") {\n const pkgList = packages.join(\" \");\n execSync(`pip install ${pkgList}`, {\n cwd: runDir,\n encoding: \"utf-8\",\n timeout: 60_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } else {\n // Node.js — npm init + install\n execSync(\"npm init -y\", { cwd: runDir, encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n const pkgList = packages.join(\" \");\n execSync(`npm install ${pkgList}`, {\n cwd: runDir,\n encoding: \"utf-8\",\n timeout: 60_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n }\n }\n\n // 코드 실행\n let cmd: string;\n let filename: string;\n\n if (language === \"python\") {\n filename = \"script.py\";\n writeFileSync(join(runDir, filename), code, \"utf-8\");\n cmd = `python3 ${filename}`;\n } else if (language === \"typescript\") {\n filename = \"script.ts\";\n writeFileSync(join(runDir, filename), code, \"utf-8\");\n cmd = `npx tsx ${filename}`;\n } else {\n filename = \"script.mjs\";\n writeFileSync(join(runDir, filename), code, \"utf-8\");\n cmd = `node ${filename}`;\n }\n\n const output = execSync(cmd, {\n cwd: runDir,\n encoding: \"utf-8\",\n timeout: 30_000,\n maxBuffer: 1024 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n return output || \"(no output)\";\n } catch (err) {\n const e = err as { stdout?: string; stderr?: string; message: string };\n return (e.stdout || \"\") + (e.stderr || \"\") || `Error: ${e.message}`;\n } finally {\n // 정리\n try {\n rmSync(runDir, { recursive: true, force: true });\n } catch {\n // ignore cleanup errors\n }\n }\n}\n","/**\n * Agent 도구 레지스트리\n */\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\nimport * as fileRead from \"./file-read.js\";\nimport * as fileWrite from \"./file-write.js\";\nimport * as fileEdit from \"./file-edit.js\";\nimport * as bash from \"./bash.js\";\nimport * as grep from \"./grep.js\";\nimport * as listFiles from \"./list-files.js\";\nimport * as sandbox from \"./sandbox.js\";\n\ninterface Tool {\n definition: ChatCompletionTool;\n execute: (args: Record<string, unknown>) => Promise<string>;\n}\n\nconst tools: Tool[] = [fileRead, fileWrite, fileEdit, bash, grep, listFiles, sandbox];\n\nconst toolMap = new Map<string, Tool>();\nfor (const t of tools) {\n toolMap.set(t.definition.function.name, t);\n}\n\nexport function getAllToolDefs(): ChatCompletionTool[] {\n return tools.map((t) => t.definition);\n}\n\nexport async function executeTool(name: string, args: Record<string, unknown>): Promise<string> {\n const tool = toolMap.get(name);\n if (!tool) return `Unknown tool: ${name}`;\n return tool.execute(args);\n}\n\nexport function getToolNames(): string[] {\n return tools.map((t) => t.definition.function.name);\n}\n","/**\n * XGEN 플랫폼 API 도구 — AI 에이전트가 XGEN 기능을 사용할 수 있게\n */\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\nimport { getAuth, getServer } from \"../../config/store.js\";\n\n// ── 도구 정의 ──\n\nexport const definitions: ChatCompletionTool[] = [\n {\n type: \"function\",\n function: {\n name: \"xgen_workflow_list\",\n description: \"XGEN 서버에서 워크플로우 목록을 가져옵니다.\",\n parameters: { type: \"object\", properties: {} },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"xgen_workflow_run\",\n description: \"XGEN 워크플로우를 실행합니다. 배포된 워크플로우만 실행 가능.\",\n parameters: {\n type: \"object\",\n properties: {\n workflow_id: { type: \"string\", description: \"워크플로우 ID\" },\n workflow_name: { type: \"string\", description: \"워크플로우 이름\" },\n input_data: { type: \"string\", description: \"입력 메시지\" },\n deploy_key: { type: \"string\", description: \"배포 키 (배포된 워크플로우)\" },\n },\n required: [\"workflow_id\", \"workflow_name\", \"input_data\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"xgen_workflow_info\",\n description: \"특정 워크플로우의 상세 정보(노드, 엣지 등)를 가져옵니다.\",\n parameters: {\n type: \"object\",\n properties: {\n workflow_id: { type: \"string\", description: \"워크플로우 ID\" },\n },\n required: [\"workflow_id\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"xgen_collection_list\",\n description: \"XGEN 서버의 문서 컬렉션(지식베이스) 목록을 가져옵니다. 문서 수, 청크 수, 공유 상태 등 포함.\",\n parameters: { type: \"object\", properties: {} },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"xgen_server_status\",\n description: \"XGEN 서버 상태를 확인합니다.\",\n parameters: { type: \"object\", properties: {} },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"xgen_execution_history\",\n description: \"워크플로우 실행 이력을 가져옵니다.\",\n parameters: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"가져올 이력 수 (기본 10)\" },\n },\n },\n },\n },\n];\n\n// ── 도구 실행 ──\n\nexport async function execute(name: string, args: Record<string, unknown>): Promise<string> {\n const server = getServer();\n const auth = getAuth();\n\n if (!server || !auth) {\n return \"XGEN 서버에 연결되어 있지 않습니다. /connect 명령으로 연결하세요.\";\n }\n\n try {\n switch (name) {\n case \"xgen_workflow_list\":\n return await workflowList();\n case \"xgen_workflow_run\":\n return await workflowRun(args);\n case \"xgen_workflow_info\":\n return await workflowInfo(args);\n case \"xgen_collection_list\":\n return await collectionList();\n case \"xgen_server_status\":\n return await serverStatus();\n case \"xgen_execution_history\":\n return await executionHistory(args);\n default:\n return `Unknown XGEN tool: ${name}`;\n }\n } catch (err) {\n return `XGEN API 오류: ${(err as Error).message}`;\n }\n}\n\nexport function isXgenTool(name: string): boolean {\n return name.startsWith(\"xgen_\");\n}\n\n// ── 내부 구현 ──\n\nasync function workflowList(): Promise<string> {\n const { getWorkflowListDetail } = await import(\"../../api/workflow.js\");\n const wfs = await getWorkflowListDetail();\n if (!wfs.length) return \"워크플로우 없음.\";\n return wfs.map((w, i) => {\n const deployed = (w as Record<string, unknown>).is_deployed;\n const dk = (w as Record<string, unknown>).deploy_key;\n const tag = deployed ? \" [배포됨]\" : \"\";\n return `${i + 1}. ${w.workflow_name}${tag}\\n ID: ${w.workflow_id ?? w.id}\\n deploy_key: ${dk || \"없음\"}`;\n }).join(\"\\n\");\n}\n\nasync function workflowRun(args: Record<string, unknown>): Promise<string> {\n const { executeWorkflow } = await import(\"../../api/workflow.js\");\n const { randomUUID } = await import(\"node:crypto\");\n const result = await executeWorkflow({\n workflow_id: args.workflow_id as string,\n workflow_name: args.workflow_name as string,\n input_data: args.input_data as string,\n interaction_id: `cli_${randomUUID().slice(0, 8)}`,\n deploy_key: args.deploy_key as string | undefined,\n }) as Record<string, unknown>;\n if (result.content) return String(result.content);\n if (result.success === false) return `오류: ${result.error ?? result.message}`;\n return JSON.stringify(result, null, 2).slice(0, 2000);\n}\n\nasync function workflowInfo(args: Record<string, unknown>): Promise<string> {\n const { getWorkflowDetail } = await import(\"../../api/workflow.js\");\n const detail = await getWorkflowDetail(args.workflow_id as string);\n const nodes = (detail.nodes as unknown[])?.length ?? 0;\n const edges = (detail.edges as unknown[])?.length ?? 0;\n return `워크플로우: ${detail.workflow_name}\\nID: ${detail.id}\\n노드: ${nodes}개\\n엣지: ${edges}개`;\n}\n\nasync function collectionList(): Promise<string> {\n const { listCollections } = await import(\"../../api/document.js\");\n const cols = await listCollections();\n if (!cols.length) return \"컬렉션 없음.\";\n return cols.map((c, i) => {\n const shared = c.is_shared ? ` [공유:${c.share_group}]` : \"\";\n return `${i + 1}. ${c.collection_make_name}${shared}\\n 문서: ${c.total_documents}개 · 청크: ${c.total_chunks}개 · 모델: ${c.init_embedding_model ?? \"-\"}`;\n }).join(\"\\n\");\n}\n\nasync function serverStatus(): Promise<string> {\n const server = getServer();\n const auth = getAuth();\n return `서버: ${server}\\n사용자: ${auth?.username}\\nUser ID: ${auth?.userId}`;\n}\n\nasync function executionHistory(args: Record<string, unknown>): Promise<string> {\n const { getIOLogs } = await import(\"../../api/workflow.js\");\n const limit = (args.limit as number) || 10;\n const logs = await getIOLogs(undefined, limit);\n if (!logs.length) return \"실행 이력 없음.\";\n return logs.map((l, i) =>\n `${i + 1}. [${l.created_at ?? \"\"}]\\n 입력: ${(l.input_data ?? \"\").slice(0, 80)}\\n 출력: ${(l.output_data ?? \"\").slice(0, 80)}`\n ).join(\"\\n\");\n}\n","/**\n * MCP (Model Context Protocol) 클라이언트\n * .mcp.json 설정을 읽어서 stdio MCP 서버와 통신\n */\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport type { ChatCompletionTool } from \"openai/resources/chat/completions\";\n\ninterface McpServerConfig {\n type: \"stdio\";\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\ninterface McpConfig {\n mcpServers: Record<string, McpServerConfig>;\n}\n\ninterface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: number;\n method: string;\n params?: unknown;\n}\n\ninterface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: number;\n result?: unknown;\n error?: { code: number; message: string };\n}\n\ninterface McpTool {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\nexport class McpClient {\n private process: ChildProcess | null = null;\n private requestId = 0;\n private pending = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void }>();\n private serverName: string;\n private config: McpServerConfig;\n private tools: McpTool[] = [];\n\n constructor(serverName: string, config: McpServerConfig) {\n this.serverName = serverName;\n this.config = config;\n }\n\n async start(): Promise<void> {\n this.process = spawn(this.config.command, this.config.args ?? [], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, ...this.config.env },\n });\n\n const rl = createInterface({ input: this.process.stdout! });\n rl.on(\"line\", (line) => {\n try {\n const msg = JSON.parse(line) as JsonRpcResponse;\n if (msg.id !== undefined && this.pending.has(msg.id)) {\n const p = this.pending.get(msg.id)!;\n this.pending.delete(msg.id);\n if (msg.error) {\n p.reject(new Error(msg.error.message));\n } else {\n p.resolve(msg.result);\n }\n }\n } catch {\n // ignore non-JSON lines\n }\n });\n\n this.process.on(\"error\", (err) => {\n console.error(`MCP [${this.serverName}] 프로세스 오류:`, err.message);\n });\n\n // Initialize\n await this.send(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: \"open-xgen\", version: \"0.3.0\" },\n });\n\n await this.send(\"notifications/initialized\", {});\n }\n\n private send(method: string, params?: unknown): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const id = ++this.requestId;\n const request: JsonRpcRequest = { jsonrpc: \"2.0\", id, method, params };\n\n this.pending.set(id, { resolve, reject });\n\n const timeout = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`MCP 요청 타임아웃: ${method}`));\n }, 15_000);\n\n this.pending.set(id, {\n resolve: (v) => {\n clearTimeout(timeout);\n resolve(v);\n },\n reject: (e) => {\n clearTimeout(timeout);\n reject(e);\n },\n });\n\n this.process?.stdin?.write(JSON.stringify(request) + \"\\n\");\n });\n }\n\n async listTools(): Promise<McpTool[]> {\n const result = (await this.send(\"tools/list\", {})) as { tools: McpTool[] };\n this.tools = result.tools ?? [];\n return this.tools;\n }\n\n async callTool(name: string, args: Record<string, unknown>): Promise<string> {\n const result = (await this.send(\"tools/call\", { name, arguments: args })) as {\n content?: { type: string; text?: string }[];\n };\n return result.content?.map((c) => c.text ?? \"\").join(\"\\n\") ?? \"\";\n }\n\n getOpenAITools(): ChatCompletionTool[] {\n return this.tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: `mcp_${this.serverName}_${t.name}`,\n description: `[MCP:${this.serverName}] ${t.description ?? t.name}`,\n parameters: (t.inputSchema as Record<string, unknown>) ?? { type: \"object\", properties: {} },\n },\n }));\n }\n\n stop(): void {\n this.process?.kill();\n this.process = null;\n }\n}\n\n/**\n * .mcp.json에서 MCP 서버 설정 로드\n */\nexport function loadMcpConfig(dir?: string): McpConfig | null {\n const searchPaths = [\n dir ? join(dir, \".mcp.json\") : null,\n join(process.cwd(), \".mcp.json\"),\n join(process.env.HOME ?? \"\", \".mcp.json\"),\n ].filter(Boolean) as string[];\n\n for (const p of searchPaths) {\n if (existsSync(p)) {\n try {\n return JSON.parse(readFileSync(p, \"utf-8\")) as McpConfig;\n } catch {\n continue;\n }\n }\n }\n return null;\n}\n\n/**\n * 모든 MCP 서버 시작 + 도구 수집\n */\nexport class McpManager {\n private clients = new Map<string, McpClient>();\n\n async startAll(config: McpConfig): Promise<void> {\n for (const [name, serverConfig] of Object.entries(config.mcpServers)) {\n if (serverConfig.type !== \"stdio\") continue;\n try {\n const client = new McpClient(name, serverConfig);\n await client.start();\n await client.listTools();\n this.clients.set(name, client);\n } catch (err) {\n console.error(`MCP [${name}] 시작 실패:`, (err as Error).message);\n }\n }\n }\n\n getAllTools(): ChatCompletionTool[] {\n const tools: ChatCompletionTool[] = [];\n for (const client of this.clients.values()) {\n tools.push(...client.getOpenAITools());\n }\n return tools;\n }\n\n async callTool(fullName: string, args: Record<string, unknown>): Promise<string> {\n // fullName format: mcp_{serverName}_{toolName}\n const parts = fullName.split(\"_\");\n if (parts.length < 3 || parts[0] !== \"mcp\") return `Unknown MCP tool: ${fullName}`;\n\n const serverName = parts[1];\n const toolName = parts.slice(2).join(\"_\");\n const client = this.clients.get(serverName);\n if (!client) return `MCP 서버를 찾을 수 없습니다: ${serverName}`;\n\n return client.callTool(toolName, args);\n }\n\n isMcpTool(name: string): boolean {\n return name.startsWith(\"mcp_\");\n }\n\n stopAll(): void {\n for (const client of this.clients.values()) {\n client.stop();\n }\n this.clients.clear();\n }\n\n get serverCount(): number {\n return this.clients.size;\n }\n\n getServerNames(): string[] {\n return [...this.clients.keys()];\n }\n}\n","/**\n * xgen doc — 문서 관리\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { requireAuth } from \"../config/store.js\";\nimport { listDocuments, uploadDocument, getDocumentInfo } from \"../api/document.js\";\nimport { printTable, printError, printHeader, formatDate } from \"../utils/format.js\";\n\nexport function registerDocCommand(program: Command): void {\n const doc = program.command(\"doc\").description(\"문서 관리\");\n\n doc\n .command(\"list\")\n .alias(\"ls\")\n .description(\"문서 목록 조회\")\n .option(\"-c, --collection <id>\", \"컬렉션 ID\")\n .action(async (opts) => {\n requireAuth();\n try {\n const docs = await listDocuments(opts.collection);\n if (!docs.length) {\n console.log(chalk.yellow(\"\\n문서가 없습니다.\\n\"));\n return;\n }\n printHeader(`문서 목록 (${docs.length}개)`);\n console.log();\n printTable(\n [\"#\", \"ID\", \"파일명\", \"타입\", \"상태\", \"생성일\"],\n docs.map((d, i) => [\n String(i + 1),\n (d.document_id ?? d.id ?? \"-\").toString().slice(0, 10),\n d.file_name ?? d.name ?? \"-\",\n d.file_type ?? \"-\",\n d.status ?? \"-\",\n formatDate(d.created_at),\n ])\n );\n console.log();\n } catch (err) {\n printError(`문서 목록 조회 실패: ${(err as Error).message}`);\n }\n });\n\n doc\n .command(\"upload <file>\")\n .description(\"문서 업로드\")\n .option(\"-c, --collection <id>\", \"컬렉션 ID\")\n .option(\"-n, --name <name>\", \"파일명\")\n .action(async (file: string, opts) => {\n requireAuth();\n try {\n console.log(chalk.gray(`업로드 중: ${file}`));\n const result = await uploadDocument(file, opts.collection, opts.name);\n console.log(chalk.green(\"✓ 업로드 완료\"));\n console.log(chalk.gray(JSON.stringify(result, null, 2)));\n } catch (err) {\n printError(`업로드 실패: ${(err as Error).message}`);\n }\n });\n\n doc\n .command(\"info <id>\")\n .description(\"문서 상세 정보\")\n .action(async (id: string) => {\n requireAuth();\n try {\n const d = await getDocumentInfo(id);\n printHeader(\"문서 정보\");\n console.log(chalk.gray(JSON.stringify(d, null, 2)));\n } catch (err) {\n printError(`조회 실패: ${(err as Error).message}`);\n }\n });\n}\n","/**\n * xgen ontology — 온톨로지 GraphRAG 질의\n */\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createInterface } from \"node:readline\";\nimport { requireAuth } from \"../config/store.js\";\nimport { queryGraphRAG, queryGraphRAGMultiTurn, getGraphStats } from \"../api/ontology.js\";\nimport { printError, printHeader } from \"../utils/format.js\";\nimport { randomUUID } from \"node:crypto\";\n\nexport function registerOntologyCommand(program: Command): void {\n const ont = program.command(\"ontology\").alias(\"ont\").description(\"온톨로지 GraphRAG 질의\");\n\n ont\n .command(\"query <question>\")\n .alias(\"q\")\n .description(\"GraphRAG 원샷 질의\")\n .option(\"-g, --graph <id>\", \"그래프 ID\")\n .option(\"--no-scs\", \"SCS 컨텍스트 비활성화\")\n .action(async (question: string, opts) => {\n requireAuth();\n try {\n console.log(chalk.gray(\"\\n질의 중...\\n\"));\n const result = await queryGraphRAG(question, opts.graph, { scs: opts.scs });\n\n if (result.answer) {\n console.log(chalk.bold(\"답변:\"));\n console.log(result.answer);\n }\n if (result.sources?.length) {\n console.log(chalk.bold(\"\\n출처:\"));\n result.sources.forEach((s) => console.log(chalk.gray(` - ${s}`)));\n }\n if (result.triples_used?.length) {\n console.log(chalk.bold(\"\\n사용된 트리플:\"));\n result.triples_used.forEach((t) => console.log(chalk.dim(` ${t}`)));\n }\n console.log();\n } catch (err) {\n printError(`질의 실패: ${(err as Error).message}`);\n }\n });\n\n ont\n .command(\"chat\")\n .description(\"멀티턴 GraphRAG 대화\")\n .option(\"-g, --graph <id>\", \"그래프 ID\")\n .action(async (opts) => {\n requireAuth();\n const sessionId = randomUUID();\n\n printHeader(\"Ontology Chat\");\n console.log(chalk.gray(\"멀티턴 GraphRAG 대화. exit로 종료.\\n\"));\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const ask = (): Promise<string> =>\n new Promise((resolve) => rl.question(chalk.green(\"❯ \"), (a) => resolve(a.trim())));\n\n while (true) {\n const input = await ask();\n if (!input) continue;\n if (input === \"exit\") {\n rl.close();\n break;\n }\n\n try {\n const result = await queryGraphRAGMultiTurn(input, sessionId, opts.graph);\n if (result.answer) console.log(`\\n${result.answer}\\n`);\n } catch (err) {\n console.log(chalk.red(`오류: ${(err as Error).message}\\n`));\n }\n }\n });\n\n ont\n .command(\"stats <graph-id>\")\n .description(\"그래프 통계\")\n .action(async (graphId: string) => {\n requireAuth();\n try {\n const stats = await getGraphStats(graphId);\n printHeader(\"그래프 통계\");\n console.log(chalk.gray(JSON.stringify(stats, null, 2)));\n console.log();\n } catch (err) {\n printError(`통계 조회 실패: ${(err as Error).message}`);\n }\n });\n}\n","/**\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","res","chalk","createInterface","chalk","client","program","OpenAI","client","tools","client","getWorkflowListDetail","listCollections","executeWorkflow","randomUUID","provider","createLLMClient","streamChat","client","chalk","chalk","program","chalk","program","clearAuth","apiValidate","chalk","chalk","chalk","chalk","text","createInterface","chalk","chalk","program","chalk","createInterface","randomUUID","chalk","rl","createInterface","randomUUID","program","chalk","createInterface","readFileSync","definition","execute","writeFileSync","mkdirSync","definition","execute","readFileSync","writeFileSync","definition","execute","definition","execute","execSync","definition","execute","execSync","definition","execute","execSync","mkdirSync","writeFileSync","existsSync","join","execute","workflowList","workflowRun","workflowInfo","getWorkflowListDetail","executeWorkflow","randomUUID","getWorkflowDetail","listCollections","getIOLogs","existsSync","readFileSync","join","createInterface","client","tools","prompt","client","W","chalk","createInterface","startTui","tools","execute","setServer","setAuth","addEnvironment","apiLogin","switchEnvironment","program","chalk","program","chalk","createInterface","client","randomUUID","program","chalk","createInterface","ask","chalk"]}
|