@lexq/cli 0.1.10 → 0.1.12

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/CONTEXT.md CHANGED
@@ -9,48 +9,18 @@ LexQ is a **B2B SaaS policy execution engine**. Customers define business rules
9
9
  - A/B testing for rule versions
10
10
  - Git-style versioning with full audit trail
11
11
 
12
- ## Platform Components
13
-
12
+ ## Architecture
14
13
  ```
15
- ┌─────────────┐ ┌──────────────┐ ┌──────────────┐
16
- lexq-web │ │ lexq-console │ │ lexq-cli │
17
- │ (Next.js) │ │ (React 18) │ │ (TypeScript) │
18
- │ Marketing │ │ Admin UI │ │ Agent Tool │
19
- └──────┬──────┘ └──────┬───────┘ └──────┬───────┘
20
- │ │ │
21
- │ ┌───────▼────────┐ │
22
- │ │ lexq-engine │◄──────────┘
23
- │ │ (Spring Boot) │
24
- │ ├────────────────┤
25
- │ │ module-admin │ :8081 ── Console API (JWT)
26
- │ │ module-partner │ :8080 ── Partner API (API Key) ◄── CLI
27
- │ │ module-engine │ :8082 ── Execution API (API Key)
28
- │ │ module-batch │ :8083 ── Background Jobs
29
- │ │ module-core │ ── Shared domain
30
- │ └───────┬────────┘
31
- │ │
32
- │ ┌───────▼────────┐
33
- │ │ PostgreSQL │ Aurora Serverless v2
34
- │ │ Redis │ ElastiCache Serverless
35
- │ └────────────────┘
36
-
37
- ┌──────▼──────┐
38
- │ lexq-docs │
39
- │ (Mintlify) │
40
- └─────────────┘
14
+ LexQ CLI ──► api.lexq.io/api/v1/partners (API Key auth)
15
+
16
+
17
+ LexQ Policy Engine
41
18
  ```
42
19
 
43
- ## CLI Engine Relationship
44
-
45
- The CLI exclusively calls `module-partner-api` (port 8080) via API Key authentication.
20
+ The CLI exclusively calls the Partner API via API Key authentication.
46
21
 
47
22
  **Base URL:** `https://api.lexq.io/api/v1/partners`
48
23
 
49
- The CLI does NOT call:
50
- - `module-admin-api` (JWT auth, console only)
51
- - `module-engine-api` (runtime execution, application code only)
52
- - `module-batch` (internal scheduler)
53
-
54
24
  ## Domain Model
55
25
 
