@lexq/cli 0.1.4 → 0.1.5

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 CHANGED
@@ -1697,9 +1697,31 @@ ${data.totalElements} total \xB7 page ${data.pageNo + 1}/${data.totalPages}`);
1697
1697
 
1698
1698
  // src/commands/logs.ts
1699
1699
  import "commander";
1700
+
1701
+ // src/types/enums.ts
1702
+ var FailureStatus = ["PENDING", "RESOLVED", "IGNORED"];
1703
+ var FailureAction = ["RETRY", "IGNORE", "RESOLVE"];
1704
+ var TaskCategory = ["INTEGRATION", "INTERNAL"];
1705
+ var TaskType = [
1706
+ // Integration
1707
+ "COUPON_ISSUE",
1708
+ "COUPON_CANCEL",
1709
+ "POINT_EARN",
1710
+ "POINT_USE",
1711
+ "POINT_REFUND",
1712
+ "NOTIFICATION_SEND",
1713
+ "CRM_SYNC_USER",
1714
+ "CRM_ADD_TAG",
1715
+ "WEBHOOK_EXECUTE",
1716
+ // Internal
1717
+ "IMAGE_PROCESSING",
1718
+ "DAILY_SETTLEMENT"
1719
+ ];
1720
+
1721
+ // src/commands/logs.ts
1700
1722
  function registerLogCommands(program) {
1701
1723
  const logs = program.command("logs").description("Failure logs");
1702
- logs.command("list").description("List failure logs").option("--category <category>", "Filter by category (INTEGRATION, INTERNAL)").option("--task-type <taskType>", "Filter by task type (COUPON_ISSUE, POINT_EARN, NOTIFICATION_SEND, WEBHOOK_EXECUTE)").option("--status <status>", "Filter by status (PENDING, RESOLVED, IGNORED)").option("--keyword <keyword>", "Search keyword").option("--start-date <date>", "Start date (yyyy-MM-dd)").option("--end-date <date>", "End date (yyyy-MM-dd)").option("--page <number>", "Page number", "0").option("--size <number>", "Page size", "20").action(async (opts) => {
1724
+ logs.command("list").description("List failure logs").option("--category <category>", "Filter by category (INTEGRATION, INTERNAL)").option("--task-type <taskType>", `Filter by task type (${TaskType.join(", ")})`).option("--status <status>", "Filter by status (PENDING, RESOLVED, IGNORED)").option("--keyword <keyword>", "Search keyword").option("--start-date <date>", "Start date (yyyy-MM-dd)").option("--end-date <date>", "End date (yyyy-MM-dd)").option("--page <number>", "Page number", "0").option("--size <number>", "Page size", "20").action(async (opts) => {
1703
1725
  try {
1704
1726
  const globalOpts = program.opts();
1705
1727
  const format = globalOpts.format ?? "json";
@@ -2697,14 +2719,9 @@ function registerLogTools(server) {
2697
2719
  inputSchema: {
2698
2720
  page: z9.number().int().min(0).default(0).describe("Page number"),
2699
2721
  size: z9.number().int().min(1).max(100).default(20).describe("Page size"),
2700
- category: z9.enum(["INTEGRATION", "INTERNAL"]).optional().describe("Task category"),
2701
- taskType: z9.enum([
2702
- "COUPON_ISSUE",
2703
- "POINT_EARN",
2704
- "NOTIFICATION_SEND",
2705
- "WEBHOOK_EXECUTE"
2706
- ]).optional().describe("Task type"),
2707
- status: z9.enum(["PENDING", "RESOLVED", "IGNORED"]).optional().describe("Log status"),
2722
+ category: z9.enum(TaskCategory).optional().describe("Task category"),
2723
+ taskType: z9.enum(TaskType).optional().describe("Task type"),
2724
+ status: z9.enum(FailureStatus).optional().describe("Log status"),
2708
2725
  keyword: z9.string().optional().describe("Search in refId, refSubId, errorMessage"),
2709
2726
  startDate: z9.string().optional().describe("Start date (yyyy-MM-dd)"),
2710
2727
  endDate: z9.string().optional().describe("End date (yyyy-MM-dd)")
@@ -2739,7 +2756,7 @@ function registerLogTools(server) {
2739
2756
  description: "Process a single failure log: RETRY, RESOLVE, or IGNORE.",
2740
2757
  inputSchema: {
2741
2758
  logId: z9.string().uuid().describe("Failure log ID"),
2742
- action: z9.enum(["RETRY", "RESOLVE", "IGNORE"]).describe("Action to take")
2759
+ action: z9.enum(FailureAction).describe("Action to take")
2743
2760
  }
2744
2761
  },
2745
2762
  async ({ logId, action }) => callApi("POST", `failure-logs/${logId}/actions`, {
@@ -2753,7 +2770,7 @@ function registerLogTools(server) {
2753
2770
  description: "Process multiple failure logs at once. Provide an array of log IDs and the action.",
2754
2771
  inputSchema: {
2755
2772
  logIds: z9.array(z9.string().uuid()).describe("Array of failure log IDs"),
2756
- action: z9.enum(["RETRY", "RESOLVE", "IGNORE"]).describe("Action to apply to all logs")
2773
+ action: z9.enum(FailureAction).describe("Action to apply to all logs")
2757
2774
  }
2758
2775
  },
2759
2776
  async ({ logIds, action }) => callApi("POST", "failure-logs/bulk-actions", {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/auth.ts","../src/lib/config.ts","../src/lib/api-client.ts","../src/lib/output.ts","../src/commands/status.ts","../src/commands/groups.ts","../src/commands/versions.ts","../src/commands/rules.ts","../src/commands/facts.ts","../src/commands/deploy.ts","../src/commands/analytics.ts","../src/commands/history.ts","../src/commands/integrations.ts","../src/commands/logs.ts","../src/commands/serve.ts","../src/mcp/server.ts","../src/mcp/tools/_shared.ts","../src/mcp/tools/status.ts","../src/mcp/tools/groups.ts","../src/mcp/tools/versions.ts","../src/mcp/tools/rules.ts","../src/mcp/tools/facts.ts","../src/mcp/tools/deploy.ts","../src/mcp/tools/analytics.ts","../src/mcp/tools/history.ts","../src/mcp/tools/integrations.ts","../src/mcp/tools/logs.ts","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, join } from 'node:path';\nimport { registerAuthCommands } from './commands/auth';\nimport { registerStatusCommand } from './commands/status';\nimport { registerGroupCommands } from './commands/groups';\nimport { registerVersionCommands } from './commands/versions';\nimport { registerRuleCommands } from './commands/rules';\nimport { registerFactCommands } from './commands/facts';\nimport { registerDeployCommands } from './commands/deploy';\nimport { registerAnalyticsCommands } from './commands/analytics';\nimport { registerHistoryCommands } from './commands/history';\nimport { registerIntegrationCommands } from './commands/integrations';\nimport { registerLogCommands } from './commands/logs';\nimport {registerServeCommand} from './commands/serve';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction getVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));\n return pkg.version;\n } catch {\n return '0.0.0';\n }\n}\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name('lexq')\n .description('LexQ CLI — manage policies, simulate rules, and deploy from the terminal.')\n .version(getVersion(), '-V, --version')\n .option('--format <format>', 'Output format: json or table', 'json')\n .option('--api-key <key>', 'Override stored API key')\n .option('--base-url <url>', 'Override API base URL')\n .option('--dry-run', 'Preview the HTTP request without executing')\n .option('--verbose', 'Show request/response details')\n .option('--no-color', 'Disable colored output');\n\n // M1: Auth & Infrastructure\n registerAuthCommands(program);\n registerStatusCommand(program);\n\n // M1+: Policy Groups (CRUD + A/B Test)\n registerGroupCommands(program);\n\n // M2: Versions, Rules, Facts\n registerVersionCommands(program);\n registerRuleCommands(program);\n registerFactCommands(program);\n\n // M3: Deployment & Analytics\n registerDeployCommands(program);\n registerAnalyticsCommands(program);\n\n // M3+: Execution History, Integrations, Failure Logs\n registerHistoryCommands(program);\n registerIntegrationCommands(program);\n registerLogCommands(program);\n\n // // M7: MCP Server\n registerServeCommand(program);\n\n return program;\n}","import { type Command } from 'commander';\nimport { createInterface } from 'node:readline/promises';\nimport { stdin, stdout } from 'node:process';\nimport { saveConfig, deleteConfig, loadConfig, getConfigPath } from '@/lib/config';\nimport { apiRequest } from '@/lib/api-client';\nimport { printJson, printError } from '@/lib/output';\nimport type { WhoAmIResponse } from '@/types/auth';\n\nexport function registerAuthCommands(program: Command): void {\n const auth = program.command('auth').description('Manage authentication');\n\n // ── login ──\n auth\n .command('login')\n .description('Authenticate with your LexQ API key')\n .action(async () => {\n try {\n const rl = createInterface({ input: stdin, output: stdout });\n const apiKey = await rl.question('Enter your API Key: ');\n rl.close();\n\n if (!apiKey.trim()) {\n console.error('API key cannot be empty.');\n process.exit(1);\n }\n\n saveConfig({ apiKey: apiKey.trim() });\n console.log(`✓ API key saved to ${getConfigPath()}`);\n console.log(' Run \"lexq auth whoami\" to verify.');\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── logout ──\n auth\n .command('logout')\n .description('Remove stored credentials')\n .action(() => {\n deleteConfig();\n console.log('✓ Credentials removed.');\n });\n\n // ── whoami ──\n auth\n .command('whoami')\n .description('Show current authentication info')\n .action(async () => {\n try {\n const config = loadConfig();\n if (!config.apiKey) {\n console.error('Not authenticated. Run \"lexq auth login\" first.');\n process.exit(1);\n }\n\n const info = await apiRequest<WhoAmIResponse>(\n 'GET',\n 'whoami',\n { apiKey: config.apiKey, baseUrl: config.baseUrl }\n );\n\n const masked = config.apiKey.length > 8\n ? config.apiKey.substring(0, 4) + '****' + config.apiKey.substring(config.apiKey.length - 4)\n : '****';\n\n printJson({\n ...info,\n apiKey: masked,\n baseUrl: config.baseUrl,\n });\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface LexqConfig {\n apiKey?: string;\n baseUrl: string;\n format: 'json' | 'table';\n}\n\nconst CONFIG_DIR = join(homedir(), '.lexq');\nconst CONFIG_FILE = join(CONFIG_DIR, 'config.json');\n\nconst DEFAULT_CONFIG: LexqConfig = {\n baseUrl: 'https://api.lexq.io/api/v1/partners',\n format: 'json',\n};\n\nexport function loadConfig(): LexqConfig {\n if (!existsSync(CONFIG_FILE)) return { ...DEFAULT_CONFIG };\n\n try {\n const raw = readFileSync(CONFIG_FILE, 'utf-8');\n return { ...DEFAULT_CONFIG, ...JSON.parse(raw) };\n } catch {\n return { ...DEFAULT_CONFIG };\n }\n}\n\nexport function saveConfig(config: Partial<LexqConfig>): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n\n const current = loadConfig();\n const merged = { ...current, ...config };\n writeFileSync(CONFIG_FILE, JSON.stringify(merged, null, 2), 'utf-8');\n}\n\nexport function deleteConfig(): void {\n if (existsSync(CONFIG_FILE)) {\n unlinkSync(CONFIG_FILE);\n }\n}\n\nexport function getConfigPath(): string {\n return CONFIG_FILE;\n}","import { loadConfig } from './config';\nimport type { ApiResponse } from '@/types/api';\n\nexport interface ApiClientOptions {\n apiKey?: string;\n baseUrl?: string;\n dryRun?: boolean;\n verbose?: boolean;\n}\n\nexport class ApiError extends Error {\n constructor(\n public readonly statusCode: number,\n public readonly errorCode: string | null,\n message: string\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\nexport async function apiRequest<T>(\n method: string,\n path: string,\n options: ApiClientOptions & { body?: unknown; params?: Record<string, string> } = {}\n): Promise<T> {\n const config = loadConfig();\n const baseUrl = options.baseUrl ?? config.baseUrl;\n const apiKey = options.apiKey ?? config.apiKey;\n\n if (!apiKey) {\n throw new ApiError(401, 'AUTH', 'Not authenticated. Run \"lexq auth login\" first.');\n }\n\n // Build URL with query params\n const url = new URL(path, baseUrl.endsWith('/') ? baseUrl : baseUrl + '/');\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined && value !== '') {\n url.searchParams.set(key, value);\n }\n }\n }\n\n const headers: Record<string, string> = {\n 'X-API-KEY': apiKey,\n 'Accept': 'application/json',\n };\n\n if (options.body) {\n headers['Content-Type'] = 'application/json';\n }\n\n // Dry-run: print request and exit\n if (options.dryRun) {\n const masked = apiKey.length > 8\n ? apiKey.substring(0, 4) + '****' + apiKey.substring(apiKey.length - 4)\n : '****';\n\n console.log(`${method} ${url.toString()}`);\n console.log('Headers:');\n console.log(` X-API-KEY: ${masked}`);\n console.log(` Content-Type: application/json`);\n if (options.body) {\n console.log('Body:');\n console.log(` ${JSON.stringify(options.body, null, 2)}`);\n }\n console.log('\\n(Use without --dry-run to execute)');\n process.exit(0);\n }\n\n if (options.verbose) {\n console.error(`→ ${method} ${url.toString()}`);\n }\n\n const startTime = Date.now();\n\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (options.verbose) {\n console.error(`← ${response.status} ${response.statusText} (${Date.now() - startTime}ms)`);\n }\n\n // Handle blob responses (export endpoints)\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('text/csv') || contentType.includes('application/octet-stream')) {\n return response as unknown as T;\n }\n\n // No-content responses (DELETE 204 등)\n if (response.status === 204 || contentType === '') {\n return undefined as T;\n }\n\n const json = (await response.json()) as ApiResponse<T>;\n\n if (!response.ok || json.result !== 'SUCCESS') {\n throw new ApiError(\n response.status,\n json.errorCode,\n json.message ?? `Request failed with status ${response.status}`\n );\n }\n\n return json.data;\n}","import Table from 'cli-table3';\n\nexport type OutputFormat = 'json' | 'table';\n\nexport function printJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function printTable(\n headers: string[],\n rows: string[][],\n options?: { truncate?: number }\n): void {\n const table = new Table({\n head: headers,\n style: { head: ['cyan'] },\n wordWrap: true,\n });\n\n for (const row of rows) {\n if (options?.truncate) {\n table.push(\n row.map((cell) =>\n cell.length > options.truncate! ? cell.substring(0, options.truncate!) + '…' : cell\n )\n );\n } else {\n table.push(row);\n }\n }\n\n console.log(table.toString());\n}\n\nexport function printError(error: unknown): void {\n if (error instanceof Error && 'errorCode' in error) {\n const apiErr = error as Error & { errorCode: string | null; statusCode: number };\n const output = {\n error: apiErr.errorCode ?? 'UNKNOWN',\n message: apiErr.message,\n status: apiErr.statusCode,\n };\n console.error(JSON.stringify(output, null, 2));\n } else if (error instanceof Error) {\n console.error(JSON.stringify({ error: 'CLI_ERROR', message: error.message }, null, 2));\n } else {\n console.error(JSON.stringify({ error: 'UNKNOWN', message: String(error) }, null, 2));\n }\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport { printJson, printError } from '@/lib/output';\nimport type { WhoAmIResponse } from '@/types/auth';\n\nexport function registerStatusCommand(program: Command): void {\n program\n .command('status')\n .description('Check API connectivity and authentication')\n .action(async () => {\n const globalOpts = program.opts();\n const startTime = Date.now();\n try {\n const info = await apiRequest<WhoAmIResponse>('GET', 'whoami', {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n });\n printJson({\n status: 'ok',\n latencyMs: Date.now() - startTime,\n tenantId: info.tenantId,\n role: info.role,\n });\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type {\n PolicyGroupSummary,\n PolicyGroupDetail,\n CreatePolicyGroupRequest,\n UpdatePolicyGroupRequest,\n StartAbTestRequest,\n AdjustTrafficRateRequest,\n} from '@/types/groups';\n\nexport function registerGroupCommands(program: Command): void {\n const groups = program.command('groups').description('Manage policy groups');\n\n // ── list ──\n groups\n .command('list')\n .description('List all policy groups')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const data = await apiRequest<PageResponse<PolicyGroupSummary>>(\n 'GET',\n 'policy-groups',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params: { page: opts.page, size: opts.size },\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'Name', 'Status', 'Priority', 'Version', 'Updated'],\n data.content.map((g) => [\n g.id,\n g.name,\n g.status,\n String(g.priority),\n g.currentVersionName ?? '–',\n g.updatedAt.substring(0, 10),\n ]),\n { truncate: 24 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── get ──\n groups\n .command('get')\n .description('Get a policy group by ID')\n .requiredOption('--id <groupId>', 'Policy group ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<PolicyGroupDetail>(\n 'GET',\n `policy-groups/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── create ──\n groups\n .command('create')\n .description('Create a new policy group')\n .requiredOption('--json <body>', 'Request body as JSON string')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = JSON.parse(opts.json) as CreatePolicyGroupRequest;\n const data = await apiRequest<PolicyGroupDetail>(\n 'POST',\n 'policy-groups',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── update ──\n groups\n .command('update')\n .description('Update a policy group')\n .requiredOption('--id <groupId>', 'Policy group ID')\n .requiredOption('--json <body>', 'Request body as JSON string')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = JSON.parse(opts.json) as UpdatePolicyGroupRequest;\n const data = await apiRequest<PolicyGroupDetail>(\n 'PUT',\n `policy-groups/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── delete ──\n groups\n .command('delete')\n .description('Delete a policy group')\n .requiredOption('--id <groupId>', 'Policy group ID')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Delete group ${opts.id}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'DELETE',\n `policy-groups/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n console.log(`✓ Group ${opts.id} deleted.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ══════════════════════════════════════════════════\n // A/B Test\n // ══════════════════════════════════════════════════\n\n const abTest = groups.command('ab-test').description('A/B test management');\n\n // ── start ──\n abTest\n .command('start')\n .description('Start an A/B test')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Challenger version ID')\n .requiredOption('--traffic-rate <rate>', 'Traffic rate for challenger (1-99)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body: StartAbTestRequest = {\n testVersionId: opts.versionId,\n trafficRate: Number(opts.trafficRate),\n };\n const data = await apiRequest<PolicyGroupDetail>(\n 'POST',\n `policy-groups/${opts.groupId}/ab-test`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── stop ──\n abTest\n .command('stop')\n .description('Stop an A/B test')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Stop A/B test for group ${opts.groupId}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n const data = await apiRequest<unknown>(\n 'DELETE',\n `policy-groups/${opts.groupId}/ab-test`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── adjust ──\n abTest\n .command('adjust')\n .description('Adjust A/B test traffic rate')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--traffic-rate <rate>', 'New traffic rate (1-99)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body: AdjustTrafficRateRequest = {\n trafficRate: Number(opts.trafficRate),\n };\n const data = await apiRequest<unknown>(\n 'PATCH',\n `policy-groups/${opts.groupId}/ab-test/traffic-rate`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type { PolicyVersionSummary } from '@/types/versions';\n\nexport function registerVersionCommands(program: Command): void {\n const versions = program.command('versions').description('Manage policy versions');\n\n // ── list ──\n versions\n .command('list')\n .description('List versions for a policy group')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const data = await apiRequest<PageResponse<PolicyVersionSummary>>(\n 'GET',\n `policy-groups/${opts.groupId}/versions`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params: { page: opts.page, size: opts.size },\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'v#', 'Status', 'Commit', 'Hash', 'Created'],\n data.content.map((v) => [\n v.id,\n `v${v.versionNo}`,\n v.status,\n v.commitMessage ?? '–',\n v.snapshotHash ? v.snapshotHash.substring(0, 8) : '–',\n v.createdAt.substring(0, 10),\n ]),\n { truncate: 24 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── get ──\n versions\n .command('get')\n .description('Get a policy version by ID')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--id <versionId>', 'Policy version ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<PolicyVersionSummary>(\n 'GET',\n `policy-groups/${opts.groupId}/versions/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── create ──\n versions\n .command('create')\n .description('Create a new draft version')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .option('--commit-message <message>', 'Commit message')\n .option('--effective-from <date>', 'Effective from (ISO datetime)')\n .option('--effective-to <date>', 'Effective to (ISO datetime)')\n .option('--json <body>', 'Full request body as JSON (overrides other options)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = opts.json\n ? JSON.parse(opts.json)\n : buildCreateBody(opts);\n\n const data = await apiRequest<PolicyVersionSummary>(\n 'POST',\n `policy-groups/${opts.groupId}/versions`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── update ──\n versions\n .command('update')\n .description('Update a draft version metadata')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--id <versionId>', 'Policy version ID')\n .option('--commit-message <message>', 'Commit message')\n .option('--effective-from <date>', 'Effective from (ISO datetime)')\n .option('--effective-to <date>', 'Effective to (ISO datetime)')\n .option('--json <body>', 'Full request body as JSON (overrides other options)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = opts.json\n ? JSON.parse(opts.json)\n : buildUpdateBody(opts);\n\n const data = await apiRequest<PolicyVersionSummary>(\n 'PUT',\n `policy-groups/${opts.groupId}/versions/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── delete ──\n versions\n .command('delete')\n .description('Delete a policy version')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--id <versionId>', 'Policy version ID')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Delete version ${opts.id}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'DELETE',\n `policy-groups/${opts.groupId}/versions/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n console.log(`✓ Version ${opts.id} deleted.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── clone ──\n versions\n .command('clone')\n .description('Clone (duplicate) a policy version')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--id <versionId>', 'Source version ID to clone')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<PolicyVersionSummary>(\n 'POST',\n `policy-groups/${opts.groupId}/versions/${opts.id}/clone`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}\n\n// ── Helpers ──\n\nfunction buildCreateBody(opts: Record<string, string | undefined>): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n if (opts.commitMessage) body.commitMessage = opts.commitMessage;\n if (opts.effectiveFrom) body.effectiveFrom = opts.effectiveFrom;\n if (opts.effectiveTo) body.effectiveTo = opts.effectiveTo;\n return body;\n}\n\nfunction buildUpdateBody(opts: Record<string, string | undefined>): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n if (opts.commitMessage) body.commitMessage = opts.commitMessage;\n if (opts.effectiveFrom) body.effectiveFrom = opts.effectiveFrom;\n if (opts.effectiveTo) body.effectiveTo = opts.effectiveTo;\n return body;\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type {\n PolicyRuleSummary,\n PolicyRuleDetail,\n CreateRuleRequest,\n UpdateRuleRequest,\n ReorderRulesRequest,\n} from '@/types/rules';\n\nexport function registerRuleCommands(program: Command): void {\n const rules = program.command('rules').description('Manage policy rules');\n\n // ── list ──\n rules\n .command('list')\n .description('List rules for a policy version')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const data = await apiRequest<PageResponse<PolicyRuleSummary>>(\n 'GET',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/rules`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params: { page: opts.page, size: opts.size },\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'Name', 'Priority', 'Conditions', 'Actions', 'Enabled'],\n data.content.map((r) => [\n r.id,\n r.name,\n String(r.priority),\n String(r.totalConditionCount),\n String(r.totalActionCount),\n r.isEnabled ? '✓' : '✗',\n ]),\n { truncate: 24 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── get ──\n rules\n .command('get')\n .description('Get a rule by ID')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .requiredOption('--id <ruleId>', 'Rule ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<PolicyRuleDetail>(\n 'GET',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/rules/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── create ──\n rules\n .command('create')\n .description('Create a new rule')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .requiredOption('--json <body>', 'Request body as JSON string')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = JSON.parse(opts.json) as CreateRuleRequest;\n const data = await apiRequest<PolicyRuleDetail>(\n 'POST',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/rules`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── update ──\n rules\n .command('update')\n .description('Update a rule')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .requiredOption('--id <ruleId>', 'Rule ID')\n .requiredOption('--json <body>', 'Request body as JSON string')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = JSON.parse(opts.json) as UpdateRuleRequest;\n const data = await apiRequest<PolicyRuleDetail>(\n 'PUT',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/rules/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── delete ──\n rules\n .command('delete')\n .description('Delete a rule')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .requiredOption('--id <ruleId>', 'Rule ID')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Delete rule ${opts.id}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'DELETE',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/rules/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n console.log(`✓ Rule ${opts.id} deleted.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── reorder ──\n rules\n .command('reorder')\n .description('Reorder rules by priority (drag & drop equivalent)')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .requiredOption('--rule-ids <ids>', 'Comma-separated rule IDs in desired order')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const ruleIds = (opts.ruleIds as string).split(',').map((id: string) => id.trim());\n\n const body: ReorderRulesRequest = {\n rules: ruleIds.map((ruleId, index) => ({\n ruleId,\n priority: index,\n })),\n };\n\n await apiRequest<void>(\n 'PATCH',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/rules/reorder`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n console.log(`✓ ${ruleIds.length} rules reordered.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── toggle ──\n rules\n .command('toggle')\n .description('Enable or disable a rule')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .requiredOption('--id <ruleId>', 'Rule ID')\n .requiredOption('--enabled <boolean>', 'true or false')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const isEnabled = opts.enabled === 'true';\n\n await apiRequest<void>(\n 'PATCH',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/rules/${opts.id}/enabled`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body: { isEnabled },\n }\n );\n console.log(`✓ Rule ${opts.id} ${isEnabled ? 'enabled' : 'disabled'}.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type { FactSchemaResponse } from '@/types/facts';\n\nexport function registerFactCommands(program: Command): void {\n const facts = program.command('facts').description('Manage fact definitions (schema)');\n\n // ── list ──\n facts\n .command('list')\n .description('List fact definitions')\n .option('--keyword <keyword>', 'Filter by keyword')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const params: Record<string, string> = {\n page: opts.page,\n size: opts.size,\n };\n if (opts.keyword) params.keyword = opts.keyword;\n\n const data = await apiRequest<PageResponse<FactSchemaResponse>>(\n 'GET',\n 'schema/facts',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'Key', 'Name', 'Type', 'System', 'Required'],\n data.content.map((f) => [\n f.id,\n f.key,\n f.name,\n f.type,\n f.isSystem ? '✓' : '–',\n f.isRequired ? '✓' : '–',\n ]),\n { truncate: 28 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── create ──\n facts\n .command('create')\n .description('Create a new fact definition')\n .option('--key <key>', 'Fact key (lowercase, underscores)')\n .option('--name <name>', 'Display name')\n .option('--type <type>', 'Value type: STRING, NUMBER, BOOLEAN, LIST_STRING, LIST_NUMBER')\n .option('--description <desc>', 'Description')\n .option('--required', 'Mark as required', false)\n .option('--json <body>', 'Full request body as JSON (overrides other options)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = opts.json\n ? JSON.parse(opts.json)\n : buildCreateBody(opts);\n\n const data = await apiRequest<FactSchemaResponse>(\n 'POST',\n 'schema/facts',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── update ──\n facts\n .command('update')\n .description('Update a fact definition')\n .requiredOption('--id <factId>', 'Fact definition ID')\n .option('--name <name>', 'Display name')\n .option('--description <desc>', 'Description')\n .option('--required', 'Mark as required')\n .option('--no-required', 'Mark as not required')\n .option('--json <body>', 'Full request body as JSON (overrides other options)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = opts.json\n ? JSON.parse(opts.json)\n : buildUpdateBody(opts);\n\n const data = await apiRequest<FactSchemaResponse>(\n 'PUT',\n `schema/facts/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── delete ──\n facts\n .command('delete')\n .description('Delete a fact definition')\n .requiredOption('--id <factId>', 'Fact definition ID')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Delete fact ${opts.id}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'DELETE',\n `schema/facts/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n console.log(`✓ Fact ${opts.id} deleted.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── action-metadata ──\n facts\n .command('action-metadata')\n .description('Get action runtime fact metadata')\n .action(async () => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<unknown>(\n 'GET',\n 'schema/action-metadata',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}\n\n// ── Helpers ──\n\nfunction buildCreateBody(opts: Record<string, string | boolean | undefined>): Record<string, unknown> {\n if (!opts.key || !opts.name || !opts.type) {\n throw new Error('--key, --name, and --type are required (or use --json).');\n }\n const body: Record<string, unknown> = {\n key: opts.key,\n name: opts.name,\n type: opts.type,\n isRequired: opts.required === true,\n };\n if (opts.description) body.description = opts.description;\n return body;\n}\n\nfunction buildUpdateBody(opts: Record<string, string | boolean | undefined>): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n if (opts.name) body.name = opts.name;\n if (opts.description !== undefined) body.description = opts.description;\n if (typeof opts.required === 'boolean') body.isRequired = opts.required;\n return body;\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type { DeploymentSummary, DeploymentDetail, DeploymentStatus } from '@/types/deploy';\n\nexport function registerDeployCommands(program: Command): void {\n const deploy = program.command('deploy').description('Deployment lifecycle and history');\n\n // ── publish ──\n deploy\n .command('publish')\n .description('Publish a DRAFT version (DRAFT → ACTIVE)')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Version ID to publish')\n .option('--memo <memo>', 'Deployment memo')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n await apiRequest<void>(\n 'POST',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/publish`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body: { memo: opts.memo ?? '' },\n }\n );\n console.log(`✓ Version ${opts.versionId} published.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── live ──\n deploy\n .command('live')\n .description('Deploy an ACTIVE version to live traffic')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Version ID to deploy')\n .option('--memo <memo>', 'Deployment memo')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n await apiRequest<void>(\n 'POST',\n `policy-groups/${opts.groupId}/deploy`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body: { versionId: opts.versionId, memo: opts.memo ?? '' },\n }\n );\n console.log(`✓ Version ${opts.versionId} deployed to live.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── rollback ──\n deploy\n .command('rollback')\n .description('Rollback to the previous deployed version')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .option('--memo <memo>', 'Rollback reason')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Rollback group ${opts.groupId}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'POST',\n `policy-groups/${opts.groupId}/rollback`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body: { memo: opts.memo ?? '' },\n }\n );\n console.log(`✓ Group ${opts.groupId} rolled back.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── undeploy ──\n deploy\n .command('undeploy')\n .description('Remove the live version from a group')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .option('--memo <memo>', 'Undeploy reason')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Undeploy group ${opts.groupId}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'POST',\n `policy-groups/${opts.groupId}/undeploy`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body: { memo: opts.memo ?? '' },\n }\n );\n console.log(`✓ Group ${opts.groupId} undeployed.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── history ──\n deploy\n .command('history')\n .description('List deployment history')\n .option('--group-id <groupId>', 'Filter by policy group')\n .option('--types <types>', 'Filter by types (comma-separated: PUBLISH,DEPLOY,ROLLBACK,UNDEPLOY)')\n .option('--start-date <date>', 'Start date (yyyy-MM-dd)')\n .option('--end-date <date>', 'End date (yyyy-MM-dd)')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const params: Record<string, string> = {\n page: opts.page,\n size: opts.size,\n };\n if (opts.groupId) params.groupId = opts.groupId;\n if (opts.types) params.types = opts.types;\n if (opts.startDate) params.startDate = opts.startDate;\n if (opts.endDate) params.endDate = opts.endDate;\n\n const data = await apiRequest<PageResponse<DeploymentSummary>>(\n 'GET',\n 'deployments',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'Type', 'Group', 'Version', 'By', 'At'],\n data.content.map((d) => [\n d.id.substring(0, 8),\n d.deploymentType,\n d.policyGroupName,\n d.versionNo != null ? `v${d.versionNo}` : '–',\n d.deployedByName,\n d.deployedAt.substring(0, 16),\n ]),\n { truncate: 20 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── detail ──\n deploy\n .command('detail')\n .description('Get deployment detail')\n .requiredOption('--id <deploymentId>', 'Deployment ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<DeploymentDetail>(\n 'GET',\n `deployments/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── overview ──\n deploy\n .command('overview')\n .description('Show deployment status overview for all groups')\n .action(async () => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const data = await apiRequest<DeploymentStatus[]>(\n 'GET',\n 'deployments/overview',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['Group', 'Name', 'Status', 'Current Version', 'Last Deploy'],\n data.map((d) => [\n d.groupId.substring(0, 8),\n d.groupName,\n d.groupStatus,\n d.currentVersionName ?? '–',\n d.lastDeployedAt?.substring(0, 16) ?? '–',\n ])\n );\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── deployable ──\n deploy\n .command('deployable')\n .description('List deployable (ACTIVE) versions for a group')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<unknown[]>(\n 'GET',\n `deployments/groups/${opts.groupId}/deployable-versions`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── diff ──\n deploy\n .command('diff')\n .description('Compare snapshot diff between two versions')\n .requiredOption('--base <versionId>', 'Base version ID')\n .requiredOption('--target <versionId>', 'Target version ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<unknown>(\n 'GET',\n 'deployments/diff',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params: {\n baseVersionId: opts.base,\n targetVersionId: opts.target,\n },\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { readFileSync } from 'node:fs';\nimport { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type {\n DryRunResponse,\n RequirementsResponse,\n SimulationHistoryResponse,\n SimulationResponse,\n} from '@/types/analytics';\n\nexport function registerAnalyticsCommands(program: Command): void {\n const analytics = program.command('analytics').description('Dry run, simulation, and requirements');\n\n // ══════════════════════════════════════════════════\n // Dry Run\n // ══════════════════════════════════════════════════\n\n analytics\n .command('dry-run')\n .description('Execute a single dry run against a version')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .option('--json <body>', 'Request body as JSON string')\n .option('--file <path>', 'Read request body from a JSON file')\n .option('--debug', 'Include debug traces', false)\n .option('--mock', 'Mock external calls', false)\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = resolveBody(opts);\n\n if (!body.facts) {\n throw new Error('Request body must include \"facts\". Use --json or --file.');\n }\n\n body.includeDebugInfo = opts.debug;\n body.mockExternalCalls = opts.mock;\n\n const data = await apiRequest<DryRunResponse>(\n 'POST',\n `analytics/dry-run/versions/${opts.versionId}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ══════════════════════════════════════════════════\n // Dry Run Compare\n // ══════════════════════════════════════════════════\n\n analytics\n .command('dry-run-compare')\n .description('Compare dry run results between two versions')\n .option('--json <body>', 'Request body as JSON string')\n .option('--file <path>', 'Read request body from a JSON file')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = resolveBody(opts);\n\n if (!body.facts || !body.versionIdA || !body.versionIdB) {\n throw new Error('Request body must include \"facts\", \"versionIdA\", \"versionIdB\". Use --json or --file.');\n }\n\n const data = await apiRequest<unknown>(\n 'POST',\n 'analytics/dry-run/compare',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ══════════════════════════════════════════════════\n // Requirements\n // ══════════════════════════════════════════════════\n\n analytics\n .command('requirements')\n .description('Analyze required input facts for a version')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const data = await apiRequest<RequirementsResponse>(\n 'GET',\n `analytics/groups/${opts.groupId}/versions/${opts.versionId}/requirements`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['Key', 'Type', 'Name', 'Required', 'Used By'],\n data.requiredFacts.map((f) => [\n f.key,\n f.type ?? '–',\n f.displayName ?? '–',\n f.required ? '✓' : '–',\n f.usedBy.join(', ') || '–',\n ])\n );\n console.log('\\nExample request:');\n console.log(JSON.stringify(data.exampleRequest, null, 2));\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ══════════════════════════════════════════════════\n // Simulation\n // ══════════════════════════════════════════════════\n\n const sim = analytics.command('simulation').description('Manage batch simulations');\n\n // ── start ──\n sim\n .command('start')\n .description('Start a new batch simulation')\n .requiredOption('--json <body>', 'Simulation request body as JSON')\n .option('--file <path>', 'Read request body from a JSON file')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = resolveBody(opts);\n\n const data = await apiRequest<SimulationResponse>(\n 'POST',\n 'analytics/simulations',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n console.log(`✓ Simulation started: ${data.simulationId} (${data.status})`);\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── status ──\n sim\n .command('status')\n .description('Get simulation status and results')\n .requiredOption('--id <simulationId>', 'Simulation ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<SimulationResponse>(\n 'GET',\n `analytics/simulations/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── list ──\n sim\n .command('list')\n .description('List simulation history')\n .option('--status <status>', 'Filter by status (PENDING, RUNNING, COMPLETED, FAILED, CANCELLED)')\n .option('--from <date>', 'Start date (yyyy-MM-dd)')\n .option('--to <date>', 'End date (yyyy-MM-dd)')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const params: Record<string, string> = {\n page: opts.page,\n size: opts.size,\n };\n if (opts.status) params.status = opts.status;\n if (opts.from) params.from = opts.from;\n if (opts.to) params.to = opts.to;\n\n const data = await apiRequest<PageResponse<SimulationHistoryResponse>>(\n 'GET',\n 'analytics/simulations',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'Group', 'Target', 'Status', 'Match', 'Records', 'Created'],\n data.content.map((s) => [\n s.simulationId.substring(0, 8),\n s.policyGroupName,\n s.targetVersionName ?? '–',\n s.status,\n `${(s.matchRate * 100).toFixed(1)}%`,\n String(s.totalRecords),\n s.createdAt.substring(0, 16),\n ]),\n { truncate: 20 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── cancel ──\n sim\n .command('cancel')\n .description('Cancel a running simulation')\n .requiredOption('--id <simulationId>', 'Simulation ID')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Cancel simulation ${opts.id}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'DELETE',\n `analytics/simulations/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n console.log(`✓ Simulation ${opts.id} cancelled.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── export ──\n sim\n .command('export')\n .description('Export simulation results')\n .requiredOption('--id <simulationId>', 'Simulation ID')\n .option('--format <fmt>', 'Export format: csv or json', 'json')\n .option('--output <path>', 'Output file path')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const exportFormat = opts.format === 'csv' ? 'csv' : 'json';\n\n const response = await apiRequest<unknown>(\n 'GET',\n `analytics/simulations/${opts.id}/export`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params: { format: exportFormat },\n }\n );\n\n if (opts.output) {\n const { writeFileSync } = await import('node:fs');\n const text = typeof response === 'string'\n ? response\n : JSON.stringify(response, null, 2);\n writeFileSync(opts.output, text, 'utf-8');\n console.log(`✓ Exported to ${opts.output}`);\n } else {\n printJson(response);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}\n\n// ── Helpers ──\n\nfunction resolveBody(opts: Record<string, string | boolean | undefined>): Record<string, unknown> {\n if (opts.file) {\n const raw = readFileSync(opts.file as string, 'utf-8');\n return JSON.parse(raw);\n }\n if (opts.json) {\n return JSON.parse(opts.json as string);\n }\n return {};\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type { ExecutionHistorySummary, ExecutionHistoryDetail, ExecutionStatsResponse } from '@/types/history';\n\nexport function registerHistoryCommands(program: Command): void {\n const history = program.command('history').description('Execution history');\n\n // ── list ──\n history\n .command('list')\n .description('List execution history')\n .option('--trace-id <traceId>', 'Filter by trace ID')\n .option('--group-id <groupId>', 'Filter by policy group')\n .option('--version-id <versionId>', 'Filter by version')\n .option('--status <status>', 'Filter by status (SUCCESS, NO_MATCH, ERROR, TIMEOUT)')\n .option('--start-date <date>', 'Start date (yyyy-MM-dd)')\n .option('--end-date <date>', 'End date (yyyy-MM-dd)')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const params: Record<string, string> = {\n page: opts.page,\n size: opts.size,\n };\n if (opts.traceId) params.traceId = opts.traceId;\n if (opts.groupId) params.policyGroupId = opts.groupId;\n if (opts.versionId) params.versionId = opts.versionId;\n if (opts.status) params.status = opts.status;\n if (opts.startDate) params.startDate = opts.startDate;\n if (opts.endDate) params.endDate = opts.endDate;\n\n const data = await apiRequest<PageResponse<ExecutionHistorySummary>>(\n 'GET',\n 'execution/history',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['Trace', 'Group', 'Version', 'Status', 'Matched', 'Latency', 'At'],\n data.content.map((h) => [\n h.traceId.substring(0, 12),\n h.policyGroupName ?? '–',\n h.policyVersionNo != null ? `v${h.policyVersionNo}` : '–',\n h.status,\n h.isMatched ? '✓' : '✗',\n `${h.latencyMs}ms`,\n h.createdAt.substring(0, 16),\n ]),\n { truncate: 20 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── get ──\n history\n .command('get')\n .description('Get execution detail')\n .requiredOption('--id <executionId>', 'Execution history ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<ExecutionHistoryDetail>(\n 'GET',\n `execution/history/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── stats ──\n history\n .command('stats')\n .description('Get execution statistics')\n .option('--group-id <groupId>', 'Filter by policy group')\n .option('--start-date <date>', 'Start date (yyyy-MM-dd)')\n .option('--end-date <date>', 'End date (yyyy-MM-dd)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const params: Record<string, string> = {};\n if (opts.groupId) params.policyGroupId = opts.groupId;\n if (opts.startDate) params.startDate = opts.startDate;\n if (opts.endDate) params.endDate = opts.endDate;\n\n const data = await apiRequest<ExecutionStatsResponse>(\n 'GET',\n 'execution/history/stats',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['Total', 'Success', 'No Match', 'Failures', 'Success Rate', 'Avg Latency'],\n [[\n String(data.totalExecutions),\n String(data.successCount),\n String(data.noMatchCount),\n String(data.failureCount),\n `${data.successRate}%`,\n `${data.avgLatencyMs}ms`,\n ]]\n );\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type { IntegrationResponse, IntegrationConfigSpecs } from '@/types/integrations';\n\nexport function registerIntegrationCommands(program: Command): void {\n const integrations = program.command('integrations').description('Manage external integrations');\n\n // ── list ──\n integrations\n .command('list')\n .description('List integrations')\n .option('--type <type>', 'Filter by type (COUPON, POINT, NOTIFICATION, CRM, MESSENGER, WEBHOOK)')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const params: Record<string, string> = {\n page: opts.page,\n size: opts.size,\n };\n if (opts.type) params.type = opts.type;\n\n const data = await apiRequest<PageResponse<IntegrationResponse>>(\n 'GET',\n 'integrations',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'Name', 'Type', 'URL', 'Active'],\n data.content.map((i) => [\n i.id.substring(0, 8),\n i.name,\n i.type,\n i.baseUrl,\n i.isActive ? '✓' : '✗',\n ]),\n { truncate: 28 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── get ──\n integrations\n .command('get')\n .description('Get integration detail')\n .requiredOption('--id <integrationId>', 'Integration ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<IntegrationResponse>(\n 'GET',\n `integrations/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── save ──\n integrations\n .command('save')\n .description('Create or update an integration')\n .requiredOption('--json <body>', 'Request body as JSON string')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = JSON.parse(opts.json);\n const data = await apiRequest<IntegrationResponse>(\n 'POST',\n 'integrations',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── delete ──\n integrations\n .command('delete')\n .description('Delete an integration')\n .requiredOption('--id <integrationId>', 'Integration ID')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Delete integration ${opts.id}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'DELETE',\n `integrations/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n console.log(`✓ Integration ${opts.id} deleted.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── config-spec ──\n integrations\n .command('config-spec')\n .description('Get integration configuration field specs')\n .action(async () => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<IntegrationConfigSpecs>(\n 'GET',\n 'integrations/config-spec',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type { FailureLogResponse, BulkActionResponse } from '@/types/logs';\n\nexport function registerLogCommands(program: Command): void {\n const logs = program.command('logs').description('Failure logs');\n\n // ── list ──\n logs\n .command('list')\n .description('List failure logs')\n .option('--category <category>', 'Filter by category (INTEGRATION, INTERNAL)')\n .option('--task-type <taskType>', 'Filter by task type (COUPON_ISSUE, POINT_EARN, NOTIFICATION_SEND, WEBHOOK_EXECUTE)')\n .option('--status <status>', 'Filter by status (PENDING, RESOLVED, IGNORED)')\n .option('--keyword <keyword>', 'Search keyword')\n .option('--start-date <date>', 'Start date (yyyy-MM-dd)')\n .option('--end-date <date>', 'End date (yyyy-MM-dd)')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const params: Record<string, string> = {\n page: opts.page,\n size: opts.size,\n };\n if (opts.category) params.category = opts.category;\n if (opts.taskType) params.taskType = opts.taskType;\n if (opts.status) params.status = opts.status;\n if (opts.keyword) params.searchKeyword = opts.keyword;\n if (opts.startDate) params.startDate = opts.startDate;\n if (opts.endDate) params.endDate = opts.endDate;\n\n const data = await apiRequest<PageResponse<FailureLogResponse>>(\n 'GET',\n 'failure-logs',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'Category', 'Task', 'Status', 'Retries', 'Error', 'Created'],\n data.content.map((l) => [\n l.id.substring(0, 8),\n l.category,\n l.taskType,\n l.status,\n String(l.retryCount),\n l.errorMessage?.substring(0, 24) ?? '–',\n l.createdAt.substring(0, 16),\n ]),\n { truncate: 24 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── get ──\n logs\n .command('get')\n .description('Get failure log detail')\n .requiredOption('--id <logId>', 'Log ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<FailureLogResponse>(\n 'GET',\n `failure-logs/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── action ──\n logs\n .command('action')\n .description('Process a failure log action (RETRY, IGNORE, RESOLVE)')\n .requiredOption('--id <logId>', 'Log ID')\n .requiredOption('--action <action>', 'Action: RETRY, IGNORE, or RESOLVE')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<FailureLogResponse>(\n 'POST',\n `failure-logs/${opts.id}/actions`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params: { action: opts.action },\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── bulk-action ──\n logs\n .command('bulk-action')\n .description('Bulk process failure logs')\n .requiredOption('--ids <logIds>', 'Comma-separated log IDs')\n .requiredOption('--action <action>', 'Action: RETRY, IGNORE, or RESOLVE')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const logIds = (opts.ids as string).split(',').map((id: string) => id.trim());\n\n const data = await apiRequest<BulkActionResponse>(\n 'POST',\n 'failure-logs/bulk-actions',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body: { logIds, action: opts.action },\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { type Command } from 'commander';\nimport { startMcpServer } from '@/mcp/server';\n\nexport function registerServeCommand(program: Command): void {\n program\n .command('serve')\n .description('Start LexQ as a server for AI agent integrations')\n .option('--mcp', 'Start as MCP (Model Context Protocol) server over stdio')\n .action(async (opts) => {\n if (!opts.mcp) {\n console.error(\n 'Error: --mcp flag is required.\\n' +\n 'Usage: lexq serve --mcp\\n\\n' +\n 'Starts a stdio MCP server for Claude Desktop, Claude.ai, Gemini, etc.'\n );\n process.exit(1);\n }\n\n await startMcpServer();\n });\n}","import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { registerStatusTools } from './tools/status';\nimport { registerGroupTools } from './tools/groups';\nimport { registerVersionTools } from './tools/versions';\nimport { registerRuleTools } from './tools/rules';\nimport { registerFactTools } from './tools/facts';\nimport { registerDeployTools } from './tools/deploy';\nimport { registerAnalyticsTools } from './tools/analytics';\nimport { registerHistoryTools } from './tools/history';\nimport { registerIntegrationTools } from './tools/integrations';\nimport { registerLogTools } from './tools/logs';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction getVersion(): string {\n try {\n const pkg = JSON.parse(\n readFileSync(join(__dirname, '..', 'package.json'), 'utf-8')\n );\n return pkg.version as string;\n } catch {\n return '0.1.0';\n }\n}\n\nexport async function startMcpServer(): Promise<void> {\n const server = new McpServer({\n name: 'lexq',\n version: getVersion(),\n });\n\n // Register all tool domains (53 tools total)\n registerStatusTools(server);\n registerGroupTools(server);\n registerVersionTools(server);\n registerRuleTools(server);\n registerFactTools(server);\n registerDeployTools(server);\n registerAnalyticsTools(server);\n registerHistoryTools(server);\n registerIntegrationTools(server);\n registerLogTools(server);\n\n // Connect via stdio transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}","import { apiRequest, type ApiClientOptions } from '@/lib/api-client';\nimport { loadConfig } from '@/lib/config';\n\nexport interface McpToolResult {\n [key: string]: unknown;\n content: Array<{ type: 'text'; text: string }>;\n isError?: boolean;\n}\n\nexport function getMcpClientOptions(): ApiClientOptions {\n const config = loadConfig();\n return {\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n };\n}\n\nexport async function callApi<T>(\n method: string,\n path: string,\n opts?: { body?: unknown; params?: Record<string, string> }\n): Promise<McpToolResult> {\n try {\n const clientOpts = getMcpClientOptions();\n const data = await apiRequest<T>(method, path, {\n ...clientOpts,\n body: opts?.body,\n params: opts?.params,\n });\n return {\n content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: message }) }],\n isError: true,\n };\n }\n}\n\nexport function paginationParams(\n page?: number,\n size?: number\n): Record<string, string> {\n const params: Record<string, string> = {};\n if (page !== undefined) params.page = String(page);\n if (size !== undefined) params.size = String(size);\n return params;\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { callApi } from './_shared';\n\nexport function registerStatusTools(server: McpServer): void {\n server.registerTool(\n 'lexq_whoami',\n {\n title: 'Who Am I',\n description: 'Show current authentication info (tenant name, role, API key mask).',\n inputSchema: {},\n },\n async () => callApi('GET', 'whoami')\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerGroupTools(server: McpServer): void {\n // ── CRUD ──\n\n server.registerTool(\n 'lexq_groups_list',\n {\n title: 'List Policy Groups',\n description:\n 'List all policy groups. Supports pagination and optional status/keyword filters.',\n inputSchema: {\n page: z.number().int().min(0).default(0).describe('Page number (0-indexed)'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n status: z\n .enum(['ACTIVE', 'DISABLED', 'ARCHIVED'])\n .optional()\n .describe('Filter by status'),\n keyword: z.string().optional().describe('Search keyword'),\n },\n },\n async ({ page, size, status, keyword }) => {\n const params: Record<string, string> = paginationParams(page, size);\n if (status) params.status = status;\n if (keyword) params.keyword = keyword;\n return callApi('GET', 'policy-groups', { params });\n }\n );\n\n server.registerTool(\n 'lexq_groups_get',\n {\n title: 'Get Policy Group',\n description: 'Get a single policy group by ID.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n },\n },\n async ({ groupId }) => callApi('GET', `policy-groups/${groupId}`)\n );\n\n server.registerTool(\n 'lexq_groups_create',\n {\n title: 'Create Policy Group',\n description:\n 'Create a new policy group. Requires name and priority. Optionally set conflict resolution, activation group, and description.',\n inputSchema: {\n name: z.string().describe('Group name (unique among non-ARCHIVED)'),\n priority: z.number().int().min(0).describe('Execution priority (lower = higher)'),\n description: z.string().optional().describe('Group description'),\n conflictResolutionMode: z\n .enum(['NONE', 'EXCLUSIVE', 'MAX_N'])\n .optional()\n .describe('Conflict resolution mode'),\n conflictResolutionStrategy: z\n .enum(['FIRST_MATCH', 'HIGHEST_PRIORITY', 'MAX_BENEFIT'])\n .optional()\n .describe('Strategy when mode is EXCLUSIVE or MAX_N'),\n maxSelections: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe('Max selections (required when mode is MAX_N)'),\n activationGroupId: z.string().uuid().optional().describe('Activation group ID'),\n },\n },\n async (args) => {\n const body: Record<string, unknown> = {\n name: args.name,\n priority: args.priority,\n };\n if (args.description !== undefined) body.description = args.description;\n if (args.conflictResolutionMode !== undefined)\n body.conflictResolutionMode = args.conflictResolutionMode;\n if (args.conflictResolutionStrategy !== undefined)\n body.conflictResolutionStrategy = args.conflictResolutionStrategy;\n if (args.maxSelections !== undefined) body.maxSelections = args.maxSelections;\n if (args.activationGroupId !== undefined)\n body.activationGroupId = args.activationGroupId;\n return callApi('POST', 'policy-groups', { body });\n }\n );\n\n server.registerTool(\n 'lexq_groups_update',\n {\n title: 'Update Policy Group',\n description: 'Update an existing policy group. Only provided fields are updated.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n name: z.string().optional().describe('New name'),\n priority: z.number().int().min(0).optional().describe('New priority'),\n description: z.string().optional().describe('New description'),\n status: z\n .enum(['ACTIVE', 'DISABLED'])\n .optional()\n .describe('Status (DISABLED = emergency stop)'),\n conflictResolutionMode: z\n .enum(['NONE', 'EXCLUSIVE', 'MAX_N'])\n .optional()\n .describe('Conflict resolution mode'),\n conflictResolutionStrategy: z\n .enum(['FIRST_MATCH', 'HIGHEST_PRIORITY', 'MAX_BENEFIT'])\n .optional()\n .describe('Strategy'),\n maxSelections: z.number().int().min(1).optional().describe('Max selections'),\n },\n },\n async ({ groupId, ...body }) =>\n callApi('PATCH', `policy-groups/${groupId}`, { body })\n );\n\n server.registerTool(\n 'lexq_groups_delete',\n {\n title: 'Delete Policy Group',\n description:\n 'Archive a policy group. Only non-live groups can be deleted. This is irreversible.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n },\n },\n async ({ groupId }) => callApi('DELETE', `policy-groups/${groupId}`)\n );\n\n // ── A/B Test ──\n\n server.registerTool(\n 'lexq_ab_test_start',\n {\n title: 'Start A/B Test',\n description:\n 'Start an A/B test on a policy group. Requires a challenger version ID and traffic split percentages.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n challengerVersionId: z.string().uuid().describe('Challenger version ID'),\n controlWeight: z\n .number()\n .int()\n .min(1)\n .max(99)\n .describe('Control traffic weight (%)'),\n challengerWeight: z\n .number()\n .int()\n .min(1)\n .max(99)\n .describe('Challenger traffic weight (%)'),\n identityKey: z\n .string()\n .optional()\n .describe('Fact key for sticky assignment (e.g. customer_id)'),\n },\n },\n async ({ groupId, ...body }) =>\n callApi('POST', `policy-groups/${groupId}/ab-test/start`, { body })\n );\n\n server.registerTool(\n 'lexq_ab_test_stop',\n {\n title: 'Stop A/B Test',\n description: 'Stop a running A/B test. Specify which version to keep.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n winnerVersionId: z.string().uuid().describe('Version ID to keep as live'),\n },\n },\n async ({ groupId, ...body }) =>\n callApi('POST', `policy-groups/${groupId}/ab-test/stop`, { body })\n );\n\n server.registerTool(\n 'lexq_ab_test_adjust',\n {\n title: 'Adjust A/B Test',\n description: 'Adjust traffic weights of a running A/B test.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n controlWeight: z.number().int().min(1).max(99).describe('New control weight (%)'),\n challengerWeight: z\n .number()\n .int()\n .min(1)\n .max(99)\n .describe('New challenger weight (%)'),\n },\n },\n async ({ groupId, ...body }) =>\n callApi('POST', `policy-groups/${groupId}/ab-test/adjust`, { body })\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerVersionTools(server: McpServer): void {\n server.registerTool(\n 'lexq_versions_list',\n {\n title: 'List Policy Versions',\n description: 'List all versions of a policy group.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n },\n },\n async ({ groupId, page, size }) =>\n callApi('GET', `policy-groups/${groupId}/versions`, {\n params: paginationParams(page, size),\n })\n );\n\n server.registerTool(\n 'lexq_versions_get',\n {\n title: 'Get Policy Version',\n description: 'Get a single version by ID, including its rules and fact requirements.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n },\n },\n async ({ groupId, versionId }) =>\n callApi('GET', `policy-groups/${groupId}/versions/${versionId}`)\n );\n\n server.registerTool(\n 'lexq_versions_create',\n {\n title: 'Create Policy Version',\n description:\n 'Create a new DRAFT version in a policy group. Provide a commit message and optional effective date range.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n commitMessage: z.string().describe('Commit message describing this version'),\n effectiveFrom: z\n .string()\n .optional()\n .describe('Effective start date (ISO 8601)'),\n effectiveTo: z\n .string()\n .optional()\n .describe('Effective end date (ISO 8601)'),\n },\n },\n async ({ groupId, ...body }) =>\n callApi('POST', `policy-groups/${groupId}/versions`, { body })\n );\n\n server.registerTool(\n 'lexq_versions_update',\n {\n title: 'Update Policy Version',\n description: 'Update a DRAFT version. Only DRAFT versions can be modified.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n commitMessage: z.string().optional().describe('New commit message'),\n effectiveFrom: z.string().optional().describe('New effective start date'),\n effectiveTo: z.string().optional().describe('New effective end date'),\n },\n },\n async ({ groupId, versionId, ...body }) =>\n callApi('PATCH', `policy-groups/${groupId}/versions/${versionId}`, { body })\n );\n\n server.registerTool(\n 'lexq_versions_delete',\n {\n title: 'Delete Policy Version',\n description: 'Delete a DRAFT version. Only DRAFT versions can be deleted.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n },\n },\n async ({ groupId, versionId }) =>\n callApi('DELETE', `policy-groups/${groupId}/versions/${versionId}`)\n );\n\n server.registerTool(\n 'lexq_versions_clone',\n {\n title: 'Clone Policy Version',\n description:\n 'Clone an existing version to create a new DRAFT. Useful when the source version is already published.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Source version ID to clone'),\n commitMessage: z\n .string()\n .optional()\n .describe('Commit message for the cloned version'),\n },\n },\n async ({ groupId, versionId, commitMessage }) => {\n const body: Record<string, unknown> = {};\n if (commitMessage !== undefined) body.commitMessage = commitMessage;\n return callApi('POST', `policy-groups/${groupId}/versions/${versionId}/clone`, {\n body,\n });\n }\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\n// Condition/Action are deeply nested JSON — accept as opaque object via z.record.\n// The engine validates structure. MCP schema describes the shape in descriptions.\n\nexport function registerRuleTools(server: McpServer): void {\n server.registerTool(\n 'lexq_rules_list',\n {\n title: 'List Rules',\n description: 'List all rules in a version. Returns summary with conditionSummary and actionSummary.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n },\n },\n async ({ groupId, versionId, page, size }) =>\n callApi('GET', `policy-groups/${groupId}/versions/${versionId}/rules`, {\n params: paginationParams(page, size),\n })\n );\n\n server.registerTool(\n 'lexq_rules_get',\n {\n title: 'Get Rule Detail',\n description:\n 'Get full rule detail including condition tree and action definitions.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n ruleId: z.string().uuid().describe('Rule ID'),\n },\n },\n async ({ groupId, versionId, ruleId }) =>\n callApi(\n 'GET',\n `policy-groups/${groupId}/versions/${versionId}/rules/${ruleId}`\n )\n );\n\n server.registerTool(\n 'lexq_rules_create',\n {\n title: 'Create Rule',\n description: `Create a rule in a DRAFT version. Requires name, priority, condition tree, and actions array.\n\nCondition: { type: \"SINGLE\", field, operator, value, valueType } or { type: \"GROUP\", operator: \"AND\"|\"OR\", children: [...] }\nOperators: EQUALS, NOT_EQUALS, GREATER_THAN, GREATER_THAN_OR_EQUAL, LESS_THAN, LESS_THAN_OR_EQUAL, CONTAINS, IN, NOT_IN\nValue types: STRING, NUMBER, BOOLEAN, LIST_STRING, LIST_NUMBER\n\nActions: [{ type, parameters }]\nTypes: DISCOUNT, POINT, COUPON_ISSUE, BLOCK, NOTIFICATION, WEBHOOK, SET_FACT, ADD_TAG`,\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n rule: z\n .string()\n .describe(\n 'JSON string of CreateRuleRequest: { name, priority, condition, actions, mutexGroup?, mutexMode?, mutexStrategy?, mutexLimit?, isEnabled? }'\n ),\n },\n },\n async ({ groupId, versionId, rule }) => {\n const body: unknown = JSON.parse(rule);\n return callApi(\n 'POST',\n `policy-groups/${groupId}/versions/${versionId}/rules`,\n { body }\n );\n }\n );\n\n server.registerTool(\n 'lexq_rules_update',\n {\n title: 'Update Rule',\n description:\n 'Update an existing rule in a DRAFT version. Only provided fields are changed.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n ruleId: z.string().uuid().describe('Rule ID'),\n rule: z\n .string()\n .describe(\n 'JSON string of UpdateRuleRequest: { name?, priority?, condition?, actions?, mutexGroup?, mutexMode?, mutexStrategy?, mutexLimit?, isEnabled? }'\n ),\n },\n },\n async ({ groupId, versionId, ruleId, rule }) => {\n const body: unknown = JSON.parse(rule);\n return callApi(\n 'PATCH',\n `policy-groups/${groupId}/versions/${versionId}/rules/${ruleId}`,\n { body }\n );\n }\n );\n\n server.registerTool(\n 'lexq_rules_delete',\n {\n title: 'Delete Rule',\n description: 'Delete a rule from a DRAFT version.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n ruleId: z.string().uuid().describe('Rule ID'),\n force: z\n .boolean()\n .default(false)\n .describe('Skip confirmation (for the last rule in a version)'),\n },\n },\n async ({ groupId, versionId, ruleId, force }) => {\n const params: Record<string, string> = {};\n if (force) params.force = 'true';\n return callApi(\n 'DELETE',\n `policy-groups/${groupId}/versions/${versionId}/rules/${ruleId}`,\n { params }\n );\n }\n );\n\n server.registerTool(\n 'lexq_rules_reorder',\n {\n title: 'Reorder Rules',\n description:\n 'Reorder rules by specifying rule IDs and their new priorities. Array index 0 = highest priority.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n ruleIds: z\n .array(z.string().uuid())\n .describe('Rule IDs in desired priority order'),\n },\n },\n async ({ groupId, versionId, ruleIds }) => {\n const rules = ruleIds.map((ruleId: string, index: number) => ({\n ruleId,\n priority: index,\n }));\n return callApi(\n 'PUT',\n `policy-groups/${groupId}/versions/${versionId}/rules/reorder`,\n { body: { rules } }\n );\n }\n );\n\n server.registerTool(\n 'lexq_rules_toggle',\n {\n title: 'Toggle Rule',\n description: 'Enable or disable a rule without deleting it.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n ruleId: z.string().uuid().describe('Rule ID'),\n isEnabled: z.boolean().describe('true to enable, false to disable'),\n },\n },\n async ({ groupId, versionId, ruleId, isEnabled }) =>\n callApi(\n 'PATCH',\n `policy-groups/${groupId}/versions/${versionId}/rules/${ruleId}/toggle`,\n { body: { isEnabled } }\n )\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerFactTools(server: McpServer): void {\n server.registerTool(\n 'lexq_facts_list',\n {\n title: 'List Fact Definitions',\n description:\n 'List all fact definitions (input variable schema). Shows key, type, and required status. Always check this before creating rules.',\n inputSchema: {\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n keyword: z.string().optional().describe('Search keyword'),\n },\n },\n async ({ page, size, keyword }) => {\n const params: Record<string, string> = paginationParams(page, size);\n if (keyword) params.keyword = keyword;\n return callApi('GET', 'schema/facts', { params });\n }\n );\n\n server.registerTool(\n 'lexq_facts_create',\n {\n title: 'Create Fact Definition',\n description:\n 'Register a new input variable. Key must be lowercase with underscores (e.g. payment_amount). Types: STRING, NUMBER, BOOLEAN, LIST_STRING, LIST_NUMBER.',\n inputSchema: {\n key: z\n .string()\n .regex(/^[a-z][a-z0-9_]*$/)\n .describe('Variable key (snake_case)'),\n name: z.string().describe('Display name'),\n type: z\n .enum(['STRING', 'NUMBER', 'BOOLEAN', 'LIST_STRING', 'LIST_NUMBER'])\n .describe('Value type'),\n description: z.string().optional().describe('Description'),\n isRequired: z\n .boolean()\n .default(false)\n .describe('Whether this fact is required for rule evaluation'),\n },\n },\n async (args) => callApi('POST', 'schema/facts', { body: args })\n );\n\n server.registerTool(\n 'lexq_facts_update',\n {\n title: 'Update Fact Definition',\n description:\n 'Update a fact definition. Key and type cannot be changed. System facts only allow name and description changes.',\n inputSchema: {\n factId: z.string().uuid().describe('Fact definition ID'),\n name: z.string().describe('Display name'),\n description: z.string().optional().describe('Description'),\n isRequired: z.boolean().describe('Required flag'),\n },\n },\n async ({ factId, ...body }) =>\n callApi('PATCH', `schema/facts/${factId}`, { body })\n );\n\n server.registerTool(\n 'lexq_facts_delete',\n {\n title: 'Delete Fact Definition',\n description:\n 'Delete a fact definition. System facts cannot be deleted.',\n inputSchema: {\n factId: z.string().uuid().describe('Fact definition ID'),\n },\n },\n async ({ factId }) => callApi('DELETE', `schema/facts/${factId}`)\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerDeployTools(server: McpServer): void {\n server.registerTool(\n 'lexq_deploy_publish',\n {\n title: 'Publish Version',\n description:\n 'Publish a DRAFT version (DRAFT → ACTIVE). Locks the version from further edits. Must have at least one rule.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID to publish'),\n memo: z.string().default('').describe('Deployment memo'),\n },\n },\n async ({ groupId, versionId, memo }) =>\n callApi(\n 'POST',\n `policy-groups/${groupId}/versions/${versionId}/publish`,\n { body: { memo } }\n )\n );\n\n server.registerTool(\n 'lexq_deploy_live',\n {\n title: 'Deploy to Live',\n description:\n 'Deploy an ACTIVE (published) version to live traffic. Takes effect immediately.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID to deploy'),\n memo: z.string().default('').describe('Deployment memo'),\n },\n },\n async ({ groupId, versionId, memo }) =>\n callApi('POST', `policy-groups/${groupId}/deploy`, {\n body: { versionId, memo },\n })\n );\n\n server.registerTool(\n 'lexq_deploy_rollback',\n {\n title: 'Rollback Deployment',\n description:\n 'Rollback to the previous deployed version. Only available if there is a previous version.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n memo: z.string().default('').describe('Rollback reason'),\n },\n },\n async ({ groupId, memo }) =>\n callApi('POST', `policy-groups/${groupId}/rollback`, {\n body: { memo },\n })\n );\n\n server.registerTool(\n 'lexq_deploy_undeploy',\n {\n title: 'Undeploy',\n description:\n 'Remove the live version from traffic. The version stays ACTIVE but no longer serves requests.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n memo: z.string().default('').describe('Undeploy reason'),\n },\n },\n async ({ groupId, memo }) =>\n callApi('POST', `policy-groups/${groupId}/undeploy`, {\n body: { memo },\n })\n );\n\n server.registerTool(\n 'lexq_deploy_history',\n {\n title: 'Deployment History',\n description: 'List deployment history across all groups.',\n inputSchema: {\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n groupId: z.string().uuid().optional().describe('Filter by group ID'),\n type: z\n .enum(['PUBLISH', 'DEPLOY', 'ROLLBACK', 'UNDEPLOY'])\n .optional()\n .describe('Filter by deployment type'),\n },\n },\n async ({ page, size, groupId, type }) => {\n const params: Record<string, string> = paginationParams(page, size);\n if (groupId) params.groupId = groupId;\n if (type) params.type = type;\n return callApi('GET', 'deployments', { params });\n }\n );\n\n server.registerTool(\n 'lexq_deploy_detail',\n {\n title: 'Deployment Detail',\n description:\n 'Get detailed info about a specific deployment including snapshot hash and integrity check.',\n inputSchema: {\n deploymentId: z.string().uuid().describe('Deployment ID'),\n },\n },\n async ({ deploymentId }) =>\n callApi('GET', `deployments/${deploymentId}`)\n );\n\n server.registerTool(\n 'lexq_deploy_overview',\n {\n title: 'Deployment Overview',\n description:\n 'Show current deployment status of all groups — which version is live, last deployment type, and deployer.',\n inputSchema: {},\n },\n async () => callApi('GET', 'deployments/overview')\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerAnalyticsTools(server: McpServer): void {\n // ── Dry Run ──\n\n server.registerTool(\n 'lexq_dry_run',\n {\n title: 'Dry Run',\n description: `Execute a single dry run against a version. Tests how rules evaluate given input facts without side effects.\n\nExample input: { \"facts\": { \"payment_amount\": 100000, \"customer_tier\": \"VIP\" } }\n\nAlways dry-run before publishing to validate rule behavior.`,\n inputSchema: {\n versionId: z.string().uuid().describe('Policy version ID to test against'),\n facts: z\n .string()\n .describe('JSON string of facts object, e.g. {\"payment_amount\":100000}'),\n includeDebugInfo: z\n .boolean()\n .default(true)\n .describe('Include execution and decision traces'),\n mockExternalCalls: z\n .boolean()\n .default(true)\n .describe('Mock external integration calls'),\n },\n },\n async ({ versionId, facts, includeDebugInfo, mockExternalCalls }) => {\n const parsedFacts: unknown = JSON.parse(facts);\n return callApi('POST', `analytics/dry-run/versions/${versionId}`, {\n body: { facts: parsedFacts, includeDebugInfo, mockExternalCalls },\n });\n }\n );\n\n // ── Dry Run Compare ──\n\n server.registerTool(\n 'lexq_dry_run_compare',\n {\n title: 'Dry Run Compare',\n description:\n 'Compare dry run results between two versions using the same input facts. Useful for validating changes.',\n inputSchema: {\n versionIdA: z.string().uuid().describe('Baseline version ID'),\n versionIdB: z.string().uuid().describe('Candidate version ID'),\n facts: z\n .string()\n .describe('JSON string of facts object'),\n },\n },\n async ({ versionIdA, versionIdB, facts }) => {\n const parsedFacts: unknown = JSON.parse(facts);\n return callApi('POST', 'analytics/dry-run/compare', {\n body: { versionIdA, versionIdB, facts: parsedFacts },\n });\n }\n );\n\n // ── Requirements ──\n\n server.registerTool(\n 'lexq_requirements',\n {\n title: 'Analyze Requirements',\n description:\n 'Analyze which input facts a version requires. Returns required keys, types, and an example request body.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n },\n },\n async ({ groupId, versionId }) =>\n callApi(\n 'GET',\n `analytics/groups/${groupId}/versions/${versionId}/requirements`\n )\n );\n\n // ── Simulation ──\n\n server.registerTool(\n 'lexq_simulation_start',\n {\n title: 'Start Simulation',\n description: `Start a batch simulation against historical execution data.\n\nExample body:\n{\n \"policyVersionId\": \"<uuid>\",\n \"dataset\": { \"type\": \"HISTORICAL\", \"source\": \"EXECUTION_LOGS\", \"from\": \"2025-01-01\", \"to\": \"2025-01-31\" },\n \"options\": { \"baselinePolicyVersionId\": \"<uuid>\", \"includeRuleStats\": true, \"maxRecords\": 10000 }\n}`,\n inputSchema: {\n body: z\n .string()\n .describe('JSON string of SimulationRequest'),\n },\n },\n async ({ body }) => {\n const parsed: unknown = JSON.parse(body);\n return callApi('POST', 'analytics/simulations', { body: parsed });\n }\n );\n\n server.registerTool(\n 'lexq_simulation_status',\n {\n title: 'Simulation Status',\n description:\n 'Get simulation status and results. Poll until status is COMPLETED or FAILED.',\n inputSchema: {\n simulationId: z.string().uuid().describe('Simulation ID'),\n },\n },\n async ({ simulationId }) =>\n callApi('GET', `analytics/simulations/${simulationId}`)\n );\n\n server.registerTool(\n 'lexq_simulation_list',\n {\n title: 'List Simulations',\n description: 'List simulation history with optional filters.',\n inputSchema: {\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n status: z\n .enum(['PENDING', 'RUNNING', 'COMPLETED', 'FAILED', 'CANCELLED'])\n .optional()\n .describe('Filter by status'),\n from: z.string().optional().describe('Start date (yyyy-MM-dd)'),\n to: z.string().optional().describe('End date (yyyy-MM-dd)'),\n },\n },\n async ({ page, size, status, from, to }) => {\n const params: Record<string, string> = paginationParams(page, size);\n if (status) params.status = status;\n if (from) params.from = from;\n if (to) params.to = to;\n return callApi('GET', 'analytics/simulations', { params });\n }\n );\n\n server.registerTool(\n 'lexq_simulation_cancel',\n {\n title: 'Cancel Simulation',\n description: 'Cancel a running or pending simulation.',\n inputSchema: {\n simulationId: z.string().uuid().describe('Simulation ID'),\n },\n },\n async ({ simulationId }) =>\n callApi('DELETE', `analytics/simulations/${simulationId}`)\n );\n\n server.registerTool(\n 'lexq_simulation_export',\n {\n title: 'Export Simulation',\n description:\n 'Export simulation results as JSON or CSV. Returns the raw data.',\n inputSchema: {\n simulationId: z.string().uuid().describe('Simulation ID'),\n format: z\n .enum(['json', 'csv'])\n .default('json')\n .describe('Export format'),\n },\n },\n async ({ simulationId, format }) =>\n callApi('GET', `analytics/simulations/${simulationId}/export`, {\n params: { format },\n })\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerHistoryTools(server: McpServer): void {\n server.registerTool(\n 'lexq_history_list',\n {\n title: 'List Execution History',\n description:\n 'List policy execution history. Shows trace ID, group, version, status, match result, and latency.',\n inputSchema: {\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n traceId: z.string().optional().describe('Filter by trace ID'),\n groupId: z.string().uuid().optional().describe('Filter by policy group'),\n versionId: z.string().uuid().optional().describe('Filter by version'),\n status: z\n .enum(['SUCCESS', 'NO_MATCH', 'ERROR', 'TIMEOUT'])\n .optional()\n .describe('Filter by execution status'),\n startDate: z.string().optional().describe('Start date (yyyy-MM-dd)'),\n endDate: z.string().optional().describe('End date (yyyy-MM-dd)'),\n },\n },\n async ({ page, size, traceId, groupId, versionId, status, startDate, endDate }) => {\n const params: Record<string, string> = paginationParams(page, size);\n if (traceId) params.traceId = traceId;\n if (groupId) params.policyGroupId = groupId;\n if (versionId) params.versionId = versionId;\n if (status) params.status = status;\n if (startDate) params.startDate = startDate;\n if (endDate) params.endDate = endDate;\n return callApi('GET', 'execution/history', { params });\n }\n );\n\n server.registerTool(\n 'lexq_history_get',\n {\n title: 'Get Execution Detail',\n description:\n 'Get full execution detail including request facts, result traces, and decision traces.',\n inputSchema: {\n executionId: z.string().uuid().describe('Execution history ID'),\n },\n },\n async ({ executionId }) =>\n callApi('GET', `execution/history/${executionId}`)\n );\n\n server.registerTool(\n 'lexq_history_stats',\n {\n title: 'Execution Statistics',\n description:\n 'Get execution KPIs: total executions, success/failure counts, success rate, and average latency.',\n inputSchema: {\n groupId: z.string().uuid().optional().describe('Filter by policy group'),\n startDate: z.string().optional().describe('Start date (yyyy-MM-dd)'),\n endDate: z.string().optional().describe('End date (yyyy-MM-dd)'),\n },\n },\n async ({ groupId, startDate, endDate }) => {\n const params: Record<string, string> = {};\n if (groupId) params.policyGroupId = groupId;\n if (startDate) params.startDate = startDate;\n if (endDate) params.endDate = endDate;\n return callApi('GET', 'execution/history/stats', { params });\n }\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerIntegrationTools(server: McpServer): void {\n server.registerTool(\n 'lexq_integrations_list',\n {\n title: 'List Integrations',\n description: 'List all external integrations (webhooks, CRM, notification, etc.).',\n inputSchema: {\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n type: z\n .enum(['COUPON', 'POINT', 'NOTIFICATION', 'CRM', 'MESSENGER', 'WEBHOOK'])\n .optional()\n .describe('Filter by integration type'),\n },\n },\n async ({ page, size, type }) => {\n const params: Record<string, string> = paginationParams(page, size);\n if (type) params.type = type;\n return callApi('GET', 'integrations', { params });\n }\n );\n\n server.registerTool(\n 'lexq_integrations_get',\n {\n title: 'Get Integration',\n description: 'Get integration detail by ID.',\n inputSchema: {\n integrationId: z.string().uuid().describe('Integration ID'),\n },\n },\n async ({ integrationId }) =>\n callApi('GET', `integrations/${integrationId}`)\n );\n\n server.registerTool(\n 'lexq_integrations_save',\n {\n title: 'Save Integration',\n description:\n 'Create or update an integration. Types: COUPON, POINT, NOTIFICATION, CRM, MESSENGER, WEBHOOK.',\n inputSchema: {\n type: z\n .enum(['COUPON', 'POINT', 'NOTIFICATION', 'CRM', 'MESSENGER', 'WEBHOOK'])\n .describe('Integration type'),\n name: z.string().describe('Integration name'),\n baseUrl: z.string().describe('Base URL of the external service'),\n apiKey: z.string().optional().describe('API key or token for the service'),\n isActive: z.boolean().default(true).describe('Whether the integration is active'),\n config: z\n .string()\n .optional()\n .describe('JSON string of additional config key-value pairs'),\n },\n },\n async ({ config, ...rest }) => {\n const body: Record<string, unknown> = { ...rest };\n if (config) body.config = JSON.parse(config);\n return callApi('POST', 'integrations', { body });\n }\n );\n\n server.registerTool(\n 'lexq_integrations_delete',\n {\n title: 'Delete Integration',\n description: 'Delete an integration by ID.',\n inputSchema: {\n integrationId: z.string().uuid().describe('Integration ID'),\n },\n },\n async ({ integrationId }) =>\n callApi('DELETE', `integrations/${integrationId}`)\n );\n\n server.registerTool(\n 'lexq_integrations_config_spec',\n {\n title: 'Integration Config Spec',\n description:\n 'Show available integration types and their required configuration fields.',\n inputSchema: {},\n },\n async () => callApi('GET', 'integrations/config-spec')\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerLogTools(server: McpServer): void {\n server.registerTool(\n 'lexq_logs_list',\n {\n title: 'List Failure Logs',\n description:\n 'List system failure logs from background tasks (webhook calls, coupon issuance, etc.).',\n inputSchema: {\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n category: z\n .enum(['INTEGRATION', 'INTERNAL'])\n .optional()\n .describe('Task category'),\n taskType: z\n .enum([\n 'COUPON_ISSUE',\n 'POINT_EARN',\n 'NOTIFICATION_SEND',\n 'WEBHOOK_EXECUTE',\n ])\n .optional()\n .describe('Task type'),\n status: z\n .enum(['PENDING', 'RESOLVED', 'IGNORED'])\n .optional()\n .describe('Log status'),\n keyword: z\n .string()\n .optional()\n .describe('Search in refId, refSubId, errorMessage'),\n startDate: z.string().optional().describe('Start date (yyyy-MM-dd)'),\n endDate: z.string().optional().describe('End date (yyyy-MM-dd)'),\n },\n },\n async ({ page, size, category, taskType, status, keyword, startDate, endDate }) => {\n const params: Record<string, string> = paginationParams(page, size);\n if (category) params.category = category;\n if (taskType) params.taskType = taskType;\n if (status) params.status = status;\n if (keyword) params.keyword = keyword;\n if (startDate) params.startDate = startDate;\n if (endDate) params.endDate = endDate;\n return callApi('GET', 'failure-logs', { params });\n }\n );\n\n server.registerTool(\n 'lexq_logs_get',\n {\n title: 'Get Failure Log',\n description: 'Get failure log detail by ID.',\n inputSchema: {\n logId: z.string().uuid().describe('Failure log ID'),\n },\n },\n async ({ logId }) => callApi('GET', `failure-logs/${logId}`)\n );\n\n server.registerTool(\n 'lexq_logs_action',\n {\n title: 'Process Failure Log',\n description: 'Process a single failure log: RETRY, RESOLVE, or IGNORE.',\n inputSchema: {\n logId: z.string().uuid().describe('Failure log ID'),\n action: z\n .enum(['RETRY', 'RESOLVE', 'IGNORE'])\n .describe('Action to take'),\n },\n },\n async ({ logId, action }) =>\n callApi('POST', `failure-logs/${logId}/actions`, {\n body: { action },\n })\n );\n\n server.registerTool(\n 'lexq_logs_bulk_action',\n {\n title: 'Bulk Process Failure Logs',\n description:\n 'Process multiple failure logs at once. Provide an array of log IDs and the action.',\n inputSchema: {\n logIds: z\n .array(z.string().uuid())\n .describe('Array of failure log IDs'),\n action: z\n .enum(['RETRY', 'RESOLVE', 'IGNORE'])\n .describe('Action to apply to all logs'),\n },\n },\n async ({ logIds, action }) =>\n callApi('POST', 'failure-logs/bulk-actions', {\n body: { logIds, action },\n })\n );\n}","import { createCli } from './cli';\nimport { printError } from './lib/output';\n\nasync function main(): Promise<void> {\n const program = createCli();\n\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n}\n\nmain();"],"mappings":"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","names":["readFileSync","fileURLToPath","dirname","join","createInterface","createInterface","createInterface","buildCreateBody","buildUpdateBody","createInterface","createInterface","readFileSync","createInterface","writeFileSync","readFileSync","createInterface","readFileSync","join","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","readFileSync","join","__dirname","dirname","fileURLToPath","getVersion","readFileSync","join"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/auth.ts","../src/lib/config.ts","../src/lib/api-client.ts","../src/lib/output.ts","../src/commands/status.ts","../src/commands/groups.ts","../src/commands/versions.ts","../src/commands/rules.ts","../src/commands/facts.ts","../src/commands/deploy.ts","../src/commands/analytics.ts","../src/commands/history.ts","../src/commands/integrations.ts","../src/commands/logs.ts","../src/types/enums.ts","../src/commands/serve.ts","../src/mcp/server.ts","../src/mcp/tools/_shared.ts","../src/mcp/tools/status.ts","../src/mcp/tools/groups.ts","../src/mcp/tools/versions.ts","../src/mcp/tools/rules.ts","../src/mcp/tools/facts.ts","../src/mcp/tools/deploy.ts","../src/mcp/tools/analytics.ts","../src/mcp/tools/history.ts","../src/mcp/tools/integrations.ts","../src/mcp/tools/logs.ts","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, join } from 'node:path';\nimport { registerAuthCommands } from './commands/auth';\nimport { registerStatusCommand } from './commands/status';\nimport { registerGroupCommands } from './commands/groups';\nimport { registerVersionCommands } from './commands/versions';\nimport { registerRuleCommands } from './commands/rules';\nimport { registerFactCommands } from './commands/facts';\nimport { registerDeployCommands } from './commands/deploy';\nimport { registerAnalyticsCommands } from './commands/analytics';\nimport { registerHistoryCommands } from './commands/history';\nimport { registerIntegrationCommands } from './commands/integrations';\nimport { registerLogCommands } from './commands/logs';\nimport {registerServeCommand} from './commands/serve';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction getVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));\n return pkg.version;\n } catch {\n return '0.0.0';\n }\n}\n\nexport function createCli(): Command {\n const program = new Command();\n\n program\n .name('lexq')\n .description('LexQ CLI — manage policies, simulate rules, and deploy from the terminal.')\n .version(getVersion(), '-V, --version')\n .option('--format <format>', 'Output format: json or table', 'json')\n .option('--api-key <key>', 'Override stored API key')\n .option('--base-url <url>', 'Override API base URL')\n .option('--dry-run', 'Preview the HTTP request without executing')\n .option('--verbose', 'Show request/response details')\n .option('--no-color', 'Disable colored output');\n\n // M1: Auth & Infrastructure\n registerAuthCommands(program);\n registerStatusCommand(program);\n\n // M1+: Policy Groups (CRUD + A/B Test)\n registerGroupCommands(program);\n\n // M2: Versions, Rules, Facts\n registerVersionCommands(program);\n registerRuleCommands(program);\n registerFactCommands(program);\n\n // M3: Deployment & Analytics\n registerDeployCommands(program);\n registerAnalyticsCommands(program);\n\n // M3+: Execution History, Integrations, Failure Logs\n registerHistoryCommands(program);\n registerIntegrationCommands(program);\n registerLogCommands(program);\n\n // // M7: MCP Server\n registerServeCommand(program);\n\n return program;\n}","import { type Command } from 'commander';\nimport { createInterface } from 'node:readline/promises';\nimport { stdin, stdout } from 'node:process';\nimport { saveConfig, deleteConfig, loadConfig, getConfigPath } from '@/lib/config';\nimport { apiRequest } from '@/lib/api-client';\nimport { printJson, printError } from '@/lib/output';\nimport type { WhoAmIResponse } from '@/types/auth';\n\nexport function registerAuthCommands(program: Command): void {\n const auth = program.command('auth').description('Manage authentication');\n\n // ── login ──\n auth\n .command('login')\n .description('Authenticate with your LexQ API key')\n .action(async () => {\n try {\n const rl = createInterface({ input: stdin, output: stdout });\n const apiKey = await rl.question('Enter your API Key: ');\n rl.close();\n\n if (!apiKey.trim()) {\n console.error('API key cannot be empty.');\n process.exit(1);\n }\n\n saveConfig({ apiKey: apiKey.trim() });\n console.log(`✓ API key saved to ${getConfigPath()}`);\n console.log(' Run \"lexq auth whoami\" to verify.');\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── logout ──\n auth\n .command('logout')\n .description('Remove stored credentials')\n .action(() => {\n deleteConfig();\n console.log('✓ Credentials removed.');\n });\n\n // ── whoami ──\n auth\n .command('whoami')\n .description('Show current authentication info')\n .action(async () => {\n try {\n const config = loadConfig();\n if (!config.apiKey) {\n console.error('Not authenticated. Run \"lexq auth login\" first.');\n process.exit(1);\n }\n\n const info = await apiRequest<WhoAmIResponse>(\n 'GET',\n 'whoami',\n { apiKey: config.apiKey, baseUrl: config.baseUrl }\n );\n\n const masked = config.apiKey.length > 8\n ? config.apiKey.substring(0, 4) + '****' + config.apiKey.substring(config.apiKey.length - 4)\n : '****';\n\n printJson({\n ...info,\n apiKey: masked,\n baseUrl: config.baseUrl,\n });\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface LexqConfig {\n apiKey?: string;\n baseUrl: string;\n format: 'json' | 'table';\n}\n\nconst CONFIG_DIR = join(homedir(), '.lexq');\nconst CONFIG_FILE = join(CONFIG_DIR, 'config.json');\n\nconst DEFAULT_CONFIG: LexqConfig = {\n baseUrl: 'https://api.lexq.io/api/v1/partners',\n format: 'json',\n};\n\nexport function loadConfig(): LexqConfig {\n if (!existsSync(CONFIG_FILE)) return { ...DEFAULT_CONFIG };\n\n try {\n const raw = readFileSync(CONFIG_FILE, 'utf-8');\n return { ...DEFAULT_CONFIG, ...JSON.parse(raw) };\n } catch {\n return { ...DEFAULT_CONFIG };\n }\n}\n\nexport function saveConfig(config: Partial<LexqConfig>): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n\n const current = loadConfig();\n const merged = { ...current, ...config };\n writeFileSync(CONFIG_FILE, JSON.stringify(merged, null, 2), 'utf-8');\n}\n\nexport function deleteConfig(): void {\n if (existsSync(CONFIG_FILE)) {\n unlinkSync(CONFIG_FILE);\n }\n}\n\nexport function getConfigPath(): string {\n return CONFIG_FILE;\n}","import { loadConfig } from './config';\nimport type { ApiResponse } from '@/types/api';\n\nexport interface ApiClientOptions {\n apiKey?: string;\n baseUrl?: string;\n dryRun?: boolean;\n verbose?: boolean;\n}\n\nexport class ApiError extends Error {\n constructor(\n public readonly statusCode: number,\n public readonly errorCode: string | null,\n message: string\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\nexport async function apiRequest<T>(\n method: string,\n path: string,\n options: ApiClientOptions & { body?: unknown; params?: Record<string, string> } = {}\n): Promise<T> {\n const config = loadConfig();\n const baseUrl = options.baseUrl ?? config.baseUrl;\n const apiKey = options.apiKey ?? config.apiKey;\n\n if (!apiKey) {\n throw new ApiError(401, 'AUTH', 'Not authenticated. Run \"lexq auth login\" first.');\n }\n\n // Build URL with query params\n const url = new URL(path, baseUrl.endsWith('/') ? baseUrl : baseUrl + '/');\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined && value !== '') {\n url.searchParams.set(key, value);\n }\n }\n }\n\n const headers: Record<string, string> = {\n 'X-API-KEY': apiKey,\n 'Accept': 'application/json',\n };\n\n if (options.body) {\n headers['Content-Type'] = 'application/json';\n }\n\n // Dry-run: print request and exit\n if (options.dryRun) {\n const masked = apiKey.length > 8\n ? apiKey.substring(0, 4) + '****' + apiKey.substring(apiKey.length - 4)\n : '****';\n\n console.log(`${method} ${url.toString()}`);\n console.log('Headers:');\n console.log(` X-API-KEY: ${masked}`);\n console.log(` Content-Type: application/json`);\n if (options.body) {\n console.log('Body:');\n console.log(` ${JSON.stringify(options.body, null, 2)}`);\n }\n console.log('\\n(Use without --dry-run to execute)');\n process.exit(0);\n }\n\n if (options.verbose) {\n console.error(`→ ${method} ${url.toString()}`);\n }\n\n const startTime = Date.now();\n\n const response = await fetch(url.toString(), {\n method,\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (options.verbose) {\n console.error(`← ${response.status} ${response.statusText} (${Date.now() - startTime}ms)`);\n }\n\n // Handle blob responses (export endpoints)\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('text/csv') || contentType.includes('application/octet-stream')) {\n return response as unknown as T;\n }\n\n // No-content responses (DELETE 204 등)\n if (response.status === 204 || contentType === '') {\n return undefined as T;\n }\n\n const json = (await response.json()) as ApiResponse<T>;\n\n if (!response.ok || json.result !== 'SUCCESS') {\n throw new ApiError(\n response.status,\n json.errorCode,\n json.message ?? `Request failed with status ${response.status}`\n );\n }\n\n return json.data;\n}","import Table from 'cli-table3';\n\nexport type OutputFormat = 'json' | 'table';\n\nexport function printJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function printTable(\n headers: string[],\n rows: string[][],\n options?: { truncate?: number }\n): void {\n const table = new Table({\n head: headers,\n style: { head: ['cyan'] },\n wordWrap: true,\n });\n\n for (const row of rows) {\n if (options?.truncate) {\n table.push(\n row.map((cell) =>\n cell.length > options.truncate! ? cell.substring(0, options.truncate!) + '…' : cell\n )\n );\n } else {\n table.push(row);\n }\n }\n\n console.log(table.toString());\n}\n\nexport function printError(error: unknown): void {\n if (error instanceof Error && 'errorCode' in error) {\n const apiErr = error as Error & { errorCode: string | null; statusCode: number };\n const output = {\n error: apiErr.errorCode ?? 'UNKNOWN',\n message: apiErr.message,\n status: apiErr.statusCode,\n };\n console.error(JSON.stringify(output, null, 2));\n } else if (error instanceof Error) {\n console.error(JSON.stringify({ error: 'CLI_ERROR', message: error.message }, null, 2));\n } else {\n console.error(JSON.stringify({ error: 'UNKNOWN', message: String(error) }, null, 2));\n }\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport { printJson, printError } from '@/lib/output';\nimport type { WhoAmIResponse } from '@/types/auth';\n\nexport function registerStatusCommand(program: Command): void {\n program\n .command('status')\n .description('Check API connectivity and authentication')\n .action(async () => {\n const globalOpts = program.opts();\n const startTime = Date.now();\n try {\n const info = await apiRequest<WhoAmIResponse>('GET', 'whoami', {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n });\n printJson({\n status: 'ok',\n latencyMs: Date.now() - startTime,\n tenantId: info.tenantId,\n role: info.role,\n });\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type {\n PolicyGroupSummary,\n PolicyGroupDetail,\n CreatePolicyGroupRequest,\n UpdatePolicyGroupRequest,\n StartAbTestRequest,\n AdjustTrafficRateRequest,\n} from '@/types/groups';\n\nexport function registerGroupCommands(program: Command): void {\n const groups = program.command('groups').description('Manage policy groups');\n\n // ── list ──\n groups\n .command('list')\n .description('List all policy groups')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const data = await apiRequest<PageResponse<PolicyGroupSummary>>(\n 'GET',\n 'policy-groups',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params: { page: opts.page, size: opts.size },\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'Name', 'Status', 'Priority', 'Version', 'Updated'],\n data.content.map((g) => [\n g.id,\n g.name,\n g.status,\n String(g.priority),\n g.currentVersionName ?? '–',\n g.updatedAt.substring(0, 10),\n ]),\n { truncate: 24 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── get ──\n groups\n .command('get')\n .description('Get a policy group by ID')\n .requiredOption('--id <groupId>', 'Policy group ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<PolicyGroupDetail>(\n 'GET',\n `policy-groups/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── create ──\n groups\n .command('create')\n .description('Create a new policy group')\n .requiredOption('--json <body>', 'Request body as JSON string')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = JSON.parse(opts.json) as CreatePolicyGroupRequest;\n const data = await apiRequest<PolicyGroupDetail>(\n 'POST',\n 'policy-groups',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── update ──\n groups\n .command('update')\n .description('Update a policy group')\n .requiredOption('--id <groupId>', 'Policy group ID')\n .requiredOption('--json <body>', 'Request body as JSON string')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = JSON.parse(opts.json) as UpdatePolicyGroupRequest;\n const data = await apiRequest<PolicyGroupDetail>(\n 'PUT',\n `policy-groups/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── delete ──\n groups\n .command('delete')\n .description('Delete a policy group')\n .requiredOption('--id <groupId>', 'Policy group ID')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Delete group ${opts.id}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'DELETE',\n `policy-groups/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n console.log(`✓ Group ${opts.id} deleted.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ══════════════════════════════════════════════════\n // A/B Test\n // ══════════════════════════════════════════════════\n\n const abTest = groups.command('ab-test').description('A/B test management');\n\n // ── start ──\n abTest\n .command('start')\n .description('Start an A/B test')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Challenger version ID')\n .requiredOption('--traffic-rate <rate>', 'Traffic rate for challenger (1-99)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body: StartAbTestRequest = {\n testVersionId: opts.versionId,\n trafficRate: Number(opts.trafficRate),\n };\n const data = await apiRequest<PolicyGroupDetail>(\n 'POST',\n `policy-groups/${opts.groupId}/ab-test`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── stop ──\n abTest\n .command('stop')\n .description('Stop an A/B test')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Stop A/B test for group ${opts.groupId}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n const data = await apiRequest<unknown>(\n 'DELETE',\n `policy-groups/${opts.groupId}/ab-test`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── adjust ──\n abTest\n .command('adjust')\n .description('Adjust A/B test traffic rate')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--traffic-rate <rate>', 'New traffic rate (1-99)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body: AdjustTrafficRateRequest = {\n trafficRate: Number(opts.trafficRate),\n };\n const data = await apiRequest<unknown>(\n 'PATCH',\n `policy-groups/${opts.groupId}/ab-test/traffic-rate`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type { PolicyVersionSummary } from '@/types/versions';\n\nexport function registerVersionCommands(program: Command): void {\n const versions = program.command('versions').description('Manage policy versions');\n\n // ── list ──\n versions\n .command('list')\n .description('List versions for a policy group')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const data = await apiRequest<PageResponse<PolicyVersionSummary>>(\n 'GET',\n `policy-groups/${opts.groupId}/versions`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params: { page: opts.page, size: opts.size },\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'v#', 'Status', 'Commit', 'Hash', 'Created'],\n data.content.map((v) => [\n v.id,\n `v${v.versionNo}`,\n v.status,\n v.commitMessage ?? '–',\n v.snapshotHash ? v.snapshotHash.substring(0, 8) : '–',\n v.createdAt.substring(0, 10),\n ]),\n { truncate: 24 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── get ──\n versions\n .command('get')\n .description('Get a policy version by ID')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--id <versionId>', 'Policy version ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<PolicyVersionSummary>(\n 'GET',\n `policy-groups/${opts.groupId}/versions/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── create ──\n versions\n .command('create')\n .description('Create a new draft version')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .option('--commit-message <message>', 'Commit message')\n .option('--effective-from <date>', 'Effective from (ISO datetime)')\n .option('--effective-to <date>', 'Effective to (ISO datetime)')\n .option('--json <body>', 'Full request body as JSON (overrides other options)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = opts.json\n ? JSON.parse(opts.json)\n : buildCreateBody(opts);\n\n const data = await apiRequest<PolicyVersionSummary>(\n 'POST',\n `policy-groups/${opts.groupId}/versions`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── update ──\n versions\n .command('update')\n .description('Update a draft version metadata')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--id <versionId>', 'Policy version ID')\n .option('--commit-message <message>', 'Commit message')\n .option('--effective-from <date>', 'Effective from (ISO datetime)')\n .option('--effective-to <date>', 'Effective to (ISO datetime)')\n .option('--json <body>', 'Full request body as JSON (overrides other options)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = opts.json\n ? JSON.parse(opts.json)\n : buildUpdateBody(opts);\n\n const data = await apiRequest<PolicyVersionSummary>(\n 'PUT',\n `policy-groups/${opts.groupId}/versions/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── delete ──\n versions\n .command('delete')\n .description('Delete a policy version')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--id <versionId>', 'Policy version ID')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Delete version ${opts.id}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'DELETE',\n `policy-groups/${opts.groupId}/versions/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n console.log(`✓ Version ${opts.id} deleted.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── clone ──\n versions\n .command('clone')\n .description('Clone (duplicate) a policy version')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--id <versionId>', 'Source version ID to clone')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<PolicyVersionSummary>(\n 'POST',\n `policy-groups/${opts.groupId}/versions/${opts.id}/clone`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}\n\n// ── Helpers ──\n\nfunction buildCreateBody(opts: Record<string, string | undefined>): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n if (opts.commitMessage) body.commitMessage = opts.commitMessage;\n if (opts.effectiveFrom) body.effectiveFrom = opts.effectiveFrom;\n if (opts.effectiveTo) body.effectiveTo = opts.effectiveTo;\n return body;\n}\n\nfunction buildUpdateBody(opts: Record<string, string | undefined>): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n if (opts.commitMessage) body.commitMessage = opts.commitMessage;\n if (opts.effectiveFrom) body.effectiveFrom = opts.effectiveFrom;\n if (opts.effectiveTo) body.effectiveTo = opts.effectiveTo;\n return body;\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type {\n PolicyRuleSummary,\n PolicyRuleDetail,\n CreateRuleRequest,\n UpdateRuleRequest,\n ReorderRulesRequest,\n} from '@/types/rules';\n\nexport function registerRuleCommands(program: Command): void {\n const rules = program.command('rules').description('Manage policy rules');\n\n // ── list ──\n rules\n .command('list')\n .description('List rules for a policy version')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const data = await apiRequest<PageResponse<PolicyRuleSummary>>(\n 'GET',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/rules`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params: { page: opts.page, size: opts.size },\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'Name', 'Priority', 'Conditions', 'Actions', 'Enabled'],\n data.content.map((r) => [\n r.id,\n r.name,\n String(r.priority),\n String(r.totalConditionCount),\n String(r.totalActionCount),\n r.isEnabled ? '✓' : '✗',\n ]),\n { truncate: 24 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── get ──\n rules\n .command('get')\n .description('Get a rule by ID')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .requiredOption('--id <ruleId>', 'Rule ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<PolicyRuleDetail>(\n 'GET',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/rules/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── create ──\n rules\n .command('create')\n .description('Create a new rule')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .requiredOption('--json <body>', 'Request body as JSON string')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = JSON.parse(opts.json) as CreateRuleRequest;\n const data = await apiRequest<PolicyRuleDetail>(\n 'POST',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/rules`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── update ──\n rules\n .command('update')\n .description('Update a rule')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .requiredOption('--id <ruleId>', 'Rule ID')\n .requiredOption('--json <body>', 'Request body as JSON string')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = JSON.parse(opts.json) as UpdateRuleRequest;\n const data = await apiRequest<PolicyRuleDetail>(\n 'PUT',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/rules/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── delete ──\n rules\n .command('delete')\n .description('Delete a rule')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .requiredOption('--id <ruleId>', 'Rule ID')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Delete rule ${opts.id}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'DELETE',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/rules/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n console.log(`✓ Rule ${opts.id} deleted.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── reorder ──\n rules\n .command('reorder')\n .description('Reorder rules by priority (drag & drop equivalent)')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .requiredOption('--rule-ids <ids>', 'Comma-separated rule IDs in desired order')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const ruleIds = (opts.ruleIds as string).split(',').map((id: string) => id.trim());\n\n const body: ReorderRulesRequest = {\n rules: ruleIds.map((ruleId, index) => ({\n ruleId,\n priority: index,\n })),\n };\n\n await apiRequest<void>(\n 'PATCH',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/rules/reorder`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n console.log(`✓ ${ruleIds.length} rules reordered.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── toggle ──\n rules\n .command('toggle')\n .description('Enable or disable a rule')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .requiredOption('--id <ruleId>', 'Rule ID')\n .requiredOption('--enabled <boolean>', 'true or false')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const isEnabled = opts.enabled === 'true';\n\n await apiRequest<void>(\n 'PATCH',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/rules/${opts.id}/enabled`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body: { isEnabled },\n }\n );\n console.log(`✓ Rule ${opts.id} ${isEnabled ? 'enabled' : 'disabled'}.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type { FactSchemaResponse } from '@/types/facts';\n\nexport function registerFactCommands(program: Command): void {\n const facts = program.command('facts').description('Manage fact definitions (schema)');\n\n // ── list ──\n facts\n .command('list')\n .description('List fact definitions')\n .option('--keyword <keyword>', 'Filter by keyword')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const params: Record<string, string> = {\n page: opts.page,\n size: opts.size,\n };\n if (opts.keyword) params.keyword = opts.keyword;\n\n const data = await apiRequest<PageResponse<FactSchemaResponse>>(\n 'GET',\n 'schema/facts',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'Key', 'Name', 'Type', 'System', 'Required'],\n data.content.map((f) => [\n f.id,\n f.key,\n f.name,\n f.type,\n f.isSystem ? '✓' : '–',\n f.isRequired ? '✓' : '–',\n ]),\n { truncate: 28 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── create ──\n facts\n .command('create')\n .description('Create a new fact definition')\n .option('--key <key>', 'Fact key (lowercase, underscores)')\n .option('--name <name>', 'Display name')\n .option('--type <type>', 'Value type: STRING, NUMBER, BOOLEAN, LIST_STRING, LIST_NUMBER')\n .option('--description <desc>', 'Description')\n .option('--required', 'Mark as required', false)\n .option('--json <body>', 'Full request body as JSON (overrides other options)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = opts.json\n ? JSON.parse(opts.json)\n : buildCreateBody(opts);\n\n const data = await apiRequest<FactSchemaResponse>(\n 'POST',\n 'schema/facts',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── update ──\n facts\n .command('update')\n .description('Update a fact definition')\n .requiredOption('--id <factId>', 'Fact definition ID')\n .option('--name <name>', 'Display name')\n .option('--description <desc>', 'Description')\n .option('--required', 'Mark as required')\n .option('--no-required', 'Mark as not required')\n .option('--json <body>', 'Full request body as JSON (overrides other options)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = opts.json\n ? JSON.parse(opts.json)\n : buildUpdateBody(opts);\n\n const data = await apiRequest<FactSchemaResponse>(\n 'PUT',\n `schema/facts/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── delete ──\n facts\n .command('delete')\n .description('Delete a fact definition')\n .requiredOption('--id <factId>', 'Fact definition ID')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Delete fact ${opts.id}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'DELETE',\n `schema/facts/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n console.log(`✓ Fact ${opts.id} deleted.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── action-metadata ──\n facts\n .command('action-metadata')\n .description('Get action runtime fact metadata')\n .action(async () => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<unknown>(\n 'GET',\n 'schema/action-metadata',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}\n\n// ── Helpers ──\n\nfunction buildCreateBody(opts: Record<string, string | boolean | undefined>): Record<string, unknown> {\n if (!opts.key || !opts.name || !opts.type) {\n throw new Error('--key, --name, and --type are required (or use --json).');\n }\n const body: Record<string, unknown> = {\n key: opts.key,\n name: opts.name,\n type: opts.type,\n isRequired: opts.required === true,\n };\n if (opts.description) body.description = opts.description;\n return body;\n}\n\nfunction buildUpdateBody(opts: Record<string, string | boolean | undefined>): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n if (opts.name) body.name = opts.name;\n if (opts.description !== undefined) body.description = opts.description;\n if (typeof opts.required === 'boolean') body.isRequired = opts.required;\n return body;\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type { DeploymentSummary, DeploymentDetail, DeploymentStatus } from '@/types/deploy';\n\nexport function registerDeployCommands(program: Command): void {\n const deploy = program.command('deploy').description('Deployment lifecycle and history');\n\n // ── publish ──\n deploy\n .command('publish')\n .description('Publish a DRAFT version (DRAFT → ACTIVE)')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Version ID to publish')\n .option('--memo <memo>', 'Deployment memo')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n await apiRequest<void>(\n 'POST',\n `policy-groups/${opts.groupId}/versions/${opts.versionId}/publish`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body: { memo: opts.memo ?? '' },\n }\n );\n console.log(`✓ Version ${opts.versionId} published.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── live ──\n deploy\n .command('live')\n .description('Deploy an ACTIVE version to live traffic')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Version ID to deploy')\n .option('--memo <memo>', 'Deployment memo')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n await apiRequest<void>(\n 'POST',\n `policy-groups/${opts.groupId}/deploy`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body: { versionId: opts.versionId, memo: opts.memo ?? '' },\n }\n );\n console.log(`✓ Version ${opts.versionId} deployed to live.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── rollback ──\n deploy\n .command('rollback')\n .description('Rollback to the previous deployed version')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .option('--memo <memo>', 'Rollback reason')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Rollback group ${opts.groupId}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'POST',\n `policy-groups/${opts.groupId}/rollback`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body: { memo: opts.memo ?? '' },\n }\n );\n console.log(`✓ Group ${opts.groupId} rolled back.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── undeploy ──\n deploy\n .command('undeploy')\n .description('Remove the live version from a group')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .option('--memo <memo>', 'Undeploy reason')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Undeploy group ${opts.groupId}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'POST',\n `policy-groups/${opts.groupId}/undeploy`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body: { memo: opts.memo ?? '' },\n }\n );\n console.log(`✓ Group ${opts.groupId} undeployed.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── history ──\n deploy\n .command('history')\n .description('List deployment history')\n .option('--group-id <groupId>', 'Filter by policy group')\n .option('--types <types>', 'Filter by types (comma-separated: PUBLISH,DEPLOY,ROLLBACK,UNDEPLOY)')\n .option('--start-date <date>', 'Start date (yyyy-MM-dd)')\n .option('--end-date <date>', 'End date (yyyy-MM-dd)')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const params: Record<string, string> = {\n page: opts.page,\n size: opts.size,\n };\n if (opts.groupId) params.groupId = opts.groupId;\n if (opts.types) params.types = opts.types;\n if (opts.startDate) params.startDate = opts.startDate;\n if (opts.endDate) params.endDate = opts.endDate;\n\n const data = await apiRequest<PageResponse<DeploymentSummary>>(\n 'GET',\n 'deployments',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'Type', 'Group', 'Version', 'By', 'At'],\n data.content.map((d) => [\n d.id.substring(0, 8),\n d.deploymentType,\n d.policyGroupName,\n d.versionNo != null ? `v${d.versionNo}` : '–',\n d.deployedByName,\n d.deployedAt.substring(0, 16),\n ]),\n { truncate: 20 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── detail ──\n deploy\n .command('detail')\n .description('Get deployment detail')\n .requiredOption('--id <deploymentId>', 'Deployment ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<DeploymentDetail>(\n 'GET',\n `deployments/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── overview ──\n deploy\n .command('overview')\n .description('Show deployment status overview for all groups')\n .action(async () => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const data = await apiRequest<DeploymentStatus[]>(\n 'GET',\n 'deployments/overview',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['Group', 'Name', 'Status', 'Current Version', 'Last Deploy'],\n data.map((d) => [\n d.groupId.substring(0, 8),\n d.groupName,\n d.groupStatus,\n d.currentVersionName ?? '–',\n d.lastDeployedAt?.substring(0, 16) ?? '–',\n ])\n );\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── deployable ──\n deploy\n .command('deployable')\n .description('List deployable (ACTIVE) versions for a group')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<unknown[]>(\n 'GET',\n `deployments/groups/${opts.groupId}/deployable-versions`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── diff ──\n deploy\n .command('diff')\n .description('Compare snapshot diff between two versions')\n .requiredOption('--base <versionId>', 'Base version ID')\n .requiredOption('--target <versionId>', 'Target version ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<unknown>(\n 'GET',\n 'deployments/diff',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params: {\n baseVersionId: opts.base,\n targetVersionId: opts.target,\n },\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { readFileSync } from 'node:fs';\nimport { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type {\n DryRunResponse,\n RequirementsResponse,\n SimulationHistoryResponse,\n SimulationResponse,\n} from '@/types/analytics';\n\nexport function registerAnalyticsCommands(program: Command): void {\n const analytics = program.command('analytics').description('Dry run, simulation, and requirements');\n\n // ══════════════════════════════════════════════════\n // Dry Run\n // ══════════════════════════════════════════════════\n\n analytics\n .command('dry-run')\n .description('Execute a single dry run against a version')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .option('--json <body>', 'Request body as JSON string')\n .option('--file <path>', 'Read request body from a JSON file')\n .option('--debug', 'Include debug traces', false)\n .option('--mock', 'Mock external calls', false)\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = resolveBody(opts);\n\n if (!body.facts) {\n throw new Error('Request body must include \"facts\". Use --json or --file.');\n }\n\n body.includeDebugInfo = opts.debug;\n body.mockExternalCalls = opts.mock;\n\n const data = await apiRequest<DryRunResponse>(\n 'POST',\n `analytics/dry-run/versions/${opts.versionId}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ══════════════════════════════════════════════════\n // Dry Run Compare\n // ══════════════════════════════════════════════════\n\n analytics\n .command('dry-run-compare')\n .description('Compare dry run results between two versions')\n .option('--json <body>', 'Request body as JSON string')\n .option('--file <path>', 'Read request body from a JSON file')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = resolveBody(opts);\n\n if (!body.facts || !body.versionIdA || !body.versionIdB) {\n throw new Error('Request body must include \"facts\", \"versionIdA\", \"versionIdB\". Use --json or --file.');\n }\n\n const data = await apiRequest<unknown>(\n 'POST',\n 'analytics/dry-run/compare',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ══════════════════════════════════════════════════\n // Requirements\n // ══════════════════════════════════════════════════\n\n analytics\n .command('requirements')\n .description('Analyze required input facts for a version')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const data = await apiRequest<RequirementsResponse>(\n 'GET',\n `analytics/groups/${opts.groupId}/versions/${opts.versionId}/requirements`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['Key', 'Type', 'Name', 'Required', 'Used By'],\n data.requiredFacts.map((f) => [\n f.key,\n f.type ?? '–',\n f.displayName ?? '–',\n f.required ? '✓' : '–',\n f.usedBy.join(', ') || '–',\n ])\n );\n console.log('\\nExample request:');\n console.log(JSON.stringify(data.exampleRequest, null, 2));\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ══════════════════════════════════════════════════\n // Simulation\n // ══════════════════════════════════════════════════\n\n const sim = analytics.command('simulation').description('Manage batch simulations');\n\n // ── start ──\n sim\n .command('start')\n .description('Start a new batch simulation')\n .requiredOption('--json <body>', 'Simulation request body as JSON')\n .option('--file <path>', 'Read request body from a JSON file')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = resolveBody(opts);\n\n const data = await apiRequest<SimulationResponse>(\n 'POST',\n 'analytics/simulations',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n console.log(`✓ Simulation started: ${data.simulationId} (${data.status})`);\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── status ──\n sim\n .command('status')\n .description('Get simulation status and results')\n .requiredOption('--id <simulationId>', 'Simulation ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<SimulationResponse>(\n 'GET',\n `analytics/simulations/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── list ──\n sim\n .command('list')\n .description('List simulation history')\n .option('--status <status>', 'Filter by status (PENDING, RUNNING, COMPLETED, FAILED, CANCELLED)')\n .option('--from <date>', 'Start date (yyyy-MM-dd)')\n .option('--to <date>', 'End date (yyyy-MM-dd)')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const params: Record<string, string> = {\n page: opts.page,\n size: opts.size,\n };\n if (opts.status) params.status = opts.status;\n if (opts.from) params.from = opts.from;\n if (opts.to) params.to = opts.to;\n\n const data = await apiRequest<PageResponse<SimulationHistoryResponse>>(\n 'GET',\n 'analytics/simulations',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'Group', 'Target', 'Status', 'Match', 'Records', 'Created'],\n data.content.map((s) => [\n s.simulationId.substring(0, 8),\n s.policyGroupName,\n s.targetVersionName ?? '–',\n s.status,\n `${(s.matchRate * 100).toFixed(1)}%`,\n String(s.totalRecords),\n s.createdAt.substring(0, 16),\n ]),\n { truncate: 20 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── cancel ──\n sim\n .command('cancel')\n .description('Cancel a running simulation')\n .requiredOption('--id <simulationId>', 'Simulation ID')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Cancel simulation ${opts.id}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'DELETE',\n `analytics/simulations/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n console.log(`✓ Simulation ${opts.id} cancelled.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── export ──\n sim\n .command('export')\n .description('Export simulation results')\n .requiredOption('--id <simulationId>', 'Simulation ID')\n .option('--format <fmt>', 'Export format: csv or json', 'json')\n .option('--output <path>', 'Output file path')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const exportFormat = opts.format === 'csv' ? 'csv' : 'json';\n\n const response = await apiRequest<unknown>(\n 'GET',\n `analytics/simulations/${opts.id}/export`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params: { format: exportFormat },\n }\n );\n\n if (opts.output) {\n const { writeFileSync } = await import('node:fs');\n const text = typeof response === 'string'\n ? response\n : JSON.stringify(response, null, 2);\n writeFileSync(opts.output, text, 'utf-8');\n console.log(`✓ Exported to ${opts.output}`);\n } else {\n printJson(response);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}\n\n// ── Helpers ──\n\nfunction resolveBody(opts: Record<string, string | boolean | undefined>): Record<string, unknown> {\n if (opts.file) {\n const raw = readFileSync(opts.file as string, 'utf-8');\n return JSON.parse(raw);\n }\n if (opts.json) {\n return JSON.parse(opts.json as string);\n }\n return {};\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type { ExecutionHistorySummary, ExecutionHistoryDetail, ExecutionStatsResponse } from '@/types/history';\n\nexport function registerHistoryCommands(program: Command): void {\n const history = program.command('history').description('Execution history');\n\n // ── list ──\n history\n .command('list')\n .description('List execution history')\n .option('--trace-id <traceId>', 'Filter by trace ID')\n .option('--group-id <groupId>', 'Filter by policy group')\n .option('--version-id <versionId>', 'Filter by version')\n .option('--status <status>', 'Filter by status (SUCCESS, NO_MATCH, ERROR, TIMEOUT)')\n .option('--start-date <date>', 'Start date (yyyy-MM-dd)')\n .option('--end-date <date>', 'End date (yyyy-MM-dd)')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const params: Record<string, string> = {\n page: opts.page,\n size: opts.size,\n };\n if (opts.traceId) params.traceId = opts.traceId;\n if (opts.groupId) params.policyGroupId = opts.groupId;\n if (opts.versionId) params.versionId = opts.versionId;\n if (opts.status) params.status = opts.status;\n if (opts.startDate) params.startDate = opts.startDate;\n if (opts.endDate) params.endDate = opts.endDate;\n\n const data = await apiRequest<PageResponse<ExecutionHistorySummary>>(\n 'GET',\n 'execution/history',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['Trace', 'Group', 'Version', 'Status', 'Matched', 'Latency', 'At'],\n data.content.map((h) => [\n h.traceId.substring(0, 12),\n h.policyGroupName ?? '–',\n h.policyVersionNo != null ? `v${h.policyVersionNo}` : '–',\n h.status,\n h.isMatched ? '✓' : '✗',\n `${h.latencyMs}ms`,\n h.createdAt.substring(0, 16),\n ]),\n { truncate: 20 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── get ──\n history\n .command('get')\n .description('Get execution detail')\n .requiredOption('--id <executionId>', 'Execution history ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<ExecutionHistoryDetail>(\n 'GET',\n `execution/history/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── stats ──\n history\n .command('stats')\n .description('Get execution statistics')\n .option('--group-id <groupId>', 'Filter by policy group')\n .option('--start-date <date>', 'Start date (yyyy-MM-dd)')\n .option('--end-date <date>', 'End date (yyyy-MM-dd)')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const params: Record<string, string> = {};\n if (opts.groupId) params.policyGroupId = opts.groupId;\n if (opts.startDate) params.startDate = opts.startDate;\n if (opts.endDate) params.endDate = opts.endDate;\n\n const data = await apiRequest<ExecutionStatsResponse>(\n 'GET',\n 'execution/history/stats',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['Total', 'Success', 'No Match', 'Failures', 'Success Rate', 'Avg Latency'],\n [[\n String(data.totalExecutions),\n String(data.successCount),\n String(data.noMatchCount),\n String(data.failureCount),\n `${data.successRate}%`,\n `${data.avgLatencyMs}ms`,\n ]]\n );\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type { IntegrationResponse, IntegrationConfigSpecs } from '@/types/integrations';\n\nexport function registerIntegrationCommands(program: Command): void {\n const integrations = program.command('integrations').description('Manage external integrations');\n\n // ── list ──\n integrations\n .command('list')\n .description('List integrations')\n .option('--type <type>', 'Filter by type (COUPON, POINT, NOTIFICATION, CRM, MESSENGER, WEBHOOK)')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const params: Record<string, string> = {\n page: opts.page,\n size: opts.size,\n };\n if (opts.type) params.type = opts.type;\n\n const data = await apiRequest<PageResponse<IntegrationResponse>>(\n 'GET',\n 'integrations',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'Name', 'Type', 'URL', 'Active'],\n data.content.map((i) => [\n i.id.substring(0, 8),\n i.name,\n i.type,\n i.baseUrl,\n i.isActive ? '✓' : '✗',\n ]),\n { truncate: 28 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── get ──\n integrations\n .command('get')\n .description('Get integration detail')\n .requiredOption('--id <integrationId>', 'Integration ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<IntegrationResponse>(\n 'GET',\n `integrations/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── save ──\n integrations\n .command('save')\n .description('Create or update an integration')\n .requiredOption('--json <body>', 'Request body as JSON string')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const body = JSON.parse(opts.json);\n const data = await apiRequest<IntegrationResponse>(\n 'POST',\n 'integrations',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── delete ──\n integrations\n .command('delete')\n .description('Delete an integration')\n .requiredOption('--id <integrationId>', 'Integration ID')\n .option('--force', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n\n if (!opts.force) {\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(`Delete integration ${opts.id}? [y/N] `);\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n console.log('Cancelled.');\n return;\n }\n }\n\n await apiRequest<void>(\n 'DELETE',\n `integrations/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n console.log(`✓ Integration ${opts.id} deleted.`);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── config-spec ──\n integrations\n .command('config-spec')\n .description('Get integration configuration field specs')\n .action(async () => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<IntegrationConfigSpecs>(\n 'GET',\n 'integrations/config-spec',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","import { type Command } from 'commander';\nimport { apiRequest } from '@/lib/api-client';\nimport type { PageResponse } from '@/types/api';\nimport { printJson, printTable, printError, type OutputFormat } from '@/lib/output';\nimport type { FailureLogResponse, BulkActionResponse } from '@/types/logs';\nimport {TaskType} from '@/types/enums'\n\nexport function registerLogCommands(program: Command): void {\n const logs = program.command('logs').description('Failure logs');\n\n // ── list ──\n logs\n .command('list')\n .description('List failure logs')\n .option('--category <category>', 'Filter by category (INTEGRATION, INTERNAL)')\n .option('--task-type <taskType>', `Filter by task type (${TaskType.join(', ')})`)\n .option('--status <status>', 'Filter by status (PENDING, RESOLVED, IGNORED)')\n .option('--keyword <keyword>', 'Search keyword')\n .option('--start-date <date>', 'Start date (yyyy-MM-dd)')\n .option('--end-date <date>', 'End date (yyyy-MM-dd)')\n .option('--page <number>', 'Page number', '0')\n .option('--size <number>', 'Page size', '20')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const format: OutputFormat = globalOpts.format ?? 'json';\n\n const params: Record<string, string> = {\n page: opts.page,\n size: opts.size,\n };\n if (opts.category) params.category = opts.category;\n if (opts.taskType) params.taskType = opts.taskType;\n if (opts.status) params.status = opts.status;\n if (opts.keyword) params.searchKeyword = opts.keyword;\n if (opts.startDate) params.startDate = opts.startDate;\n if (opts.endDate) params.endDate = opts.endDate;\n\n const data = await apiRequest<PageResponse<FailureLogResponse>>(\n 'GET',\n 'failure-logs',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params,\n }\n );\n\n if (format === 'table') {\n printTable(\n ['ID', 'Category', 'Task', 'Status', 'Retries', 'Error', 'Created'],\n data.content.map((l) => [\n l.id.substring(0, 8),\n l.category,\n l.taskType,\n l.status,\n String(l.retryCount),\n l.errorMessage?.substring(0, 24) ?? '–',\n l.createdAt.substring(0, 16),\n ]),\n { truncate: 24 }\n );\n console.log(`\\n${data.totalElements} total · page ${data.pageNo + 1}/${data.totalPages}`);\n } else {\n printJson(data);\n }\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── get ──\n logs\n .command('get')\n .description('Get failure log detail')\n .requiredOption('--id <logId>', 'Log ID')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<FailureLogResponse>(\n 'GET',\n `failure-logs/${opts.id}`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── action ──\n logs\n .command('action')\n .description('Process a failure log action (RETRY, IGNORE, RESOLVE)')\n .requiredOption('--id <logId>', 'Log ID')\n .requiredOption('--action <action>', 'Action: RETRY, IGNORE, or RESOLVE')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const data = await apiRequest<FailureLogResponse>(\n 'POST',\n `failure-logs/${opts.id}/actions`,\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n params: { action: opts.action },\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── bulk-action ──\n logs\n .command('bulk-action')\n .description('Bulk process failure logs')\n .requiredOption('--ids <logIds>', 'Comma-separated log IDs')\n .requiredOption('--action <action>', 'Action: RETRY, IGNORE, or RESOLVE')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const logIds = (opts.ids as string).split(',').map((id: string) => id.trim());\n\n const data = await apiRequest<BulkActionResponse>(\n 'POST',\n 'failure-logs/bulk-actions',\n {\n apiKey: globalOpts.apiKey,\n baseUrl: globalOpts.baseUrl,\n dryRun: globalOpts.dryRun,\n verbose: globalOpts.verbose,\n body: { logIds, action: opts.action },\n }\n );\n printJson(data);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n}","// ── Policy Engine ──\nexport const PolicyGroupStatus = ['ACTIVE', 'DISABLED', 'ARCHIVED'] as const;\nexport type PolicyGroupStatus = (typeof PolicyGroupStatus)[number];\n\nexport const PolicyVersionStatus = ['DRAFT', 'ACTIVE', 'ARCHIVED', 'EXPIRED'] as const;\nexport type PolicyVersionStatus = (typeof PolicyVersionStatus)[number];\n\n// ── Condition & Action ──\nexport const ConditionOperator = [\n 'EQUALS', 'NOT_EQUALS',\n 'GREATER_THAN', 'GREATER_THAN_OR_EQUAL',\n 'LESS_THAN', 'LESS_THAN_OR_EQUAL',\n 'CONTAINS', 'IN', 'NOT_IN',\n] as const;\nexport type ConditionOperator = (typeof ConditionOperator)[number];\n\nexport const LogicalOperator = ['AND', 'OR'] as const;\nexport type LogicalOperator = (typeof LogicalOperator)[number];\n\nexport const ActionType = [\n 'DISCOUNT', 'POINT', 'COUPON_ISSUE', 'BLOCK',\n 'NOTIFICATION', 'WEBHOOK', 'SET_FACT', 'ADD_TAG',\n 'UNKNOWN',\n] as const;\nexport type ActionType = (typeof ActionType)[number];\n\nexport const ValueType = ['STRING', 'NUMBER', 'BOOLEAN', 'LIST_STRING', 'LIST_NUMBER'] as const;\nexport type ValueType = (typeof ValueType)[number];\n\n// ── Conflict Resolution ──\nexport const ConflictResolutionMode = ['NONE', 'EXCLUSIVE', 'MAX_N'] as const;\nexport type ConflictResolutionMode = (typeof ConflictResolutionMode)[number];\n\nexport const ConflictResolutionStrategy = ['FIRST_MATCH', 'HIGHEST_PRIORITY', 'MAX_BENEFIT'] as const;\nexport type ConflictResolutionStrategy = (typeof ConflictResolutionStrategy)[number];\n\n// ── Deployment ──\nexport const DeploymentType = ['PUBLISH', 'DEPLOY', 'ROLLBACK', 'UNDEPLOY'] as const;\nexport type DeploymentType = (typeof DeploymentType)[number];\n\n// ── Execution ──\nexport const ApiExecutionStatus = ['SUCCESS', 'NO_MATCH', 'ERROR', 'TIMEOUT'] as const;\nexport type ApiExecutionStatus = (typeof ApiExecutionStatus)[number];\n\nexport const ApiExecutionType = ['SINGLE_GROUP', 'SPECIFIC_VERSION', 'BATCH', 'COMPOSITE'] as const;\nexport type ApiExecutionType = (typeof ApiExecutionType)[number];\n\n// ── Decision ──\nexport const DecisionStatus = [\n 'SELECTED', 'NO_MATCH', 'NOT_SELECTED',\n 'BLOCKED_MUTEX', 'LOST_PRIORITY', 'DROPPED_LIMIT', 'ERROR',\n] as const;\nexport type DecisionStatus = (typeof DecisionStatus)[number];\n\nexport const DecisionReasonCode = [\n 'FINAL_WINNER',\n 'VERSION_MISMATCH',\n 'EFFECTIVE_DATE_INVALID',\n 'CONDITION_MISMATCH',\n 'MUTEX_PRIORITY_LOST',\n 'MUTEX_LIMIT_REACHED',\n 'GROUP_LIMIT_REACHED',\n 'TOTAL_LIMIT_REACHED',\n 'ACTION_ERROR',\n 'ENGINE_ERROR',\n] as const;\nexport type DecisionReasonCode = (typeof DecisionReasonCode)[number];\n\n// ── Simulation ──\nexport const SimulationStatus = ['PENDING', 'RUNNING', 'COMPLETED', 'FAILED', 'CANCELLED'] as const;\nexport type SimulationStatus = (typeof SimulationStatus)[number];\n\nexport const SimulationDatasetType = ['EXECUTION_LOG', 'MANUAL'] as const;\nexport type SimulationDatasetType = (typeof SimulationDatasetType)[number];\n\nexport const SimulationDatasetSource = ['RECENT', 'DATE_RANGE', 'MANUAL'] as const;\nexport type SimulationDatasetSource = (typeof SimulationDatasetSource)[number];\n\nexport const SimulationMetricType = ['COUNT', 'SUM', 'AVG'] as const;\nexport type SimulationMetricType = (typeof SimulationMetricType)[number];\n\n// ── Auth ──\nexport const Role = ['ADMIN', 'USER', 'VIEWER', 'API_CLIENT'] as const;\nexport type Role = (typeof Role)[number];\n\n// ── Integration ──\nexport const IntegrationType = ['COUPON', 'POINT', 'NOTIFICATION', 'CRM', 'MESSENGER', 'WEBHOOK'] as const;\nexport type IntegrationType = (typeof IntegrationType)[number];\n\n// ── Failure Log ──\nexport const FailureStatus = ['PENDING', 'RESOLVED', 'IGNORED'] as const;\nexport type FailureStatus = (typeof FailureStatus)[number];\n\nexport const FailureAction = ['RETRY', 'IGNORE', 'RESOLVE'] as const;\nexport type FailureAction = (typeof FailureAction)[number];\n\nexport const TaskCategory = ['INTEGRATION', 'INTERNAL'] as const;\nexport type TaskCategory = (typeof TaskCategory)[number];\n\nexport const TaskType = [\n // Integration\n 'COUPON_ISSUE', 'COUPON_CANCEL',\n 'POINT_EARN', 'POINT_USE', 'POINT_REFUND',\n 'NOTIFICATION_SEND',\n 'CRM_SYNC_USER', 'CRM_ADD_TAG',\n 'WEBHOOK_EXECUTE',\n // Internal\n 'IMAGE_PROCESSING', 'DAILY_SETTLEMENT',\n] as const;\nexport type TaskType = (typeof TaskType)[number];","import { type Command } from 'commander';\nimport { startMcpServer } from '@/mcp/server';\n\nexport function registerServeCommand(program: Command): void {\n program\n .command('serve')\n .description('Start LexQ as a server for AI agent integrations')\n .option('--mcp', 'Start as MCP (Model Context Protocol) server over stdio')\n .action(async (opts) => {\n if (!opts.mcp) {\n console.error(\n 'Error: --mcp flag is required.\\n' +\n 'Usage: lexq serve --mcp\\n\\n' +\n 'Starts a stdio MCP server for Claude Desktop, Claude.ai, Gemini, etc.'\n );\n process.exit(1);\n }\n\n await startMcpServer();\n });\n}","import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { registerStatusTools } from './tools/status';\nimport { registerGroupTools } from './tools/groups';\nimport { registerVersionTools } from './tools/versions';\nimport { registerRuleTools } from './tools/rules';\nimport { registerFactTools } from './tools/facts';\nimport { registerDeployTools } from './tools/deploy';\nimport { registerAnalyticsTools } from './tools/analytics';\nimport { registerHistoryTools } from './tools/history';\nimport { registerIntegrationTools } from './tools/integrations';\nimport { registerLogTools } from './tools/logs';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction getVersion(): string {\n try {\n const pkg = JSON.parse(\n readFileSync(join(__dirname, '..', 'package.json'), 'utf-8')\n );\n return pkg.version as string;\n } catch {\n return '0.1.0';\n }\n}\n\nexport async function startMcpServer(): Promise<void> {\n const server = new McpServer({\n name: 'lexq',\n version: getVersion(),\n });\n\n // Register all tool domains (53 tools total)\n registerStatusTools(server);\n registerGroupTools(server);\n registerVersionTools(server);\n registerRuleTools(server);\n registerFactTools(server);\n registerDeployTools(server);\n registerAnalyticsTools(server);\n registerHistoryTools(server);\n registerIntegrationTools(server);\n registerLogTools(server);\n\n // Connect via stdio transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}","import { apiRequest, type ApiClientOptions } from '@/lib/api-client';\nimport { loadConfig } from '@/lib/config';\n\nexport interface McpToolResult {\n [key: string]: unknown;\n content: Array<{ type: 'text'; text: string }>;\n isError?: boolean;\n}\n\nexport function getMcpClientOptions(): ApiClientOptions {\n const config = loadConfig();\n return {\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n };\n}\n\nexport async function callApi<T>(\n method: string,\n path: string,\n opts?: { body?: unknown; params?: Record<string, string> }\n): Promise<McpToolResult> {\n try {\n const clientOpts = getMcpClientOptions();\n const data = await apiRequest<T>(method, path, {\n ...clientOpts,\n body: opts?.body,\n params: opts?.params,\n });\n return {\n content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: message }) }],\n isError: true,\n };\n }\n}\n\nexport function paginationParams(\n page?: number,\n size?: number\n): Record<string, string> {\n const params: Record<string, string> = {};\n if (page !== undefined) params.page = String(page);\n if (size !== undefined) params.size = String(size);\n return params;\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { callApi } from './_shared';\n\nexport function registerStatusTools(server: McpServer): void {\n server.registerTool(\n 'lexq_whoami',\n {\n title: 'Who Am I',\n description: 'Show current authentication info (tenant name, role, API key mask).',\n inputSchema: {},\n },\n async () => callApi('GET', 'whoami')\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerGroupTools(server: McpServer): void {\n // ── CRUD ──\n\n server.registerTool(\n 'lexq_groups_list',\n {\n title: 'List Policy Groups',\n description:\n 'List all policy groups. Supports pagination and optional status/keyword filters.',\n inputSchema: {\n page: z.number().int().min(0).default(0).describe('Page number (0-indexed)'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n status: z\n .enum(['ACTIVE', 'DISABLED', 'ARCHIVED'])\n .optional()\n .describe('Filter by status'),\n keyword: z.string().optional().describe('Search keyword'),\n },\n },\n async ({ page, size, status, keyword }) => {\n const params: Record<string, string> = paginationParams(page, size);\n if (status) params.status = status;\n if (keyword) params.keyword = keyword;\n return callApi('GET', 'policy-groups', { params });\n }\n );\n\n server.registerTool(\n 'lexq_groups_get',\n {\n title: 'Get Policy Group',\n description: 'Get a single policy group by ID.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n },\n },\n async ({ groupId }) => callApi('GET', `policy-groups/${groupId}`)\n );\n\n server.registerTool(\n 'lexq_groups_create',\n {\n title: 'Create Policy Group',\n description:\n 'Create a new policy group. Requires name and priority. Optionally set conflict resolution, activation group, and description.',\n inputSchema: {\n name: z.string().describe('Group name (unique among non-ARCHIVED)'),\n priority: z.number().int().min(0).describe('Execution priority (lower = higher)'),\n description: z.string().optional().describe('Group description'),\n conflictResolutionMode: z\n .enum(['NONE', 'EXCLUSIVE', 'MAX_N'])\n .optional()\n .describe('Conflict resolution mode'),\n conflictResolutionStrategy: z\n .enum(['FIRST_MATCH', 'HIGHEST_PRIORITY', 'MAX_BENEFIT'])\n .optional()\n .describe('Strategy when mode is EXCLUSIVE or MAX_N'),\n maxSelections: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe('Max selections (required when mode is MAX_N)'),\n activationGroupId: z.string().uuid().optional().describe('Activation group ID'),\n },\n },\n async (args) => {\n const body: Record<string, unknown> = {\n name: args.name,\n priority: args.priority,\n };\n if (args.description !== undefined) body.description = args.description;\n if (args.conflictResolutionMode !== undefined)\n body.conflictResolutionMode = args.conflictResolutionMode;\n if (args.conflictResolutionStrategy !== undefined)\n body.conflictResolutionStrategy = args.conflictResolutionStrategy;\n if (args.maxSelections !== undefined) body.maxSelections = args.maxSelections;\n if (args.activationGroupId !== undefined)\n body.activationGroupId = args.activationGroupId;\n return callApi('POST', 'policy-groups', { body });\n }\n );\n\n server.registerTool(\n 'lexq_groups_update',\n {\n title: 'Update Policy Group',\n description: 'Update an existing policy group. Only provided fields are updated.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n name: z.string().optional().describe('New name'),\n priority: z.number().int().min(0).optional().describe('New priority'),\n description: z.string().optional().describe('New description'),\n status: z\n .enum(['ACTIVE', 'DISABLED'])\n .optional()\n .describe('Status (DISABLED = emergency stop)'),\n conflictResolutionMode: z\n .enum(['NONE', 'EXCLUSIVE', 'MAX_N'])\n .optional()\n .describe('Conflict resolution mode'),\n conflictResolutionStrategy: z\n .enum(['FIRST_MATCH', 'HIGHEST_PRIORITY', 'MAX_BENEFIT'])\n .optional()\n .describe('Strategy'),\n maxSelections: z.number().int().min(1).optional().describe('Max selections'),\n },\n },\n async ({ groupId, ...body }) =>\n callApi('PATCH', `policy-groups/${groupId}`, { body })\n );\n\n server.registerTool(\n 'lexq_groups_delete',\n {\n title: 'Delete Policy Group',\n description:\n 'Archive a policy group. Only non-live groups can be deleted. This is irreversible.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n },\n },\n async ({ groupId }) => callApi('DELETE', `policy-groups/${groupId}`)\n );\n\n // ── A/B Test ──\n\n server.registerTool(\n 'lexq_ab_test_start',\n {\n title: 'Start A/B Test',\n description:\n 'Start an A/B test on a policy group. Requires a challenger version ID and traffic split percentages.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n challengerVersionId: z.string().uuid().describe('Challenger version ID'),\n controlWeight: z\n .number()\n .int()\n .min(1)\n .max(99)\n .describe('Control traffic weight (%)'),\n challengerWeight: z\n .number()\n .int()\n .min(1)\n .max(99)\n .describe('Challenger traffic weight (%)'),\n identityKey: z\n .string()\n .optional()\n .describe('Fact key for sticky assignment (e.g. customer_id)'),\n },\n },\n async ({ groupId, ...body }) =>\n callApi('POST', `policy-groups/${groupId}/ab-test/start`, { body })\n );\n\n server.registerTool(\n 'lexq_ab_test_stop',\n {\n title: 'Stop A/B Test',\n description: 'Stop a running A/B test. Specify which version to keep.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n winnerVersionId: z.string().uuid().describe('Version ID to keep as live'),\n },\n },\n async ({ groupId, ...body }) =>\n callApi('POST', `policy-groups/${groupId}/ab-test/stop`, { body })\n );\n\n server.registerTool(\n 'lexq_ab_test_adjust',\n {\n title: 'Adjust A/B Test',\n description: 'Adjust traffic weights of a running A/B test.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n controlWeight: z.number().int().min(1).max(99).describe('New control weight (%)'),\n challengerWeight: z\n .number()\n .int()\n .min(1)\n .max(99)\n .describe('New challenger weight (%)'),\n },\n },\n async ({ groupId, ...body }) =>\n callApi('POST', `policy-groups/${groupId}/ab-test/adjust`, { body })\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerVersionTools(server: McpServer): void {\n server.registerTool(\n 'lexq_versions_list',\n {\n title: 'List Policy Versions',\n description: 'List all versions of a policy group.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n },\n },\n async ({ groupId, page, size }) =>\n callApi('GET', `policy-groups/${groupId}/versions`, {\n params: paginationParams(page, size),\n })\n );\n\n server.registerTool(\n 'lexq_versions_get',\n {\n title: 'Get Policy Version',\n description: 'Get a single version by ID, including its rules and fact requirements.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n },\n },\n async ({ groupId, versionId }) =>\n callApi('GET', `policy-groups/${groupId}/versions/${versionId}`)\n );\n\n server.registerTool(\n 'lexq_versions_create',\n {\n title: 'Create Policy Version',\n description:\n 'Create a new DRAFT version in a policy group. Provide a commit message and optional effective date range.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n commitMessage: z.string().describe('Commit message describing this version'),\n effectiveFrom: z\n .string()\n .optional()\n .describe('Effective start date (ISO 8601)'),\n effectiveTo: z\n .string()\n .optional()\n .describe('Effective end date (ISO 8601)'),\n },\n },\n async ({ groupId, ...body }) =>\n callApi('POST', `policy-groups/${groupId}/versions`, { body })\n );\n\n server.registerTool(\n 'lexq_versions_update',\n {\n title: 'Update Policy Version',\n description: 'Update a DRAFT version. Only DRAFT versions can be modified.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n commitMessage: z.string().optional().describe('New commit message'),\n effectiveFrom: z.string().optional().describe('New effective start date'),\n effectiveTo: z.string().optional().describe('New effective end date'),\n },\n },\n async ({ groupId, versionId, ...body }) =>\n callApi('PATCH', `policy-groups/${groupId}/versions/${versionId}`, { body })\n );\n\n server.registerTool(\n 'lexq_versions_delete',\n {\n title: 'Delete Policy Version',\n description: 'Delete a DRAFT version. Only DRAFT versions can be deleted.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n },\n },\n async ({ groupId, versionId }) =>\n callApi('DELETE', `policy-groups/${groupId}/versions/${versionId}`)\n );\n\n server.registerTool(\n 'lexq_versions_clone',\n {\n title: 'Clone Policy Version',\n description:\n 'Clone an existing version to create a new DRAFT. Useful when the source version is already published.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Source version ID to clone'),\n commitMessage: z\n .string()\n .optional()\n .describe('Commit message for the cloned version'),\n },\n },\n async ({ groupId, versionId, commitMessage }) => {\n const body: Record<string, unknown> = {};\n if (commitMessage !== undefined) body.commitMessage = commitMessage;\n return callApi('POST', `policy-groups/${groupId}/versions/${versionId}/clone`, {\n body,\n });\n }\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\n// Condition/Action are deeply nested JSON — accept as opaque object via z.record.\n// The engine validates structure. MCP schema describes the shape in descriptions.\n\nexport function registerRuleTools(server: McpServer): void {\n server.registerTool(\n 'lexq_rules_list',\n {\n title: 'List Rules',\n description: 'List all rules in a version. Returns summary with conditionSummary and actionSummary.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n },\n },\n async ({ groupId, versionId, page, size }) =>\n callApi('GET', `policy-groups/${groupId}/versions/${versionId}/rules`, {\n params: paginationParams(page, size),\n })\n );\n\n server.registerTool(\n 'lexq_rules_get',\n {\n title: 'Get Rule Detail',\n description:\n 'Get full rule detail including condition tree and action definitions.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n ruleId: z.string().uuid().describe('Rule ID'),\n },\n },\n async ({ groupId, versionId, ruleId }) =>\n callApi(\n 'GET',\n `policy-groups/${groupId}/versions/${versionId}/rules/${ruleId}`\n )\n );\n\n server.registerTool(\n 'lexq_rules_create',\n {\n title: 'Create Rule',\n description: `Create a rule in a DRAFT version. Requires name, priority, condition tree, and actions array.\n\nCondition: { type: \"SINGLE\", field, operator, value, valueType } or { type: \"GROUP\", operator: \"AND\"|\"OR\", children: [...] }\nOperators: EQUALS, NOT_EQUALS, GREATER_THAN, GREATER_THAN_OR_EQUAL, LESS_THAN, LESS_THAN_OR_EQUAL, CONTAINS, IN, NOT_IN\nValue types: STRING, NUMBER, BOOLEAN, LIST_STRING, LIST_NUMBER\n\nActions: [{ type, parameters }]\nTypes: DISCOUNT, POINT, COUPON_ISSUE, BLOCK, NOTIFICATION, WEBHOOK, SET_FACT, ADD_TAG`,\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n rule: z\n .string()\n .describe(\n 'JSON string of CreateRuleRequest: { name, priority, condition, actions, mutexGroup?, mutexMode?, mutexStrategy?, mutexLimit?, isEnabled? }'\n ),\n },\n },\n async ({ groupId, versionId, rule }) => {\n const body: unknown = JSON.parse(rule);\n return callApi(\n 'POST',\n `policy-groups/${groupId}/versions/${versionId}/rules`,\n { body }\n );\n }\n );\n\n server.registerTool(\n 'lexq_rules_update',\n {\n title: 'Update Rule',\n description:\n 'Update an existing rule in a DRAFT version. Only provided fields are changed.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n ruleId: z.string().uuid().describe('Rule ID'),\n rule: z\n .string()\n .describe(\n 'JSON string of UpdateRuleRequest: { name?, priority?, condition?, actions?, mutexGroup?, mutexMode?, mutexStrategy?, mutexLimit?, isEnabled? }'\n ),\n },\n },\n async ({ groupId, versionId, ruleId, rule }) => {\n const body: unknown = JSON.parse(rule);\n return callApi(\n 'PATCH',\n `policy-groups/${groupId}/versions/${versionId}/rules/${ruleId}`,\n { body }\n );\n }\n );\n\n server.registerTool(\n 'lexq_rules_delete',\n {\n title: 'Delete Rule',\n description: 'Delete a rule from a DRAFT version.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n ruleId: z.string().uuid().describe('Rule ID'),\n force: z\n .boolean()\n .default(false)\n .describe('Skip confirmation (for the last rule in a version)'),\n },\n },\n async ({ groupId, versionId, ruleId, force }) => {\n const params: Record<string, string> = {};\n if (force) params.force = 'true';\n return callApi(\n 'DELETE',\n `policy-groups/${groupId}/versions/${versionId}/rules/${ruleId}`,\n { params }\n );\n }\n );\n\n server.registerTool(\n 'lexq_rules_reorder',\n {\n title: 'Reorder Rules',\n description:\n 'Reorder rules by specifying rule IDs and their new priorities. Array index 0 = highest priority.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n ruleIds: z\n .array(z.string().uuid())\n .describe('Rule IDs in desired priority order'),\n },\n },\n async ({ groupId, versionId, ruleIds }) => {\n const rules = ruleIds.map((ruleId: string, index: number) => ({\n ruleId,\n priority: index,\n }));\n return callApi(\n 'PUT',\n `policy-groups/${groupId}/versions/${versionId}/rules/reorder`,\n { body: { rules } }\n );\n }\n );\n\n server.registerTool(\n 'lexq_rules_toggle',\n {\n title: 'Toggle Rule',\n description: 'Enable or disable a rule without deleting it.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n ruleId: z.string().uuid().describe('Rule ID'),\n isEnabled: z.boolean().describe('true to enable, false to disable'),\n },\n },\n async ({ groupId, versionId, ruleId, isEnabled }) =>\n callApi(\n 'PATCH',\n `policy-groups/${groupId}/versions/${versionId}/rules/${ruleId}/toggle`,\n { body: { isEnabled } }\n )\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerFactTools(server: McpServer): void {\n server.registerTool(\n 'lexq_facts_list',\n {\n title: 'List Fact Definitions',\n description:\n 'List all fact definitions (input variable schema). Shows key, type, and required status. Always check this before creating rules.',\n inputSchema: {\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n keyword: z.string().optional().describe('Search keyword'),\n },\n },\n async ({ page, size, keyword }) => {\n const params: Record<string, string> = paginationParams(page, size);\n if (keyword) params.keyword = keyword;\n return callApi('GET', 'schema/facts', { params });\n }\n );\n\n server.registerTool(\n 'lexq_facts_create',\n {\n title: 'Create Fact Definition',\n description:\n 'Register a new input variable. Key must be lowercase with underscores (e.g. payment_amount). Types: STRING, NUMBER, BOOLEAN, LIST_STRING, LIST_NUMBER.',\n inputSchema: {\n key: z\n .string()\n .regex(/^[a-z][a-z0-9_]*$/)\n .describe('Variable key (snake_case)'),\n name: z.string().describe('Display name'),\n type: z\n .enum(['STRING', 'NUMBER', 'BOOLEAN', 'LIST_STRING', 'LIST_NUMBER'])\n .describe('Value type'),\n description: z.string().optional().describe('Description'),\n isRequired: z\n .boolean()\n .default(false)\n .describe('Whether this fact is required for rule evaluation'),\n },\n },\n async (args) => callApi('POST', 'schema/facts', { body: args })\n );\n\n server.registerTool(\n 'lexq_facts_update',\n {\n title: 'Update Fact Definition',\n description:\n 'Update a fact definition. Key and type cannot be changed. System facts only allow name and description changes.',\n inputSchema: {\n factId: z.string().uuid().describe('Fact definition ID'),\n name: z.string().describe('Display name'),\n description: z.string().optional().describe('Description'),\n isRequired: z.boolean().describe('Required flag'),\n },\n },\n async ({ factId, ...body }) =>\n callApi('PATCH', `schema/facts/${factId}`, { body })\n );\n\n server.registerTool(\n 'lexq_facts_delete',\n {\n title: 'Delete Fact Definition',\n description:\n 'Delete a fact definition. System facts cannot be deleted.',\n inputSchema: {\n factId: z.string().uuid().describe('Fact definition ID'),\n },\n },\n async ({ factId }) => callApi('DELETE', `schema/facts/${factId}`)\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerDeployTools(server: McpServer): void {\n server.registerTool(\n 'lexq_deploy_publish',\n {\n title: 'Publish Version',\n description:\n 'Publish a DRAFT version (DRAFT → ACTIVE). Locks the version from further edits. Must have at least one rule.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID to publish'),\n memo: z.string().default('').describe('Deployment memo'),\n },\n },\n async ({ groupId, versionId, memo }) =>\n callApi(\n 'POST',\n `policy-groups/${groupId}/versions/${versionId}/publish`,\n { body: { memo } }\n )\n );\n\n server.registerTool(\n 'lexq_deploy_live',\n {\n title: 'Deploy to Live',\n description:\n 'Deploy an ACTIVE (published) version to live traffic. Takes effect immediately.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID to deploy'),\n memo: z.string().default('').describe('Deployment memo'),\n },\n },\n async ({ groupId, versionId, memo }) =>\n callApi('POST', `policy-groups/${groupId}/deploy`, {\n body: { versionId, memo },\n })\n );\n\n server.registerTool(\n 'lexq_deploy_rollback',\n {\n title: 'Rollback Deployment',\n description:\n 'Rollback to the previous deployed version. Only available if there is a previous version.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n memo: z.string().default('').describe('Rollback reason'),\n },\n },\n async ({ groupId, memo }) =>\n callApi('POST', `policy-groups/${groupId}/rollback`, {\n body: { memo },\n })\n );\n\n server.registerTool(\n 'lexq_deploy_undeploy',\n {\n title: 'Undeploy',\n description:\n 'Remove the live version from traffic. The version stays ACTIVE but no longer serves requests.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n memo: z.string().default('').describe('Undeploy reason'),\n },\n },\n async ({ groupId, memo }) =>\n callApi('POST', `policy-groups/${groupId}/undeploy`, {\n body: { memo },\n })\n );\n\n server.registerTool(\n 'lexq_deploy_history',\n {\n title: 'Deployment History',\n description: 'List deployment history across all groups.',\n inputSchema: {\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n groupId: z.string().uuid().optional().describe('Filter by group ID'),\n type: z\n .enum(['PUBLISH', 'DEPLOY', 'ROLLBACK', 'UNDEPLOY'])\n .optional()\n .describe('Filter by deployment type'),\n },\n },\n async ({ page, size, groupId, type }) => {\n const params: Record<string, string> = paginationParams(page, size);\n if (groupId) params.groupId = groupId;\n if (type) params.type = type;\n return callApi('GET', 'deployments', { params });\n }\n );\n\n server.registerTool(\n 'lexq_deploy_detail',\n {\n title: 'Deployment Detail',\n description:\n 'Get detailed info about a specific deployment including snapshot hash and integrity check.',\n inputSchema: {\n deploymentId: z.string().uuid().describe('Deployment ID'),\n },\n },\n async ({ deploymentId }) =>\n callApi('GET', `deployments/${deploymentId}`)\n );\n\n server.registerTool(\n 'lexq_deploy_overview',\n {\n title: 'Deployment Overview',\n description:\n 'Show current deployment status of all groups — which version is live, last deployment type, and deployer.',\n inputSchema: {},\n },\n async () => callApi('GET', 'deployments/overview')\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerAnalyticsTools(server: McpServer): void {\n // ── Dry Run ──\n\n server.registerTool(\n 'lexq_dry_run',\n {\n title: 'Dry Run',\n description: `Execute a single dry run against a version. Tests how rules evaluate given input facts without side effects.\n\nExample input: { \"facts\": { \"payment_amount\": 100000, \"customer_tier\": \"VIP\" } }\n\nAlways dry-run before publishing to validate rule behavior.`,\n inputSchema: {\n versionId: z.string().uuid().describe('Policy version ID to test against'),\n facts: z\n .string()\n .describe('JSON string of facts object, e.g. {\"payment_amount\":100000}'),\n includeDebugInfo: z\n .boolean()\n .default(true)\n .describe('Include execution and decision traces'),\n mockExternalCalls: z\n .boolean()\n .default(true)\n .describe('Mock external integration calls'),\n },\n },\n async ({ versionId, facts, includeDebugInfo, mockExternalCalls }) => {\n const parsedFacts: unknown = JSON.parse(facts);\n return callApi('POST', `analytics/dry-run/versions/${versionId}`, {\n body: { facts: parsedFacts, includeDebugInfo, mockExternalCalls },\n });\n }\n );\n\n // ── Dry Run Compare ──\n\n server.registerTool(\n 'lexq_dry_run_compare',\n {\n title: 'Dry Run Compare',\n description:\n 'Compare dry run results between two versions using the same input facts. Useful for validating changes.',\n inputSchema: {\n versionIdA: z.string().uuid().describe('Baseline version ID'),\n versionIdB: z.string().uuid().describe('Candidate version ID'),\n facts: z\n .string()\n .describe('JSON string of facts object'),\n },\n },\n async ({ versionIdA, versionIdB, facts }) => {\n const parsedFacts: unknown = JSON.parse(facts);\n return callApi('POST', 'analytics/dry-run/compare', {\n body: { versionIdA, versionIdB, facts: parsedFacts },\n });\n }\n );\n\n // ── Requirements ──\n\n server.registerTool(\n 'lexq_requirements',\n {\n title: 'Analyze Requirements',\n description:\n 'Analyze which input facts a version requires. Returns required keys, types, and an example request body.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n },\n },\n async ({ groupId, versionId }) =>\n callApi(\n 'GET',\n `analytics/groups/${groupId}/versions/${versionId}/requirements`\n )\n );\n\n // ── Simulation ──\n\n server.registerTool(\n 'lexq_simulation_start',\n {\n title: 'Start Simulation',\n description: `Start a batch simulation against historical execution data.\n\nExample body:\n{\n \"policyVersionId\": \"<uuid>\",\n \"dataset\": { \"type\": \"HISTORICAL\", \"source\": \"EXECUTION_LOGS\", \"from\": \"2025-01-01\", \"to\": \"2025-01-31\" },\n \"options\": { \"baselinePolicyVersionId\": \"<uuid>\", \"includeRuleStats\": true, \"maxRecords\": 10000 }\n}`,\n inputSchema: {\n body: z\n .string()\n .describe('JSON string of SimulationRequest'),\n },\n },\n async ({ body }) => {\n const parsed: unknown = JSON.parse(body);\n return callApi('POST', 'analytics/simulations', { body: parsed });\n }\n );\n\n server.registerTool(\n 'lexq_simulation_status',\n {\n title: 'Simulation Status',\n description:\n 'Get simulation status and results. Poll until status is COMPLETED or FAILED.',\n inputSchema: {\n simulationId: z.string().uuid().describe('Simulation ID'),\n },\n },\n async ({ simulationId }) =>\n callApi('GET', `analytics/simulations/${simulationId}`)\n );\n\n server.registerTool(\n 'lexq_simulation_list',\n {\n title: 'List Simulations',\n description: 'List simulation history with optional filters.',\n inputSchema: {\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n status: z\n .enum(['PENDING', 'RUNNING', 'COMPLETED', 'FAILED', 'CANCELLED'])\n .optional()\n .describe('Filter by status'),\n from: z.string().optional().describe('Start date (yyyy-MM-dd)'),\n to: z.string().optional().describe('End date (yyyy-MM-dd)'),\n },\n },\n async ({ page, size, status, from, to }) => {\n const params: Record<string, string> = paginationParams(page, size);\n if (status) params.status = status;\n if (from) params.from = from;\n if (to) params.to = to;\n return callApi('GET', 'analytics/simulations', { params });\n }\n );\n\n server.registerTool(\n 'lexq_simulation_cancel',\n {\n title: 'Cancel Simulation',\n description: 'Cancel a running or pending simulation.',\n inputSchema: {\n simulationId: z.string().uuid().describe('Simulation ID'),\n },\n },\n async ({ simulationId }) =>\n callApi('DELETE', `analytics/simulations/${simulationId}`)\n );\n\n server.registerTool(\n 'lexq_simulation_export',\n {\n title: 'Export Simulation',\n description:\n 'Export simulation results as JSON or CSV. Returns the raw data.',\n inputSchema: {\n simulationId: z.string().uuid().describe('Simulation ID'),\n format: z\n .enum(['json', 'csv'])\n .default('json')\n .describe('Export format'),\n },\n },\n async ({ simulationId, format }) =>\n callApi('GET', `analytics/simulations/${simulationId}/export`, {\n params: { format },\n })\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerHistoryTools(server: McpServer): void {\n server.registerTool(\n 'lexq_history_list',\n {\n title: 'List Execution History',\n description:\n 'List policy execution history. Shows trace ID, group, version, status, match result, and latency.',\n inputSchema: {\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n traceId: z.string().optional().describe('Filter by trace ID'),\n groupId: z.string().uuid().optional().describe('Filter by policy group'),\n versionId: z.string().uuid().optional().describe('Filter by version'),\n status: z\n .enum(['SUCCESS', 'NO_MATCH', 'ERROR', 'TIMEOUT'])\n .optional()\n .describe('Filter by execution status'),\n startDate: z.string().optional().describe('Start date (yyyy-MM-dd)'),\n endDate: z.string().optional().describe('End date (yyyy-MM-dd)'),\n },\n },\n async ({ page, size, traceId, groupId, versionId, status, startDate, endDate }) => {\n const params: Record<string, string> = paginationParams(page, size);\n if (traceId) params.traceId = traceId;\n if (groupId) params.policyGroupId = groupId;\n if (versionId) params.versionId = versionId;\n if (status) params.status = status;\n if (startDate) params.startDate = startDate;\n if (endDate) params.endDate = endDate;\n return callApi('GET', 'execution/history', { params });\n }\n );\n\n server.registerTool(\n 'lexq_history_get',\n {\n title: 'Get Execution Detail',\n description:\n 'Get full execution detail including request facts, result traces, and decision traces.',\n inputSchema: {\n executionId: z.string().uuid().describe('Execution history ID'),\n },\n },\n async ({ executionId }) =>\n callApi('GET', `execution/history/${executionId}`)\n );\n\n server.registerTool(\n 'lexq_history_stats',\n {\n title: 'Execution Statistics',\n description:\n 'Get execution KPIs: total executions, success/failure counts, success rate, and average latency.',\n inputSchema: {\n groupId: z.string().uuid().optional().describe('Filter by policy group'),\n startDate: z.string().optional().describe('Start date (yyyy-MM-dd)'),\n endDate: z.string().optional().describe('End date (yyyy-MM-dd)'),\n },\n },\n async ({ groupId, startDate, endDate }) => {\n const params: Record<string, string> = {};\n if (groupId) params.policyGroupId = groupId;\n if (startDate) params.startDate = startDate;\n if (endDate) params.endDate = endDate;\n return callApi('GET', 'execution/history/stats', { params });\n }\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\n\nexport function registerIntegrationTools(server: McpServer): void {\n server.registerTool(\n 'lexq_integrations_list',\n {\n title: 'List Integrations',\n description: 'List all external integrations (webhooks, CRM, notification, etc.).',\n inputSchema: {\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n type: z\n .enum(['COUPON', 'POINT', 'NOTIFICATION', 'CRM', 'MESSENGER', 'WEBHOOK'])\n .optional()\n .describe('Filter by integration type'),\n },\n },\n async ({ page, size, type }) => {\n const params: Record<string, string> = paginationParams(page, size);\n if (type) params.type = type;\n return callApi('GET', 'integrations', { params });\n }\n );\n\n server.registerTool(\n 'lexq_integrations_get',\n {\n title: 'Get Integration',\n description: 'Get integration detail by ID.',\n inputSchema: {\n integrationId: z.string().uuid().describe('Integration ID'),\n },\n },\n async ({ integrationId }) =>\n callApi('GET', `integrations/${integrationId}`)\n );\n\n server.registerTool(\n 'lexq_integrations_save',\n {\n title: 'Save Integration',\n description:\n 'Create or update an integration. Types: COUPON, POINT, NOTIFICATION, CRM, MESSENGER, WEBHOOK.',\n inputSchema: {\n type: z\n .enum(['COUPON', 'POINT', 'NOTIFICATION', 'CRM', 'MESSENGER', 'WEBHOOK'])\n .describe('Integration type'),\n name: z.string().describe('Integration name'),\n baseUrl: z.string().describe('Base URL of the external service'),\n apiKey: z.string().optional().describe('API key or token for the service'),\n isActive: z.boolean().default(true).describe('Whether the integration is active'),\n config: z\n .string()\n .optional()\n .describe('JSON string of additional config key-value pairs'),\n },\n },\n async ({ config, ...rest }) => {\n const body: Record<string, unknown> = { ...rest };\n if (config) body.config = JSON.parse(config);\n return callApi('POST', 'integrations', { body });\n }\n );\n\n server.registerTool(\n 'lexq_integrations_delete',\n {\n title: 'Delete Integration',\n description: 'Delete an integration by ID.',\n inputSchema: {\n integrationId: z.string().uuid().describe('Integration ID'),\n },\n },\n async ({ integrationId }) =>\n callApi('DELETE', `integrations/${integrationId}`)\n );\n\n server.registerTool(\n 'lexq_integrations_config_spec',\n {\n title: 'Integration Config Spec',\n description:\n 'Show available integration types and their required configuration fields.',\n inputSchema: {},\n },\n async () => callApi('GET', 'integrations/config-spec')\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { callApi, paginationParams } from './_shared';\nimport {FailureAction, FailureStatus, TaskCategory, TaskType} from '@/types/enums'\n\nexport function registerLogTools(server: McpServer): void {\n server.registerTool(\n 'lexq_logs_list',\n {\n title: 'List Failure Logs',\n description:\n 'List system failure logs from background tasks (webhook calls, coupon issuance, etc.).',\n inputSchema: {\n page: z.number().int().min(0).default(0).describe('Page number'),\n size: z.number().int().min(1).max(100).default(20).describe('Page size'),\n category: z\n .enum(TaskCategory)\n .optional()\n .describe('Task category'),\n taskType: z\n .enum(TaskType)\n .optional()\n .describe('Task type'),\n status: z\n .enum(FailureStatus)\n .optional()\n .describe('Log status'),\n keyword: z\n .string()\n .optional()\n .describe('Search in refId, refSubId, errorMessage'),\n startDate: z.string().optional().describe('Start date (yyyy-MM-dd)'),\n endDate: z.string().optional().describe('End date (yyyy-MM-dd)'),\n },\n },\n async ({ page, size, category, taskType, status, keyword, startDate, endDate }) => {\n const params: Record<string, string> = paginationParams(page, size);\n if (category) params.category = category;\n if (taskType) params.taskType = taskType;\n if (status) params.status = status;\n if (keyword) params.keyword = keyword;\n if (startDate) params.startDate = startDate;\n if (endDate) params.endDate = endDate;\n return callApi('GET', 'failure-logs', { params });\n }\n );\n\n server.registerTool(\n 'lexq_logs_get',\n {\n title: 'Get Failure Log',\n description: 'Get failure log detail by ID.',\n inputSchema: {\n logId: z.string().uuid().describe('Failure log ID'),\n },\n },\n async ({ logId }) => callApi('GET', `failure-logs/${logId}`)\n );\n\n server.registerTool(\n 'lexq_logs_action',\n {\n title: 'Process Failure Log',\n description: 'Process a single failure log: RETRY, RESOLVE, or IGNORE.',\n inputSchema: {\n logId: z.string().uuid().describe('Failure log ID'),\n action: z\n .enum(FailureAction)\n .describe('Action to take'),\n },\n },\n async ({ logId, action }) =>\n callApi('POST', `failure-logs/${logId}/actions`, {\n body: { action },\n })\n );\n\n server.registerTool(\n 'lexq_logs_bulk_action',\n {\n title: 'Bulk Process Failure Logs',\n description:\n 'Process multiple failure logs at once. Provide an array of log IDs and the action.',\n inputSchema: {\n logIds: z\n .array(z.string().uuid())\n .describe('Array of failure log IDs'),\n action: z\n .enum(FailureAction)\n .describe('Action to apply to all logs'),\n },\n },\n async ({ logIds, action }) =>\n callApi('POST', 'failure-logs/bulk-actions', {\n body: { logIds, action },\n })\n );\n}","import { createCli } from './cli';\nimport { printError } from './lib/output';\n\nasync function main(): Promise<void> {\n const program = createCli();\n\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n}\n\nmain();"],"mappings":"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","names":["readFileSync","fileURLToPath","dirname","join","createInterface","createInterface","createInterface","buildCreateBody","buildUpdateBody","createInterface","createInterface","readFileSync","createInterface","writeFileSync","readFileSync","createInterface","readFileSync","join","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","readFileSync","join","__dirname","dirname","fileURLToPath","getVersion","readFileSync","join"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lexq/cli",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "LexQ CLI — manage policies, simulate rules, and deploy from the terminal. Built for humans and AI agents.",
5
5
  "type": "module",
6
6
  "bin": {