@posthog/wizard 2.0.1 → 2.1.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/bin.js +53 -8
- package/dist/bin.js.map +1 -1
- package/dist/src/__tests__/cli.test.js +50 -3
- package/dist/src/__tests__/cli.test.js.map +1 -1
- package/dist/src/__tests__/package-json.test.d.ts +1 -0
- package/dist/src/__tests__/package-json.test.js +173 -0
- package/dist/src/__tests__/package-json.test.js.map +1 -0
- package/dist/src/frameworks/angular/angular-wizard-agent.js +1 -6
- package/dist/src/frameworks/angular/angular-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/astro/astro-wizard-agent.js +1 -4
- package/dist/src/frameworks/astro/astro-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js +1 -4
- package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/nuxt/nuxt-wizard-agent.js +1 -4
- package/dist/src/frameworks/nuxt/nuxt-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/react-native/react-native-wizard-agent.js +1 -6
- package/dist/src/frameworks/react-native/react-native-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/react-router/react-router-wizard-agent.js +1 -6
- package/dist/src/frameworks/react-router/react-router-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/tanstack-router/tanstack-router-wizard-agent.js +1 -6
- package/dist/src/frameworks/tanstack-router/tanstack-router-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/tanstack-start/tanstack-start-wizard-agent.js +1 -6
- package/dist/src/frameworks/tanstack-start/tanstack-start-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/vue/vue-wizard-agent.js +1 -4
- package/dist/src/frameworks/vue/vue-wizard-agent.js.map +1 -1
- package/dist/src/lib/__tests__/agent-interface.test.js +1 -0
- package/dist/src/lib/__tests__/agent-interface.test.js.map +1 -1
- package/dist/src/lib/__tests__/yara-hooks.test.d.ts +1 -0
- package/dist/src/lib/__tests__/yara-hooks.test.js +432 -0
- package/dist/src/lib/__tests__/yara-hooks.test.js.map +1 -0
- package/dist/src/lib/__tests__/yara-scanner.test.d.ts +1 -0
- package/dist/src/lib/__tests__/yara-scanner.test.js +613 -0
- package/dist/src/lib/__tests__/yara-scanner.test.js.map +1 -0
- package/dist/src/lib/agent-interface.d.ts +4 -2
- package/dist/src/lib/agent-interface.js +40 -26
- package/dist/src/lib/agent-interface.js.map +1 -1
- package/dist/src/lib/agent-runner.js +49 -15
- package/dist/src/lib/agent-runner.js.map +1 -1
- package/dist/src/lib/commandments.js +1 -0
- package/dist/src/lib/commandments.js.map +1 -1
- package/dist/src/lib/constants.d.ts +4 -3
- package/dist/src/lib/constants.js +3 -2
- package/dist/src/lib/constants.js.map +1 -1
- package/dist/src/lib/middleware/benchmark.js +2 -6
- package/dist/src/lib/middleware/benchmark.js.map +1 -1
- package/dist/src/lib/middleware/benchmarks/json-writer.js +1 -2
- package/dist/src/lib/middleware/benchmarks/json-writer.js.map +1 -1
- package/dist/src/lib/middleware/benchmarks/summary.js +6 -10
- package/dist/src/lib/middleware/benchmarks/summary.js.map +1 -1
- package/dist/src/lib/skill-install.d.ts +10 -0
- package/dist/src/lib/skill-install.js +23 -0
- package/dist/src/lib/skill-install.js.map +1 -0
- package/dist/src/lib/version.d.ts +1 -1
- package/dist/src/lib/version.js +1 -1
- package/dist/src/lib/version.js.map +1 -1
- package/dist/src/lib/wizard-session.d.ts +13 -0
- package/dist/src/lib/wizard-session.js +3 -0
- package/dist/src/lib/wizard-session.js.map +1 -1
- package/dist/src/lib/yara-hooks.d.ts +44 -0
- package/dist/src/lib/yara-hooks.js +377 -0
- package/dist/src/lib/yara-hooks.js.map +1 -0
- package/dist/src/lib/yara-scanner.d.ts +61 -0
- package/dist/src/lib/yara-scanner.js +328 -0
- package/dist/src/lib/yara-scanner.js.map +1 -0
- package/dist/src/run.d.ts +3 -0
- package/dist/src/run.js +11 -2
- package/dist/src/run.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +2 -1
- package/dist/src/steps/add-mcp-server-to-clients/index.js +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
- package/dist/src/steps/add-or-update-environment-variables.js +9 -10
- package/dist/src/steps/add-or-update-environment-variables.js.map +1 -1
- package/dist/src/steps/upload-environment-variables/providers/vercel.js +4 -8
- package/dist/src/steps/upload-environment-variables/providers/vercel.js.map +1 -1
- package/dist/src/ui/logging-ui.d.ts +5 -0
- package/dist/src/ui/logging-ui.js +3 -0
- package/dist/src/ui/logging-ui.js.map +1 -1
- package/dist/src/ui/tui/ink-ui.d.ts +5 -0
- package/dist/src/ui/tui/ink-ui.js +3 -0
- package/dist/src/ui/tui/ink-ui.js.map +1 -1
- package/dist/src/ui/tui/primitives/Divider.d.ts +6 -0
- package/dist/src/ui/tui/primitives/Divider.js +15 -0
- package/dist/src/ui/tui/primitives/Divider.js.map +1 -0
- package/dist/src/ui/tui/primitives/index.d.ts +1 -0
- package/dist/src/ui/tui/primitives/index.js +1 -0
- package/dist/src/ui/tui/primitives/index.js.map +1 -1
- package/dist/src/ui/tui/router.d.ts +2 -1
- package/dist/src/ui/tui/router.js +1 -0
- package/dist/src/ui/tui/router.js.map +1 -1
- package/dist/src/ui/tui/screen-registry.js +2 -0
- package/dist/src/ui/tui/screen-registry.js.map +1 -1
- package/dist/src/ui/tui/screens/IntroScreen.js +18 -2
- package/dist/src/ui/tui/screens/IntroScreen.js.map +1 -1
- package/dist/src/ui/tui/screens/PortConflictScreen.d.ts +11 -0
- package/dist/src/ui/tui/screens/PortConflictScreen.js +30 -0
- package/dist/src/ui/tui/screens/PortConflictScreen.js.map +1 -0
- package/dist/src/ui/tui/store.d.ts +18 -0
- package/dist/src/ui/tui/store.js +25 -0
- package/dist/src/ui/tui/store.js.map +1 -1
- package/dist/src/ui/wizard-ui.d.ts +6 -0
- package/dist/src/ui/wizard-ui.js.map +1 -1
- package/dist/src/utils/debug.js +1 -5
- package/dist/src/utils/debug.js.map +1 -1
- package/dist/src/utils/logging.js +7 -10
- package/dist/src/utils/logging.js.map +1 -1
- package/dist/src/utils/oauth.js +44 -4
- package/dist/src/utils/oauth.js.map +1 -1
- package/dist/src/utils/package-json.d.ts +5 -0
- package/dist/src/utils/package-json.js +20 -0
- package/dist/src/utils/package-json.js.map +1 -1
- package/dist/src/utils/rules/universal.md +12 -0
- package/dist/src/utils/setup-utils.js +12 -14
- package/dist/src/utils/setup-utils.js.map +1 -1
- package/dist/src/utils/types.d.ts +9 -0
- package/dist/src/utils/types.js.map +1 -1
- package/package.json +1 -2
|
@@ -32,24 +32,22 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
36
|
exports.runAgentWizard = runAgentWizard;
|
|
40
37
|
const framework_config_1 = require("./framework-config");
|
|
41
38
|
const wizard_session_1 = require("./wizard-session");
|
|
42
39
|
const setup_utils_1 = require("../utils/setup-utils");
|
|
40
|
+
const constants_1 = require("./constants");
|
|
43
41
|
const analytics_1 = require("../utils/analytics");
|
|
44
42
|
const ui_1 = require("../ui");
|
|
45
43
|
const agent_interface_1 = require("./agent-interface");
|
|
46
44
|
const urls_1 = require("../utils/urls");
|
|
47
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
48
45
|
const semver = __importStar(require("semver"));
|
|
49
46
|
const anthropic_status_1 = require("../utils/anthropic-status");
|
|
50
47
|
const debug_1 = require("../utils/debug");
|
|
51
48
|
const benchmark_1 = require("./middleware/benchmark");
|
|
52
49
|
const wizard_abort_1 = require("../utils/wizard-abort");
|
|
50
|
+
const yara_hooks_1 = require("./yara-hooks");
|
|
53
51
|
/**
|
|
54
52
|
* Build a WizardOptions bag from a WizardSession (for code that still expects WizardOptions).
|
|
55
53
|
*/
|
|
@@ -66,6 +64,7 @@ function sessionToOptions(session) {
|
|
|
66
64
|
benchmark: session.benchmark,
|
|
67
65
|
projectId: session.projectId,
|
|
68
66
|
apiKey: session.apiKey,
|
|
67
|
+
yaraReport: session.yaraReport,
|
|
69
68
|
};
|
|
70
69
|
}
|
|
71
70
|
/**
|
|
@@ -75,28 +74,33 @@ function sessionToOptions(session) {
|
|
|
75
74
|
* All user decisions come from the session — no UI prompts.
|
|
76
75
|
*/
|
|
77
76
|
async function runAgentWizard(config, session) {
|
|
77
|
+
(0, debug_1.initLogFile)();
|
|
78
|
+
(0, debug_1.logToFile)(`[agent-runner] START integration=${config.metadata.integration}`);
|
|
78
79
|
if (session.debug) {
|
|
79
80
|
(0, debug_1.enableDebugLogs)();
|
|
80
81
|
}
|
|
81
82
|
// Version check
|
|
82
83
|
if (config.detection.minimumVersion && config.detection.getInstalledVersion) {
|
|
84
|
+
(0, debug_1.logToFile)('[agent-runner] checking version');
|
|
83
85
|
const version = await config.detection.getInstalledVersion(sessionToOptions(session));
|
|
84
86
|
if (version) {
|
|
87
|
+
(0, debug_1.logToFile)(`[agent-runner] version=${version} minimum=${config.detection.minimumVersion}`);
|
|
85
88
|
const coerced = semver.coerce(version);
|
|
86
89
|
if (coerced && semver.lt(coerced, config.detection.minimumVersion)) {
|
|
87
90
|
const docsUrl = config.metadata.unsupportedVersionDocsUrl ?? config.metadata.docsUrl;
|
|
88
|
-
(0,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
91
|
+
await (0, wizard_abort_1.wizardAbort)({
|
|
92
|
+
message: `Sorry: the wizard can't help you with ${config.metadata.name} ${version}. ` +
|
|
93
|
+
`Upgrade to ${config.metadata.name} ${config.detection.minimumVersion} or later, ` +
|
|
94
|
+
`or check out the manual setup guide.\n\n` +
|
|
95
|
+
`Setup ${config.metadata.name} manually: ${docsUrl}`,
|
|
96
|
+
});
|
|
92
97
|
}
|
|
93
98
|
}
|
|
94
99
|
}
|
|
95
|
-
// Setup phase — informational only, no prompts
|
|
96
|
-
// Beta notice, pre-run notice, and welcome label are all derivable
|
|
97
|
-
// from session.frameworkConfig — IntroScreen reads them directly.
|
|
98
100
|
// Check Anthropic/Claude service status (pure — no prompt)
|
|
101
|
+
(0, debug_1.logToFile)('[agent-runner] checking anthropic status');
|
|
99
102
|
const statusResult = await (0, anthropic_status_1.checkAnthropicStatus)();
|
|
103
|
+
(0, debug_1.logToFile)(`[agent-runner] anthropic status=${statusResult.status}`);
|
|
100
104
|
if (statusResult.status === 'down' || statusResult.status === 'degraded') {
|
|
101
105
|
(0, ui_1.getUI)().showServiceStatus({
|
|
102
106
|
description: statusResult.description,
|
|
@@ -104,12 +108,12 @@ async function runAgentWizard(config, session) {
|
|
|
104
108
|
});
|
|
105
109
|
}
|
|
106
110
|
// Check for blocking env overrides in .claude/settings.json before login.
|
|
107
|
-
// These keys block the Wizard from accessing the PostHog LLM Gateway.
|
|
108
111
|
const blockingOverrideKeys = (0, agent_interface_1.checkClaudeSettingsOverrides)(session.installDir);
|
|
112
|
+
(0, debug_1.logToFile)(`[agent-runner] settings overrides: ${blockingOverrideKeys.length > 0 ? blockingOverrideKeys.join(', ') : 'none'}`);
|
|
109
113
|
if (blockingOverrideKeys.length > 0) {
|
|
110
114
|
await (0, ui_1.getUI)().showSettingsOverride(blockingOverrideKeys, () => (0, agent_interface_1.backupAndFixClaudeSettings)(session.installDir));
|
|
115
|
+
(0, debug_1.logToFile)('[agent-runner] settings override resolved');
|
|
111
116
|
}
|
|
112
|
-
// Disclosure text is static — IntroScreen renders it directly.
|
|
113
117
|
const typeScriptDetected = (0, setup_utils_1.isUsingTypeScript)({
|
|
114
118
|
installDir: session.installDir,
|
|
115
119
|
});
|
|
@@ -121,7 +125,6 @@ async function runAgentWizard(config, session) {
|
|
|
121
125
|
if (usesPackageJson) {
|
|
122
126
|
packageJson = await (0, setup_utils_1.tryGetPackageJson)({ installDir: session.installDir });
|
|
123
127
|
if (packageJson) {
|
|
124
|
-
// Log warning if package not installed, but continue (agent handles it)
|
|
125
128
|
const { hasPackageInstalled } = await import('../utils/package-json.js');
|
|
126
129
|
if (!hasPackageInstalled(config.detection.packageName, packageJson)) {
|
|
127
130
|
(0, ui_1.getUI)().log.warn(`${config.detection.packageDisplayName} does not seem to be installed. Continuing anyway — the agent will handle it.`);
|
|
@@ -144,6 +147,7 @@ async function runAgentWizard(config, session) {
|
|
|
144
147
|
integration: config.metadata.integration,
|
|
145
148
|
});
|
|
146
149
|
// Get PostHog credentials (region auto-detected from token)
|
|
150
|
+
(0, debug_1.logToFile)('[agent-runner] starting OAuth');
|
|
147
151
|
const { projectApiKey, host, accessToken, projectId, cloudRegion } = await (0, setup_utils_1.getOrAskForProjectData)({
|
|
148
152
|
signup: session.signup,
|
|
149
153
|
ci: session.ci,
|
|
@@ -175,9 +179,22 @@ async function runAgentWizard(config, session) {
|
|
|
175
179
|
// Determine MCP URL: CLI flag > env var > production default
|
|
176
180
|
const mcpUrl = session.localMcp
|
|
177
181
|
? 'http://localhost:8787/mcp'
|
|
178
|
-
: process.env.MCP_URL ||
|
|
182
|
+
: process.env.MCP_URL ||
|
|
183
|
+
(cloudRegion === 'eu'
|
|
184
|
+
? 'https://mcp-eu.posthog.com/mcp'
|
|
185
|
+
: 'https://mcp.posthog.com/mcp');
|
|
179
186
|
const restoreSettings = () => (0, agent_interface_1.restoreClaudeSettings)(session.installDir);
|
|
180
187
|
(0, ui_1.getUI)().onEnterScreen('outro', restoreSettings);
|
|
188
|
+
// Register YARA report as cleanup so it fires on any exit path (including wizardAbort)
|
|
189
|
+
if (session.yaraReport) {
|
|
190
|
+
(0, wizard_abort_1.registerCleanup)(() => {
|
|
191
|
+
const reportPath = (0, yara_hooks_1.writeScanReport)();
|
|
192
|
+
if (reportPath) {
|
|
193
|
+
const summary = (0, yara_hooks_1.formatScanReport)();
|
|
194
|
+
(0, ui_1.getUI)().log.info(`YARA scan report: ${reportPath}${summary ?? ''}`);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}
|
|
181
198
|
(0, ui_1.getUI)().startRun();
|
|
182
199
|
const agent = await (0, agent_interface_1.initializeAgent)({
|
|
183
200
|
workingDirectory: session.installDir,
|
|
@@ -220,6 +237,15 @@ async function runAgentWizard(config, session) {
|
|
|
220
237
|
}),
|
|
221
238
|
});
|
|
222
239
|
}
|
|
240
|
+
if (agentResult.error === agent_interface_1.AgentErrorType.YARA_VIOLATION) {
|
|
241
|
+
await (0, wizard_abort_1.wizardAbort)({
|
|
242
|
+
message: 'Security violation detected\n\nThe YARA scanner terminated the session after detecting a security violation.\nThis may indicate prompt injection, poisoned skill files, or a policy breach.\n\nPlease report this to: wizard@posthog.com',
|
|
243
|
+
error: new wizard_abort_1.WizardError('YARA scanner terminated session', {
|
|
244
|
+
integration: config.metadata.integration,
|
|
245
|
+
error_type: agent_interface_1.AgentErrorType.YARA_VIOLATION,
|
|
246
|
+
}),
|
|
247
|
+
});
|
|
248
|
+
}
|
|
223
249
|
if (agentResult.error === agent_interface_1.AgentErrorType.RATE_LIMIT ||
|
|
224
250
|
agentResult.error === agent_interface_1.AgentErrorType.API_ERROR) {
|
|
225
251
|
analytics_1.analytics.wizardCapture('agent api error', {
|
|
@@ -245,6 +271,14 @@ async function runAgentWizard(config, session) {
|
|
|
245
271
|
integration: config.metadata.integration,
|
|
246
272
|
session,
|
|
247
273
|
});
|
|
274
|
+
if (uploadedEnvVars.length > 0) {
|
|
275
|
+
analytics_1.analytics.capture(constants_1.WIZARD_INTERACTION_EVENT_NAME, {
|
|
276
|
+
action: 'wizard_env_vars_uploaded',
|
|
277
|
+
integration: config.metadata.integration,
|
|
278
|
+
variable_count: uploadedEnvVars.length,
|
|
279
|
+
variable_keys: uploadedEnvVars,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
248
282
|
}
|
|
249
283
|
// MCP installation is handled by McpScreen — no prompt here
|
|
250
284
|
// Build outro data and store it for OutroScreen
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../../src/lib/agent-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DEFAULT_PACKAGE_INSTALLATION,\n SPINNER_MESSAGE,\n type FrameworkConfig,\n} from './framework-config';\nimport { type WizardSession, OutroKind } from './wizard-session';\nimport {\n tryGetPackageJson,\n isUsingTypeScript,\n getOrAskForProjectData,\n} from '../utils/setup-utils';\nimport type { PackageDotJson } from '../utils/package-json';\nimport type { WizardOptions } from '../utils/types';\nimport { analytics } from '../utils/analytics';\nimport { getUI } from '../ui';\nimport {\n initializeAgent,\n runAgent,\n AgentSignals,\n AgentErrorType,\n buildWizardMetadata,\n checkClaudeSettingsOverrides,\n backupAndFixClaudeSettings,\n restoreClaudeSettings,\n} from './agent-interface';\nimport { getCloudUrlFromRegion } from '../utils/urls';\nimport chalk from 'chalk';\nimport * as semver from 'semver';\nimport { checkAnthropicStatus } from '../utils/anthropic-status';\nimport { enableDebugLogs } from '../utils/debug';\nimport { createBenchmarkPipeline } from './middleware/benchmark';\nimport { wizardAbort, WizardError } from '../utils/wizard-abort';\n\n/**\n * Build a WizardOptions bag from a WizardSession (for code that still expects WizardOptions).\n */\nfunction sessionToOptions(session: WizardSession): WizardOptions {\n return {\n installDir: session.installDir,\n debug: session.debug,\n forceInstall: session.forceInstall,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n menu: session.menu,\n benchmark: session.benchmark,\n projectId: session.projectId,\n apiKey: session.apiKey,\n };\n}\n\n/**\n * Universal agent-powered wizard runner.\n * Handles the complete flow for any framework using PostHog MCP integration.\n *\n * All user decisions come from the session — no UI prompts.\n */\nexport async function runAgentWizard(\n config: FrameworkConfig,\n session: WizardSession,\n): Promise<void> {\n if (session.debug) {\n enableDebugLogs();\n }\n\n // Version check\n if (config.detection.minimumVersion && config.detection.getInstalledVersion) {\n const version = await config.detection.getInstalledVersion(\n sessionToOptions(session),\n );\n if (version) {\n const coerced = semver.coerce(version);\n if (coerced && semver.lt(coerced, config.detection.minimumVersion)) {\n const docsUrl =\n config.metadata.unsupportedVersionDocsUrl ?? config.metadata.docsUrl;\n getUI().log.warn(\n `Sorry: the wizard can't help you with ${config.metadata.name} ${version}. Upgrade to ${config.metadata.name} ${config.detection.minimumVersion} or later, or check out the manual setup guide.`,\n );\n getUI().log.info(\n `Setup ${config.metadata.name} manually: ${chalk.cyan(docsUrl)}`,\n );\n getUI().outro('PostHog wizard will see you next time!');\n return;\n }\n }\n }\n\n // Setup phase — informational only, no prompts\n // Beta notice, pre-run notice, and welcome label are all derivable\n // from session.frameworkConfig — IntroScreen reads them directly.\n\n // Check Anthropic/Claude service status (pure — no prompt)\n const statusResult = await checkAnthropicStatus();\n if (statusResult.status === 'down' || statusResult.status === 'degraded') {\n getUI().showServiceStatus({\n description: statusResult.description,\n statusPageUrl: 'https://status.claude.com',\n });\n }\n\n // Check for blocking env overrides in .claude/settings.json before login.\n // These keys block the Wizard from accessing the PostHog LLM Gateway.\n const blockingOverrideKeys = checkClaudeSettingsOverrides(session.installDir);\n if (blockingOverrideKeys.length > 0) {\n await getUI().showSettingsOverride(blockingOverrideKeys, () =>\n backupAndFixClaudeSettings(session.installDir),\n );\n }\n\n // Disclosure text is static — IntroScreen renders it directly.\n\n const typeScriptDetected = isUsingTypeScript({\n installDir: session.installDir,\n });\n session.typescript = typeScriptDetected;\n\n // Framework detection and version\n const usesPackageJson = config.detection.usesPackageJson !== false;\n let packageJson: PackageDotJson | null = null;\n let frameworkVersion: string | undefined;\n\n if (usesPackageJson) {\n packageJson = await tryGetPackageJson({ installDir: session.installDir });\n if (packageJson) {\n // Log warning if package not installed, but continue (agent handles it)\n const { hasPackageInstalled } = await import('../utils/package-json.js');\n if (!hasPackageInstalled(config.detection.packageName, packageJson)) {\n getUI().log.warn(\n `${config.detection.packageDisplayName} does not seem to be installed. Continuing anyway — the agent will handle it.`,\n );\n }\n frameworkVersion = config.detection.getVersion(packageJson);\n } else {\n getUI().log.warn(\n 'Could not find package.json. Continuing anyway — the agent will handle it.',\n );\n }\n } else {\n frameworkVersion = config.detection.getVersion(null);\n }\n\n // Set analytics tags for framework version\n if (frameworkVersion && config.detection.getVersionBucket) {\n const versionBucket = config.detection.getVersionBucket(frameworkVersion);\n analytics.setTag(`${config.metadata.integration}-version`, versionBucket);\n }\n\n analytics.wizardCapture('agent started', {\n integration: config.metadata.integration,\n });\n\n // Get PostHog credentials (region auto-detected from token)\n const { projectApiKey, host, accessToken, projectId, cloudRegion } =\n await getOrAskForProjectData({\n signup: session.signup,\n ci: session.ci,\n apiKey: session.apiKey,\n projectId: session.projectId,\n });\n\n session.credentials = { accessToken, projectApiKey, host, projectId };\n\n // Notify TUI that credentials are available (resolves past AuthScreen)\n getUI().setCredentials(session.credentials);\n\n // Framework context was already gathered by SetupScreen + detection\n const frameworkContext = session.frameworkContext;\n\n // Set analytics tags from framework context\n const contextTags = config.analytics.getTags(frameworkContext);\n Object.entries(contextTags).forEach(([key, value]) => {\n analytics.setTag(key, value);\n });\n\n const integrationPrompt = buildIntegrationPrompt(\n config,\n {\n frameworkVersion: frameworkVersion || 'latest',\n typescript: typeScriptDetected,\n projectApiKey,\n host,\n projectId,\n },\n frameworkContext,\n );\n\n // Initialize and run agent\n const spinner = getUI().spinner();\n\n // Evaluate all feature flags at the start of the run so they can be sent to the LLM gateway\n const wizardFlags = await analytics.getAllFlagsForWizard();\n const wizardMetadata = buildWizardMetadata(wizardFlags);\n\n // Determine MCP URL: CLI flag > env var > production default\n const mcpUrl = session.localMcp\n ? 'http://localhost:8787/mcp'\n : process.env.MCP_URL || 'https://mcp.posthog.com/mcp';\n\n const restoreSettings = () => restoreClaudeSettings(session.installDir);\n getUI().onEnterScreen('outro', restoreSettings);\n getUI().startRun();\n\n const agent = await initializeAgent(\n {\n workingDirectory: session.installDir,\n posthogMcpUrl: mcpUrl,\n posthogApiKey: accessToken,\n posthogApiHost: host,\n additionalMcpServers: config.metadata.additionalMcpServers,\n detectPackageManager: config.detection.detectPackageManager,\n wizardFlags,\n wizardMetadata,\n },\n sessionToOptions(session),\n );\n\n const middleware = session.benchmark\n ? createBenchmarkPipeline(spinner, sessionToOptions(session))\n : undefined;\n\n const agentResult = await runAgent(\n agent,\n integrationPrompt,\n sessionToOptions(session),\n spinner,\n {\n estimatedDurationMinutes: config.ui.estimatedDurationMinutes,\n spinnerMessage: SPINNER_MESSAGE,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n additionalFeatureQueue: session.additionalFeatureQueue,\n },\n middleware,\n );\n\n // Handle error cases detected in agent output\n if (agentResult.error === AgentErrorType.MCP_MISSING) {\n await wizardAbort({\n message: `Could not access the PostHog MCP server\\n\\nThe wizard was unable to connect to the PostHog MCP server.\\nThis could be due to a network issue or a configuration problem.\\n\\nPlease try again, or set up ${config.metadata.name} manually by following our documentation:\\n${config.metadata.docsUrl}`,\n error: new WizardError('Agent could not access PostHog MCP server', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.MCP_MISSING,\n signal: AgentSignals.ERROR_MCP_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.RESOURCE_MISSING) {\n await wizardAbort({\n message: `Could not access the setup resource\\n\\nThe wizard could not access the setup resource. This may indicate a version mismatch or a temporary service issue.\\n\\nPlease try again, or set up ${config.metadata.name} manually by following our documentation:\\n${config.metadata.docsUrl}`,\n error: new WizardError('Agent could not access setup resource', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.RESOURCE_MISSING,\n signal: AgentSignals.ERROR_RESOURCE_MISSING,\n }),\n });\n }\n\n if (\n agentResult.error === AgentErrorType.RATE_LIMIT ||\n agentResult.error === AgentErrorType.API_ERROR\n ) {\n analytics.wizardCapture('agent api error', {\n integration: config.metadata.integration,\n error_type: agentResult.error,\n error_message: agentResult.message,\n });\n\n await wizardAbort({\n message: `API Error\\n\\n${\n agentResult.message || 'Unknown error'\n }\\n\\nPlease report this error to: wizard@posthog.com`,\n error: new WizardError(`API error: ${agentResult.message}`, {\n integration: config.metadata.integration,\n error_type: agentResult.error,\n }),\n });\n }\n\n // Build environment variables from OAuth credentials\n const envVars = config.environment.getEnvVars(projectApiKey, host);\n\n // Upload environment variables to hosting providers (auto-accept)\n let uploadedEnvVars: string[] = [];\n if (config.environment.uploadToHosting) {\n const { uploadEnvironmentVariablesStep } = await import(\n '../steps/index.js'\n );\n uploadedEnvVars = await uploadEnvironmentVariablesStep(envVars, {\n integration: config.metadata.integration,\n session,\n });\n }\n\n // MCP installation is handled by McpScreen — no prompt here\n\n // Build outro data and store it for OutroScreen\n const continueUrl = session.signup\n ? `${getCloudUrlFromRegion(cloudRegion)}/products?source=wizard`\n : undefined;\n\n const changes = [\n ...config.ui.getOutroChanges(frameworkContext),\n Object.keys(envVars).length > 0\n ? `Added environment variables to .env file`\n : '',\n uploadedEnvVars.length > 0\n ? `Uploaded environment variables to your hosting provider`\n : '',\n ].filter(Boolean);\n\n session.outroData = {\n kind: OutroKind.Success,\n changes,\n docsUrl: config.metadata.docsUrl,\n continueUrl,\n };\n\n getUI().outro(`Successfully installed PostHog!`);\n\n await analytics.shutdown('success');\n}\n\n/**\n * Build the integration prompt for the agent.\n */\nfunction buildIntegrationPrompt(\n config: FrameworkConfig,\n context: {\n frameworkVersion: string;\n typescript: boolean;\n projectApiKey: string;\n host: string;\n projectId: number;\n },\n frameworkContext: Record<string, unknown>,\n): string {\n const additionalLines = config.prompts.getAdditionalContextLines\n ? config.prompts.getAdditionalContextLines(frameworkContext)\n : [];\n\n const additionalContext =\n additionalLines.length > 0\n ? '\\n' + additionalLines.map((line) => `- ${line}`).join('\\n')\n : '';\n\n return `You have access to the PostHog MCP server which provides skills to integrate PostHog into this ${\n config.metadata.name\n } project.\n\nProject context:\n- PostHog Project ID: ${context.projectId}\n- Framework: ${config.metadata.name} ${context.frameworkVersion}\n- TypeScript: ${context.typescript ? 'Yes' : 'No'}\n- PostHog public token: ${context.projectApiKey}\n- PostHog Host: ${context.host}\n- Project type: ${config.prompts.projectTypeDetection}\n- Package installation: ${\n config.prompts.packageInstallation ?? DEFAULT_PACKAGE_INSTALLATION\n }${additionalContext}\n\nInstructions (follow these steps IN ORDER - do not skip or reorder):\n\nSTEP 1: List available skills from the PostHog MCP server using ListMcpResourcesTool. If this tool is not available or you cannot access the MCP server, you must emit: ${\n AgentSignals.ERROR_MCP_MISSING\n } Could not access the PostHog MCP server and halt.\n\n Review the skill descriptions and choose the one that best matches this project's framework and configuration.\n If no suitable skill is found, or you cannot access the MCP server, you emit: ${\n AgentSignals.ERROR_RESOURCE_MISSING\n } Could not find a suitable skill for this project.\n\nSTEP 2: Fetch the chosen skill resource (e.g., posthog://skills/{skill-id}).\n The resource returns a shell command to install the skill.\n\nSTEP 3: Run the installation command using Bash:\n - Execute the EXACT command returned by the resource (do not modify it)\n - This will download and extract the skill to .claude/skills/{skill-id}/\n\nSTEP 4: Load the installed skill's SKILL.md file to understand what references are available.\n\nSTEP 5: Follow the skill's workflow files in sequence. Look for numbered workflow files in the references (e.g., files with patterns like \"1.0-\", \"1.1-\", \"1.2-\"). Start with the first one and proceed through each step until completion. Each workflow file will tell you what to do and which file comes next. Never directly write PostHog tokens directly to code files; always use environment variables.\n\nSTEP 6: Set up environment variables for PostHog using the wizard-tools MCP server (this runs locally — secret values never leave the machine):\n - Use check_env_keys to see which keys already exist in the project's .env file (e.g. .env.local or .env).\n - Use set_env_values to create or update the PostHog public token and host, using the appropriate environment variable naming convention for ${\n config.metadata.name\n }, which you'll find in example code. The tool will also ensure .gitignore coverage. Don't assume the presence of keys means the value is up to date. Write the correct value each time.\n - Reference these environment variables in the code files you create instead of hardcoding the public token and host.\n\nImportant: Use the detect_package_manager tool (from the wizard-tools MCP server) to determine which package manager the project uses. Do not manually search for lockfiles or config files. Always install packages as a background task. Don't await completion; proceed with other work immediately after starting the installation. You must read a file immediately before attempting to write it, even if you have previously read it; failure to do so will cause a tool failure.\n\n\n`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../../src/lib/agent-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DEFAULT_PACKAGE_INSTALLATION,\n SPINNER_MESSAGE,\n type FrameworkConfig,\n} from './framework-config';\nimport { type WizardSession, OutroKind } from './wizard-session';\nimport {\n tryGetPackageJson,\n isUsingTypeScript,\n getOrAskForProjectData,\n} from '../utils/setup-utils';\nimport type { PackageDotJson } from '../utils/package-json';\nimport type { WizardOptions } from '../utils/types';\nimport { WIZARD_INTERACTION_EVENT_NAME } from './constants';\nimport { analytics } from '../utils/analytics';\nimport { getUI } from '../ui';\nimport {\n initializeAgent,\n runAgent,\n AgentSignals,\n AgentErrorType,\n buildWizardMetadata,\n checkClaudeSettingsOverrides,\n backupAndFixClaudeSettings,\n restoreClaudeSettings,\n} from './agent-interface';\nimport { getCloudUrlFromRegion } from '../utils/urls';\n\nimport * as semver from 'semver';\nimport { checkAnthropicStatus } from '../utils/anthropic-status';\nimport { enableDebugLogs, initLogFile, logToFile } from '../utils/debug';\nimport { createBenchmarkPipeline } from './middleware/benchmark';\nimport {\n wizardAbort,\n WizardError,\n registerCleanup,\n} from '../utils/wizard-abort';\nimport { formatScanReport, writeScanReport } from './yara-hooks';\n\n/**\n * Build a WizardOptions bag from a WizardSession (for code that still expects WizardOptions).\n */\nfunction sessionToOptions(session: WizardSession): WizardOptions {\n return {\n installDir: session.installDir,\n debug: session.debug,\n forceInstall: session.forceInstall,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n menu: session.menu,\n benchmark: session.benchmark,\n projectId: session.projectId,\n apiKey: session.apiKey,\n yaraReport: session.yaraReport,\n };\n}\n\n/**\n * Universal agent-powered wizard runner.\n * Handles the complete flow for any framework using PostHog MCP integration.\n *\n * All user decisions come from the session — no UI prompts.\n */\nexport async function runAgentWizard(\n config: FrameworkConfig,\n session: WizardSession,\n): Promise<void> {\n initLogFile();\n logToFile(`[agent-runner] START integration=${config.metadata.integration}`);\n\n if (session.debug) {\n enableDebugLogs();\n }\n\n // Version check\n if (config.detection.minimumVersion && config.detection.getInstalledVersion) {\n logToFile('[agent-runner] checking version');\n const version = await config.detection.getInstalledVersion(\n sessionToOptions(session),\n );\n if (version) {\n logToFile(\n `[agent-runner] version=${version} minimum=${config.detection.minimumVersion}`,\n );\n const coerced = semver.coerce(version);\n if (coerced && semver.lt(coerced, config.detection.minimumVersion)) {\n const docsUrl =\n config.metadata.unsupportedVersionDocsUrl ?? config.metadata.docsUrl;\n await wizardAbort({\n message:\n `Sorry: the wizard can't help you with ${config.metadata.name} ${version}. ` +\n `Upgrade to ${config.metadata.name} ${config.detection.minimumVersion} or later, ` +\n `or check out the manual setup guide.\\n\\n` +\n `Setup ${config.metadata.name} manually: ${docsUrl}`,\n });\n }\n }\n }\n\n // Check Anthropic/Claude service status (pure — no prompt)\n logToFile('[agent-runner] checking anthropic status');\n const statusResult = await checkAnthropicStatus();\n logToFile(`[agent-runner] anthropic status=${statusResult.status}`);\n if (statusResult.status === 'down' || statusResult.status === 'degraded') {\n getUI().showServiceStatus({\n description: statusResult.description,\n statusPageUrl: 'https://status.claude.com',\n });\n }\n\n // Check for blocking env overrides in .claude/settings.json before login.\n const blockingOverrideKeys = checkClaudeSettingsOverrides(session.installDir);\n logToFile(\n `[agent-runner] settings overrides: ${\n blockingOverrideKeys.length > 0 ? blockingOverrideKeys.join(', ') : 'none'\n }`,\n );\n if (blockingOverrideKeys.length > 0) {\n await getUI().showSettingsOverride(blockingOverrideKeys, () =>\n backupAndFixClaudeSettings(session.installDir),\n );\n logToFile('[agent-runner] settings override resolved');\n }\n\n const typeScriptDetected = isUsingTypeScript({\n installDir: session.installDir,\n });\n session.typescript = typeScriptDetected;\n\n // Framework detection and version\n const usesPackageJson = config.detection.usesPackageJson !== false;\n let packageJson: PackageDotJson | null = null;\n let frameworkVersion: string | undefined;\n\n if (usesPackageJson) {\n packageJson = await tryGetPackageJson({ installDir: session.installDir });\n if (packageJson) {\n const { hasPackageInstalled } = await import('../utils/package-json.js');\n if (!hasPackageInstalled(config.detection.packageName, packageJson)) {\n getUI().log.warn(\n `${config.detection.packageDisplayName} does not seem to be installed. Continuing anyway — the agent will handle it.`,\n );\n }\n frameworkVersion = config.detection.getVersion(packageJson);\n } else {\n getUI().log.warn(\n 'Could not find package.json. Continuing anyway — the agent will handle it.',\n );\n }\n } else {\n frameworkVersion = config.detection.getVersion(null);\n }\n\n // Set analytics tags for framework version\n if (frameworkVersion && config.detection.getVersionBucket) {\n const versionBucket = config.detection.getVersionBucket(frameworkVersion);\n analytics.setTag(`${config.metadata.integration}-version`, versionBucket);\n }\n\n analytics.wizardCapture('agent started', {\n integration: config.metadata.integration,\n });\n\n // Get PostHog credentials (region auto-detected from token)\n logToFile('[agent-runner] starting OAuth');\n const { projectApiKey, host, accessToken, projectId, cloudRegion } =\n await getOrAskForProjectData({\n signup: session.signup,\n ci: session.ci,\n apiKey: session.apiKey,\n projectId: session.projectId,\n });\n\n session.credentials = { accessToken, projectApiKey, host, projectId };\n\n // Notify TUI that credentials are available (resolves past AuthScreen)\n getUI().setCredentials(session.credentials);\n\n // Framework context was already gathered by SetupScreen + detection\n const frameworkContext = session.frameworkContext;\n\n // Set analytics tags from framework context\n const contextTags = config.analytics.getTags(frameworkContext);\n Object.entries(contextTags).forEach(([key, value]) => {\n analytics.setTag(key, value);\n });\n\n const integrationPrompt = buildIntegrationPrompt(\n config,\n {\n frameworkVersion: frameworkVersion || 'latest',\n typescript: typeScriptDetected,\n projectApiKey,\n host,\n projectId,\n },\n frameworkContext,\n );\n\n // Initialize and run agent\n const spinner = getUI().spinner();\n\n // Evaluate all feature flags at the start of the run so they can be sent to the LLM gateway\n const wizardFlags = await analytics.getAllFlagsForWizard();\n const wizardMetadata = buildWizardMetadata(wizardFlags);\n\n // Determine MCP URL: CLI flag > env var > production default\n const mcpUrl = session.localMcp\n ? 'http://localhost:8787/mcp'\n : process.env.MCP_URL ||\n (cloudRegion === 'eu'\n ? 'https://mcp-eu.posthog.com/mcp'\n : 'https://mcp.posthog.com/mcp');\n\n const restoreSettings = () => restoreClaudeSettings(session.installDir);\n getUI().onEnterScreen('outro', restoreSettings);\n\n // Register YARA report as cleanup so it fires on any exit path (including wizardAbort)\n if (session.yaraReport) {\n registerCleanup(() => {\n const reportPath = writeScanReport();\n if (reportPath) {\n const summary = formatScanReport();\n getUI().log.info(`YARA scan report: ${reportPath}${summary ?? ''}`);\n }\n });\n }\n\n getUI().startRun();\n\n const agent = await initializeAgent(\n {\n workingDirectory: session.installDir,\n posthogMcpUrl: mcpUrl,\n posthogApiKey: accessToken,\n posthogApiHost: host,\n additionalMcpServers: config.metadata.additionalMcpServers,\n detectPackageManager: config.detection.detectPackageManager,\n wizardFlags,\n wizardMetadata,\n },\n sessionToOptions(session),\n );\n\n const middleware = session.benchmark\n ? createBenchmarkPipeline(spinner, sessionToOptions(session))\n : undefined;\n\n const agentResult = await runAgent(\n agent,\n integrationPrompt,\n sessionToOptions(session),\n spinner,\n {\n estimatedDurationMinutes: config.ui.estimatedDurationMinutes,\n spinnerMessage: SPINNER_MESSAGE,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n additionalFeatureQueue: session.additionalFeatureQueue,\n },\n middleware,\n );\n\n // Handle error cases detected in agent output\n if (agentResult.error === AgentErrorType.MCP_MISSING) {\n await wizardAbort({\n message: `Could not access the PostHog MCP server\\n\\nThe wizard was unable to connect to the PostHog MCP server.\\nThis could be due to a network issue or a configuration problem.\\n\\nPlease try again, or set up ${config.metadata.name} manually by following our documentation:\\n${config.metadata.docsUrl}`,\n error: new WizardError('Agent could not access PostHog MCP server', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.MCP_MISSING,\n signal: AgentSignals.ERROR_MCP_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.RESOURCE_MISSING) {\n await wizardAbort({\n message: `Could not access the setup resource\\n\\nThe wizard could not access the setup resource. This may indicate a version mismatch or a temporary service issue.\\n\\nPlease try again, or set up ${config.metadata.name} manually by following our documentation:\\n${config.metadata.docsUrl}`,\n error: new WizardError('Agent could not access setup resource', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.RESOURCE_MISSING,\n signal: AgentSignals.ERROR_RESOURCE_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.YARA_VIOLATION) {\n await wizardAbort({\n message:\n 'Security violation detected\\n\\nThe YARA scanner terminated the session after detecting a security violation.\\nThis may indicate prompt injection, poisoned skill files, or a policy breach.\\n\\nPlease report this to: wizard@posthog.com',\n error: new WizardError('YARA scanner terminated session', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.YARA_VIOLATION,\n }),\n });\n }\n\n if (\n agentResult.error === AgentErrorType.RATE_LIMIT ||\n agentResult.error === AgentErrorType.API_ERROR\n ) {\n analytics.wizardCapture('agent api error', {\n integration: config.metadata.integration,\n error_type: agentResult.error,\n error_message: agentResult.message,\n });\n\n await wizardAbort({\n message: `API Error\\n\\n${\n agentResult.message || 'Unknown error'\n }\\n\\nPlease report this error to: wizard@posthog.com`,\n error: new WizardError(`API error: ${agentResult.message}`, {\n integration: config.metadata.integration,\n error_type: agentResult.error,\n }),\n });\n }\n\n // Build environment variables from OAuth credentials\n const envVars = config.environment.getEnvVars(projectApiKey, host);\n\n // Upload environment variables to hosting providers (auto-accept)\n let uploadedEnvVars: string[] = [];\n if (config.environment.uploadToHosting) {\n const { uploadEnvironmentVariablesStep } = await import(\n '../steps/index.js'\n );\n uploadedEnvVars = await uploadEnvironmentVariablesStep(envVars, {\n integration: config.metadata.integration,\n session,\n });\n if (uploadedEnvVars.length > 0) {\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'wizard_env_vars_uploaded',\n integration: config.metadata.integration,\n variable_count: uploadedEnvVars.length,\n variable_keys: uploadedEnvVars,\n });\n }\n }\n\n // MCP installation is handled by McpScreen — no prompt here\n\n // Build outro data and store it for OutroScreen\n const continueUrl = session.signup\n ? `${getCloudUrlFromRegion(cloudRegion)}/products?source=wizard`\n : undefined;\n\n const changes = [\n ...config.ui.getOutroChanges(frameworkContext),\n Object.keys(envVars).length > 0\n ? `Added environment variables to .env file`\n : '',\n uploadedEnvVars.length > 0\n ? `Uploaded environment variables to your hosting provider`\n : '',\n ].filter(Boolean);\n\n session.outroData = {\n kind: OutroKind.Success,\n changes,\n docsUrl: config.metadata.docsUrl,\n continueUrl,\n };\n\n getUI().outro(`Successfully installed PostHog!`);\n\n await analytics.shutdown('success');\n}\n\n/**\n * Build the integration prompt for the agent.\n */\nfunction buildIntegrationPrompt(\n config: FrameworkConfig,\n context: {\n frameworkVersion: string;\n typescript: boolean;\n projectApiKey: string;\n host: string;\n projectId: number;\n },\n frameworkContext: Record<string, unknown>,\n): string {\n const additionalLines = config.prompts.getAdditionalContextLines\n ? config.prompts.getAdditionalContextLines(frameworkContext)\n : [];\n\n const additionalContext =\n additionalLines.length > 0\n ? '\\n' + additionalLines.map((line) => `- ${line}`).join('\\n')\n : '';\n\n return `You have access to the PostHog MCP server which provides skills to integrate PostHog into this ${\n config.metadata.name\n } project.\n\nProject context:\n- PostHog Project ID: ${context.projectId}\n- Framework: ${config.metadata.name} ${context.frameworkVersion}\n- TypeScript: ${context.typescript ? 'Yes' : 'No'}\n- PostHog public token: ${context.projectApiKey}\n- PostHog Host: ${context.host}\n- Project type: ${config.prompts.projectTypeDetection}\n- Package installation: ${\n config.prompts.packageInstallation ?? DEFAULT_PACKAGE_INSTALLATION\n }${additionalContext}\n\nInstructions (follow these steps IN ORDER - do not skip or reorder):\n\nSTEP 1: List available skills from the PostHog MCP server using ListMcpResourcesTool. If this tool is not available or you cannot access the MCP server, you must emit: ${\n AgentSignals.ERROR_MCP_MISSING\n } Could not access the PostHog MCP server and halt.\n\n Review the skill descriptions and choose the one that best matches this project's framework and configuration.\n If no suitable skill is found, or you cannot access the MCP server, you emit: ${\n AgentSignals.ERROR_RESOURCE_MISSING\n } Could not find a suitable skill for this project.\n\nSTEP 2: Fetch the chosen skill resource (e.g., posthog://skills/{skill-id}).\n The resource returns a shell command to install the skill.\n\nSTEP 3: Run the installation command using Bash:\n - Execute the EXACT command returned by the resource (do not modify it)\n - This will download and extract the skill to .claude/skills/{skill-id}/\n\nSTEP 4: Load the installed skill's SKILL.md file to understand what references are available.\n\nSTEP 5: Follow the skill's workflow files in sequence. Look for numbered workflow files in the references (e.g., files with patterns like \"1.0-\", \"1.1-\", \"1.2-\"). Start with the first one and proceed through each step until completion. Each workflow file will tell you what to do and which file comes next. Never directly write PostHog tokens directly to code files; always use environment variables.\n\nSTEP 6: Set up environment variables for PostHog using the wizard-tools MCP server (this runs locally — secret values never leave the machine):\n - Use check_env_keys to see which keys already exist in the project's .env file (e.g. .env.local or .env).\n - Use set_env_values to create or update the PostHog public token and host, using the appropriate environment variable naming convention for ${\n config.metadata.name\n }, which you'll find in example code. The tool will also ensure .gitignore coverage. Don't assume the presence of keys means the value is up to date. Write the correct value each time.\n - Reference these environment variables in the code files you create instead of hardcoding the public token and host.\n\nImportant: Use the detect_package_manager tool (from the wizard-tools MCP server) to determine which package manager the project uses. Do not manually search for lockfiles or config files. Always install packages as a background task. Don't await completion; proceed with other work immediately after starting the installation. You must read a file immediately before attempting to write it, even if you have previously read it; failure to do so will cause a tool failure.\n\n\n`;\n}\n"]}
|
|
@@ -17,6 +17,7 @@ const WIZARD_COMMANDMENTS = [
|
|
|
17
17
|
'Prefer minimal, targeted edits that achieve the requested behavior while preserving existing structure and style. Avoid large refactors, broad reformatting, or unrelated changes unless explicitly requested.',
|
|
18
18
|
'Do not spawn subagents unless explicitly instructed to do so.',
|
|
19
19
|
'Use the TodoWrite tool to track your progress. Create a todo list at the start describing the high-level areas of work, mark each as in_progress when you begin it, and completed when done.',
|
|
20
|
+
'If you see a [YARA WARNING] or [YARA VIOLATION] message, handle it silently. Fix the issue (revert the write, avoid the flagged pattern) without mentioning security warnings or YARA to the user. These are internal guardrails, not user-facing alerts. Never show scary security language to the user.',
|
|
20
21
|
].join('\n');
|
|
21
22
|
function getWizardCommandments() {
|
|
22
23
|
return WIZARD_COMMANDMENTS;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commandments.js","sourceRoot":"","sources":["../../../src/lib/commandments.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"commandments.js","sourceRoot":"","sources":["../../../src/lib/commandments.ts"],"names":[],"mappings":";;AA4BA,sDAEC;AA9BD;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG;IAC1B,gLAAgL;IAEhL,4OAA4O;IAE5O,4LAA4L;IAE5L,oLAAoL;IAEpL,uMAAuM;IAEvM,gVAAgV;IAEhV,gNAAgN;IAEhN,+DAA+D;IAE/D,8LAA8L;IAE9L,2SAA2S;CAC5S,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,SAAgB,qBAAqB;IACnC,OAAO,mBAAmB,CAAC;AAC7B,CAAC","sourcesContent":["/**\n * Wizard-wide commandments that are always appended as a system prompt.\n *\n * Keep this as a simple string so it can be inlined into the compiled bundle\n * without extra files, copying, or runtime I/O.\n */\nconst WIZARD_COMMANDMENTS = [\n 'Never hallucinate a PostHog API key, host, or any other secret. Always use the real values that have been configured for this project (for example via environment variables).',\n\n 'Never write API keys, access tokens, or other secrets directly into source code. Always reference environment variables instead, and rely on the wizard-tools MCP server (check_env_keys / set_env_values) to create or update .env files.',\n\n 'Always use the detect_package_manager tool from the wizard-tools MCP server to determine the package manager. Do not guess based on lockfiles or hard-code npm, yarn, pnpm, bun, pip, etc.',\n\n 'When installing packages, start the installation as a background task and then continue with other work. Do not block waiting for installs to finish unless explicitly instructed.',\n\n 'Before writing to any file, you MUST read that exact file immediately beforehand using the Read tool, even if you have already read it earlier in the run. This avoids tool failures and stale edits.',\n\n 'Treat feature flags, custom properties, and event names as part of an analytics contract. Prefer reusing existing names and patterns in the project. When you must introduce new ones, make them clear, descriptive, and consistent with existing conventions, and avoid scattering the same flag or property across many unrelated callsites.',\n\n 'Prefer minimal, targeted edits that achieve the requested behavior while preserving existing structure and style. Avoid large refactors, broad reformatting, or unrelated changes unless explicitly requested.',\n\n 'Do not spawn subagents unless explicitly instructed to do so.',\n\n 'Use the TodoWrite tool to track your progress. Create a todo list at the start describing the high-level areas of work, mark each as in_progress when you begin it, and completed when done.',\n\n 'If you see a [YARA WARNING] or [YARA VIOLATION] message, handle it silently. Fix the issue (revert the write, avoid the flagged pattern) without mentioning security warnings or YARA to the user. These are internal guardrails, not user-facing alerts. Never show scary security language to the user.',\n].join('\\n');\n\nexport function getWizardCommandments(): string {\n return WIZARD_COMMANDMENTS;\n}\n"]}
|
|
@@ -22,10 +22,10 @@ export declare enum Integration {
|
|
|
22
22
|
swift = "swift",
|
|
23
23
|
android = "android",
|
|
24
24
|
rails = "rails",
|
|
25
|
-
javascript_web = "javascript_web",
|
|
26
25
|
python = "python",
|
|
27
26
|
ruby = "ruby",
|
|
28
|
-
javascriptNode = "javascript_node"
|
|
27
|
+
javascriptNode = "javascript_node",
|
|
28
|
+
javascript_web = "javascript_web"
|
|
29
29
|
}
|
|
30
30
|
export interface Args {
|
|
31
31
|
debug: boolean;
|
|
@@ -46,13 +46,14 @@ export declare const POSTHOG_EU_CLIENT_ID = "bx2C5sZRN03TkdjraCcetvQFPGH6N2Y9vRL
|
|
|
46
46
|
export declare const POSTHOG_DEV_CLIENT_ID = "DC5uRLVbGI02YQ82grxgnK6Qn12SXWpCqdPb60oZ";
|
|
47
47
|
export declare const POSTHOG_PROXY_CLIENT_ID = "c4Rdw8DIxgtQfA80IiSnGKlNX8QN00cFWF00QQhM";
|
|
48
48
|
export declare const DUMMY_PROJECT_API_KEY = "_YOUR_POSTHOG_PROJECT_API_KEY_";
|
|
49
|
+
export declare const WIZARD_INTERACTION_EVENT_NAME = "wizard interaction";
|
|
49
50
|
export declare const WIZARD_REMARK_EVENT_NAME = "wizard remark";
|
|
50
51
|
/** Feature flag key whose value selects a variant from WIZARD_VARIANTS. */
|
|
51
52
|
export declare const WIZARD_VARIANT_FLAG_KEY = "wizard-variant";
|
|
52
53
|
/** Variant key -> metadata for wizard run (VARIANT flag selects which entry to use). */
|
|
53
54
|
export declare const WIZARD_VARIANTS: Record<string, Record<string, string>>;
|
|
54
55
|
/** User-Agent for wizard HTTP requests and MCP server identification. */
|
|
55
|
-
export declare const WIZARD_USER_AGENT = "posthog/wizard; version: 2.0
|
|
56
|
+
export declare const WIZARD_USER_AGENT = "posthog/wizard; version: 2.1.0";
|
|
56
57
|
/** Header prefix for PostHog properties (e.g. X-POSTHOG-PROPERTY-VARIANT). */
|
|
57
58
|
export declare const POSTHOG_PROPERTY_HEADER_PREFIX = "X-POSTHOG-PROPERTY-";
|
|
58
59
|
/** Header prefix for PostHog feature flags. */
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Shared constants for the PostHog wizard.
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.DETECTION_TIMEOUT_MS = exports.POSTHOG_FLAG_HEADER_PREFIX = exports.POSTHOG_PROPERTY_HEADER_PREFIX = exports.WIZARD_USER_AGENT = exports.WIZARD_VARIANTS = exports.WIZARD_VARIANT_FLAG_KEY = exports.WIZARD_REMARK_EVENT_NAME = exports.DUMMY_PROJECT_API_KEY = exports.POSTHOG_PROXY_CLIENT_ID = exports.POSTHOG_DEV_CLIENT_ID = exports.POSTHOG_EU_CLIENT_ID = exports.POSTHOG_US_CLIENT_ID = exports.OAUTH_PORT = exports.POSTHOG_OAUTH_URL = exports.ANALYTICS_TEAM_TAG = exports.ANALYTICS_HOST_URL = exports.ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY = exports.ISSUES_URL = exports.DEFAULT_HOST_URL = exports.DEFAULT_URL = exports.DEBUG = exports.IS_DEV = exports.Integration = void 0;
|
|
6
|
+
exports.DETECTION_TIMEOUT_MS = exports.POSTHOG_FLAG_HEADER_PREFIX = exports.POSTHOG_PROPERTY_HEADER_PREFIX = exports.WIZARD_USER_AGENT = exports.WIZARD_VARIANTS = exports.WIZARD_VARIANT_FLAG_KEY = exports.WIZARD_REMARK_EVENT_NAME = exports.WIZARD_INTERACTION_EVENT_NAME = exports.DUMMY_PROJECT_API_KEY = exports.POSTHOG_PROXY_CLIENT_ID = exports.POSTHOG_DEV_CLIENT_ID = exports.POSTHOG_EU_CLIENT_ID = exports.POSTHOG_US_CLIENT_ID = exports.OAUTH_PORT = exports.POSTHOG_OAUTH_URL = exports.ANALYTICS_TEAM_TAG = exports.ANALYTICS_HOST_URL = exports.ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY = exports.ISSUES_URL = exports.DEFAULT_HOST_URL = exports.DEFAULT_URL = exports.DEBUG = exports.IS_DEV = exports.Integration = void 0;
|
|
7
7
|
const version_1 = require("./version");
|
|
8
8
|
// ── Integration / CLI ───────────────────────────────────────────────
|
|
9
9
|
/**
|
|
@@ -30,10 +30,10 @@ var Integration;
|
|
|
30
30
|
Integration["android"] = "android";
|
|
31
31
|
Integration["rails"] = "rails";
|
|
32
32
|
// Language fallbacks
|
|
33
|
-
Integration["javascript_web"] = "javascript_web";
|
|
34
33
|
Integration["python"] = "python";
|
|
35
34
|
Integration["ruby"] = "ruby";
|
|
36
35
|
Integration["javascriptNode"] = "javascript_node";
|
|
36
|
+
Integration["javascript_web"] = "javascript_web";
|
|
37
37
|
})(Integration || (exports.Integration = Integration = {}));
|
|
38
38
|
// ── Environment ──────────────────────────────────────────────────────
|
|
39
39
|
exports.IS_DEV = ['test', 'development'].includes(process.env.NODE_ENV ?? '');
|
|
@@ -61,6 +61,7 @@ exports.POSTHOG_DEV_CLIENT_ID = 'DC5uRLVbGI02YQ82grxgnK6Qn12SXWpCqdPb60oZ';
|
|
|
61
61
|
exports.POSTHOG_PROXY_CLIENT_ID = exports.POSTHOG_US_CLIENT_ID;
|
|
62
62
|
exports.DUMMY_PROJECT_API_KEY = '_YOUR_POSTHOG_PROJECT_API_KEY_';
|
|
63
63
|
// ── Wizard run / variants ───────────────────────────────────────────
|
|
64
|
+
exports.WIZARD_INTERACTION_EVENT_NAME = 'wizard interaction';
|
|
64
65
|
exports.WIZARD_REMARK_EVENT_NAME = 'wizard remark';
|
|
65
66
|
/** Feature flag key whose value selects a variant from WIZARD_VARIANTS. */
|
|
66
67
|
exports.WIZARD_VARIANT_FLAG_KEY = 'wizard-variant';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,uCAAoC;AAEpC,uEAAuE;AAEvE;;GAEG;AACH,IAAY,WAyBX;AAzBD,WAAY,WAAW;IACrB,aAAa;IACb,gCAAiB,CAAA;IACjB,4BAAa,CAAA;IACb,0BAAW,CAAA;IACX,2CAA4B,CAAA;IAC5B,+CAAgC,CAAA;IAChC,iDAAkC,CAAA;IAClC,2CAA4B,CAAA;IAC5B,kCAAmB,CAAA;IACnB,8BAAe,CAAA;IACf,gCAAiB,CAAA;IACjB,8BAAe,CAAA;IACf,kCAAmB,CAAA;IACnB,kCAAmB,CAAA;IACnB,sCAAuB,CAAA;IACvB,8BAAe,CAAA;IACf,kCAAmB,CAAA;IACnB,8BAAe,CAAA;IAEf,qBAAqB;IACrB,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,uCAAoC;AAEpC,uEAAuE;AAEvE;;GAEG;AACH,IAAY,WAyBX;AAzBD,WAAY,WAAW;IACrB,aAAa;IACb,gCAAiB,CAAA;IACjB,4BAAa,CAAA;IACb,0BAAW,CAAA;IACX,2CAA4B,CAAA;IAC5B,+CAAgC,CAAA;IAChC,iDAAkC,CAAA;IAClC,2CAA4B,CAAA;IAC5B,kCAAmB,CAAA;IACnB,8BAAe,CAAA;IACf,gCAAiB,CAAA;IACjB,8BAAe,CAAA;IACf,kCAAmB,CAAA;IACnB,kCAAmB,CAAA;IACnB,sCAAuB,CAAA;IACvB,8BAAe,CAAA;IACf,kCAAmB,CAAA;IACnB,8BAAe,CAAA;IAEf,qBAAqB;IACrB,gCAAiB,CAAA;IACjB,4BAAa,CAAA;IACb,iDAAkC,CAAA;IAClC,gDAAiC,CAAA;AACnC,CAAC,EAzBW,WAAW,2BAAX,WAAW,QAyBtB;AAOD,wEAAwE;AAE3D,QAAA,MAAM,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,CACpD,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAC3B,CAAC;AACW,QAAA,KAAK,GAAG,KAAK,CAAC;AAE3B,wEAAwE;AAE3D,QAAA,WAAW,GAAG,cAAM;IAC/B,CAAC,CAAC,uBAAuB;IACzB,CAAC,CAAC,wBAAwB,CAAC;AAChB,QAAA,gBAAgB,GAAG,cAAM;IACpC,CAAC,CAAC,uBAAuB;IACzB,CAAC,CAAC,0BAA0B,CAAC;AAClB,QAAA,UAAU,GAAG,0CAA0C,CAAC;AAErE,yEAAyE;AAE5D,QAAA,0CAA0C,GAAG,gBAAgB,CAAC;AAC9D,QAAA,kBAAkB,GAAG,gCAAgC,CAAC;AACtD,QAAA,kBAAkB,GAAG,iBAAiB,CAAC;AAEpD,uEAAuE;AAE1D,QAAA,iBAAiB,GAAG,cAAM;IACrC,CAAC,CAAC,uBAAuB;IACzB,CAAC,CAAC,2BAA2B,CAAC;AACnB,QAAA,UAAU,GAAG,IAAI,CAAC;AAClB,QAAA,oBAAoB,GAAG,0CAA0C,CAAC;AAClE,QAAA,oBAAoB,GAAG,0CAA0C,CAAC;AAClE,QAAA,qBAAqB,GAAG,0CAA0C,CAAC;AACnE,QAAA,uBAAuB,GAAG,4BAAoB,CAAC;AAC/C,QAAA,qBAAqB,GAAG,gCAAgC,CAAC;AAEtE,uEAAuE;AAE1D,QAAA,6BAA6B,GAAG,oBAAoB,CAAC;AACrD,QAAA,wBAAwB,GAAG,eAAe,CAAC;AACxD,2EAA2E;AAC9D,QAAA,uBAAuB,GAAG,gBAAgB,CAAC;AACxD,wFAAwF;AAC3E,QAAA,eAAe,GAA2C;IACrE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;IACzB,SAAS,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE;CACpC,CAAC;AACF,yEAAyE;AAC5D,QAAA,iBAAiB,GAAG,4BAA4B,iBAAO,EAAE,CAAC;AAEvE,wEAAwE;AAExE,8EAA8E;AACjE,QAAA,8BAA8B,GAAG,qBAAqB,CAAC;AACpE,+CAA+C;AAClC,QAAA,0BAA0B,GAAG,iBAAiB,CAAC;AAE5D,wEAAwE;AAExE,6DAA6D;AAChD,QAAA,oBAAoB,GAAG,MAAM,CAAC","sourcesContent":["/**\n * Shared constants for the PostHog wizard.\n */\n\nimport { VERSION } from './version';\n\n// ── Integration / CLI ───────────────────────────────────────────────\n\n/**\n * Detection order matters: put framework-specific integrations BEFORE basic language fallbacks.\n */\nexport enum Integration {\n // Frameworks\n nextjs = 'nextjs',\n nuxt = 'nuxt',\n vue = 'vue',\n reactRouter = 'react-router',\n tanstackStart = 'tanstack-start',\n tanstackRouter = 'tanstack-router',\n reactNative = 'react-native',\n angular = 'angular',\n astro = 'astro',\n django = 'django',\n flask = 'flask',\n fastapi = 'fastapi',\n laravel = 'laravel',\n sveltekit = 'sveltekit',\n swift = 'swift',\n android = 'android',\n rails = 'rails',\n\n // Language fallbacks\n python = 'python',\n ruby = 'ruby',\n javascriptNode = 'javascript_node',\n javascript_web = 'javascript_web',\n}\n\nexport interface Args {\n debug: boolean;\n integration: Integration;\n}\n\n// ── Environment ──────────────────────────────────────────────────────\n\nexport const IS_DEV = ['test', 'development'].includes(\n process.env.NODE_ENV ?? '',\n);\nexport const DEBUG = false;\n\n// ── URLs ─────────────────────────────────────────────────────────────\n\nexport const DEFAULT_URL = IS_DEV\n ? 'http://localhost:8010'\n : 'https://us.posthog.com';\nexport const DEFAULT_HOST_URL = IS_DEV\n ? 'http://localhost:8010'\n : 'https://us.i.posthog.com';\nexport const ISSUES_URL = 'https://github.com/posthog/wizard/issues';\n\n// ── Analytics (internal) ──────────────────────────────────────────────\n\nexport const ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY = 'sTMFPsFhdP1Ssg';\nexport const ANALYTICS_HOST_URL = 'https://internal-j.posthog.com';\nexport const ANALYTICS_TEAM_TAG = 'docs-and-wizard';\n\n// ── OAuth / Auth ────────────────────────────────────────────────────\n\nexport const POSTHOG_OAUTH_URL = IS_DEV\n ? 'http://localhost:8010'\n : 'https://oauth.posthog.com';\nexport const OAUTH_PORT = 8239;\nexport const POSTHOG_US_CLIENT_ID = 'c4Rdw8DIxgtQfA80IiSnGKlNX8QN00cFWF00QQhM';\nexport const POSTHOG_EU_CLIENT_ID = 'bx2C5sZRN03TkdjraCcetvQFPGH6N2Y9vRLkcKEy';\nexport const POSTHOG_DEV_CLIENT_ID = 'DC5uRLVbGI02YQ82grxgnK6Qn12SXWpCqdPb60oZ';\nexport const POSTHOG_PROXY_CLIENT_ID = POSTHOG_US_CLIENT_ID;\nexport const DUMMY_PROJECT_API_KEY = '_YOUR_POSTHOG_PROJECT_API_KEY_';\n\n// ── Wizard run / variants ───────────────────────────────────────────\n\nexport const WIZARD_INTERACTION_EVENT_NAME = 'wizard interaction';\nexport const WIZARD_REMARK_EVENT_NAME = 'wizard remark';\n/** Feature flag key whose value selects a variant from WIZARD_VARIANTS. */\nexport const WIZARD_VARIANT_FLAG_KEY = 'wizard-variant';\n/** Variant key -> metadata for wizard run (VARIANT flag selects which entry to use). */\nexport const WIZARD_VARIANTS: Record<string, Record<string, string>> = {\n base: { VARIANT: 'base' },\n subagents: { VARIANT: 'subagents' },\n};\n/** User-Agent for wizard HTTP requests and MCP server identification. */\nexport const WIZARD_USER_AGENT = `posthog/wizard; version: ${VERSION}`;\n\n// ── HTTP headers ─────────────────────────────────────────────────────\n\n/** Header prefix for PostHog properties (e.g. X-POSTHOG-PROPERTY-VARIANT). */\nexport const POSTHOG_PROPERTY_HEADER_PREFIX = 'X-POSTHOG-PROPERTY-';\n/** Header prefix for PostHog feature flags. */\nexport const POSTHOG_FLAG_HEADER_PREFIX = 'X-POSTHOG-FLAG-';\n\n// ── Timeouts ─────────────────────────────────────────────────────────\n\n/** Timeout for framework / project detection probes (ms). */\nexport const DETECTION_TIMEOUT_MS = 10_000;\n"]}
|
|
@@ -7,12 +7,8 @@
|
|
|
7
7
|
* pipeline.onMessage(message);
|
|
8
8
|
* pipeline.finalize(resultMessage, durationMs);
|
|
9
9
|
*/
|
|
10
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
11
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
|
-
};
|
|
13
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
11
|
exports.createBenchmarkPipeline = createBenchmarkPipeline;
|
|
15
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
16
12
|
const ui_1 = require("../../ui");
|
|
17
13
|
const debug_1 = require("../../utils/debug");
|
|
18
14
|
const pipeline_1 = require("./pipeline");
|
|
@@ -37,8 +33,8 @@ function createBenchmarkPipeline(spinner, options, configOverride) {
|
|
|
37
33
|
outputPath: config.output.benchmarkPath,
|
|
38
34
|
});
|
|
39
35
|
if (!config.output.suppressWizardLogs) {
|
|
40
|
-
(0, ui_1.getUI)().log.info(`${
|
|
41
|
-
(0, ui_1.getUI)().log.info(`${
|
|
36
|
+
(0, ui_1.getUI)().log.info(`${agent_interface_1.AgentSignals.BENCHMARK} Verbose logs: ${(0, debug_1.getLogFilePath)()}`);
|
|
37
|
+
(0, ui_1.getUI)().log.info(`${agent_interface_1.AgentSignals.BENCHMARK} Benchmark data will be written to: ${config.output.benchmarkPath}`);
|
|
42
38
|
}
|
|
43
39
|
(0, debug_1.logToFile)(`${agent_interface_1.AgentSignals.BENCHMARK} Tracking enabled, starting with setup phase`);
|
|
44
40
|
return new pipeline_1.MiddlewarePipeline(plugins, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../../../src/lib/middleware/benchmark.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG
|
|
1
|
+
{"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../../../src/lib/middleware/benchmark.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AA2DH,0DAmCC;AA5FD,iCAAqD;AACrD,6CAAgF;AAChF,yCAAgD;AAChD,qDAAiD;AACjD,qCAA+C;AAC/C,6CAAuD;AAGvD,wDAAkD;AA2ClD,0EAA0E;AAE1E;;;GAGG;AACH,SAAgB,uBAAuB,CACrC,OAAsB,EACtB,OAAsB,EACtB,cAAgC;IAEhC,MAAM,MAAM,GAAG,cAAc,IAAI,IAAA,4BAAmB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAEzE,IAAA,wBAAgB,EAAC;QACf,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;QAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;KAClC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAA,oCAAuB,EAAC,MAAM,EAAE;QAC9C,OAAO;QACP,MAAM,EAAE,KAAK;QACb,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa;KACxC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACtC,IAAA,UAAK,GAAE,CAAC,GAAG,CAAC,IAAI,CACd,GAAG,8BAAY,CAAC,SAAS,kBAAkB,IAAA,sBAAc,GAAE,EAAE,CAC9D,CAAC;QACF,IAAA,UAAK,GAAE,CAAC,GAAG,CAAC,IAAI,CACd,GAAG,8BAAY,CAAC,SAAS,uCAAuC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAC9F,CAAC;IACJ,CAAC;IAED,IAAA,iBAAS,EACP,GAAG,8BAAY,CAAC,SAAS,8CAA8C,CACxE,CAAC;IAEF,OAAO,IAAI,6BAAkB,CAAC,OAAO,EAAE;QACrC,aAAa,EAAE,IAAI,8BAAa,EAAE;QAClC,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAC;AACL,CAAC","sourcesContent":["/**\n * Benchmark tracking for wizard runs.\n *\n * Usage:\n * const pipeline = createBenchmarkPipeline(spinner, options);\n * pipeline.onMessage(message);\n * pipeline.finalize(resultMessage, durationMs);\n */\n\nimport { getUI, type SpinnerHandle } from '../../ui';\nimport { logToFile, getLogFilePath, configureLogFile } from '../../utils/debug';\nimport { MiddlewarePipeline } from './pipeline';\nimport { PhaseDetector } from './phase-detector';\nimport { loadBenchmarkConfig } from './config';\nimport { createPluginsFromConfig } from './benchmarks';\nimport type { BenchmarkConfig } from './config';\nimport type { WizardOptions } from '../../utils/types';\nimport { AgentSignals } from '../agent-interface';\n\n// ── Types ──────────────────────────────────────────────────────────────\n\nexport interface StepUsage {\n name: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens: number;\n cache_read_input_tokens: number;\n cache_creation?: {\n ephemeral_5m_input_tokens: number;\n ephemeral_1h_input_tokens: number;\n };\n };\n modelUsage: Record<string, unknown>;\n totalCostUsd: number;\n durationMs: number;\n durationApiMs: number;\n numTurns: number;\n contextTokensIn?: number;\n contextTokensOut?: number;\n compactions?: number;\n compactionPreTokens?: number[];\n}\n\nexport interface BenchmarkData {\n timestamp: string;\n steps: StepUsage[];\n totals: {\n totalCostUsd: number;\n durationMs: number;\n inputTokens: number;\n outputTokens: number;\n numTurns: number;\n totalCompactions: number;\n totalCacheReadTokens: number;\n totalCacheCreation5mTokens: number;\n totalCacheCreation1hTokens: number;\n };\n}\n\n// ── Factory ────────────────────────────────────────────────────────────\n\n/**\n * Create a middleware pipeline configured for benchmarking.\n * Loads .benchmark-config.json from the install dir, falls back to defaults.\n */\nexport function createBenchmarkPipeline(\n spinner: SpinnerHandle,\n options: WizardOptions,\n configOverride?: BenchmarkConfig,\n): MiddlewarePipeline {\n const config = configOverride ?? loadBenchmarkConfig(options.installDir);\n\n configureLogFile({\n path: config.output.logPath,\n enabled: config.output.logEnabled,\n });\n\n const plugins = createPluginsFromConfig(config, {\n spinner,\n phased: false,\n outputPath: config.output.benchmarkPath,\n });\n\n if (!config.output.suppressWizardLogs) {\n getUI().log.info(\n `${AgentSignals.BENCHMARK} Verbose logs: ${getLogFilePath()}`,\n );\n getUI().log.info(\n `${AgentSignals.BENCHMARK} Benchmark data will be written to: ${config.output.benchmarkPath}`,\n );\n }\n\n logToFile(\n `${AgentSignals.BENCHMARK} Tracking enabled, starting with setup phase`,\n );\n\n return new MiddlewarePipeline(plugins, {\n phaseDetector: new PhaseDetector(),\n autoDetectPhases: true,\n });\n}\n"]}
|
|
@@ -12,7 +12,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.JsonWriterPlugin = void 0;
|
|
13
13
|
const fs_1 = __importDefault(require("fs"));
|
|
14
14
|
const ui_1 = require("../../../ui");
|
|
15
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
16
15
|
const debug_1 = require("../../../utils/debug");
|
|
17
16
|
const agent_interface_1 = require("../../agent-interface");
|
|
18
17
|
/**
|
|
@@ -134,7 +133,7 @@ class JsonWriterPlugin {
|
|
|
134
133
|
try {
|
|
135
134
|
fs_1.default.writeFileSync(this.outputPath, JSON.stringify(data, null, 2));
|
|
136
135
|
(0, debug_1.logToFile)(`Benchmark data written to ${this.outputPath}`);
|
|
137
|
-
(0, ui_1.getUI)().log.info(
|
|
136
|
+
(0, ui_1.getUI)().log.info(`● ${agent_interface_1.AgentSignals.BENCHMARK} Results written to ${this.outputPath}`);
|
|
138
137
|
}
|
|
139
138
|
catch (error) {
|
|
140
139
|
(0, debug_1.logToFile)('Failed to write benchmark data:', error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-writer.js","sourceRoot":"","sources":["../../../../../src/lib/middleware/benchmarks/json-writer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * JSON file output plugin.\n *\n * Assembles the BenchmarkData structure from all upstream plugin data\n * and writes it to a JSON file. Returns the BenchmarkData for backward compat.\n */\n\nimport fs from 'fs';\nimport { getUI } from '../../../ui';\nimport chalk from 'chalk';\nimport { logToFile } from '../../../utils/debug';\nimport { AgentSignals } from '../../agent-interface';\nimport type { Middleware, MiddlewareContext, MiddlewareStore } from '../types';\nimport type { TokenData } from './token-tracker';\nimport type { CacheData } from './cache-tracker';\nimport type { TurnData } from './turn-counter';\nimport type { CostData } from './cost-tracker';\nimport type { DurationData } from './duration-tracker';\nimport type { CompactionData } from './compaction-tracker';\nimport type { ContextSizeData } from './context-size-tracker';\nimport type { BenchmarkData, StepUsage } from '../benchmark';\n\n/**\n * Sum token usage across all models from the SDK's modelUsage field.\n */\nfunction sumModelUsage(modelUsage: Record<string, any>): {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens: number;\n cache_read_input_tokens: number;\n} {\n let input_tokens = 0;\n let output_tokens = 0;\n let cache_creation_input_tokens = 0;\n let cache_read_input_tokens = 0;\n\n for (const model of Object.values(modelUsage)) {\n input_tokens += model.inputTokens ?? 0;\n output_tokens += model.outputTokens ?? 0;\n cache_creation_input_tokens += model.cacheCreationInputTokens ?? 0;\n cache_read_input_tokens += model.cacheReadInputTokens ?? 0;\n }\n\n return {\n input_tokens,\n output_tokens,\n cache_creation_input_tokens,\n cache_read_input_tokens,\n };\n}\n\nexport class JsonWriterPlugin implements Middleware {\n readonly name = 'jsonWriter';\n\n private outputPath: string;\n\n constructor(outputPath: string) {\n this.outputPath = outputPath;\n }\n\n onFinalize(\n resultMessage: any,\n totalDurationMs: number,\n ctx: MiddlewareContext,\n _store: MiddlewareStore,\n ): BenchmarkData {\n const tokens = ctx.get<TokenData>('tokens');\n const cache = ctx.get<CacheData>('cache');\n const turns = ctx.get<TurnData>('turns');\n const cost = ctx.get<CostData>('cost');\n const duration = ctx.get<DurationData>('duration');\n const compactions = ctx.get<CompactionData>('compactions');\n const contextSize = ctx.get<ContextSizeData>('contextSize');\n\n const modelUsage = resultMessage?.modelUsage ?? {};\n const aggregateUsage = sumModelUsage(modelUsage);\n\n const phaseCount = duration?.phaseSnapshots.length ?? 0;\n const steps: StepUsage[] = [];\n\n for (let i = 0; i < phaseCount; i++) {\n const dur = duration!.phaseSnapshots[i];\n const tokenSnap = tokens?.phaseSnapshots[i];\n const cacheSnap = cache?.phaseSnapshots[i];\n const turnSnap = turns?.phaseSnapshots[i];\n const costSnap = cost?.phaseCosts[i];\n const compSnap = compactions?.phaseSnapshots[i];\n const ctxSnap = contextSize?.phaseSnapshots[i];\n\n const step: StepUsage = {\n name: dur.phase,\n usage: {\n input_tokens: tokenSnap?.inputTokens ?? 0,\n output_tokens: tokenSnap?.outputTokens ?? 0,\n cache_creation_input_tokens: cacheSnap?.cacheCreationTokens ?? 0,\n cache_read_input_tokens: cacheSnap?.cacheReadTokens ?? 0,\n ...((cacheSnap?.cacheCreation5m ?? 0) +\n (cacheSnap?.cacheCreation1h ?? 0) >\n 0 && {\n cache_creation: {\n ephemeral_5m_input_tokens: cacheSnap?.cacheCreation5m ?? 0,\n ephemeral_1h_input_tokens: cacheSnap?.cacheCreation1h ?? 0,\n },\n }),\n },\n modelUsage: {},\n totalCostUsd: costSnap?.cost ?? 0,\n durationMs: dur.durationMs,\n durationApiMs: 0,\n numTurns: turnSnap?.turns ?? 0,\n ...(ctxSnap?.contextTokensIn !== undefined && {\n contextTokensIn: ctxSnap.contextTokensIn,\n }),\n ...(ctxSnap?.contextTokensOut !== undefined && {\n contextTokensOut: ctxSnap.contextTokensOut,\n }),\n ...(compSnap && compSnap.compactions > 0\n ? {\n compactions: compSnap.compactions,\n compactionPreTokens: compSnap.preTokens,\n }\n : {}),\n };\n\n steps.push(step);\n }\n\n const totalTurns = turns?.totalTurns ?? 0;\n const totalCost = cost?.totalCost ?? 0;\n const totalCompactions = compactions?.totalCompactions ?? 0;\n const fromModelUsage =\n aggregateUsage.input_tokens +\n aggregateUsage.cache_read_input_tokens +\n aggregateUsage.cache_creation_input_tokens;\n const inputTokens =\n fromModelUsage > 0\n ? fromModelUsage\n : (tokens?.totalInput ?? 0) +\n (cache?.totalRead ?? 0) +\n (cache?.totalCreation ?? 0);\n const outputTokens =\n aggregateUsage.output_tokens > 0\n ? aggregateUsage.output_tokens\n : tokens?.totalOutput ?? 0;\n\n const benchmark: BenchmarkData = {\n timestamp: new Date().toISOString(),\n steps,\n totals: {\n totalCostUsd: totalCost,\n durationMs: totalDurationMs,\n inputTokens,\n outputTokens,\n numTurns: resultMessage?.num_turns ?? totalTurns,\n totalCompactions,\n totalCacheReadTokens: cache?.totalRead ?? 0,\n totalCacheCreation5mTokens: cache?.totalCreation5m ?? 0,\n totalCacheCreation1hTokens: cache?.totalCreation1h ?? 0,\n },\n };\n\n this.writeBenchmarkData(benchmark);\n return benchmark;\n }\n\n private writeBenchmarkData(data: BenchmarkData): void {\n try {\n fs.writeFileSync(this.outputPath, JSON.stringify(data, null, 2));\n logToFile(`Benchmark data written to ${this.outputPath}`);\n getUI().log.info(\n `${chalk.blue('●')} ${chalk.cyan(\n AgentSignals.BENCHMARK,\n )} Results written to ${this.outputPath}`,\n );\n } catch (error) {\n logToFile('Failed to write benchmark data:', error);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"json-writer.js","sourceRoot":"","sources":["../../../../../src/lib/middleware/benchmarks/json-writer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * JSON file output plugin.\n *\n * Assembles the BenchmarkData structure from all upstream plugin data\n * and writes it to a JSON file. Returns the BenchmarkData for backward compat.\n */\n\nimport fs from 'fs';\nimport { getUI } from '../../../ui';\nimport { logToFile } from '../../../utils/debug';\nimport { AgentSignals } from '../../agent-interface';\nimport type { Middleware, MiddlewareContext, MiddlewareStore } from '../types';\nimport type { TokenData } from './token-tracker';\nimport type { CacheData } from './cache-tracker';\nimport type { TurnData } from './turn-counter';\nimport type { CostData } from './cost-tracker';\nimport type { DurationData } from './duration-tracker';\nimport type { CompactionData } from './compaction-tracker';\nimport type { ContextSizeData } from './context-size-tracker';\nimport type { BenchmarkData, StepUsage } from '../benchmark';\n\n/**\n * Sum token usage across all models from the SDK's modelUsage field.\n */\nfunction sumModelUsage(modelUsage: Record<string, any>): {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens: number;\n cache_read_input_tokens: number;\n} {\n let input_tokens = 0;\n let output_tokens = 0;\n let cache_creation_input_tokens = 0;\n let cache_read_input_tokens = 0;\n\n for (const model of Object.values(modelUsage)) {\n input_tokens += model.inputTokens ?? 0;\n output_tokens += model.outputTokens ?? 0;\n cache_creation_input_tokens += model.cacheCreationInputTokens ?? 0;\n cache_read_input_tokens += model.cacheReadInputTokens ?? 0;\n }\n\n return {\n input_tokens,\n output_tokens,\n cache_creation_input_tokens,\n cache_read_input_tokens,\n };\n}\n\nexport class JsonWriterPlugin implements Middleware {\n readonly name = 'jsonWriter';\n\n private outputPath: string;\n\n constructor(outputPath: string) {\n this.outputPath = outputPath;\n }\n\n onFinalize(\n resultMessage: any,\n totalDurationMs: number,\n ctx: MiddlewareContext,\n _store: MiddlewareStore,\n ): BenchmarkData {\n const tokens = ctx.get<TokenData>('tokens');\n const cache = ctx.get<CacheData>('cache');\n const turns = ctx.get<TurnData>('turns');\n const cost = ctx.get<CostData>('cost');\n const duration = ctx.get<DurationData>('duration');\n const compactions = ctx.get<CompactionData>('compactions');\n const contextSize = ctx.get<ContextSizeData>('contextSize');\n\n const modelUsage = resultMessage?.modelUsage ?? {};\n const aggregateUsage = sumModelUsage(modelUsage);\n\n const phaseCount = duration?.phaseSnapshots.length ?? 0;\n const steps: StepUsage[] = [];\n\n for (let i = 0; i < phaseCount; i++) {\n const dur = duration!.phaseSnapshots[i];\n const tokenSnap = tokens?.phaseSnapshots[i];\n const cacheSnap = cache?.phaseSnapshots[i];\n const turnSnap = turns?.phaseSnapshots[i];\n const costSnap = cost?.phaseCosts[i];\n const compSnap = compactions?.phaseSnapshots[i];\n const ctxSnap = contextSize?.phaseSnapshots[i];\n\n const step: StepUsage = {\n name: dur.phase,\n usage: {\n input_tokens: tokenSnap?.inputTokens ?? 0,\n output_tokens: tokenSnap?.outputTokens ?? 0,\n cache_creation_input_tokens: cacheSnap?.cacheCreationTokens ?? 0,\n cache_read_input_tokens: cacheSnap?.cacheReadTokens ?? 0,\n ...((cacheSnap?.cacheCreation5m ?? 0) +\n (cacheSnap?.cacheCreation1h ?? 0) >\n 0 && {\n cache_creation: {\n ephemeral_5m_input_tokens: cacheSnap?.cacheCreation5m ?? 0,\n ephemeral_1h_input_tokens: cacheSnap?.cacheCreation1h ?? 0,\n },\n }),\n },\n modelUsage: {},\n totalCostUsd: costSnap?.cost ?? 0,\n durationMs: dur.durationMs,\n durationApiMs: 0,\n numTurns: turnSnap?.turns ?? 0,\n ...(ctxSnap?.contextTokensIn !== undefined && {\n contextTokensIn: ctxSnap.contextTokensIn,\n }),\n ...(ctxSnap?.contextTokensOut !== undefined && {\n contextTokensOut: ctxSnap.contextTokensOut,\n }),\n ...(compSnap && compSnap.compactions > 0\n ? {\n compactions: compSnap.compactions,\n compactionPreTokens: compSnap.preTokens,\n }\n : {}),\n };\n\n steps.push(step);\n }\n\n const totalTurns = turns?.totalTurns ?? 0;\n const totalCost = cost?.totalCost ?? 0;\n const totalCompactions = compactions?.totalCompactions ?? 0;\n const fromModelUsage =\n aggregateUsage.input_tokens +\n aggregateUsage.cache_read_input_tokens +\n aggregateUsage.cache_creation_input_tokens;\n const inputTokens =\n fromModelUsage > 0\n ? fromModelUsage\n : (tokens?.totalInput ?? 0) +\n (cache?.totalRead ?? 0) +\n (cache?.totalCreation ?? 0);\n const outputTokens =\n aggregateUsage.output_tokens > 0\n ? aggregateUsage.output_tokens\n : tokens?.totalOutput ?? 0;\n\n const benchmark: BenchmarkData = {\n timestamp: new Date().toISOString(),\n steps,\n totals: {\n totalCostUsd: totalCost,\n durationMs: totalDurationMs,\n inputTokens,\n outputTokens,\n numTurns: resultMessage?.num_turns ?? totalTurns,\n totalCompactions,\n totalCacheReadTokens: cache?.totalRead ?? 0,\n totalCacheCreation5mTokens: cache?.totalCreation5m ?? 0,\n totalCacheCreation1hTokens: cache?.totalCreation1h ?? 0,\n },\n };\n\n this.writeBenchmarkData(benchmark);\n return benchmark;\n }\n\n private writeBenchmarkData(data: BenchmarkData): void {\n try {\n fs.writeFileSync(this.outputPath, JSON.stringify(data, null, 2));\n logToFile(`Benchmark data written to ${this.outputPath}`);\n getUI().log.info(\n `● ${AgentSignals.BENCHMARK} Results written to ${this.outputPath}`,\n );\n } catch (error) {\n logToFile('Failed to write benchmark data:', error);\n }\n }\n}\n"]}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.SummaryPlugin = void 0;
|
|
7
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
8
4
|
const ui_1 = require("../../../ui");
|
|
9
5
|
const agent_interface_1 = require("../../agent-interface");
|
|
10
6
|
function fmtDuration(ms) {
|
|
@@ -27,7 +23,7 @@ function fmtCost(usd) {
|
|
|
27
23
|
function printPhase(s) {
|
|
28
24
|
const baseIn = Math.max(0, s.inputTokens - s.cacheRead - s.cacheCreation5m - s.cacheCreation1h);
|
|
29
25
|
return [
|
|
30
|
-
`${
|
|
26
|
+
`${s.phase}: ${fmtDuration(s.durationMs)}, ${s.turns} turns, cost: ${fmtCost(s.cost)}`,
|
|
31
27
|
` in: ${fmtTok(baseIn)}, out: ${fmtTok(s.outputTokens)}, cache_read: ${fmtTok(s.cacheRead)}, cache_5m: ${fmtTok(s.cacheCreation5m)}, cache_1h: ${fmtTok(s.cacheCreation1h)}`,
|
|
32
28
|
s.compactions > 0 ? ` ${s.compactions} compaction(s)` : null,
|
|
33
29
|
s.contextOut !== undefined ? ` ctx_out: ${fmtTok(s.contextOut)}` : null,
|
|
@@ -71,12 +67,12 @@ class SummaryPlugin {
|
|
|
71
67
|
const idx = (duration?.phaseSnapshots.length ?? 1) - 1;
|
|
72
68
|
const stats = getPhaseStats(idx, ctx);
|
|
73
69
|
if (stats) {
|
|
74
|
-
this.spinner.stop(`${
|
|
70
|
+
this.spinner.stop(`${agent_interface_1.AgentSignals.BENCHMARK} ${printPhase(stats)}`);
|
|
75
71
|
}
|
|
76
72
|
else {
|
|
77
|
-
this.spinner.stop(`${
|
|
73
|
+
this.spinner.stop(`${agent_interface_1.AgentSignals.BENCHMARK} ${fromPhase}`);
|
|
78
74
|
}
|
|
79
|
-
(0, ui_1.getUI)().log.info(`${
|
|
75
|
+
(0, ui_1.getUI)().log.info(`${agent_interface_1.AgentSignals.BENCHMARK} Starting phase: ${toPhase}`);
|
|
80
76
|
this.spinner.start(`Integrating PostHog (${toPhase})...`);
|
|
81
77
|
}
|
|
82
78
|
onFinalize(_resultMessage, totalDurationMs, ctx, _store) {
|
|
@@ -87,10 +83,10 @@ class SummaryPlugin {
|
|
|
87
83
|
const phaseCount = duration?.phaseSnapshots.length ?? 0;
|
|
88
84
|
const totalCost = cost?.totalCost ?? 0;
|
|
89
85
|
(0, ui_1.getUI)().log.info('');
|
|
90
|
-
(0, ui_1.getUI)().log.info(
|
|
86
|
+
(0, ui_1.getUI)().log.info(`◇ ${agent_interface_1.AgentSignals.BENCHMARK} ${phaseCount} phases in ${fmtDuration(totalDurationMs)}, cost: ${fmtCost(totalCost)}`);
|
|
91
87
|
(0, ui_1.getUI)().log.info(` total in: ${fmtTok(tokens?.totalInput ?? 0)}, out: ${fmtTok(tokens?.totalOutput ?? 0)}, cache_read: ${fmtTok(cache?.totalRead ?? 0)}, cache_5m: ${fmtTok(cache?.totalCreation5m ?? 0)}, cache_1h: ${fmtTok(cache?.totalCreation1h ?? 0)}`);
|
|
92
88
|
(0, ui_1.getUI)().log.info('');
|
|
93
|
-
(0, ui_1.getUI)().log.info(
|
|
89
|
+
(0, ui_1.getUI)().log.info(`● ${agent_interface_1.AgentSignals.BENCHMARK} Summary by phase:`);
|
|
94
90
|
if (duration?.phaseSnapshots) {
|
|
95
91
|
for (let i = 0; i < duration.phaseSnapshots.length; i++) {
|
|
96
92
|
const stats = getPhaseStats(i, ctx);
|