56
26
  ```
@@ -132,27 +102,4 @@ Tenant
132
102
  | **Execution Trace** | Per-rule evaluation result showing whether the condition matched and what actions were generated. |
133
103
  | **Decision Trace** | Final disposition of a rule after conflict resolution (SELECTED, BLOCKED_MUTEX, etc.). |
134
104
  | **Snapshot Hash** | SHA-256 hash of a version's rule snapshot at deployment time. Used to verify integrity. |
135
- | **Traffic Rate** | Percentage (0–100) of traffic routed to the A/B test version. |
136
-
137
- ## Infrastructure
138
-
139
- | Component | Service | Region |
140
- |---|---|---|
141
- | Compute | AWS ECS Fargate | us-east-1 |
142
- | Database | Aurora PostgreSQL Serverless v2 | us-east-1 |
143
- | Cache | ElastiCache Redis Serverless | us-east-1 |
144
- | CDN | CloudFront + S3 | Global |
145
- | DNS | Cloudflare | — |
146
- | Email | AWS SES | us-east-1 |
147
- | Docs | Mintlify | — |
148
- | IaC | Terraform | — |
149
- | CI/CD | GitHub Actions (OIDC) | — |
150
-
151
- ## Domains
152
-
153
- | Domain | Target |
154
- |---|---|
155
- | `lexq.io` | Vercel (marketing site) |
156
- | `console.lexq.io` | CloudFront → S3 (React SPA) |
157
- | `api.lexq.io` | ALB → ECS (all backend modules) |
158
- | `docs.lexq.io` | Mintlify |
105
+ | **Traffic Rate** | Percentage (0–100) of traffic routed to the A/B test version. |
package/LICENSE ADDED
@@ -0,0 +1,191 @@
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to the Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by the Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding any notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ Copyright 2025 LexQ, LLC
180
+
181
+ Licensed under the Apache License, Version 2.0 (the "License");
182
+ you may not use this file except in compliance with the License.
183
+ You may obtain a copy of the License at
184
+
185
+ http://www.apache.org/licenses/LICENSE-2.0
186
+
187
+ Unless required by applicable law or agreed to in writing, software
188
+ distributed under the License is distributed on an "AS IS" BASIS,
189
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
190
+ See the License for the specific language governing permissions and
191
+ limitations under the License.
package/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # LexQ CLI
2
2
 
3
+ > CLI and MCP server for [LexQ](https://lexq.io) — a rule engine with built-in simulation.
3
4
  > Manage policies, simulate rules, and deploy from the terminal. Built for humans and AI agents.
4
5
 
5
6
  **[Website](https://lexq.io)** · **[Docs](https://docs.lexq.io)** · **[Console](https://console.lexq.io)**
@@ -153,8 +154,33 @@ bash tests/e2e.sh # E2E tests (requires API key)
153
154
 
154
155
  ## MCP Server Mode
155
156
 
156
- Run LexQ CLI as an MCP (Model Context Protocol) server for seamless AI agent integration:
157
+ LexQ exposes 55 policy engine tools via MCP. Two connection methods:
157
158
 
159
+ ### Claude.ai (Cloud — no install)
160
+
161
+ 1. Go to **Settings → Connectors → Add Custom Integration**
162
+ 2. Enter: `https://mcp.lexq.io`
163
+ 3. Sign in with your LexQ account and select an API key
164
+ 4. Done — 55 tools available in every conversation
165
+
166
+ ### Remote (Streamable HTTP)
167
+
168
+ For any MCP client that supports remote servers:
169
+ ```json
170
+ {
171
+ "mcpServers": {
172
+ "lexq": {
173
+ "url": "https://mcp.lexq.io"
174
+ }
175
+ }
176
+ }
177
+ ```
178
+
179
+ OAuth 2.1 authentication is required. Your AI client will handle authorization automatically.
180
+
181
+ ### Local (stdio)
182
+
183
+ Run LexQ CLI as a local MCP server:
158
184
  ```bash
159
185
  lexq serve --mcp
160
186
  ```
@@ -181,12 +207,6 @@ Add to `claude_desktop_config.json`:
181
207
  }
