@posthog/wizard 2.10.4 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -7
- package/dist/{McpScreen-LqnNwEfV.js → AuditChecksViewer-DsfXIO9e.js} +475 -36
- package/dist/AuditChecksViewer-DsfXIO9e.js.map +1 -0
- package/dist/{add-mcp-server-to-clients-lfUH2pdU.js → add-mcp-server-to-clients-BKoew3aT.js} +157 -125
- package/dist/add-mcp-server-to-clients-BKoew3aT.js.map +1 -0
- package/dist/{readiness-Cep84RsR.js → agent-interface-D5W9BAB2.js} +329 -464
- package/dist/agent-interface-D5W9BAB2.js.map +1 -0
- package/dist/{agent-runner-DHtcWn15.js → agent-runner-B8Cx6X6x.js} +22 -31
- package/dist/agent-runner-B8Cx6X6x.js.map +1 -0
- package/dist/analytics-DmD31Ssc.js +123 -0
- package/dist/analytics-DmD31Ssc.js.map +1 -0
- package/dist/analytics-JDitS2JI.js +2 -0
- package/dist/bin.js +521 -46
- package/dist/bin.js.map +1 -1
- package/dist/debug-Bkaqv1ab.js +686 -0
- package/dist/debug-Bkaqv1ab.js.map +1 -0
- package/dist/{debug-CIyf0ZGx.js → debug-I5sRZubJ.js} +1 -1
- package/dist/{defaults-DoVkE0gW.js → defaults-GbLPuHxj.js} +8 -8
- package/dist/defaults-GbLPuHxj.js.map +1 -0
- package/dist/detection-C_RfYYDe.js +206 -0
- package/dist/detection-C_RfYYDe.js.map +1 -0
- package/dist/{env-api-key-K8TdTDII.js → env-api-key-D5G2PrXW.js} +1 -1
- package/dist/{env-api-key-K8TdTDII.js.map → env-api-key-D5G2PrXW.js.map} +1 -1
- package/dist/file-8iNrXHkG.js +16 -0
- package/dist/file-8iNrXHkG.js.map +1 -0
- package/dist/{file-utils-BWneZy6p.js → file-utils-DnTSiTJw.js} +1 -1
- package/dist/{file-utils-BWneZy6p.js.map → file-utils-DnTSiTJw.js.map} +1 -1
- package/dist/package-json-BzVey4Bd.js +2 -0
- package/dist/{package-json-Ctq6LSl8.js → package-json-F_7oktsp.js} +1 -1
- package/dist/{package-json-Ctq6LSl8.js.map → package-json-F_7oktsp.js.map} +1 -1
- package/dist/{package-manager-CwU26DwX.js → package-manager-qxP2PpM_.js} +2 -2
- package/dist/{package-manager-CwU26DwX.js.map → package-manager-qxP2PpM_.js.map} +1 -1
- package/dist/paths-DJS47p5x.js +26 -0
- package/dist/paths-DJS47p5x.js.map +1 -0
- package/dist/{posthog-integration-HBDZrREG.js → posthog-integration-DX77Msto.js} +43 -14
- package/dist/posthog-integration-DX77Msto.js.map +1 -0
- package/dist/posthog-vm0k9PKS.js +11 -0
- package/dist/posthog-vm0k9PKS.js.map +1 -0
- package/dist/provisioning-CHfTOEvg.js +2 -0
- package/dist/provisioning-DUj285NO.js +166 -0
- package/dist/provisioning-DUj285NO.js.map +1 -0
- package/dist/{registry-BIV1wRpo.js → registry-CCtIsqb8.js} +5 -6
- package/dist/{registry-BIV1wRpo.js.map → registry-CCtIsqb8.js.map} +1 -1
- package/dist/{router-CXjdWNh2.js → router-BTfmEDDJ.js} +4 -3
- package/dist/router-BTfmEDDJ.js.map +1 -0
- package/dist/{setup-utils-CHojnr4N.js → setup-utils-Bv8z6HMb.js} +17 -150
- package/dist/setup-utils-Bv8z6HMb.js.map +1 -0
- package/dist/setup-utils-CoX-vLgw.js +2 -0
- package/dist/{start-playground-D1iLBvqF.js → start-playground-DYNQ8rOz.js} +181 -9
- package/dist/start-playground-DYNQ8rOz.js.map +1 -0
- package/dist/{start-tui-DkT_H5zx.js → start-tui-DleQG3La.js} +1290 -163
- package/dist/start-tui-DleQG3La.js.map +1 -0
- package/dist/{steps-zpqG7W08.js → steps-C-syS8if.js} +8 -8
- package/dist/steps-C-syS8if.js.map +1 -0
- package/dist/task-stream-CX7Uf6EM.js +61 -0
- package/dist/task-stream-CX7Uf6EM.js.map +1 -0
- package/dist/{telemetry-CPoSyK0a.js → telemetry-DHZfjgqx.js} +2 -2
- package/dist/{telemetry-CPoSyK0a.js.map → telemetry-DHZfjgqx.js.map} +1 -1
- package/dist/{wizard-abort-BcEPhAxY.js → wizard-abort-DIhFXJ5N.js} +1 -1
- package/dist/{wizard-abort-DKctLd33.js → wizard-abort-DfhWuzaw.js} +6 -4
- package/dist/{wizard-abort-DKctLd33.js.map → wizard-abort-DfhWuzaw.js.map} +1 -1
- package/dist/wizard-session-BQC9vy9Z.js +2 -0
- package/dist/{wizard-session-Db6R023m.js → wizard-session-BcNJTl2I.js} +1 -1
- package/dist/{wizard-session-Db6R023m.js.map → wizard-session-BcNJTl2I.js.map} +1 -1
- package/dist/wizard-ui-YdGFRyu_.js +14 -0
- package/dist/wizard-ui-YdGFRyu_.js.map +1 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/dist/McpScreen-LqnNwEfV.js.map +0 -1
- package/dist/add-mcp-server-to-clients-lfUH2pdU.js.map +0 -1
- package/dist/agent-runner-DHtcWn15.js.map +0 -1
- package/dist/agent-skill-BVjJqol6.js +0 -59
- package/dist/agent-skill-BVjJqol6.js.map +0 -1
- package/dist/analytics-Cm6i5_gc.js +0 -207
- package/dist/analytics-Cm6i5_gc.js.map +0 -1
- package/dist/analytics-CviQ_A9M.js +0 -2
- package/dist/debug-CyJ_3dTP.js +0 -201
- package/dist/debug-CyJ_3dTP.js.map +0 -1
- package/dist/defaults-DoVkE0gW.js.map +0 -1
- package/dist/detection-gcQwPKPu.js +0 -122
- package/dist/detection-gcQwPKPu.js.map +0 -1
- package/dist/package-json-BQgl5C3Z.js +0 -2
- package/dist/posthog-integration-HBDZrREG.js.map +0 -1
- package/dist/readiness-Cep84RsR.js.map +0 -1
- package/dist/router-CXjdWNh2.js.map +0 -1
- package/dist/setup-utils-CHojnr4N.js.map +0 -1
- package/dist/start-playground-D1iLBvqF.js.map +0 -1
- package/dist/start-tui-DkT_H5zx.js.map +0 -1
- package/dist/steps-zpqG7W08.js.map +0 -1
- package/dist/wizard-session-y7nf6aKH.js +0 -2
package/dist/{add-mcp-server-to-clients-lfUH2pdU.js → add-mcp-server-to-clients-BKoew3aT.js}
RENAMED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-B_-DWIq7.js";
|
|
2
|
-
import {
|
|
3
|
-
import { n as analytics } from "./analytics-
|
|
4
|
-
import { t as traceStep } from "./telemetry-
|
|
5
|
-
import {
|
|
2
|
+
import { W as runtimeEnv, c as getUI, r as debug } from "./debug-Bkaqv1ab.js";
|
|
3
|
+
import { n as analytics } from "./analytics-DmD31Ssc.js";
|
|
4
|
+
import { t as traceStep } from "./telemetry-DHZfjgqx.js";
|
|
5
|
+
import { i as getNativeHTTPServerConfig, r as getDefaultServerConfig, t as ALL_FEATURE_VALUES } from "./defaults-GbLPuHxj.js";
|
|
6
6
|
import { execSync, spawnSync } from "node:child_process";
|
|
7
|
-
import * as fs$1 from "fs";
|
|
8
|
-
import * as
|
|
7
|
+
import * as fs$1 from "node:fs";
|
|
8
|
+
import * as os from "node:os";
|
|
9
|
+
import * as path$1 from "node:path";
|
|
10
|
+
import * as fs$2 from "fs";
|
|
11
|
+
import * as path$2 from "path";
|
|
9
12
|
import z$1 from "zod";
|
|
10
13
|
import { execSync as execSync$1 } from "child_process";
|
|
11
14
|
import * as jsonc from "jsonc-parser";
|
|
12
|
-
import * as os from "os";
|
|
15
|
+
import * as os$1 from "os";
|
|
13
16
|
//#region src/steps/add-mcp-server-to-clients/MCPClient.ts
|
|
14
17
|
var MCPClient = class {
|
|
15
18
|
name;
|
|
@@ -22,14 +25,14 @@ var DefaultMCPClient = class extends MCPClient {
|
|
|
22
25
|
getServerPropertyName() {
|
|
23
26
|
return "mcpServers";
|
|
24
27
|
}
|
|
25
|
-
getServerConfig(apiKey,
|
|
26
|
-
return getDefaultServerConfig(apiKey,
|
|
28
|
+
getServerConfig(apiKey, selectedFeatures, local) {
|
|
29
|
+
return getDefaultServerConfig(apiKey, selectedFeatures, local);
|
|
27
30
|
}
|
|
28
31
|
async isServerInstalled(local) {
|
|
29
32
|
try {
|
|
30
33
|
const configPath = await this.getConfigPath();
|
|
31
|
-
if (!fs$
|
|
32
|
-
const configContent = await fs$
|
|
34
|
+
if (!fs$2.existsSync(configPath)) return false;
|
|
35
|
+
const configContent = await fs$2.promises.readFile(configPath, "utf8");
|
|
33
36
|
const config = jsonc.parse(configContent);
|
|
34
37
|
const serverPropertyName = this.getServerPropertyName();
|
|
35
38
|
const serverName = local ? "posthog-local" : "posthog";
|
|
@@ -39,21 +42,18 @@ var DefaultMCPClient = class extends MCPClient {
|
|
|
39
42
|
}
|
|
40
43
|
}
|
|
41
44
|
async addServer(apiKey, selectedFeatures, local) {
|
|
42
|
-
return this._addServerType(apiKey, "sse", selectedFeatures, local);
|
|
43
|
-
}
|
|
44
|
-
async _addServerType(apiKey, type, selectedFeatures, local) {
|
|
45
45
|
try {
|
|
46
46
|
const configPath = await this.getConfigPath();
|
|
47
|
-
const configDir = path$
|
|
48
|
-
await fs$
|
|
47
|
+
const configDir = path$2.dirname(configPath);
|
|
48
|
+
await fs$2.promises.mkdir(configDir, { recursive: true });
|
|
49
49
|
const serverPropertyName = this.getServerPropertyName();
|
|
50
50
|
let configContent = "";
|
|
51
51
|
let existingConfig = {};
|
|
52
|
-
if (fs$
|
|
53
|
-
configContent = await fs$
|
|
52
|
+
if (fs$2.existsSync(configPath)) {
|
|
53
|
+
configContent = await fs$2.promises.readFile(configPath, "utf8");
|
|
54
54
|
existingConfig = jsonc.parse(configContent) || {};
|
|
55
55
|
}
|
|
56
|
-
const newServerConfig = this.getServerConfig(apiKey,
|
|
56
|
+
const newServerConfig = this.getServerConfig(apiKey, selectedFeatures, local);
|
|
57
57
|
const typedConfig = existingConfig;
|
|
58
58
|
if (!typedConfig[serverPropertyName]) typedConfig[serverPropertyName] = {};
|
|
59
59
|
const serverName = local ? "posthog-local" : "posthog";
|
|
@@ -63,7 +63,7 @@ var DefaultMCPClient = class extends MCPClient {
|
|
|
63
63
|
insertSpaces: true
|
|
64
64
|
} });
|
|
65
65
|
const modifiedContent = jsonc.applyEdits(configContent, edits);
|
|
66
|
-
await fs$
|
|
66
|
+
await fs$2.promises.writeFile(configPath, modifiedContent, "utf8");
|
|
67
67
|
return { success: true };
|
|
68
68
|
} catch {
|
|
69
69
|
return { success: false };
|
|
@@ -72,8 +72,8 @@ var DefaultMCPClient = class extends MCPClient {
|
|
|
72
72
|
async removeServer(local) {
|
|
73
73
|
try {
|
|
74
74
|
const configPath = await this.getConfigPath();
|
|
75
|
-
if (!fs$
|
|
76
|
-
const configContent = await fs$
|
|
75
|
+
if (!fs$2.existsSync(configPath)) return { success: false };
|
|
76
|
+
const configContent = await fs$2.promises.readFile(configPath, "utf8");
|
|
77
77
|
const config = jsonc.parse(configContent);
|
|
78
78
|
const serverPropertyName = this.getServerPropertyName();
|
|
79
79
|
const serverName = local ? "posthog-local" : "posthog";
|
|
@@ -83,7 +83,7 @@ var DefaultMCPClient = class extends MCPClient {
|
|
|
83
83
|
insertSpaces: true
|
|
84
84
|
} });
|
|
85
85
|
const modifiedContent = jsonc.applyEdits(configContent, edits);
|
|
86
|
-
await fs$
|
|
86
|
+
await fs$2.promises.writeFile(configPath, modifiedContent, "utf8");
|
|
87
87
|
return { success: true };
|
|
88
88
|
}
|
|
89
89
|
} catch {}
|
|
@@ -101,13 +101,10 @@ var CursorMCPClient = class extends DefaultMCPClient {
|
|
|
101
101
|
return Promise.resolve(process.platform === "darwin" || process.platform === "win32");
|
|
102
102
|
}
|
|
103
103
|
async getConfigPath() {
|
|
104
|
-
return Promise.resolve(path$
|
|
105
|
-
}
|
|
106
|
-
getServerConfig(apiKey, type, selectedFeatures, local) {
|
|
107
|
-
return getNativeHTTPServerConfig(apiKey, type, selectedFeatures, local);
|
|
104
|
+
return Promise.resolve(path$2.join(os$1.homedir(), ".cursor", "mcp.json"));
|
|
108
105
|
}
|
|
109
|
-
|
|
110
|
-
return
|
|
106
|
+
getServerConfig(apiKey, selectedFeatures, local) {
|
|
107
|
+
return getNativeHTTPServerConfig(apiKey, selectedFeatures, local);
|
|
111
108
|
}
|
|
112
109
|
};
|
|
113
110
|
//#endregion
|
|
@@ -121,11 +118,11 @@ var ClaudeCodeMCPClient = class extends DefaultMCPClient {
|
|
|
121
118
|
findClaudeBinary() {
|
|
122
119
|
if (this.claudeBinaryPath) return this.claudeBinaryPath;
|
|
123
120
|
const possiblePaths = [
|
|
124
|
-
path$
|
|
121
|
+
path$2.join(os$1.homedir(), ".claude", "local", "claude"),
|
|
125
122
|
"/usr/local/bin/claude",
|
|
126
123
|
"/opt/homebrew/bin/claude"
|
|
127
124
|
];
|
|
128
|
-
for (const claudePath of possiblePaths) if (fs$
|
|
125
|
+
for (const claudePath of possiblePaths) if (fs$2.existsSync(claudePath)) {
|
|
129
126
|
debug(` Found claude binary at: ${claudePath}`);
|
|
130
127
|
this.claudeBinaryPath = claudePath;
|
|
131
128
|
return claudePath;
|
|
@@ -144,7 +141,7 @@ var ClaudeCodeMCPClient = class extends DefaultMCPClient {
|
|
|
144
141
|
const claudeBinary = this.findClaudeBinary();
|
|
145
142
|
if (!claudeBinary) {
|
|
146
143
|
debug(" Claude Code not found. Installation paths checked:");
|
|
147
|
-
debug(` - ${path$
|
|
144
|
+
debug(` - ${path$2.join(os$1.homedir(), ".claude", "local", "claude")}`);
|
|
148
145
|
debug(` - /usr/local/bin/claude`);
|
|
149
146
|
debug(` - /opt/homebrew/bin/claude`);
|
|
150
147
|
debug(` - PATH`);
|
|
@@ -157,44 +154,55 @@ var ClaudeCodeMCPClient = class extends DefaultMCPClient {
|
|
|
157
154
|
return Promise.resolve(false);
|
|
158
155
|
}
|
|
159
156
|
}
|
|
160
|
-
isServerInstalled(
|
|
161
|
-
|
|
162
|
-
const claudeBinary = this.findClaudeBinary();
|
|
163
|
-
if (!claudeBinary) return Promise.resolve(false);
|
|
164
|
-
const outputStr = execSync$1(`${claudeBinary} mcp list`, { stdio: "pipe" }).toString();
|
|
165
|
-
const serverName = local ? "posthog-local" : "posthog";
|
|
166
|
-
if (outputStr.includes(serverName)) return Promise.resolve(true);
|
|
167
|
-
} catch {}
|
|
168
|
-
return Promise.resolve(false);
|
|
157
|
+
isServerInstalled() {
|
|
158
|
+
return this.isPluginInstalled();
|
|
169
159
|
}
|
|
170
160
|
getConfigPath() {
|
|
171
161
|
throw new Error("Not implemented");
|
|
172
162
|
}
|
|
173
|
-
addServer(
|
|
163
|
+
async addServer() {
|
|
164
|
+
return { success: (await this.installPlugin()).success };
|
|
165
|
+
}
|
|
166
|
+
removeServer(local) {
|
|
174
167
|
const claudeBinary = this.findClaudeBinary();
|
|
175
168
|
if (!claudeBinary) return Promise.resolve({ success: false });
|
|
176
|
-
const command = `${claudeBinary} mcp
|
|
169
|
+
const command = `${claudeBinary} mcp remove --scope user ${local ? "posthog-local" : "posthog"}`;
|
|
177
170
|
try {
|
|
178
171
|
execSync$1(command);
|
|
179
172
|
} catch (error) {
|
|
180
|
-
|
|
181
|
-
if (msg.includes("already exists")) return Promise.resolve({ success: true });
|
|
182
|
-
analytics.captureException(/* @__PURE__ */ new Error(`Failed to add server to Claude Code: ${msg}`));
|
|
173
|
+
analytics.captureException(/* @__PURE__ */ new Error(`Failed to remove server from Claude Code: ${error instanceof Error ? error.message : String(error)}`));
|
|
183
174
|
return Promise.resolve({ success: false });
|
|
184
175
|
}
|
|
185
176
|
return Promise.resolve({ success: true });
|
|
186
177
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
178
|
+
supportsPlugin() {
|
|
179
|
+
return this.findClaudeBinary() !== null;
|
|
180
|
+
}
|
|
181
|
+
isPluginInstalled() {
|
|
182
|
+
const binary = this.findClaudeBinary();
|
|
183
|
+
if (!binary) return Promise.resolve(false);
|
|
191
184
|
try {
|
|
192
|
-
execSync$1(
|
|
185
|
+
const output = execSync$1(`${binary} plugin list`, { stdio: "pipe" }).toString();
|
|
186
|
+
return Promise.resolve(output.toLowerCase().includes("posthog"));
|
|
187
|
+
} catch {
|
|
188
|
+
return Promise.resolve(false);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
installPlugin() {
|
|
192
|
+
const binary = this.findClaudeBinary();
|
|
193
|
+
if (!binary) return Promise.resolve({ success: false });
|
|
194
|
+
try {
|
|
195
|
+
execSync$1(`${binary} plugin install posthog`, { stdio: "pipe" });
|
|
196
|
+
return Promise.resolve({ success: true });
|
|
193
197
|
} catch (error) {
|
|
194
|
-
|
|
198
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
199
|
+
if (msg.includes("already installed") || msg.includes("already exists")) return Promise.resolve({
|
|
200
|
+
success: true,
|
|
201
|
+
alreadyInstalled: true
|
|
202
|
+
});
|
|
203
|
+
analytics.captureException(/* @__PURE__ */ new Error(`Claude Code plugin install failed: ${msg}`));
|
|
195
204
|
return Promise.resolve({ success: false });
|
|
196
205
|
}
|
|
197
|
-
return Promise.resolve({ success: true });
|
|
198
206
|
}
|
|
199
207
|
};
|
|
200
208
|
z$1.object({ servers: z$1.record(z$1.string(), z$1.union([z$1.object({
|
|
@@ -215,25 +223,21 @@ var VisualStudioCodeClient = class extends DefaultMCPClient {
|
|
|
215
223
|
return Promise.resolve(process.platform === "darwin" || process.platform === "win32" || process.platform === "linux");
|
|
216
224
|
}
|
|
217
225
|
async getConfigPath() {
|
|
218
|
-
const homeDir = os.homedir();
|
|
226
|
+
const homeDir = os$1.homedir();
|
|
219
227
|
const isWindows = process.platform === "win32";
|
|
220
228
|
const isMac = process.platform === "darwin";
|
|
221
229
|
const isLinux = process.platform === "linux";
|
|
222
|
-
if (isMac) return Promise.resolve(path$
|
|
223
|
-
if (isWindows) return Promise.resolve(path$
|
|
224
|
-
if (isLinux) return Promise.resolve(path$
|
|
230
|
+
if (isMac) return Promise.resolve(path$2.join(homeDir, "Library", "Application Support", "Code", "User", "mcp.json"));
|
|
231
|
+
if (isWindows) return Promise.resolve(path$2.join(runtimeEnv("APPDATA") || "", "Code", "User", "mcp.json"));
|
|
232
|
+
if (isLinux) return Promise.resolve(path$2.join(homeDir, ".config", "Code", "User", "mcp.json"));
|
|
225
233
|
throw new Error(`Unsupported platform: ${process.platform}`);
|
|
226
234
|
}
|
|
227
|
-
getServerConfig(apiKey,
|
|
235
|
+
getServerConfig(apiKey, selectedFeatures, local) {
|
|
228
236
|
return {
|
|
229
237
|
type: "http",
|
|
230
|
-
|
|
231
|
-
headers: { Authorization: `Bearer ${apiKey}` }
|
|
238
|
+
...getNativeHTTPServerConfig(apiKey, selectedFeatures, local)
|
|
232
239
|
};
|
|
233
240
|
}
|
|
234
|
-
async addServer(apiKey, selectedFeatures, local) {
|
|
235
|
-
return this._addServerType(apiKey, "streamable-http", selectedFeatures, local);
|
|
236
|
-
}
|
|
237
241
|
};
|
|
238
242
|
z$1.object({ context_servers: z$1.record(z$1.string(), z$1.union([z$1.object({
|
|
239
243
|
enabled: z$1.boolean().optional(),
|
|
@@ -255,91 +259,62 @@ var ZedClient = class extends DefaultMCPClient {
|
|
|
255
259
|
return Promise.resolve(process.platform === "darwin" || process.platform === "linux");
|
|
256
260
|
}
|
|
257
261
|
async getConfigPath() {
|
|
258
|
-
const homeDir = os.homedir();
|
|
262
|
+
const homeDir = os$1.homedir();
|
|
259
263
|
const isMac = process.platform === "darwin";
|
|
260
264
|
const isLinux = process.platform === "linux";
|
|
261
|
-
if (isMac) return Promise.resolve(path$
|
|
265
|
+
if (isMac) return Promise.resolve(path$2.join(homeDir, ".config", "zed", "settings.json"));
|
|
262
266
|
if (isLinux) {
|
|
263
267
|
const xdgConfigHome = runtimeEnv("XDG_CONFIG_HOME");
|
|
264
|
-
if (xdgConfigHome) return Promise.resolve(path$
|
|
265
|
-
return Promise.resolve(path$
|
|
268
|
+
if (xdgConfigHome) return Promise.resolve(path$2.join(xdgConfigHome, "zed", "settings.json"));
|
|
269
|
+
return Promise.resolve(path$2.join(homeDir, ".config", "zed", "settings.json"));
|
|
266
270
|
}
|
|
267
271
|
throw new Error(`Unsupported platform: ${process.platform}`);
|
|
268
272
|
}
|
|
269
|
-
getServerConfig(apiKey,
|
|
273
|
+
getServerConfig(apiKey, selectedFeatures, local) {
|
|
270
274
|
return {
|
|
271
275
|
enabled: true,
|
|
272
|
-
|
|
273
|
-
headers: { Authorization: `Bearer ${apiKey}` }
|
|
276
|
+
...getNativeHTTPServerConfig(apiKey, selectedFeatures, local)
|
|
274
277
|
};
|
|
275
278
|
}
|
|
276
|
-
async addServer(apiKey, selectedFeatures, local) {
|
|
277
|
-
return this._addServerType(apiKey, "streamable-http", selectedFeatures, local);
|
|
278
|
-
}
|
|
279
279
|
};
|
|
280
280
|
//#endregion
|
|
281
281
|
//#region src/steps/add-mcp-server-to-clients/clients/codex.ts
|
|
282
282
|
var CodexMCPClient = class extends DefaultMCPClient {
|
|
283
283
|
name = "Codex";
|
|
284
|
+
codexBinaryPath = null;
|
|
284
285
|
constructor() {
|
|
285
286
|
super();
|
|
286
287
|
}
|
|
287
|
-
|
|
288
|
+
findCodexBinary() {
|
|
289
|
+
if (this.codexBinaryPath) return this.codexBinaryPath;
|
|
288
290
|
try {
|
|
289
|
-
execSync("codex
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
291
|
+
const resolved = execSync("command -v codex", { stdio: "pipe" }).toString().trim();
|
|
292
|
+
if (resolved) {
|
|
293
|
+
this.codexBinaryPath = resolved;
|
|
294
|
+
return resolved;
|
|
295
|
+
}
|
|
296
|
+
} catch {}
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
isClientSupported() {
|
|
300
|
+
return Promise.resolve(this.findCodexBinary() !== null);
|
|
294
301
|
}
|
|
295
302
|
getConfigPath() {
|
|
296
303
|
throw new Error("Not implemented");
|
|
297
304
|
}
|
|
298
|
-
isServerInstalled(
|
|
299
|
-
|
|
300
|
-
try {
|
|
301
|
-
const result = spawnSync("codex", [
|
|
302
|
-
"mcp",
|
|
303
|
-
"list",
|
|
304
|
-
"--json"
|
|
305
|
-
], { encoding: "utf-8" });
|
|
306
|
-
if (result.error || result.status !== 0) return Promise.resolve(false);
|
|
307
|
-
const stdout = result.stdout?.trim();
|
|
308
|
-
if (!stdout) return Promise.resolve(false);
|
|
309
|
-
const servers = JSON.parse(stdout);
|
|
310
|
-
return Promise.resolve(servers.some((server) => server.name === serverName));
|
|
311
|
-
} catch {
|
|
312
|
-
return Promise.resolve(false);
|
|
313
|
-
}
|
|
305
|
+
isServerInstalled() {
|
|
306
|
+
return this.isPluginInstalled();
|
|
314
307
|
}
|
|
315
|
-
addServer(
|
|
316
|
-
|
|
317
|
-
"mcp",
|
|
318
|
-
"add",
|
|
319
|
-
local ? "posthog-local" : "posthog",
|
|
320
|
-
"--url",
|
|
321
|
-
buildMCPUrl("streamable-http", selectedFeatures, local)
|
|
322
|
-
];
|
|
323
|
-
const env = { ...process.env };
|
|
324
|
-
if (apiKey) {
|
|
325
|
-
env.POSTHOG_API_KEY = apiKey;
|
|
326
|
-
args.push("--bearer-token-env-var", "POSTHOG_API_KEY");
|
|
327
|
-
}
|
|
328
|
-
const result = spawnSync("codex", args, {
|
|
329
|
-
stdio: "ignore",
|
|
330
|
-
env
|
|
331
|
-
});
|
|
332
|
-
if (result.error || result.status !== 0) {
|
|
333
|
-
analytics.captureException(/* @__PURE__ */ new Error("Failed to add server to Codex CLI."));
|
|
334
|
-
return Promise.resolve({ success: false });
|
|
335
|
-
}
|
|
336
|
-
return Promise.resolve({ success: true });
|
|
308
|
+
async addServer() {
|
|
309
|
+
return { success: (await this.installPlugin()).success };
|
|
337
310
|
}
|
|
338
|
-
removeServer(
|
|
339
|
-
const
|
|
311
|
+
removeServer() {
|
|
312
|
+
const binary = this.findCodexBinary();
|
|
313
|
+
if (!binary) return Promise.resolve({ success: false });
|
|
314
|
+
const result = spawnSync(binary, [
|
|
340
315
|
"mcp",
|
|
341
316
|
"remove",
|
|
342
|
-
|
|
317
|
+
"posthog"
|
|
343
318
|
], { stdio: "ignore" });
|
|
344
319
|
if (result.error || result.status !== 0) {
|
|
345
320
|
analytics.captureException(/* @__PURE__ */ new Error("Failed to remove server from Codex CLI."));
|
|
@@ -347,24 +322,69 @@ var CodexMCPClient = class extends DefaultMCPClient {
|
|
|
347
322
|
}
|
|
348
323
|
return Promise.resolve({ success: true });
|
|
349
324
|
}
|
|
325
|
+
supportsPlugin() {
|
|
326
|
+
return this.findCodexBinary() !== null;
|
|
327
|
+
}
|
|
328
|
+
isPluginInstalled() {
|
|
329
|
+
const configPath = path$1.join(os.homedir(), ".codex", "config.toml");
|
|
330
|
+
try {
|
|
331
|
+
const contents = fs$1.readFileSync(configPath, "utf-8");
|
|
332
|
+
return Promise.resolve(contents.toLowerCase().includes("[marketplaces.posthog]"));
|
|
333
|
+
} catch {
|
|
334
|
+
return Promise.resolve(false);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
installPlugin() {
|
|
338
|
+
const binary = this.findCodexBinary();
|
|
339
|
+
if (!binary) return Promise.resolve({ success: false });
|
|
340
|
+
const run = () => spawnSync(binary, [
|
|
341
|
+
"plugin",
|
|
342
|
+
"marketplace",
|
|
343
|
+
"add",
|
|
344
|
+
"PostHog/ai-plugin"
|
|
345
|
+
], { encoding: "utf-8" });
|
|
346
|
+
let result = run();
|
|
347
|
+
if (result.status !== 0 && (result.stderr ?? "").includes("already added from a different source")) {
|
|
348
|
+
const staleDir = path$1.join(os.homedir(), ".codex", ".tmp", "marketplaces", "posthog");
|
|
349
|
+
try {
|
|
350
|
+
fs$1.rmSync(staleDir, {
|
|
351
|
+
recursive: true,
|
|
352
|
+
force: true
|
|
353
|
+
});
|
|
354
|
+
} catch {}
|
|
355
|
+
result = run();
|
|
356
|
+
}
|
|
357
|
+
if (result.status !== 0) {
|
|
358
|
+
analytics.captureException(/* @__PURE__ */ new Error(`Codex plugin install failed: ${result.stderr ?? ""}`));
|
|
359
|
+
return Promise.resolve({ success: false });
|
|
360
|
+
}
|
|
361
|
+
return Promise.resolve({ success: true });
|
|
362
|
+
}
|
|
350
363
|
};
|
|
351
364
|
//#endregion
|
|
365
|
+
//#region src/steps/add-mcp-server-to-clients/plugin-client.ts
|
|
366
|
+
function isPluginCapable(client) {
|
|
367
|
+
return typeof client === "object" && client !== null && "supportsPlugin" in client && "installPlugin" in client;
|
|
368
|
+
}
|
|
369
|
+
//#endregion
|
|
352
370
|
//#region src/steps/add-mcp-server-to-clients/index.ts
|
|
353
371
|
var add_mcp_server_to_clients_exports = /* @__PURE__ */ __exportAll({
|
|
354
372
|
addMCPServer: () => addMCPServer,
|
|
355
373
|
addMCPServerToClientsStep: () => addMCPServerToClientsStep,
|
|
356
374
|
getInstalledClients: () => getInstalledClients,
|
|
357
375
|
getSupportedClients: () => getSupportedClients,
|
|
376
|
+
getSupportedPluginClients: () => getSupportedPluginClients,
|
|
377
|
+
installPlugins: () => installPlugins,
|
|
358
378
|
removeMCPServer: () => removeMCPServer,
|
|
359
379
|
removeMCPServerFromClientsStep: () => removeMCPServerFromClientsStep
|
|
360
380
|
});
|
|
361
381
|
const getSupportedClients = async () => {
|
|
362
382
|
const allClients = [
|
|
363
|
-
new CursorMCPClient(),
|
|
364
383
|
new ClaudeCodeMCPClient(),
|
|
384
|
+
new CodexMCPClient(),
|
|
385
|
+
new CursorMCPClient(),
|
|
365
386
|
new VisualStudioCodeClient(),
|
|
366
|
-
new ZedClient()
|
|
367
|
-
new CodexMCPClient()
|
|
387
|
+
new ZedClient()
|
|
368
388
|
];
|
|
369
389
|
const supportedClients = [];
|
|
370
390
|
debug("Checking for supported MCP clients...");
|
|
@@ -427,10 +447,22 @@ const getInstalledClients = async (local) => {
|
|
|
427
447
|
const addMCPServer = async (clients, personalApiKey, selectedFeatures, local) => {
|
|
428
448
|
for (const client of clients) await client.addServer(personalApiKey, selectedFeatures, local);
|
|
429
449
|
};
|
|
450
|
+
const getSupportedPluginClients = (clients) => {
|
|
451
|
+
return clients.filter(isPluginCapable).filter((c) => c.supportsPlugin());
|
|
452
|
+
};
|
|
453
|
+
const installPlugins = async (clients) => {
|
|
454
|
+
const installed = [];
|
|
455
|
+
for (const client of clients) try {
|
|
456
|
+
if ((await client.installPlugin()).success) installed.push(client.name);
|
|
457
|
+
} catch (err) {
|
|
458
|
+
debug(`[installPlugins] installPlugin threw for ${client.name}: ${err}`);
|
|
459
|
+
}
|
|
460
|
+
return installed;
|
|
461
|
+
};
|
|
430
462
|
const removeMCPServer = async (clients, local) => {
|
|
431
463
|
for (const client of clients) await client.removeServer(local);
|
|
432
464
|
};
|
|
433
465
|
//#endregion
|
|
434
|
-
export { getSupportedClients as a, getInstalledClients as i, addMCPServerToClientsStep as n,
|
|
466
|
+
export { getSupportedClients as a, removeMCPServer as c, getInstalledClients as i, removeMCPServerFromClientsStep as l, addMCPServerToClientsStep as n, getSupportedPluginClients as o, add_mcp_server_to_clients_exports as r, installPlugins as s, addMCPServer as t, isPluginCapable as u };
|
|
435
467
|
|
|
436
|
-
//# sourceMappingURL=add-mcp-server-to-clients-
|
|
468
|
+
//# sourceMappingURL=add-mcp-server-to-clients-BKoew3aT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-mcp-server-to-clients-BKoew3aT.js","names":["fs","path","path","os","path","os","fs","execSync","z","os","path","z","os","path","path","fs"],"sources":["../src/steps/add-mcp-server-to-clients/MCPClient.ts","../src/steps/add-mcp-server-to-clients/clients/cursor.ts","../src/steps/add-mcp-server-to-clients/clients/claude-code.ts","../src/steps/add-mcp-server-to-clients/clients/visual-studio-code.ts","../src/steps/add-mcp-server-to-clients/clients/zed.ts","../src/steps/add-mcp-server-to-clients/clients/codex.ts","../src/steps/add-mcp-server-to-clients/plugin-client.ts","../src/steps/add-mcp-server-to-clients/index.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as jsonc from 'jsonc-parser';\nimport { getDefaultServerConfig } from './defaults';\n\nexport type MCPServerConfig = Record<string, unknown>;\n\nexport abstract class MCPClient {\n name: string;\n abstract getConfigPath(): Promise<string>;\n abstract getServerPropertyName(): string;\n abstract isServerInstalled(local?: boolean): Promise<boolean>;\n abstract addServer(\n apiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n ): Promise<{ success: boolean }>;\n abstract removeServer(local?: boolean): Promise<{ success: boolean }>;\n abstract isClientSupported(): Promise<boolean>;\n}\n\nexport abstract class DefaultMCPClient extends MCPClient {\n name = 'Default';\n\n constructor() {\n super();\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(\n apiKey: string | undefined,\n selectedFeatures?: string[],\n local?: boolean,\n ): MCPServerConfig {\n return getDefaultServerConfig(apiKey, selectedFeatures, local);\n }\n\n async isServerInstalled(local?: boolean): Promise<boolean> {\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return false;\n }\n\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n const config = jsonc.parse(configContent) as Record<string, any>;\n const serverPropertyName = this.getServerPropertyName();\n const serverName = local ? 'posthog-local' : 'posthog';\n\n return (\n serverPropertyName in config && serverName in config[serverPropertyName]\n );\n } catch {\n return false;\n }\n }\n\n async addServer(\n apiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n ): Promise<{ success: boolean }> {\n try {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n await fs.promises.mkdir(configDir, { recursive: true });\n\n const serverPropertyName = this.getServerPropertyName();\n let configContent = '';\n let existingConfig = {};\n\n if (fs.existsSync(configPath)) {\n configContent = await fs.promises.readFile(configPath, 'utf8');\n existingConfig = jsonc.parse(configContent) || {};\n }\n\n const newServerConfig = this.getServerConfig(\n apiKey,\n selectedFeatures,\n local,\n );\n const typedConfig = existingConfig as Record<string, any>;\n if (!typedConfig[serverPropertyName]) {\n typedConfig[serverPropertyName] = {};\n }\n const serverName = local ? 'posthog-local' : 'posthog';\n typedConfig[serverPropertyName][serverName] = newServerConfig;\n\n const edits = jsonc.modify(\n configContent,\n [serverPropertyName, serverName],\n newServerConfig,\n {\n formattingOptions: {\n tabSize: 2,\n insertSpaces: true,\n },\n },\n );\n\n const modifiedContent = jsonc.applyEdits(configContent, edits);\n\n await fs.promises.writeFile(configPath, modifiedContent, 'utf8');\n\n return { success: true };\n } catch {\n return { success: false };\n }\n }\n\n async removeServer(local?: boolean): Promise<{ success: boolean }> {\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return { success: false };\n }\n\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n const config = jsonc.parse(configContent) as Record<string, any>;\n const serverPropertyName = this.getServerPropertyName();\n\n const serverName = local ? 'posthog-local' : 'posthog';\n\n if (\n serverPropertyName in config &&\n serverName in config[serverPropertyName]\n ) {\n const edits = jsonc.modify(\n configContent,\n [serverPropertyName, serverName],\n undefined,\n {\n formattingOptions: {\n tabSize: 2,\n insertSpaces: true,\n },\n },\n );\n\n const modifiedContent = jsonc.applyEdits(configContent, edits);\n\n await fs.promises.writeFile(configPath, modifiedContent, 'utf8');\n\n return { success: true };\n }\n } catch {\n //\n }\n\n return { success: false };\n }\n}\n","import { DefaultMCPClient, MCPServerConfig } from '../MCPClient';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { DefaultMCPClientConfig, getNativeHTTPServerConfig } from '../defaults';\nimport { z } from 'zod';\n\nexport const CursorMCPConfig = DefaultMCPClientConfig;\n\nexport type CursorMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class CursorMCPClient extends DefaultMCPClient {\n name = 'Cursor';\n\n constructor() {\n super();\n }\n\n async isClientSupported(): Promise<boolean> {\n return Promise.resolve(\n process.platform === 'darwin' || process.platform === 'win32',\n );\n }\n\n async getConfigPath(): Promise<string> {\n return Promise.resolve(path.join(os.homedir(), '.cursor', 'mcp.json'));\n }\n\n getServerConfig(\n apiKey: string | undefined,\n selectedFeatures?: string[],\n local?: boolean,\n ): MCPServerConfig {\n return getNativeHTTPServerConfig(apiKey, selectedFeatures, local);\n }\n}\n","import { DefaultMCPClient } from '../MCPClient';\nimport { DefaultMCPClientConfig } from '../defaults';\nimport { PluginCapable, PluginInstallResult } from '../plugin-client';\nimport { z } from 'zod';\nimport { execSync } from 'child_process';\nimport { analytics } from '../../../utils/analytics';\nimport { debug } from '../../../utils/debug';\nimport * as os from 'os';\nimport * as path from 'path';\nimport * as fs from 'fs';\n\nexport const ClaudeCodeMCPConfig = DefaultMCPClientConfig;\n\nexport type ClaudeCodeMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class ClaudeCodeMCPClient\n extends DefaultMCPClient\n implements PluginCapable\n{\n name = 'Claude Code';\n private claudeBinaryPath: string | null = null;\n\n constructor() {\n super();\n }\n\n private findClaudeBinary(): string | null {\n if (this.claudeBinaryPath) {\n return this.claudeBinaryPath;\n }\n\n // Common installation paths for Claude Code CLI\n const possiblePaths = [\n path.join(os.homedir(), '.claude', 'local', 'claude'),\n '/usr/local/bin/claude',\n '/opt/homebrew/bin/claude',\n ];\n\n for (const claudePath of possiblePaths) {\n if (fs.existsSync(claudePath)) {\n debug(` Found claude binary at: ${claudePath}`);\n this.claudeBinaryPath = claudePath;\n return claudePath;\n }\n }\n\n // Try PATH as fallback\n try {\n execSync('command -v claude', { stdio: 'pipe' });\n debug(' Found claude in PATH');\n this.claudeBinaryPath = 'claude';\n return 'claude';\n } catch {\n // Not in PATH\n }\n\n return null;\n }\n\n isClientSupported(): Promise<boolean> {\n try {\n debug(' Checking for Claude Code...');\n const claudeBinary = this.findClaudeBinary();\n\n if (!claudeBinary) {\n debug(' Claude Code not found. Installation paths checked:');\n debug(` - ${path.join(os.homedir(), '.claude', 'local', 'claude')}`);\n debug(` - /usr/local/bin/claude`);\n debug(` - /opt/homebrew/bin/claude`);\n debug(` - PATH`);\n return Promise.resolve(false);\n }\n\n const output = execSync(`${claudeBinary} --version`, { stdio: 'pipe' });\n const version = output.toString().trim();\n debug(` Claude Code detected: ${version}`);\n return Promise.resolve(true);\n } catch (error) {\n debug(\n ` Claude Code check failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n return Promise.resolve(false);\n }\n }\n\n isServerInstalled(): Promise<boolean> {\n return this.isPluginInstalled();\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n async addServer(): Promise<{ success: boolean }> {\n const result = await this.installPlugin();\n return { success: result.success };\n }\n\n removeServer(local?: boolean): Promise<{ success: boolean }> {\n const claudeBinary = this.findClaudeBinary();\n if (!claudeBinary) {\n return Promise.resolve({ success: false });\n }\n\n const serverName = local ? 'posthog-local' : 'posthog';\n const command = `${claudeBinary} mcp remove --scope user ${serverName}`;\n\n try {\n execSync(command);\n } catch (error) {\n analytics.captureException(\n new Error(\n `Failed to remove server from Claude Code: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n\n supportsPlugin(): boolean {\n return this.findClaudeBinary() !== null;\n }\n\n isPluginInstalled(): Promise<boolean> {\n const binary = this.findClaudeBinary();\n if (!binary) return Promise.resolve(false);\n try {\n const output = execSync(`${binary} plugin list`, {\n stdio: 'pipe',\n }).toString();\n return Promise.resolve(output.toLowerCase().includes('posthog'));\n } catch {\n return Promise.resolve(false);\n }\n }\n\n installPlugin(): Promise<PluginInstallResult> {\n const binary = this.findClaudeBinary();\n if (!binary) return Promise.resolve({ success: false });\n try {\n execSync(`${binary} plugin install posthog`, { stdio: 'pipe' });\n return Promise.resolve({ success: true });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes('already installed') || msg.includes('already exists')) {\n return Promise.resolve({ success: true, alreadyInstalled: true });\n }\n analytics.captureException(\n new Error(`Claude Code plugin install failed: ${msg}`),\n );\n return Promise.resolve({ success: false });\n }\n }\n}\n","import z from 'zod';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { DefaultMCPClient, MCPServerConfig } from '../MCPClient';\nimport { getNativeHTTPServerConfig } from '../defaults';\nimport { runtimeEnv } from '@env';\n\nexport const VisualStudioCodeMCPConfig = z\n .object({\n servers: z.record(\n z.string(),\n z.union([\n z.object({\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n }),\n z.object({\n type: z.enum(['http', 'sse']),\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n ]),\n ),\n })\n .passthrough();\n\nexport type VisualStudioCodeMCPConfig = z.infer<\n typeof VisualStudioCodeMCPConfig\n>;\n\nexport class VisualStudioCodeClient extends DefaultMCPClient {\n name = 'Visual Studio Code';\n\n getServerPropertyName(): string {\n return 'servers';\n }\n\n async isClientSupported(): Promise<boolean> {\n return Promise.resolve(\n process.platform === 'darwin' ||\n process.platform === 'win32' ||\n process.platform === 'linux',\n );\n }\n\n async getConfigPath(): Promise<string> {\n const homeDir = os.homedir();\n const isWindows = process.platform === 'win32';\n const isMac = process.platform === 'darwin';\n const isLinux = process.platform === 'linux';\n\n if (isMac) {\n return Promise.resolve(\n path.join(\n homeDir,\n 'Library',\n 'Application Support',\n 'Code',\n 'User',\n 'mcp.json',\n ),\n );\n }\n\n if (isWindows) {\n return Promise.resolve(\n path.join(runtimeEnv('APPDATA') || '', 'Code', 'User', 'mcp.json'),\n );\n }\n\n if (isLinux) {\n return Promise.resolve(\n path.join(homeDir, '.config', 'Code', 'User', 'mcp.json'),\n );\n }\n\n throw new Error(`Unsupported platform: ${process.platform}`);\n }\n\n getServerConfig(\n apiKey: string | undefined,\n selectedFeatures?: string[],\n local?: boolean,\n ): MCPServerConfig {\n return {\n type: 'http',\n ...getNativeHTTPServerConfig(apiKey, selectedFeatures, local),\n };\n }\n}\n","import z from 'zod';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { DefaultMCPClient, MCPServerConfig } from '../MCPClient';\nimport { getNativeHTTPServerConfig } from '../defaults';\nimport { runtimeEnv } from '@env';\n\nexport const ZedMCPConfig = z\n .object({\n context_servers: z.record(\n z.string(),\n z.union([\n z.object({\n enabled: z.boolean().optional(),\n source: z.string().optional(),\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n }),\n z.object({\n enabled: z.boolean().optional(),\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n ]),\n ),\n })\n .passthrough();\n\nexport type ZedMCPConfig = z.infer<typeof ZedMCPConfig>;\n\nexport class ZedClient extends DefaultMCPClient {\n name = 'Zed';\n\n getServerPropertyName(): string {\n return 'context_servers';\n }\n\n async isClientSupported(): Promise<boolean> {\n return Promise.resolve(\n process.platform === 'darwin' || process.platform === 'linux',\n );\n }\n\n async getConfigPath(): Promise<string> {\n const homeDir = os.homedir();\n const isMac = process.platform === 'darwin';\n const isLinux = process.platform === 'linux';\n\n if (isMac) {\n return Promise.resolve(\n path.join(homeDir, '.config', 'zed', 'settings.json'),\n );\n }\n\n if (isLinux) {\n // https://zed.dev/docs/configuring-zed#settings-files\n const xdgConfigHome = runtimeEnv('XDG_CONFIG_HOME');\n if (xdgConfigHome) {\n return Promise.resolve(\n path.join(xdgConfigHome, 'zed', 'settings.json'),\n );\n }\n return Promise.resolve(\n path.join(homeDir, '.config', 'zed', 'settings.json'),\n );\n }\n\n throw new Error(`Unsupported platform: ${process.platform}`);\n }\n\n getServerConfig(\n apiKey: string | undefined,\n selectedFeatures?: string[],\n local?: boolean,\n ): MCPServerConfig {\n return {\n enabled: true,\n ...getNativeHTTPServerConfig(apiKey, selectedFeatures, local),\n };\n }\n}\n","import { z } from 'zod';\nimport { execSync, spawnSync } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nimport { DefaultMCPClient } from '../MCPClient';\nimport { DefaultMCPClientConfig } from '../defaults';\nimport { PluginCapable, PluginInstallResult } from '../plugin-client';\n\nimport { analytics } from '../../../utils/analytics';\n\nexport const CodexMCPConfig = DefaultMCPClientConfig;\n\nexport type CodexMCPConfig = z.infer<typeof DefaultMCPClientConfig>;\n\nexport class CodexMCPClient extends DefaultMCPClient implements PluginCapable {\n name = 'Codex';\n private codexBinaryPath: string | null = null;\n\n constructor() {\n super();\n }\n\n private findCodexBinary(): string | null {\n if (this.codexBinaryPath) return this.codexBinaryPath;\n try {\n const resolved = execSync('command -v codex', { stdio: 'pipe' })\n .toString()\n .trim();\n if (resolved) {\n this.codexBinaryPath = resolved;\n return resolved;\n }\n } catch {\n // not in PATH\n }\n return null;\n }\n\n isClientSupported(): Promise<boolean> {\n return Promise.resolve(this.findCodexBinary() !== null);\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n isServerInstalled(): Promise<boolean> {\n return this.isPluginInstalled();\n }\n\n async addServer(): Promise<{ success: boolean }> {\n const result = await this.installPlugin();\n return { success: result.success };\n }\n\n removeServer(): Promise<{ success: boolean }> {\n const binary = this.findCodexBinary();\n if (!binary) return Promise.resolve({ success: false });\n\n const result = spawnSync(binary, ['mcp', 'remove', 'posthog'], {\n stdio: 'ignore',\n });\n\n if (result.error || result.status !== 0) {\n analytics.captureException(\n new Error('Failed to remove server from Codex CLI.'),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n\n supportsPlugin(): boolean {\n return this.findCodexBinary() !== null;\n }\n\n isPluginInstalled(): Promise<boolean> {\n const configPath = path.join(os.homedir(), '.codex', 'config.toml');\n try {\n const contents = fs.readFileSync(configPath, 'utf-8');\n // Marketplace installs appear as [marketplaces.posthog] in config.toml\n return Promise.resolve(\n contents.toLowerCase().includes('[marketplaces.posthog]'),\n );\n } catch {\n return Promise.resolve(false);\n }\n }\n\n installPlugin(): Promise<PluginInstallResult> {\n const binary = this.findCodexBinary();\n if (!binary) return Promise.resolve({ success: false });\n\n const run = () =>\n spawnSync(binary, ['plugin', 'marketplace', 'add', 'PostHog/ai-plugin'], {\n encoding: 'utf-8',\n });\n\n let result = run();\n\n // Stale cache directory with no config.toml entry — clear it and retry\n if (\n result.status !== 0 &&\n (result.stderr ?? '').includes('already added from a different source')\n ) {\n const staleDir = path.join(\n os.homedir(),\n '.codex',\n '.tmp',\n 'marketplaces',\n 'posthog',\n );\n try {\n fs.rmSync(staleDir, { recursive: true, force: true });\n } catch {\n // ignore — retry anyway\n }\n result = run();\n }\n\n if (result.status !== 0) {\n analytics.captureException(\n new Error(`Codex plugin install failed: ${result.stderr ?? ''}`),\n );\n return Promise.resolve({ success: false });\n }\n\n return Promise.resolve({ success: true });\n }\n}\n\nexport default CodexMCPClient;\n","export interface PluginInstallResult {\n success: boolean;\n alreadyInstalled?: boolean;\n}\n\nexport interface PluginCapable {\n supportsPlugin(): boolean;\n isPluginInstalled(): Promise<boolean>;\n installPlugin(): Promise<PluginInstallResult>;\n}\n\nexport function isPluginCapable<T>(client: T): client is T & PluginCapable {\n return (\n typeof client === 'object' &&\n client !== null &&\n 'supportsPlugin' in client &&\n 'installPlugin' in client\n );\n}\n","import type { Integration } from '../../lib/constants';\nimport type { CloudRegion } from '../../utils/types';\nimport { traceStep } from '../../telemetry';\nimport { analytics } from '../../utils/analytics';\nimport { getUI } from '../../ui';\nimport { MCPClient } from './MCPClient';\nimport { CursorMCPClient } from './clients/cursor';\nimport { ClaudeCodeMCPClient } from './clients/claude-code';\nimport { VisualStudioCodeClient } from './clients/visual-studio-code';\nimport { ZedClient } from './clients/zed';\nimport { CodexMCPClient } from './clients/codex';\nimport { ALL_FEATURE_VALUES } from './defaults';\nimport { debug } from '../../utils/debug';\nimport { isPluginCapable, PluginCapable } from './plugin-client';\n\nexport const getSupportedClients = async (): Promise<MCPClient[]> => {\n const allClients = [\n new ClaudeCodeMCPClient(),\n new CodexMCPClient(),\n new CursorMCPClient(),\n new VisualStudioCodeClient(),\n new ZedClient(),\n ];\n const supportedClients: MCPClient[] = [];\n\n debug('Checking for supported MCP clients...');\n for (const client of allClients) {\n const isSupported = await client.isClientSupported();\n debug(`${client.name}: ${isSupported ? '✓ supported' : '✗ not supported'}`);\n if (isSupported) {\n supportedClients.push(client);\n }\n }\n debug(\n `Found ${supportedClients.length} supported client(s): ${supportedClients\n .map((c) => c.name)\n .join(', ')}`,\n );\n\n return supportedClients;\n};\n\n/**\n * Add MCP server to clients. No prompts — pure orchestration.\n * Prompts are handled by McpScreen (TUI) or auto-accepted (CI).\n */\nexport const addMCPServerToClientsStep = async ({\n integration,\n local = false,\n ci = false,\n cloudRegion: _cloudRegion,\n features,\n apiKey,\n}: {\n integration?: Integration;\n local?: boolean;\n ci?: boolean;\n cloudRegion?: CloudRegion;\n features?: string[];\n apiKey?: string;\n}): Promise<string[]> => {\n const ui = getUI();\n\n // CI mode: skip MCP installation entirely\n if (ci) {\n ui.log.info('Skipping MCP installation (CI mode)');\n return [];\n }\n\n const supportedClients = await getSupportedClients();\n\n if (supportedClients.length === 0) {\n ui.log.info(\n 'No supported MCP clients detected. Skipping MCP installation.',\n );\n return [];\n }\n\n // Auto-install to all supported clients\n await traceStep('adding mcp servers', async () => {\n await addMCPServer(\n supportedClients,\n apiKey,\n features ?? [...ALL_FEATURE_VALUES],\n local,\n );\n });\n\n ui.log.success(\n `Added the MCP server to:\n ${supportedClients.map((c) => `- ${c.name}`).join('\\n ')} `,\n );\n\n analytics.wizardCapture('mcp servers added', {\n clients: supportedClients.map((c) => c.name),\n integration,\n });\n\n return supportedClients.map((c) => c.name);\n};\n\nexport const removeMCPServerFromClientsStep = async ({\n integration,\n local = false,\n}: {\n integration?: Integration;\n local?: boolean;\n}): Promise<string[]> => {\n const installedClients = await getInstalledClients(local);\n if (installedClients.length === 0) {\n analytics.wizardCapture('mcp no servers to remove', {\n integration,\n });\n return [];\n }\n\n // Auto-remove from all installed clients\n const results = await traceStep('removing mcp servers', async () => {\n await removeMCPServer(installedClients, local);\n return installedClients.map((c) => c.name);\n });\n\n analytics.wizardCapture('mcp servers removed', {\n clients: results,\n integration,\n });\n\n return results;\n};\n\nexport const getInstalledClients = async (\n local?: boolean,\n): Promise<MCPClient[]> => {\n const clients = await getSupportedClients();\n const installedClients: MCPClient[] = [];\n\n for (const client of clients) {\n if (await client.isServerInstalled(local)) {\n installedClients.push(client);\n }\n }\n\n return installedClients;\n};\n\nexport const addMCPServer = async (\n clients: MCPClient[],\n personalApiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n): Promise<void> => {\n for (const client of clients) {\n await client.addServer(personalApiKey, selectedFeatures, local);\n }\n};\n\nexport const getSupportedPluginClients = (\n clients: MCPClient[],\n): Array<MCPClient & PluginCapable> => {\n return clients.filter(isPluginCapable).filter((c) => c.supportsPlugin());\n};\n\nexport const installPlugins = async (\n clients: Array<MCPClient & PluginCapable>,\n): Promise<string[]> => {\n const installed: string[] = [];\n for (const client of clients) {\n try {\n const result = await client.installPlugin();\n if (result.success) installed.push(client.name);\n } catch (err) {\n debug(`[installPlugins] installPlugin threw for ${client.name}: ${err}`);\n }\n }\n return installed;\n};\n\nexport const removeMCPServer = async (\n clients: MCPClient[],\n local?: boolean,\n): Promise<void> => {\n for (const client of clients) {\n await client.removeServer(local);\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAOA,IAAsB,YAAtB,MAAgC;CAC9B;;AAaF,IAAsB,mBAAtB,cAA+C,UAAU;CACvD,OAAO;CAEP,cAAc;AACZ,SAAO;;CAGT,wBAAgC;AAC9B,SAAO;;CAGT,gBACE,QACA,kBACA,OACiB;AACjB,SAAO,uBAAuB,QAAQ,kBAAkB,MAAM;;CAGhE,MAAM,kBAAkB,OAAmC;AACzD,MAAI;GACF,MAAM,aAAa,MAAM,KAAK,eAAe;AAE7C,OAAI,CAACA,KAAG,WAAW,WAAW,CAC5B,QAAO;GAGT,MAAM,gBAAgB,MAAMA,KAAG,SAAS,SAAS,YAAY,OAAO;GACpE,MAAM,SAAS,MAAM,MAAM,cAAc;GACzC,MAAM,qBAAqB,KAAK,uBAAuB;GACvD,MAAM,aAAa,QAAQ,kBAAkB;AAE7C,UACE,sBAAsB,UAAU,cAAc,OAAO;UAEjD;AACN,UAAO;;;CAIX,MAAM,UACJ,QACA,kBACA,OAC+B;AAC/B,MAAI;GACF,MAAM,aAAa,MAAM,KAAK,eAAe;GAC7C,MAAM,YAAYC,OAAK,QAAQ,WAAW;AAE1C,SAAMD,KAAG,SAAS,MAAM,WAAW,EAAE,WAAW,MAAM,CAAC;GAEvD,MAAM,qBAAqB,KAAK,uBAAuB;GACvD,IAAI,gBAAgB;GACpB,IAAI,iBAAiB,EAAE;AAEvB,OAAIA,KAAG,WAAW,WAAW,EAAE;AAC7B,oBAAgB,MAAMA,KAAG,SAAS,SAAS,YAAY,OAAO;AAC9D,qBAAiB,MAAM,MAAM,cAAc,IAAI,EAAE;;GAGnD,MAAM,kBAAkB,KAAK,gBAC3B,QACA,kBACA,MACD;GACD,MAAM,cAAc;AACpB,OAAI,CAAC,YAAY,oBACf,aAAY,sBAAsB,EAAE;GAEtC,MAAM,aAAa,QAAQ,kBAAkB;AAC7C,eAAY,oBAAoB,cAAc;GAE9C,MAAM,QAAQ,MAAM,OAClB,eACA,CAAC,oBAAoB,WAAW,EAChC,iBACA,EACE,mBAAmB;IACjB,SAAS;IACT,cAAc;IACf,EACF,CACF;GAED,MAAM,kBAAkB,MAAM,WAAW,eAAe,MAAM;AAE9D,SAAMA,KAAG,SAAS,UAAU,YAAY,iBAAiB,OAAO;AAEhE,UAAO,EAAE,SAAS,MAAM;UAClB;AACN,UAAO,EAAE,SAAS,OAAO;;;CAI7B,MAAM,aAAa,OAAgD;AACjE,MAAI;GACF,MAAM,aAAa,MAAM,KAAK,eAAe;AAE7C,OAAI,CAACA,KAAG,WAAW,WAAW,CAC5B,QAAO,EAAE,SAAS,OAAO;GAG3B,MAAM,gBAAgB,MAAMA,KAAG,SAAS,SAAS,YAAY,OAAO;GACpE,MAAM,SAAS,MAAM,MAAM,cAAc;GACzC,MAAM,qBAAqB,KAAK,uBAAuB;GAEvD,MAAM,aAAa,QAAQ,kBAAkB;AAE7C,OACE,sBAAsB,UACtB,cAAc,OAAO,qBACrB;IACA,MAAM,QAAQ,MAAM,OAClB,eACA,CAAC,oBAAoB,WAAW,EAChC,KAAA,GACA,EACE,mBAAmB;KACjB,SAAS;KACT,cAAc;KACf,EACF,CACF;IAED,MAAM,kBAAkB,MAAM,WAAW,eAAe,MAAM;AAE9D,UAAMA,KAAG,SAAS,UAAU,YAAY,iBAAiB,OAAO;AAEhE,WAAO,EAAE,SAAS,MAAM;;UAEpB;AAIR,SAAO,EAAE,SAAS,OAAO;;;;;ACjJ7B,IAAa,kBAAb,cAAqC,iBAAiB;CACpD,OAAO;CAEP,cAAc;AACZ,SAAO;;CAGT,MAAM,oBAAsC;AAC1C,SAAO,QAAQ,QACb,QAAQ,aAAa,YAAY,QAAQ,aAAa,QACvD;;CAGH,MAAM,gBAAiC;AACrC,SAAO,QAAQ,QAAQE,OAAK,KAAKC,KAAG,SAAS,EAAE,WAAW,WAAW,CAAC;;CAGxE,gBACE,QACA,kBACA,OACiB;AACjB,SAAO,0BAA0B,QAAQ,kBAAkB,MAAM;;;;;ACjBrE,IAAa,sBAAb,cACU,iBAEV;CACE,OAAO;CACP,mBAA0C;CAE1C,cAAc;AACZ,SAAO;;CAGT,mBAA0C;AACxC,MAAI,KAAK,iBACP,QAAO,KAAK;EAId,MAAM,gBAAgB;GACpBC,OAAK,KAAKC,KAAG,SAAS,EAAE,WAAW,SAAS,SAAS;GACrD;GACA;GACD;AAED,OAAK,MAAM,cAAc,cACvB,KAAIC,KAAG,WAAW,WAAW,EAAE;AAC7B,SAAM,6BAA6B,aAAa;AAChD,QAAK,mBAAmB;AACxB,UAAO;;AAKX,MAAI;AACF,cAAS,qBAAqB,EAAE,OAAO,QAAQ,CAAC;AAChD,SAAM,yBAAyB;AAC/B,QAAK,mBAAmB;AACxB,UAAO;UACD;AAIR,SAAO;;CAGT,oBAAsC;AACpC,MAAI;AACF,SAAM,gCAAgC;GACtC,MAAM,eAAe,KAAK,kBAAkB;AAE5C,OAAI,CAAC,cAAc;AACjB,UAAM,uDAAuD;AAC7D,UAAM,SAASF,OAAK,KAAKC,KAAG,SAAS,EAAE,WAAW,SAAS,SAAS,GAAG;AACvE,UAAM,8BAA8B;AACpC,UAAM,iCAAiC;AACvC,UAAM,aAAa;AACnB,WAAO,QAAQ,QAAQ,MAAM;;AAK/B,SAAM,2BAFSE,WAAS,GAAG,aAAa,aAAa,EAAE,OAAO,QAAQ,CAAC,CAChD,UAAU,CAAC,MAAM,GACG;AAC3C,UAAO,QAAQ,QAAQ,KAAK;WACrB,OAAO;AACd,SACE,+BACE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GAEzD;AACD,UAAO,QAAQ,QAAQ,MAAM;;;CAIjC,oBAAsC;AACpC,SAAO,KAAK,mBAAmB;;CAGjC,gBAAiC;AAC/B,QAAM,IAAI,MAAM,kBAAkB;;CAGpC,MAAM,YAA2C;AAE/C,SAAO,EAAE,UADM,MAAM,KAAK,eAAe,EAChB,SAAS;;CAGpC,aAAa,OAAgD;EAC3D,MAAM,eAAe,KAAK,kBAAkB;AAC5C,MAAI,CAAC,aACH,QAAO,QAAQ,QAAQ,EAAE,SAAS,OAAO,CAAC;EAI5C,MAAM,UAAU,GAAG,aAAa,2BADb,QAAQ,kBAAkB;AAG7C,MAAI;AACF,cAAS,QAAQ;WACV,OAAO;AACd,aAAU,iCACR,IAAI,MACF,6CACE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GAEzD,CACF;AACD,UAAO,QAAQ,QAAQ,EAAE,SAAS,OAAO,CAAC;;AAG5C,SAAO,QAAQ,QAAQ,EAAE,SAAS,MAAM,CAAC;;CAG3C,iBAA0B;AACxB,SAAO,KAAK,kBAAkB,KAAK;;CAGrC,oBAAsC;EACpC,MAAM,SAAS,KAAK,kBAAkB;AACtC,MAAI,CAAC,OAAQ,QAAO,QAAQ,QAAQ,MAAM;AAC1C,MAAI;GACF,MAAM,SAASA,WAAS,GAAG,OAAO,eAAe,EAC/C,OAAO,QACR,CAAC,CAAC,UAAU;AACb,UAAO,QAAQ,QAAQ,OAAO,aAAa,CAAC,SAAS,UAAU,CAAC;UAC1D;AACN,UAAO,QAAQ,QAAQ,MAAM;;;CAIjC,gBAA8C;EAC5C,MAAM,SAAS,KAAK,kBAAkB;AACtC,MAAI,CAAC,OAAQ,QAAO,QAAQ,QAAQ,EAAE,SAAS,OAAO,CAAC;AACvD,MAAI;AACF,cAAS,GAAG,OAAO,0BAA0B,EAAE,OAAO,QAAQ,CAAC;AAC/D,UAAO,QAAQ,QAAQ,EAAE,SAAS,MAAM,CAAC;WAClC,OAAO;GACd,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAClE,OAAI,IAAI,SAAS,oBAAoB,IAAI,IAAI,SAAS,iBAAiB,CACrE,QAAO,QAAQ,QAAQ;IAAE,SAAS;IAAM,kBAAkB;IAAM,CAAC;AAEnE,aAAU,iCACR,IAAI,MAAM,sCAAsC,MAAM,CACvD;AACD,UAAO,QAAQ,QAAQ,EAAE,SAAS,OAAO,CAAC;;;;ACrJPC,IACtC,OAAO,EACN,SAASA,IAAE,OACTA,IAAE,QAAQ,EACVA,IAAE,MAAM,CACNA,IAAE,OAAO;CACP,SAASA,IAAE,QAAQ,CAAC,UAAU;CAC9B,MAAMA,IAAE,MAAMA,IAAE,QAAQ,CAAC,CAAC,UAAU;CACpC,KAAKA,IAAE,OAAOA,IAAE,QAAQ,EAAEA,IAAE,QAAQ,CAAC,CAAC,UAAU;CACjD,CAAC,EACFA,IAAE,OAAO;CACP,MAAMA,IAAE,KAAK,CAAC,QAAQ,MAAM,CAAC;CAC7B,KAAKA,IAAE,QAAQ;CACf,SAASA,IAAE,OAAOA,IAAE,QAAQ,EAAEA,IAAE,QAAQ,CAAC,CAAC,UAAU;CACrD,CAAC,CACH,CAAC,CACH,EACF,CAAC,CACD,aAAa;AAMhB,IAAa,yBAAb,cAA4C,iBAAiB;CAC3D,OAAO;CAEP,wBAAgC;AAC9B,SAAO;;CAGT,MAAM,oBAAsC;AAC1C,SAAO,QAAQ,QACb,QAAQ,aAAa,YACnB,QAAQ,aAAa,WACrB,QAAQ,aAAa,QACxB;;CAGH,MAAM,gBAAiC;EACrC,MAAM,UAAUC,KAAG,SAAS;EAC5B,MAAM,YAAY,QAAQ,aAAa;EACvC,MAAM,QAAQ,QAAQ,aAAa;EACnC,MAAM,UAAU,QAAQ,aAAa;AAErC,MAAI,MACF,QAAO,QAAQ,QACbC,OAAK,KACH,SACA,WACA,uBACA,QACA,QACA,WACD,CACF;AAGH,MAAI,UACF,QAAO,QAAQ,QACbA,OAAK,KAAK,WAAW,UAAU,IAAI,IAAI,QAAQ,QAAQ,WAAW,CACnE;AAGH,MAAI,QACF,QAAO,QAAQ,QACbA,OAAK,KAAK,SAAS,WAAW,QAAQ,QAAQ,WAAW,CAC1D;AAGH,QAAM,IAAI,MAAM,yBAAyB,QAAQ,WAAW;;CAG9D,gBACE,QACA,kBACA,OACiB;AACjB,SAAO;GACL,MAAM;GACN,GAAG,0BAA0B,QAAQ,kBAAkB,MAAM;GAC9D;;;ACjFuBC,IACzB,OAAO,EACN,iBAAiBA,IAAE,OACjBA,IAAE,QAAQ,EACVA,IAAE,MAAM,CACNA,IAAE,OAAO;CACP,SAASA,IAAE,SAAS,CAAC,UAAU;CAC/B,QAAQA,IAAE,QAAQ,CAAC,UAAU;CAC7B,SAASA,IAAE,QAAQ,CAAC,UAAU;CAC9B,MAAMA,IAAE,MAAMA,IAAE,QAAQ,CAAC,CAAC,UAAU;CACpC,KAAKA,IAAE,OAAOA,IAAE,QAAQ,EAAEA,IAAE,QAAQ,CAAC,CAAC,UAAU;CACjD,CAAC,EACFA,IAAE,OAAO;CACP,SAASA,IAAE,SAAS,CAAC,UAAU;CAC/B,KAAKA,IAAE,QAAQ;CACf,SAASA,IAAE,OAAOA,IAAE,QAAQ,EAAEA,IAAE,QAAQ,CAAC,CAAC,UAAU;CACrD,CAAC,CACH,CAAC,CACH,EACF,CAAC,CACD,aAAa;AAIhB,IAAa,YAAb,cAA+B,iBAAiB;CAC9C,OAAO;CAEP,wBAAgC;AAC9B,SAAO;;CAGT,MAAM,oBAAsC;AAC1C,SAAO,QAAQ,QACb,QAAQ,aAAa,YAAY,QAAQ,aAAa,QACvD;;CAGH,MAAM,gBAAiC;EACrC,MAAM,UAAUC,KAAG,SAAS;EAC5B,MAAM,QAAQ,QAAQ,aAAa;EACnC,MAAM,UAAU,QAAQ,aAAa;AAErC,MAAI,MACF,QAAO,QAAQ,QACbC,OAAK,KAAK,SAAS,WAAW,OAAO,gBAAgB,CACtD;AAGH,MAAI,SAAS;GAEX,MAAM,gBAAgB,WAAW,kBAAkB;AACnD,OAAI,cACF,QAAO,QAAQ,QACbA,OAAK,KAAK,eAAe,OAAO,gBAAgB,CACjD;AAEH,UAAO,QAAQ,QACbA,OAAK,KAAK,SAAS,WAAW,OAAO,gBAAgB,CACtD;;AAGH,QAAM,IAAI,MAAM,yBAAyB,QAAQ,WAAW;;CAG9D,gBACE,QACA,kBACA,OACiB;AACjB,SAAO;GACL,SAAS;GACT,GAAG,0BAA0B,QAAQ,kBAAkB,MAAM;GAC9D;;;;;AC/DL,IAAa,iBAAb,cAAoC,iBAA0C;CAC5E,OAAO;CACP,kBAAyC;CAEzC,cAAc;AACZ,SAAO;;CAGT,kBAAyC;AACvC,MAAI,KAAK,gBAAiB,QAAO,KAAK;AACtC,MAAI;GACF,MAAM,WAAW,SAAS,oBAAoB,EAAE,OAAO,QAAQ,CAAC,CAC7D,UAAU,CACV,MAAM;AACT,OAAI,UAAU;AACZ,SAAK,kBAAkB;AACvB,WAAO;;UAEH;AAGR,SAAO;;CAGT,oBAAsC;AACpC,SAAO,QAAQ,QAAQ,KAAK,iBAAiB,KAAK,KAAK;;CAGzD,gBAAiC;AAC/B,QAAM,IAAI,MAAM,kBAAkB;;CAGpC,oBAAsC;AACpC,SAAO,KAAK,mBAAmB;;CAGjC,MAAM,YAA2C;AAE/C,SAAO,EAAE,UADM,MAAM,KAAK,eAAe,EAChB,SAAS;;CAGpC,eAA8C;EAC5C,MAAM,SAAS,KAAK,iBAAiB;AACrC,MAAI,CAAC,OAAQ,QAAO,QAAQ,QAAQ,EAAE,SAAS,OAAO,CAAC;EAEvD,MAAM,SAAS,UAAU,QAAQ;GAAC;GAAO;GAAU;GAAU,EAAE,EAC7D,OAAO,UACR,CAAC;AAEF,MAAI,OAAO,SAAS,OAAO,WAAW,GAAG;AACvC,aAAU,iCACR,IAAI,MAAM,0CAA0C,CACrD;AACD,UAAO,QAAQ,QAAQ,EAAE,SAAS,OAAO,CAAC;;AAG5C,SAAO,QAAQ,QAAQ,EAAE,SAAS,MAAM,CAAC;;CAG3C,iBAA0B;AACxB,SAAO,KAAK,iBAAiB,KAAK;;CAGpC,oBAAsC;EACpC,MAAM,aAAaC,OAAK,KAAK,GAAG,SAAS,EAAE,UAAU,cAAc;AACnE,MAAI;GACF,MAAM,WAAWC,KAAG,aAAa,YAAY,QAAQ;AAErD,UAAO,QAAQ,QACb,SAAS,aAAa,CAAC,SAAS,yBAAyB,CAC1D;UACK;AACN,UAAO,QAAQ,QAAQ,MAAM;;;CAIjC,gBAA8C;EAC5C,MAAM,SAAS,KAAK,iBAAiB;AACrC,MAAI,CAAC,OAAQ,QAAO,QAAQ,QAAQ,EAAE,SAAS,OAAO,CAAC;EAEvD,MAAM,YACJ,UAAU,QAAQ;GAAC;GAAU;GAAe;GAAO;GAAoB,EAAE,EACvE,UAAU,SACX,CAAC;EAEJ,IAAI,SAAS,KAAK;AAGlB,MACE,OAAO,WAAW,MACjB,OAAO,UAAU,IAAI,SAAS,wCAAwC,EACvE;GACA,MAAM,WAAWD,OAAK,KACpB,GAAG,SAAS,EACZ,UACA,QACA,gBACA,UACD;AACD,OAAI;AACF,SAAG,OAAO,UAAU;KAAE,WAAW;KAAM,OAAO;KAAM,CAAC;WAC/C;AAGR,YAAS,KAAK;;AAGhB,MAAI,OAAO,WAAW,GAAG;AACvB,aAAU,iCACR,IAAI,MAAM,gCAAgC,OAAO,UAAU,KAAK,CACjE;AACD,UAAO,QAAQ,QAAQ,EAAE,SAAS,OAAO,CAAC;;AAG5C,SAAO,QAAQ,QAAQ,EAAE,SAAS,MAAM,CAAC;;;;;ACvH7C,SAAgB,gBAAmB,QAAwC;AACzE,QACE,OAAO,WAAW,YAClB,WAAW,QACX,oBAAoB,UACpB,mBAAmB;;;;;;;;;;;;;;ACDvB,MAAa,sBAAsB,YAAkC;CACnE,MAAM,aAAa;EACjB,IAAI,qBAAqB;EACzB,IAAI,gBAAgB;EACpB,IAAI,iBAAiB;EACrB,IAAI,wBAAwB;EAC5B,IAAI,WAAW;EAChB;CACD,MAAM,mBAAgC,EAAE;AAExC,OAAM,wCAAwC;AAC9C,MAAK,MAAM,UAAU,YAAY;EAC/B,MAAM,cAAc,MAAM,OAAO,mBAAmB;AACpD,QAAM,GAAG,OAAO,KAAK,IAAI,cAAc,gBAAgB,oBAAoB;AAC3E,MAAI,YACF,kBAAiB,KAAK,OAAO;;AAGjC,OACE,SAAS,iBAAiB,OAAO,wBAAwB,iBACtD,KAAK,MAAM,EAAE,KAAK,CAClB,KAAK,KAAK,GACd;AAED,QAAO;;;;;;AAOT,MAAa,4BAA4B,OAAO,EAC9C,aACA,QAAQ,OACR,KAAK,OACL,aAAa,cACb,UACA,aAQuB;CACvB,MAAM,KAAK,OAAO;AAGlB,KAAI,IAAI;AACN,KAAG,IAAI,KAAK,sCAAsC;AAClD,SAAO,EAAE;;CAGX,MAAM,mBAAmB,MAAM,qBAAqB;AAEpD,KAAI,iBAAiB,WAAW,GAAG;AACjC,KAAG,IAAI,KACL,gEACD;AACD,SAAO,EAAE;;AAIX,OAAM,UAAU,sBAAsB,YAAY;AAChD,QAAM,aACJ,kBACA,QACA,YAAY,CAAC,GAAG,mBAAmB,EACnC,MACD;GACD;AAEF,IAAG,IAAI,QACL;IACA,iBAAiB,KAAK,MAAM,KAAK,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,GACzD;AAED,WAAU,cAAc,qBAAqB;EAC3C,SAAS,iBAAiB,KAAK,MAAM,EAAE,KAAK;EAC5C;EACD,CAAC;AAEF,QAAO,iBAAiB,KAAK,MAAM,EAAE,KAAK;;AAG5C,MAAa,iCAAiC,OAAO,EACnD,aACA,QAAQ,YAIe;CACvB,MAAM,mBAAmB,MAAM,oBAAoB,MAAM;AACzD,KAAI,iBAAiB,WAAW,GAAG;AACjC,YAAU,cAAc,4BAA4B,EAClD,aACD,CAAC;AACF,SAAO,EAAE;;CAIX,MAAM,UAAU,MAAM,UAAU,wBAAwB,YAAY;AAClE,QAAM,gBAAgB,kBAAkB,MAAM;AAC9C,SAAO,iBAAiB,KAAK,MAAM,EAAE,KAAK;GAC1C;AAEF,WAAU,cAAc,uBAAuB;EAC7C,SAAS;EACT;EACD,CAAC;AAEF,QAAO;;AAGT,MAAa,sBAAsB,OACjC,UACyB;CACzB,MAAM,UAAU,MAAM,qBAAqB;CAC3C,MAAM,mBAAgC,EAAE;AAExC,MAAK,MAAM,UAAU,QACnB,KAAI,MAAM,OAAO,kBAAkB,MAAM,CACvC,kBAAiB,KAAK,OAAO;AAIjC,QAAO;;AAGT,MAAa,eAAe,OAC1B,SACA,gBACA,kBACA,UACkB;AAClB,MAAK,MAAM,UAAU,QACnB,OAAM,OAAO,UAAU,gBAAgB,kBAAkB,MAAM;;AAInE,MAAa,6BACX,YACqC;AACrC,QAAO,QAAQ,OAAO,gBAAgB,CAAC,QAAQ,MAAM,EAAE,gBAAgB,CAAC;;AAG1E,MAAa,iBAAiB,OAC5B,YACsB;CACtB,MAAM,YAAsB,EAAE;AAC9B,MAAK,MAAM,UAAU,QACnB,KAAI;AAEF,OADe,MAAM,OAAO,eAAe,EAChC,QAAS,WAAU,KAAK,OAAO,KAAK;UACxC,KAAK;AACZ,QAAM,4CAA4C,OAAO,KAAK,IAAI,MAAM;;AAG5E,QAAO;;AAGT,MAAa,kBAAkB,OAC7B,SACA,UACkB;AAClB,MAAK,MAAM,UAAU,QACnB,OAAM,OAAO,aAAa,MAAM"}
|