@posthog/wizard 2.16.1 → 2.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{add-mcp-server-to-clients-BS6Rjcwh.js → add-mcp-server-to-clients-DnPwZl1P.js} +38 -5
- package/dist/add-mcp-server-to-clients-DnPwZl1P.js.map +1 -0
- package/dist/{agent-interface-B4eUlMso.js → agent-interface-C2VEF-BD.js} +110 -54
- package/dist/agent-interface-C2VEF-BD.js.map +1 -0
- package/dist/{agent-runner-BxqiKVEf.js → agent-runner-Dw8cjZoN.js} +11 -8
- package/dist/{agent-runner-BxqiKVEf.js.map → agent-runner-Dw8cjZoN.js.map} +1 -1
- package/dist/{analytics-DUuUurR3.js → analytics-C-zcTO6g.js} +26 -4
- package/dist/analytics-C-zcTO6g.js.map +1 -0
- package/dist/{api-CGJ1iGps.js → api-B3MWP3vm.js} +14 -4
- package/dist/{api-CGJ1iGps.js.map → api-B3MWP3vm.js.map} +1 -1
- package/dist/bin.js +238 -82
- package/dist/bin.js.map +1 -1
- package/dist/{ci-install-DD7WMmIF.js → ci-install-DLuSmSq6.js} +4 -4
- package/dist/{ci-install-DD7WMmIF.js.map → ci-install-DLuSmSq6.js.map} +1 -1
- package/dist/{debug-Cd0hPlZy.js → debug--gQGudnY.js} +1 -1
- package/dist/{debug-ubpO6102.js → debug-BorYMfpE.js} +2 -2
- package/dist/{debug-ubpO6102.js.map → debug-BorYMfpE.js.map} +1 -1
- package/dist/{defaults-zrYmZ2ID.js → defaults-DA3-9dHT.js} +1 -1
- package/dist/{defaults-zrYmZ2ID.js.map → defaults-DA3-9dHT.js.map} +1 -1
- package/dist/{env-api-key-DEl3LJBv.js → env-api-key-MlzJYAvt.js} +1 -1
- package/dist/{env-api-key-DEl3LJBv.js.map → env-api-key-MlzJYAvt.js.map} +1 -1
- package/dist/{environment-BAaC5THg.js → environment-DIOtLqTQ.js} +3 -3
- package/dist/{environment-BAaC5THg.js.map → environment-DIOtLqTQ.js.map} +1 -1
- package/dist/{file-utils-DPmgn9Vm.js → file-utils-VAXoyXVA.js} +1 -1
- package/dist/{file-utils-DPmgn9Vm.js.map → file-utils-VAXoyXVA.js.map} +1 -1
- package/dist/{interactive-BaMAq88Q.js → interactive-DjGjlvY3.js} +2 -2
- package/dist/{interactive-BaMAq88Q.js.map → interactive-DjGjlvY3.js.map} +1 -1
- package/dist/{mcp-prompt-streaming-clGsVw8q.js → mcp-prompt-streaming-Dm47tmiy.js} +62 -12
- package/dist/mcp-prompt-streaming-Dm47tmiy.js.map +1 -0
- package/dist/{non-interactive-l2AKE3jD.js → non-interactive-C2f3Gwva.js} +2 -2
- package/dist/{non-interactive-l2AKE3jD.js.map → non-interactive-C2f3Gwva.js.map} +1 -1
- package/dist/{package-json-Cynjr9k4.js → package-json-DCuoye-H.js} +8 -2
- package/dist/{package-json-Cynjr9k4.js.map → package-json-DCuoye-H.js.map} +1 -1
- package/dist/{package-manager-BqsJK3ej.js → package-manager-Bl2KOUFK.js} +2 -2
- package/dist/{package-manager-BqsJK3ej.js.map → package-manager-Bl2KOUFK.js.map} +1 -1
- package/dist/{playground-DlE5RNfE.js → playground-ZLG68cvx.js} +21 -10
- package/dist/playground-ZLG68cvx.js.map +1 -0
- package/dist/{posthog-DWL8uOcl.js → posthog-Cr37rnla.js} +1 -1
- package/dist/{posthog-DWL8uOcl.js.map → posthog-Cr37rnla.js.map} +1 -1
- package/dist/{posthog-integration-Bf_vtWI9.js → posthog-integration-B_DLodqr.js} +282 -14
- package/dist/posthog-integration-B_DLodqr.js.map +1 -0
- package/dist/{provisioning-D_hAuxUN.js → provisioning-Bk4E6VYn.js} +9 -4
- package/dist/{provisioning-D_hAuxUN.js.map → provisioning-Bk4E6VYn.js.map} +1 -1
- package/dist/{registry-DKgYqROt.js → registry-DMM3UmZD.js} +5 -5
- package/dist/{registry-DKgYqROt.js.map → registry-DMM3UmZD.js.map} +1 -1
- package/dist/{setup-utils-D-uTycLX.js → setup-utils-Df9ezAjZ.js} +86 -38
- package/dist/setup-utils-Df9ezAjZ.js.map +1 -0
- package/dist/{slides-CL1mv_Kq.js → slides-DwvXZ8iS.js} +1583 -322
- package/dist/slides-DwvXZ8iS.js.map +1 -0
- package/dist/{start-tui-DXrv6cof.js → start-tui-P9aMwBzt.js} +28 -18
- package/dist/start-tui-P9aMwBzt.js.map +1 -0
- package/dist/{steps-CgScwqso.js → steps-RCRZbLjZ.js} +6 -6
- package/dist/{steps-CgScwqso.js.map → steps-RCRZbLjZ.js.map} +1 -1
- package/dist/{task-stream-CF6QMVMv.js → task-stream-CZRj6auI.js} +3 -3
- package/dist/{task-stream-CF6QMVMv.js.map → task-stream-CZRj6auI.js.map} +1 -1
- package/dist/{telemetry-v6O12Bep.js → telemetry-CMbVbpaY.js} +2 -2
- package/dist/{telemetry-v6O12Bep.js.map → telemetry-CMbVbpaY.js.map} +1 -1
- package/dist/urls-BzG_Jtw9.js +35 -0
- package/dist/urls-BzG_Jtw9.js.map +1 -0
- package/dist/{wizard-abort-BGoBKgvC.js → wizard-abort-Dl8WJQgJ.js} +1 -1
- package/dist/{wizard-abort-iTaJ8wC8.js → wizard-abort-QuKm_B5z.js} +3 -3
- package/dist/{wizard-abort-iTaJ8wC8.js.map → wizard-abort-QuKm_B5z.js.map} +1 -1
- package/dist/{wizard-session-gsn8Z3bZ.js → wizard-session-d27JGRGi.js} +1 -1
- package/dist/{wizard-session-gsn8Z3bZ.js.map → wizard-session-d27JGRGi.js.map} +1 -1
- package/dist/{wizard-session-7tMjgOvP.js → wizard-session-y304gEEI.js} +1 -1
- package/package.json +1 -1
- package/dist/TextBlock-CdeZog_6.js +0 -275
- package/dist/TextBlock-CdeZog_6.js.map +0 -1
- package/dist/add-mcp-server-to-clients-BS6Rjcwh.js.map +0 -1
- package/dist/agent-interface-B4eUlMso.js.map +0 -1
- package/dist/analytics-DUuUurR3.js.map +0 -1
- package/dist/api-B8OR0N1V.js +0 -2
- package/dist/mcp-prompt-streaming-clGsVw8q.js.map +0 -1
- package/dist/package-json-CumwmZpv.js +0 -2
- package/dist/playground-DlE5RNfE.js.map +0 -1
- package/dist/posthog-integration-Bf_vtWI9.js.map +0 -1
- package/dist/provisioning-BlBnlcFd.js +0 -2
- package/dist/setup-utils-BHZEdkNZ.js +0 -2
- package/dist/setup-utils-D-uTycLX.js.map +0 -1
- package/dist/skill-CnOQAZXp.js +0 -29
- package/dist/skill-CnOQAZXp.js.map +0 -1
- package/dist/slides-CL1mv_Kq.js.map +0 -1
- package/dist/start-tui-DXrv6cof.js.map +0 -1
package/dist/{add-mcp-server-to-clients-BS6Rjcwh.js → add-mcp-server-to-clients-DnPwZl1P.js}
RENAMED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-B_-DWIq7.js";
|
|
2
|
-
import { X as runtimeEnv, p as getUI, r as debug } from "./debug-
|
|
3
|
-
import { t as analytics } from "./analytics-
|
|
4
|
-
import { t as withProgress } from "./telemetry-
|
|
5
|
-
import { i as getNativeHTTPServerConfig, r as getDefaultServerConfig, t as ALL_FEATURE_VALUES } from "./defaults-
|
|
2
|
+
import { X as runtimeEnv, p as getUI, r as debug } from "./debug-BorYMfpE.js";
|
|
3
|
+
import { t as analytics } from "./analytics-C-zcTO6g.js";
|
|
4
|
+
import { t as withProgress } from "./telemetry-CMbVbpaY.js";
|
|
5
|
+
import { i as getNativeHTTPServerConfig, r as getDefaultServerConfig, t as ALL_FEATURE_VALUES } from "./defaults-DA3-9dHT.js";
|
|
6
6
|
import { execSync, spawnSync } from "node:child_process";
|
|
7
7
|
import * as fs$1 from "node:fs";
|
|
8
8
|
import * as os from "node:os";
|
|
9
9
|
import * as path$1 from "node:path";
|
|
10
10
|
import * as fs$2 from "fs";
|
|
11
11
|
import * as path$2 from "path";
|
|
12
|
+
import opn from "opn";
|
|
12
13
|
import z$1 from "zod";
|
|
13
14
|
import { execSync as execSync$1 } from "child_process";
|
|
14
15
|
import * as os$1 from "os";
|
|
@@ -205,6 +206,37 @@ var ClaudeCodeMCPClient = class extends DefaultMCPClient {
|
|
|
205
206
|
}
|
|
206
207
|
}
|
|
207
208
|
};
|
|
209
|
+
//#endregion
|
|
210
|
+
//#region src/steps/add-mcp-server-to-clients/clients/claude-web.ts
|
|
211
|
+
/**
|
|
212
|
+
* Claude Desktop / Claude.ai (web). PostHog ships here as a hosted connector,
|
|
213
|
+
* not a local config — so instead of writing files we open the connector
|
|
214
|
+
* directory page and let the user sign in and click "Connect".
|
|
215
|
+
*/
|
|
216
|
+
var ClaudeWebMCPClient = class extends MCPClient {
|
|
217
|
+
name = "Claude Desktop/Web";
|
|
218
|
+
connectorUrl = "https://claude.ai/directory/connectors/posthog";
|
|
219
|
+
finishInstruction = "Sign in and click \"Connect\" to finish.";
|
|
220
|
+
isClientSupported() {
|
|
221
|
+
return Promise.resolve(true);
|
|
222
|
+
}
|
|
223
|
+
isServerInstalled() {
|
|
224
|
+
return Promise.resolve(false);
|
|
225
|
+
}
|
|
226
|
+
addServer() {
|
|
227
|
+
opn(this.connectorUrl, { wait: false }).catch(() => {});
|
|
228
|
+
return Promise.resolve({ success: true });
|
|
229
|
+
}
|
|
230
|
+
removeServer() {
|
|
231
|
+
return Promise.resolve({ success: false });
|
|
232
|
+
}
|
|
233
|
+
getConfigPath() {
|
|
234
|
+
throw new Error("Not implemented");
|
|
235
|
+
}
|
|
236
|
+
getServerPropertyName() {
|
|
237
|
+
throw new Error("Not implemented");
|
|
238
|
+
}
|
|
239
|
+
};
|
|
208
240
|
z$1.object({ servers: z$1.record(z$1.string(), z$1.union([z$1.object({
|
|
209
241
|
command: z$1.string().optional(),
|
|
210
242
|
args: z$1.array(z$1.string()).optional(),
|
|
@@ -381,6 +413,7 @@ var add_mcp_server_to_clients_exports = /* @__PURE__ */ __exportAll({
|
|
|
381
413
|
const getSupportedClients = async () => {
|
|
382
414
|
const allClients = [
|
|
383
415
|
new ClaudeCodeMCPClient(),
|
|
416
|
+
new ClaudeWebMCPClient(),
|
|
384
417
|
new CodexMCPClient(),
|
|
385
418
|
new CursorMCPClient(),
|
|
386
419
|
new VisualStudioCodeClient(),
|
|
@@ -465,4 +498,4 @@ const removeMCPServer = async (clients, local) => {
|
|
|
465
498
|
//#endregion
|
|
466
499
|
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 };
|
|
467
500
|
|
|
468
|
-
//# sourceMappingURL=add-mcp-server-to-clients-
|
|
501
|
+
//# sourceMappingURL=add-mcp-server-to-clients-DnPwZl1P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-mcp-server-to-clients-DnPwZl1P.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/claude-web.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 {\n DefaultMCPClient,\n MCPServerConfig,\n} from '@steps/add-mcp-server-to-clients/MCPClient';\nimport * as path from 'path';\nimport * as os from 'os';\nimport {\n DefaultMCPClientConfig,\n getNativeHTTPServerConfig,\n} from '@steps/add-mcp-server-to-clients/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 '@steps/add-mcp-server-to-clients/MCPClient';\nimport { DefaultMCPClientConfig } from '@steps/add-mcp-server-to-clients/defaults';\nimport {\n PluginCapable,\n PluginInstallResult,\n} from '@steps/add-mcp-server-to-clients/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 opn from 'opn';\nimport { MCPClient } from '@steps/add-mcp-server-to-clients/MCPClient';\nimport { BrowserFinishable } from '@steps/add-mcp-server-to-clients/browser-client';\n\n/**\n * Claude Desktop / Claude.ai (web). PostHog ships here as a hosted connector,\n * not a local config — so instead of writing files we open the connector\n * directory page and let the user sign in and click \"Connect\".\n */\nexport class ClaudeWebMCPClient extends MCPClient implements BrowserFinishable {\n name = 'Claude Desktop/Web';\n connectorUrl = 'https://claude.ai/directory/connectors/posthog';\n finishInstruction = 'Sign in and click \"Connect\" to finish.';\n\n isClientSupported(): Promise<boolean> {\n // Browser-based — available on every platform.\n return Promise.resolve(true);\n }\n\n isServerInstalled(): Promise<boolean> {\n // The connector lives in the user's Claude account; nothing local to\n // inspect. Returning false also keeps it out of `mcp remove`.\n return Promise.resolve(false);\n }\n\n addServer(): Promise<{ success: boolean }> {\n void opn(this.connectorUrl, { wait: false }).catch(() => {\n // opn throws in environments without a browser (e.g. CI) — swallow it;\n // the URL is still surfaced to the user on the Done screen.\n });\n return Promise.resolve({ success: true });\n }\n\n removeServer(): Promise<{ success: boolean }> {\n return Promise.resolve({ success: false });\n }\n\n getConfigPath(): Promise<string> {\n throw new Error('Not implemented');\n }\n\n getServerPropertyName(): string {\n throw new Error('Not implemented');\n }\n}\n\nexport default ClaudeWebMCPClient;\n","import z from 'zod';\nimport * as path from 'path';\nimport * as os from 'os';\nimport {\n DefaultMCPClient,\n MCPServerConfig,\n} from '@steps/add-mcp-server-to-clients/MCPClient';\nimport { getNativeHTTPServerConfig } from '@steps/add-mcp-server-to-clients/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 {\n DefaultMCPClient,\n MCPServerConfig,\n} from '@steps/add-mcp-server-to-clients/MCPClient';\nimport { getNativeHTTPServerConfig } from '@steps/add-mcp-server-to-clients/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 '@steps/add-mcp-server-to-clients/MCPClient';\nimport { DefaultMCPClientConfig } from '@steps/add-mcp-server-to-clients/defaults';\nimport {\n PluginCapable,\n PluginInstallResult,\n} from '@steps/add-mcp-server-to-clients/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 { withProgress } 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 { ClaudeWebMCPClient } from './clients/claude-web';\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 ClaudeWebMCPClient(),\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 withProgress('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 withProgress('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":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { n as __require } from "./rolldown-runtime-B_-DWIq7.js";
|
|
2
|
-
import { F as POSTHOG_PROPERTY_HEADER_PREFIX, G as WIZARD_VARIANTS, H as WIZARD_REMARK_EVENT_NAME, K as WIZARD_VARIANT_FLAG_KEY, N as POSTHOG_FLAG_HEADER_PREFIX, W as WIZARD_USER_AGENT, a as getLogFilePath, f as skillTmpPath, o as initLogFile, p as getUI, r as debug, s as logToFile, u as WIZARD_YARA_REPORT_FILE } from "./debug-
|
|
3
|
-
import { t as analytics } from "./analytics-
|
|
4
|
-
import {
|
|
5
|
-
import { n as ADDITIONAL_FEATURE_PROMPTS } from "./wizard-session-
|
|
6
|
-
import { n as registerCleanup, r as wizardAbort, t as WizardError } from "./wizard-abort-
|
|
2
|
+
import { F as POSTHOG_PROPERTY_HEADER_PREFIX, G as WIZARD_VARIANTS, H as WIZARD_REMARK_EVENT_NAME, K as WIZARD_VARIANT_FLAG_KEY, N as POSTHOG_FLAG_HEADER_PREFIX, W as WIZARD_USER_AGENT, a as getLogFilePath, f as skillTmpPath, o as initLogFile, p as getUI, r as debug, s as logToFile, u as WIZARD_YARA_REPORT_FILE } from "./debug-BorYMfpE.js";
|
|
3
|
+
import { t as analytics } from "./analytics-C-zcTO6g.js";
|
|
4
|
+
import { i as getLlmGatewayUrlFromHost } from "./urls-BzG_Jtw9.js";
|
|
5
|
+
import { n as ADDITIONAL_FEATURE_PROMPTS } from "./wizard-session-d27JGRGi.js";
|
|
6
|
+
import { n as registerCleanup, r as wizardAbort, t as WizardError } from "./wizard-abort-QuKm_B5z.js";
|
|
7
7
|
import * as fs$1 from "fs";
|
|
8
8
|
import fs from "fs";
|
|
9
9
|
import path from "path";
|
|
@@ -1452,6 +1452,83 @@ function getWizardCommandments() {
|
|
|
1452
1452
|
return WIZARD_COMMANDMENTS;
|
|
1453
1453
|
}
|
|
1454
1454
|
//#endregion
|
|
1455
|
+
//#region src/lib/agent/signals.ts
|
|
1456
|
+
/**
|
|
1457
|
+
* Agent signal vocabulary — the marker strings the agent emits and the error
|
|
1458
|
+
* taxonomy the runner returns. Kept as a dependency-free leaf module so both
|
|
1459
|
+
* `agent-interface.ts` and `output-signals.ts` can import it without a cycle.
|
|
1460
|
+
*/
|
|
1461
|
+
const AgentSignals = {
|
|
1462
|
+
STATUS: "[STATUS]",
|
|
1463
|
+
ERROR_MCP_MISSING: "[ERROR-MCP-MISSING]",
|
|
1464
|
+
ERROR_RESOURCE_MISSING: "[ERROR-RESOURCE-MISSING]",
|
|
1465
|
+
ABORT: "[ABORT]",
|
|
1466
|
+
WIZARD_REMARK: "[WIZARD-REMARK]",
|
|
1467
|
+
BENCHMARK: "[BENCHMARK]",
|
|
1468
|
+
DASHBOARD_URL: "[DASHBOARD_URL]",
|
|
1469
|
+
NOTEBOOK_URL: "[NOTEBOOK_URL]"
|
|
1470
|
+
};
|
|
1471
|
+
//#endregion
|
|
1472
|
+
//#region src/lib/agent/output-signals.ts
|
|
1473
|
+
/**
|
|
1474
|
+
* Parses the signal-bearing lines out of agent output and discards the rest.
|
|
1475
|
+
*
|
|
1476
|
+
* The agent and SDK communicate non-content events (auth/API errors, YARA
|
|
1477
|
+
* violations, missing MCP/resource, the end-of-run remark) by emitting marker
|
|
1478
|
+
* strings inside their prose. `AgentOutputSignals` keeps only the lines that
|
|
1479
|
+
* carry such a marker, so the buffer stays bounded regardless of run length.
|
|
1480
|
+
*/
|
|
1481
|
+
/**
|
|
1482
|
+
* Single source of truth for the substrings runAgent scans agent output for.
|
|
1483
|
+
* `push()` retains a line iff it contains one of these values; every query
|
|
1484
|
+
* reads the same table, so retention and consumers cannot drift. API-error
|
|
1485
|
+
* status codes are not separate entries — `API_ERROR` is the one needle and
|
|
1486
|
+
* the code is a parameter to `hasApiErrorStatus`.
|
|
1487
|
+
*/
|
|
1488
|
+
const OUTPUT_SIGNALS = {
|
|
1489
|
+
API_ERROR: "API Error:",
|
|
1490
|
+
YARA_CRITICAL: "[YARA CRITICAL]",
|
|
1491
|
+
YARA_SCANNER_ERROR: "[YARA] Scanner error",
|
|
1492
|
+
MCP_MISSING: AgentSignals.ERROR_MCP_MISSING,
|
|
1493
|
+
RESOURCE_MISSING: AgentSignals.ERROR_RESOURCE_MISSING,
|
|
1494
|
+
WIZARD_REMARK: AgentSignals.WIZARD_REMARK
|
|
1495
|
+
};
|
|
1496
|
+
const SIGNAL_NEEDLES = Object.values(OUTPUT_SIGNALS);
|
|
1497
|
+
var AgentOutputSignals = class {
|
|
1498
|
+
lines = [];
|
|
1499
|
+
/** Parse step: keep the line only if it carries a known signal; drop prose. */
|
|
1500
|
+
push(text) {
|
|
1501
|
+
if (SIGNAL_NEEDLES.some((n) => text.includes(n))) this.lines.push(text);
|
|
1502
|
+
}
|
|
1503
|
+
get text() {
|
|
1504
|
+
return this.lines.join("\n");
|
|
1505
|
+
}
|
|
1506
|
+
/** True if any retained line contains the given signal's marker. */
|
|
1507
|
+
has(signal) {
|
|
1508
|
+
return this.text.includes(OUTPUT_SIGNALS[signal]);
|
|
1509
|
+
}
|
|
1510
|
+
hasApiError() {
|
|
1511
|
+
return this.has("API_ERROR");
|
|
1512
|
+
}
|
|
1513
|
+
/** True for a specific HTTP status, e.g. 401 (auth) or 429 (rate limit). */
|
|
1514
|
+
hasApiErrorStatus(code) {
|
|
1515
|
+
return this.text.includes(`${OUTPUT_SIGNALS.API_ERROR} ${code}`);
|
|
1516
|
+
}
|
|
1517
|
+
hasYaraViolation() {
|
|
1518
|
+
return this.has("YARA_CRITICAL") || this.has("YARA_SCANNER_ERROR");
|
|
1519
|
+
}
|
|
1520
|
+
/** Joined `API Error: …` lines for the user-facing message, or undefined. */
|
|
1521
|
+
apiErrorMessage() {
|
|
1522
|
+
const m = this.text.match(new RegExp(`${OUTPUT_SIGNALS.API_ERROR} [^\\n]+`, "g"));
|
|
1523
|
+
return m ? m.join("\n") : void 0;
|
|
1524
|
+
}
|
|
1525
|
+
/** Text after the single `[WIZARD-REMARK]` marker, trimmed, or undefined. */
|
|
1526
|
+
remark() {
|
|
1527
|
+
const re = new RegExp(`${OUTPUT_SIGNALS.WIZARD_REMARK.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*(.+?)(?:\\n|$)`, "s");
|
|
1528
|
+
return this.text.match(re)?.[1]?.trim() || void 0;
|
|
1529
|
+
}
|
|
1530
|
+
};
|
|
1531
|
+
//#endregion
|
|
1455
1532
|
//#region src/lib/agent/agent-interface.ts
|
|
1456
1533
|
/**
|
|
1457
1534
|
* Shared agent interface for PostHog wizards
|
|
@@ -1470,16 +1547,6 @@ function getClaudeCodeExecutablePath() {
|
|
|
1470
1547
|
const sdkPackagePath = __require.resolve("@anthropic-ai/claude-agent-sdk");
|
|
1471
1548
|
return path.join(path.dirname(sdkPackagePath), "cli.js");
|
|
1472
1549
|
}
|
|
1473
|
-
const AgentSignals = {
|
|
1474
|
-
STATUS: "[STATUS]",
|
|
1475
|
-
ERROR_MCP_MISSING: "[ERROR-MCP-MISSING]",
|
|
1476
|
-
ERROR_RESOURCE_MISSING: "[ERROR-RESOURCE-MISSING]",
|
|
1477
|
-
ABORT: "[ABORT]",
|
|
1478
|
-
WIZARD_REMARK: "[WIZARD-REMARK]",
|
|
1479
|
-
BENCHMARK: "[BENCHMARK]",
|
|
1480
|
-
DASHBOARD_URL: "[DASHBOARD_URL]",
|
|
1481
|
-
NOTEBOOK_URL: "[NOTEBOOK_URL]"
|
|
1482
|
-
};
|
|
1483
1550
|
const BLOCKING_ENV_KEYS = [
|
|
1484
1551
|
"ANTHROPIC_API_KEY",
|
|
1485
1552
|
"ANTHROPIC_BASE_URL",
|
|
@@ -1585,7 +1652,7 @@ function restoreClaudeSettings(workingDirectory) {
|
|
|
1585
1652
|
* Phase 2 — collect remark (once): block with remark prompt
|
|
1586
1653
|
* Phase 3 — allow stop: return {}
|
|
1587
1654
|
*/
|
|
1588
|
-
function createStopHook(featureQueue,
|
|
1655
|
+
function createStopHook(featureQueue, signals) {
|
|
1589
1656
|
let featureIndex = 0;
|
|
1590
1657
|
let remarkRequested = false;
|
|
1591
1658
|
return (input) => {
|
|
@@ -1595,11 +1662,9 @@ function createStopHook(featureQueue, collectedText) {
|
|
|
1595
1662
|
remarkRequested,
|
|
1596
1663
|
queueLength: featureQueue.length
|
|
1597
1664
|
});
|
|
1598
|
-
if (
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
return {};
|
|
1602
|
-
}
|
|
1665
|
+
if (signals?.hasApiError()) {
|
|
1666
|
+
logToFile("Stop hook: API error detected, allowing immediate stop");
|
|
1667
|
+
return {};
|
|
1603
1668
|
}
|
|
1604
1669
|
if (featureIndex < featureQueue.length) {
|
|
1605
1670
|
const feature = featureQueue[featureIndex++];
|
|
@@ -1903,8 +1968,8 @@ async function initializeAgent(config, options) {
|
|
|
1903
1968
|
* Check agent output for YARA scanner violations.
|
|
1904
1969
|
* Used in both the success and catch paths of runAgent.
|
|
1905
1970
|
*/
|
|
1906
|
-
function checkYaraViolation(
|
|
1907
|
-
if (
|
|
1971
|
+
function checkYaraViolation(signals, spinner) {
|
|
1972
|
+
if (signals.hasYaraViolation()) {
|
|
1908
1973
|
logToFile("Agent error: YARA_VIOLATION");
|
|
1909
1974
|
spinner.stop("Security violation detected");
|
|
1910
1975
|
return { error: "WIZARD_YARA_VIOLATION" };
|
|
@@ -1926,7 +1991,7 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
|
|
|
1926
1991
|
logToFile("Claude Code executable:", cliPath);
|
|
1927
1992
|
logToFile("Prompt:", prompt);
|
|
1928
1993
|
const startTime = Date.now();
|
|
1929
|
-
const
|
|
1994
|
+
const signals = new AgentOutputSignals();
|
|
1930
1995
|
let receivedSuccessResult = false;
|
|
1931
1996
|
let loggedInitialContext = false;
|
|
1932
1997
|
let lastResultMessage = null;
|
|
@@ -1954,13 +2019,8 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
|
|
|
1954
2019
|
logToFile(`Ignoring post-completion error, agent completed successfully in ${durationSeconds}s`);
|
|
1955
2020
|
logToFile("Suppressed error:", suppressedError.message);
|
|
1956
2021
|
} else logToFile(`Agent run completed in ${durationSeconds}s`);
|
|
1957
|
-
const
|
|
1958
|
-
|
|
1959
|
-
const remarkMatch = outputText.match(remarkRegex);
|
|
1960
|
-
if (remarkMatch && remarkMatch[1]) {
|
|
1961
|
-
const remark = remarkMatch[1].trim();
|
|
1962
|
-
if (remark) analytics.capture(WIZARD_REMARK_EVENT_NAME, { remark });
|
|
1963
|
-
}
|
|
2022
|
+
const remark = signals.remark();
|
|
2023
|
+
if (remark) analytics.capture(WIZARD_REMARK_EVENT_NAME, { remark });
|
|
1964
2024
|
analytics.wizardCapture("agent completed", {
|
|
1965
2025
|
duration_ms: durationMs,
|
|
1966
2026
|
duration_seconds: durationSeconds
|
|
@@ -2070,7 +2130,7 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
|
|
|
2070
2130
|
PreToolUse: createPreToolUseYaraHooks(),
|
|
2071
2131
|
PostToolUse: createPostToolUseYaraHooks(),
|
|
2072
2132
|
Stop: [{
|
|
2073
|
-
hooks: [createStopHook(config?.additionalFeatureQueue ?? [],
|
|
2133
|
+
hooks: [createStopHook(config?.additionalFeatureQueue ?? [], signals)],
|
|
2074
2134
|
timeout: 30
|
|
2075
2135
|
}]
|
|
2076
2136
|
}
|
|
@@ -2094,7 +2154,7 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
|
|
|
2094
2154
|
}
|
|
2095
2155
|
loggedInitialContext = true;
|
|
2096
2156
|
}
|
|
2097
|
-
handleSDKMessage(message, options, spinner,
|
|
2157
|
+
handleSDKMessage(message, options, spinner, signals, receivedSuccessResult, tasks);
|
|
2098
2158
|
if (abortCases.length > 0 && !abortReason && message.type === "assistant") {
|
|
2099
2159
|
const content = message.message?.content;
|
|
2100
2160
|
if (Array.isArray(content)) {
|
|
@@ -2110,7 +2170,7 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
|
|
|
2110
2170
|
}
|
|
2111
2171
|
}
|
|
2112
2172
|
}
|
|
2113
|
-
if (message.type === "assistant" &&
|
|
2173
|
+
if (message.type === "assistant" && signals.hasApiErrorStatus(401)) {
|
|
2114
2174
|
signalDone();
|
|
2115
2175
|
spinner.stop("Authentication failed");
|
|
2116
2176
|
const conflicts = checkAllSettingsConflicts(options.installDir);
|
|
@@ -2148,22 +2208,20 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
|
|
|
2148
2208
|
message: abortReason
|
|
2149
2209
|
};
|
|
2150
2210
|
}
|
|
2151
|
-
const
|
|
2152
|
-
const yaraResult = checkYaraViolation(outputText, spinner);
|
|
2211
|
+
const yaraResult = checkYaraViolation(signals, spinner);
|
|
2153
2212
|
if (yaraResult) return yaraResult;
|
|
2154
|
-
if (
|
|
2213
|
+
if (signals.has("MCP_MISSING")) {
|
|
2155
2214
|
logToFile("Agent error: MCP_MISSING");
|
|
2156
2215
|
spinner.stop("Agent could not access PostHog MCP");
|
|
2157
2216
|
return { error: "WIZARD_MCP_MISSING" };
|
|
2158
2217
|
}
|
|
2159
|
-
if (
|
|
2218
|
+
if (signals.has("RESOURCE_MISSING")) {
|
|
2160
2219
|
logToFile("Agent error: RESOURCE_MISSING");
|
|
2161
2220
|
spinner.stop("Agent could not access setup resource");
|
|
2162
2221
|
return { error: "WIZARD_RESOURCE_MISSING" };
|
|
2163
2222
|
}
|
|
2164
|
-
const
|
|
2165
|
-
|
|
2166
|
-
if (outputText.includes("API Error: 429")) {
|
|
2223
|
+
const apiErrorMessage = signals.apiErrorMessage() ?? "Unknown API error";
|
|
2224
|
+
if (signals.hasApiErrorStatus(429)) {
|
|
2167
2225
|
logToFile("Agent error: RATE_LIMIT");
|
|
2168
2226
|
spinner.stop("Rate limit exceeded");
|
|
2169
2227
|
return {
|
|
@@ -2171,7 +2229,7 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
|
|
|
2171
2229
|
message: apiErrorMessage
|
|
2172
2230
|
};
|
|
2173
2231
|
}
|
|
2174
|
-
if (
|
|
2232
|
+
if (signals.hasApiError()) {
|
|
2175
2233
|
logToFile("Agent error: API_ERROR");
|
|
2176
2234
|
spinner.stop("API error occurred");
|
|
2177
2235
|
return {
|
|
@@ -2190,12 +2248,10 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
|
|
|
2190
2248
|
};
|
|
2191
2249
|
}
|
|
2192
2250
|
if (receivedSuccessResult) return completeWithSuccess(error);
|
|
2193
|
-
const
|
|
2194
|
-
const yaraResult = checkYaraViolation(outputText, spinner);
|
|
2251
|
+
const yaraResult = checkYaraViolation(signals, spinner);
|
|
2195
2252
|
if (yaraResult) return yaraResult;
|
|
2196
|
-
const
|
|
2197
|
-
|
|
2198
|
-
if (outputText.includes("API Error: 429")) {
|
|
2253
|
+
const apiErrorMessage = signals.apiErrorMessage() ?? "Unknown API error";
|
|
2254
|
+
if (signals.hasApiErrorStatus(429)) {
|
|
2199
2255
|
logToFile("Agent error (caught): RATE_LIMIT");
|
|
2200
2256
|
spinner.stop("Rate limit exceeded");
|
|
2201
2257
|
return {
|
|
@@ -2203,7 +2259,7 @@ async function runAgent(agentConfig, prompt, options, spinner, config, middlewar
|
|
|
2203
2259
|
message: apiErrorMessage
|
|
2204
2260
|
};
|
|
2205
2261
|
}
|
|
2206
|
-
if (
|
|
2262
|
+
if (signals.hasApiError()) {
|
|
2207
2263
|
logToFile("Agent error (caught): API_ERROR");
|
|
2208
2264
|
spinner.stop("API error occurred");
|
|
2209
2265
|
return {
|
|
@@ -2331,7 +2387,7 @@ function extractTaskIdFromResult(content) {
|
|
|
2331
2387
|
}
|
|
2332
2388
|
}
|
|
2333
2389
|
}
|
|
2334
|
-
function handleSDKMessage(message, options, spinner,
|
|
2390
|
+
function handleSDKMessage(message, options, spinner, signals, receivedSuccessResult = false, tasks) {
|
|
2335
2391
|
const STATUS_RANK = {
|
|
2336
2392
|
completed: 0,
|
|
2337
2393
|
in_progress: 1
|
|
@@ -2349,7 +2405,7 @@ function handleSDKMessage(message, options, spinner, collectedText, receivedSucc
|
|
|
2349
2405
|
const content = message.message?.content;
|
|
2350
2406
|
if (Array.isArray(content)) for (const block of content) {
|
|
2351
2407
|
if (block.type === "text" && typeof block.text === "string") {
|
|
2352
|
-
|
|
2408
|
+
signals.push(block.text);
|
|
2353
2409
|
const statusRegex = new RegExp(`^.*${AgentSignals.STATUS.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*(.+?)$`, "m");
|
|
2354
2410
|
const statusMatch = block.text.match(statusRegex);
|
|
2355
2411
|
if (statusMatch) {
|
|
@@ -2388,14 +2444,14 @@ function handleSDKMessage(message, options, spinner, collectedText, receivedSucc
|
|
|
2388
2444
|
case "result":
|
|
2389
2445
|
if (message.is_error) {
|
|
2390
2446
|
logToFile("Agent result with error:", message.result);
|
|
2391
|
-
if (typeof message.result === "string")
|
|
2447
|
+
if (typeof message.result === "string") signals.push(message.result);
|
|
2392
2448
|
if (message.errors && !receivedSuccessResult) for (const err of message.errors) {
|
|
2393
2449
|
getUI().log.error(`Error: ${err}`);
|
|
2394
2450
|
logToFile("ERROR:", err);
|
|
2395
2451
|
}
|
|
2396
2452
|
} else if (message.subtype === "success") {
|
|
2397
2453
|
logToFile("Agent completed successfully");
|
|
2398
|
-
if (typeof message.result === "string")
|
|
2454
|
+
if (typeof message.result === "string") signals.push(message.result);
|
|
2399
2455
|
} else {
|
|
2400
2456
|
logToFile("Agent result with error:", message.result);
|
|
2401
2457
|
if (message.errors && !receivedSuccessResult) for (const err of message.errors) {
|
|
@@ -2417,6 +2473,6 @@ function handleSDKMessage(message, options, spinner, collectedText, receivedSucc
|
|
|
2417
2473
|
}
|
|
2418
2474
|
}
|
|
2419
2475
|
//#endregion
|
|
2420
|
-
export {
|
|
2476
|
+
export { AUDIT_REPORT_FILE as _, initializeAgent as a, getAuditChecks as b, AgentSignals as c, WIZARD_TOOL_NAMES as d, downloadSkill as f, AUDIT_CHECKS_KEY as g, AUDIT_CHECKS_FILE as h, checkAllSettingsConflicts as i, formatScanReport as l, installSkillById as m, buildAgentEnv as n, restoreClaudeSettings as o, fetchSkillMenu as p, buildWizardMetadata as r, runAgent as s, backupAndFixClaudeSettings as t, writeScanReport as u, AUDIT_SEVERITY_STYLE as v, coerceAuditChecks as y };
|
|
2421
2477
|
|
|
2422
|
-
//# sourceMappingURL=agent-interface-
|
|
2478
|
+
//# sourceMappingURL=agent-interface-C2VEF-BD.js.map
|