182
208
  ```
183
209
 
184
- ### Claude.ai (Web)
185
-
186
- Settings → MCP Servers → Add:
187
- - Command: `npx`
188
- - Args: `-y @lexq/cli serve --mcp`
189
-
190
210
  ### VS Code / Cursor
191
211
 
192
212
  `.vscode/mcp.json`:
package/dist/index.js CHANGED
@@ -55,6 +55,8 @@ var ApiError = class extends Error {
55
55
  this.errorCode = errorCode;
56
56
  this.name = "ApiError";
57
57
  }
58
+ statusCode;
59
+ errorCode;
58
60
  };
59
61
  async function apiRequest(method, path, options = {}) {
60
62
  const config = loadConfig();
@@ -3047,4 +3049,3 @@ async function main() {
3047
3049
  }
3048
3050
  }
3049
3051
  main();
3050
- //# sourceMappingURL=index.js.map
@@ -998,4 +998,3 @@ export {
998
998
  paginationParams,
999
999
  registerAllTools
1000
1000
  };
1001
- //# sourceMappingURL=register.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lexq/cli",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
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": {
@@ -53,8 +53,8 @@
53
53
  "devDependencies": {
54
54
  "@eslint/js": "^9.20.0",
55
55
  "@types/node": "^22.12.0",
56
- "eslint": "^9.20.0",
57
- "tsup": "^8.4.0",
56
+ "eslint": "^10.2.0",
57
+ "tsup": "^8.5.1",
58
58
  "typescript": "^5.7.0",
59
59
  "typescript-eslint": "^8.24.0"
60
60
  },
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
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/mcp/register.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, writeFileSync} 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 DatasetUploadResponse,\n DryRunCompareResponse,\n DryRunResponse,\n RequirementsResponse,\n SimulationHistoryResponse,\n SimulationResponse,\n} from '@/types/analytics';\nimport {loadConfig} from \"@/lib/config\";\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<DryRunCompareResponse>(\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 format: OutputFormat = globalOpts.format ?? 'json';\n\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\n if (format === 'table') {\n console.log(`Status: ${data.status}`);\n console.log(`Progress: ${data.progress}%`);\n\n if (data.summary) {\n console.log(`\\n── Summary ──`);\n console.log(`Records: ${data.summary.totalRecords.toLocaleString()}`);\n console.log(`Matched: ${data.summary.matchedRecords.toLocaleString()}`);\n console.log(`Match Rate: ${data.summary.matchRate.toFixed(1)}%`);\n console.log(`Time: ${data.summary.executionTimeMs.toLocaleString()}ms`);\n }\n\n if (data.metricSummary) {\n console.log(`\\n── Metric: ${data.metricSummary.targetVariable} (${data.metricSummary.aggregationType}) ──`);\n console.log(`Baseline: ${data.metricSummary.baselineValue.toLocaleString()}`);\n console.log(`Simulated: ${data.metricSummary.simulatedValue.toLocaleString()}`);\n console.log(`Delta: ${data.metricSummary.delta > 0 ? '+' : ''}${data.metricSummary.delta.toLocaleString()}`);\n console.log(`Change: ${data.metricSummary.deltaPercentage > 0 ? '+' : ''}${data.metricSummary.deltaPercentage.toFixed(1)}%`);\n }\n\n if (data.policyImpact?.comparison) {\n const diff = data.policyImpact.comparison.difference;\n console.log(`\\n── Impact ──`);\n console.log(`Matched Δ: ${diff.matchedCountDelta > 0 ? '+' : ''}${diff.matchedCountDelta}`);\n console.log(`Rate Δ: ${diff.matchedRateDelta > 0 ? '+' : ''}${diff.matchedRateDelta.toFixed(1)}%`);\n console.log(`Metric Δ: ${diff.metricValueDelta > 0 ? '+' : ''}${diff.metricValueDelta.toLocaleString()}`);\n }\n\n if (data.ruleStats?.length) {\n console.log('');\n printTable(\n ['Rule', 'Matched', 'Metric'],\n data.ruleStats.map((r) => [\n r.ruleName,\n r.matchedCount.toLocaleString(),\n r.metricValue.toLocaleString(),\n ]),\n { truncate: 30 }\n );\n }\n } else {\n printJson(data);\n }\n\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.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 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 // Dataset\n // ══════════════════════════════════════════════════\n\n const dataset = analytics.command('dataset').description('Upload datasets and download templates');\n\n // ── upload ──\n dataset\n .command('upload')\n .description('Upload a CSV or JSON file as a simulation dataset')\n .requiredOption('--file <path>', 'Path to CSV or JSON file')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const config = loadConfig();\n const baseUrl = globalOpts.baseUrl ?? config.baseUrl;\n const apiKey = globalOpts.apiKey ?? config.apiKey;\n\n if (!apiKey) {\n throw new Error('Not authenticated. Run \"lexq auth login\" first.');\n }\n\n const filePath = opts.file as string;\n const fileBuffer = readFileSync(filePath);\n const fileName = filePath.split('/').pop() ?? 'dataset';\n\n // Content-Type 추론\n const ext = fileName.split('.').pop()?.toLowerCase();\n let contentType = 'application/octet-stream';\n if (ext === 'csv') contentType = 'text/csv';\n else if (ext === 'json') contentType = 'application/json';\n\n // Node.js 18+ native FormData + Blob\n const blob = new Blob([fileBuffer], { type: contentType });\n const formData = new FormData();\n formData.append('file', blob, fileName);\n\n const url = new URL('analytics/datasets/upload', baseUrl.endsWith('/') ? baseUrl : baseUrl + '/');\n\n if (globalOpts.verbose) {\n console.error(`→ POST ${url.toString()}`);\n console.error(` File: ${filePath} (${fileBuffer.length} bytes)`);\n }\n\n const response = await fetch(url.toString(), {\n method: 'POST',\n headers: { 'X-API-KEY': apiKey },\n body: formData,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Upload failed (${response.status}): ${errorText}`);\n }\n\n const envelope = await response.json() as { data: DatasetUploadResponse };\n const result = envelope.data;\n console.log(`✓ Dataset uploaded: ${result.path}`);\n console.log(` File: ${result.filename} (${result.size} bytes)`);\n printJson(result);\n } catch (error) {\n printError(error);\n process.exit(1);\n }\n });\n\n // ── template ──\n dataset\n .command('template')\n .description('Download a dataset template based on version requirements')\n .requiredOption('--group-id <groupId>', 'Policy group ID')\n .requiredOption('--version-id <versionId>', 'Policy version ID')\n .option('--format <fmt>', 'Template format: csv or json', 'csv')\n .option('--output <path>', 'Output file path')\n .action(async (opts) => {\n try {\n const globalOpts = program.opts();\n const config = loadConfig();\n const baseUrl = globalOpts.baseUrl ?? config.baseUrl;\n const apiKey = globalOpts.apiKey ?? config.apiKey;\n\n if (!apiKey) {\n throw new Error('Not authenticated. Run \"lexq auth login\" first.');\n }\n\n const fmt = opts.format === 'json' ? 'json' : 'csv';\n const url = new URL(\n `analytics/groups/${opts.groupId}/versions/${opts.versionId}/dataset-template`,\n baseUrl.endsWith('/') ? baseUrl : baseUrl + '/'\n );\n url.searchParams.set('format', fmt);\n\n const response = await fetch(url.toString(), {\n headers: { 'X-API-KEY': apiKey, Accept: '*/*' },\n });\n\n if (!response.ok) {\n throw new Error(`Template download failed (${response.status})`);\n }\n\n const text = await response.text();\n\n if (opts.output) {\n writeFileSync(opts.output as string, text, 'utf-8');\n console.log(`✓ Template saved to ${opts.output}`);\n } else {\n console.log(text);\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 { createCallApiFromConfig } from './tools/_shared';\nimport { registerAllTools } from './register';\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 const callApi = createCallApiFromConfig();\n registerAllTools(server, callApi);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\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\n/**\n * Function signature for making API calls.\n * Injected into tool registration functions for testability and reuse.\n *\n * - lexq-cli (stdio): uses createCallApiFromConfig() — reads ~/.lexq/config.json\n * - lexq-mcp (HTTP): uses createApiCaller(apiKey) — Bearer token from request\n */\nexport type CallApi = (\n method: string,\n path: string,\n opts?: {\n body?: unknown;\n params?: Record<string, string>;\n upload?: { content: string; filename: string; fieldName: string };\n },\n) => Promise<McpToolResult>;\n\n/**\n * Creates a CallApi bound to the local config file (~/.lexq/config.json).\n * Used by the CLI's stdio MCP server.\n */\nexport function createCallApiFromConfig(): CallApi {\n return async (method, path, opts) => {\n try {\n const config = loadConfig();\n\n // ── Upload 처리 (multipart/form-data) ──\n if (opts?.upload) {\n const url = new URL(path, config.baseUrl.endsWith('/') ? config.baseUrl : config.baseUrl + '/');\n if (opts.params) {\n for (const [key, value] of Object.entries(opts.params)) {\n if (value !== undefined) url.searchParams.set(key, value);\n }\n }\n\n if (!config.apiKey) {\n throw new Error('Not authenticated. Run \"lexq auth login\" first.');\n }\n\n const blob = new Blob([opts.upload.content], { type: 'text/plain' });\n const formData = new FormData();\n formData.append(opts.upload.fieldName, blob, opts.upload.filename);\n\n const response = await fetch(url.toString(), {\n method,\n headers: { 'X-API-KEY': config.apiKey },\n body: formData,\n });\n\n const data = await response.json();\n return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };\n }\n\n const clientOpts: ApiClientOptions = {\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n };\n const data = await apiRequest(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}\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}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CallApi } from './_shared';\n\nexport function registerStatusTools(server: McpServer, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\n\nexport function registerGroupTools(server: McpServer, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\n\nexport function registerVersionTools(server: McpServer, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { 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, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\n\nexport function registerFactTools(server: McpServer, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\n\nexport function registerDeployTools(server: McpServer, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\n\nexport function registerAnalyticsTools(server: McpServer, callApi: CallApi): 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\n // ── Dataset Upload ──\n\n server.registerTool(\n 'lexq_dataset_upload',\n {\n title: 'Upload Dataset',\n description: `Upload inline CSV or JSON content as a simulation dataset.\nThe content is uploaded to S3 and a path is returned.\nUse this path in simulation start with dataset type UPLOADED.\n\nCSV example:\nuser_id,payment_amount\nuser_001,150000\nuser_002,50000\n\nJSON example:\n[{\"user_id\":\"user_001\",\"payment_amount\":150000}, {\"user_id\":\"user_002\",\"payment_amount\":50000}]`,\n inputSchema: {\n content: z.string().describe('CSV or JSON content as string'),\n filename: z\n .string()\n .default('dataset.csv')\n .describe('Filename with extension (.csv or .json)'),\n },\n },\n async ({ content, filename }) =>\n callApi('POST', 'analytics/datasets/upload', {\n upload: { content, filename, fieldName: 'file' },\n })\n );\n\n // ── Dataset Template ──\n\n server.registerTool(\n 'lexq_dataset_template',\n {\n title: 'Download Dataset Template',\n description:\n 'Generate a sample CSV or JSON template based on the required facts of a version. Use this to understand the expected data format before uploading a dataset.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n format: z\n .enum(['csv', 'json'])\n .default('csv')\n .describe('Template format'),\n },\n },\n async ({ groupId, versionId, format }) =>\n callApi(\n 'GET',\n `analytics/groups/${groupId}/versions/${versionId}/dataset-template`,\n { params: { format } }\n )\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\n\nexport function registerHistoryTools(server: McpServer, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\n\nexport function registerIntegrationTools(server: McpServer, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\nimport {FailureAction, FailureStatus, TaskCategory, TaskType} from '@/types/enums'\n\nexport function registerLogTools(server: McpServer, callApi: CallApi): 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 type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CallApi } from './tools/_shared';\n\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\n/**\n * Registers all 55 MCP tools on the given server.\n *\n * @param server - McpServer instance\n * @param callApi - API caller function (config-based for CLI, Bearer-based for HTTP)\n */\nexport function registerAllTools(server: McpServer, callApi: CallApi): void {\n registerStatusTools(server, callApi);\n registerGroupTools(server, callApi);\n registerVersionTools(server, callApi);\n registerRuleTools(server, callApi);\n registerFactTools(server, callApi);\n registerDeployTools(server, callApi);\n registerAnalyticsTools(server, callApi);\n registerHistoryTools(server, callApi);\n registerIntegrationTools(server, callApi);\n registerLogTools(server, callApi);\n}\n\n// Re-exports for external consumers (lexq-mcp)\nexport type { CallApi, McpToolResult } from './tools/_shared';\nexport { paginationParams } from './tools/_shared';\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","writeFileSync","createInterface","writeFileSync","readFileSync","createInterface","readFileSync","join","data","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 +0,0 @@
1
- {"version":3,"sources":["../../src/mcp/tools/status.ts","../../src/mcp/tools/groups.ts","../../src/lib/config.ts","../../src/mcp/tools/_shared.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/types/enums.ts","../../src/mcp/register.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CallApi } from './_shared';\n\nexport function registerStatusTools(server: McpServer, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\n\nexport function registerGroupTools(server: McpServer, callApi: CallApi): 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 { 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 { 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\n/**\n * Function signature for making API calls.\n * Injected into tool registration functions for testability and reuse.\n *\n * - lexq-cli (stdio): uses createCallApiFromConfig() — reads ~/.lexq/config.json\n * - lexq-mcp (HTTP): uses createApiCaller(apiKey) — Bearer token from request\n */\nexport type CallApi = (\n method: string,\n path: string,\n opts?: {\n body?: unknown;\n params?: Record<string, string>;\n upload?: { content: string; filename: string; fieldName: string };\n },\n) => Promise<McpToolResult>;\n\n/**\n * Creates a CallApi bound to the local config file (~/.lexq/config.json).\n * Used by the CLI's stdio MCP server.\n */\nexport function createCallApiFromConfig(): CallApi {\n return async (method, path, opts) => {\n try {\n const config = loadConfig();\n\n // ── Upload 처리 (multipart/form-data) ──\n if (opts?.upload) {\n const url = new URL(path, config.baseUrl.endsWith('/') ? config.baseUrl : config.baseUrl + '/');\n if (opts.params) {\n for (const [key, value] of Object.entries(opts.params)) {\n if (value !== undefined) url.searchParams.set(key, value);\n }\n }\n\n if (!config.apiKey) {\n throw new Error('Not authenticated. Run \"lexq auth login\" first.');\n }\n\n const blob = new Blob([opts.upload.content], { type: 'text/plain' });\n const formData = new FormData();\n formData.append(opts.upload.fieldName, blob, opts.upload.filename);\n\n const response = await fetch(url.toString(), {\n method,\n headers: { 'X-API-KEY': config.apiKey },\n body: formData,\n });\n\n const data = await response.json();\n return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };\n }\n\n const clientOpts: ApiClientOptions = {\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n };\n const data = await apiRequest(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}\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}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\n\nexport function registerVersionTools(server: McpServer, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { 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, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\n\nexport function registerFactTools(server: McpServer, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\n\nexport function registerDeployTools(server: McpServer, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\n\nexport function registerAnalyticsTools(server: McpServer, callApi: CallApi): 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\n // ── Dataset Upload ──\n\n server.registerTool(\n 'lexq_dataset_upload',\n {\n title: 'Upload Dataset',\n description: `Upload inline CSV or JSON content as a simulation dataset.\nThe content is uploaded to S3 and a path is returned.\nUse this path in simulation start with dataset type UPLOADED.\n\nCSV example:\nuser_id,payment_amount\nuser_001,150000\nuser_002,50000\n\nJSON example:\n[{\"user_id\":\"user_001\",\"payment_amount\":150000}, {\"user_id\":\"user_002\",\"payment_amount\":50000}]`,\n inputSchema: {\n content: z.string().describe('CSV or JSON content as string'),\n filename: z\n .string()\n .default('dataset.csv')\n .describe('Filename with extension (.csv or .json)'),\n },\n },\n async ({ content, filename }) =>\n callApi('POST', 'analytics/datasets/upload', {\n upload: { content, filename, fieldName: 'file' },\n })\n );\n\n // ── Dataset Template ──\n\n server.registerTool(\n 'lexq_dataset_template',\n {\n title: 'Download Dataset Template',\n description:\n 'Generate a sample CSV or JSON template based on the required facts of a version. Use this to understand the expected data format before uploading a dataset.',\n inputSchema: {\n groupId: z.string().uuid().describe('Policy group ID'),\n versionId: z.string().uuid().describe('Version ID'),\n format: z\n .enum(['csv', 'json'])\n .default('csv')\n .describe('Template format'),\n },\n },\n async ({ groupId, versionId, format }) =>\n callApi(\n 'GET',\n `analytics/groups/${groupId}/versions/${versionId}/dataset-template`,\n { params: { format } }\n )\n );\n}","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\n\nexport function registerHistoryTools(server: McpServer, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\n\nexport function registerIntegrationTools(server: McpServer, callApi: CallApi): 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 type { CallApi } from './_shared';\nimport { paginationParams } from './_shared';\nimport {FailureAction, FailureStatus, TaskCategory, TaskType} from '@/types/enums'\n\nexport function registerLogTools(server: McpServer, callApi: CallApi): 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}","// ── 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 { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CallApi } from './tools/_shared';\n\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\n/**\n * Registers all 55 MCP tools on the given server.\n *\n * @param server - McpServer instance\n * @param callApi - API caller function (config-based for CLI, Bearer-based for HTTP)\n */\nexport function registerAllTools(server: McpServer, callApi: CallApi): void {\n registerStatusTools(server, callApi);\n registerGroupTools(server, callApi);\n registerVersionTools(server, callApi);\n registerRuleTools(server, callApi);\n registerFactTools(server, callApi);\n registerDeployTools(server, callApi);\n registerAnalyticsTools(server, callApi);\n registerHistoryTools(server, callApi);\n registerIntegrationTools(server, callApi);\n registerLogTools(server, callApi);\n}\n\n// Re-exports for external consumers (lexq-mcp)\nexport type { CallApi, McpToolResult } from './tools/_shared';\nexport { paginationParams } from './tools/_shared';\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z"]}