@posthog/wizard 1.33.0 → 1.35.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 +9 -0
- package/dist/bin.js.map +1 -1
- package/dist/src/javascript-node/javascript-node-wizard-agent.d.ts +4 -0
- package/dist/src/javascript-node/javascript-node-wizard-agent.js +61 -0
- package/dist/src/javascript-node/javascript-node-wizard-agent.js.map +1 -0
- package/dist/src/javascript-web/javascript-web-wizard-agent.d.ts +3 -0
- package/dist/src/javascript-web/javascript-web-wizard-agent.js +150 -0
- package/dist/src/javascript-web/javascript-web-wizard-agent.js.map +1 -0
- package/dist/src/javascript-web/utils.d.ts +23 -0
- package/dist/src/javascript-web/utils.js +99 -0
- package/dist/src/javascript-web/utils.js.map +1 -0
- 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/agent-interface.d.ts +5 -0
- package/dist/src/lib/agent-interface.js +19 -2
- package/dist/src/lib/agent-interface.js.map +1 -1
- package/dist/src/lib/agent-runner.js +8 -4
- package/dist/src/lib/agent-runner.js.map +1 -1
- package/dist/src/lib/api.js +3 -0
- package/dist/src/lib/api.js.map +1 -1
- package/dist/src/lib/constants.d.ts +6 -1
- package/dist/src/lib/constants.js +15 -1
- package/dist/src/lib/constants.js.map +1 -1
- package/dist/src/lib/middleware/benchmark.d.ts +54 -0
- package/dist/src/lib/middleware/benchmark.js +49 -0
- package/dist/src/lib/middleware/benchmark.js.map +1 -0
- package/dist/src/lib/middleware/benchmarks/cache-tracker.d.ts +44 -0
- package/dist/src/lib/middleware/benchmarks/cache-tracker.js +81 -0
- package/dist/src/lib/middleware/benchmarks/cache-tracker.js.map +1 -0
- package/dist/src/lib/middleware/benchmarks/compaction-tracker.d.ts +29 -0
- package/dist/src/lib/middleware/benchmarks/compaction-tracker.js +60 -0
- package/dist/src/lib/middleware/benchmarks/compaction-tracker.js.map +1 -0
- package/dist/src/lib/middleware/benchmarks/context-size-tracker.d.ts +26 -0
- package/dist/src/lib/middleware/benchmarks/context-size-tracker.js +56 -0
- package/dist/src/lib/middleware/benchmarks/context-size-tracker.js.map +1 -0
- package/dist/src/lib/middleware/benchmarks/cost-tracker.d.ts +16 -0
- package/dist/src/lib/middleware/benchmarks/cost-tracker.js +76 -0
- package/dist/src/lib/middleware/benchmarks/cost-tracker.js.map +1 -0
- package/dist/src/lib/middleware/benchmarks/duration-tracker.d.ts +20 -0
- package/dist/src/lib/middleware/benchmarks/duration-tracker.js +40 -0
- package/dist/src/lib/middleware/benchmarks/duration-tracker.js.map +1 -0
- package/dist/src/lib/middleware/benchmarks/index.d.ts +9 -0
- package/dist/src/lib/middleware/benchmarks/index.js +60 -0
- package/dist/src/lib/middleware/benchmarks/index.js.map +1 -0
- package/dist/src/lib/middleware/benchmarks/json-writer.d.ts +15 -0
- package/dist/src/lib/middleware/benchmarks/json-writer.js +145 -0
- package/dist/src/lib/middleware/benchmarks/json-writer.js.map +1 -0
- package/dist/src/lib/middleware/benchmarks/summary.d.ts +9 -0
- package/dist/src/lib/middleware/benchmarks/summary.js +106 -0
- package/dist/src/lib/middleware/benchmarks/summary.js.map +1 -0
- package/dist/src/lib/middleware/benchmarks/token-tracker.d.ts +40 -0
- package/dist/src/lib/middleware/benchmarks/token-tracker.js +77 -0
- package/dist/src/lib/middleware/benchmarks/token-tracker.js.map +1 -0
- package/dist/src/lib/middleware/benchmarks/turn-counter.d.ts +34 -0
- package/dist/src/lib/middleware/benchmarks/turn-counter.js +59 -0
- package/dist/src/lib/middleware/benchmarks/turn-counter.js.map +1 -0
- package/dist/src/lib/middleware/config.d.ts +24 -0
- package/dist/src/lib/middleware/config.js +78 -0
- package/dist/src/lib/middleware/config.js.map +1 -0
- package/dist/src/lib/middleware/index.d.ts +11 -0
- package/dist/src/lib/middleware/index.js +18 -0
- package/dist/src/lib/middleware/index.js.map +1 -0
- package/dist/src/lib/middleware/phase-detector.d.ts +7 -0
- package/dist/src/lib/middleware/phase-detector.js +64 -0
- package/dist/src/lib/middleware/phase-detector.js.map +1 -0
- package/dist/src/lib/middleware/pipeline.d.ts +29 -0
- package/dist/src/lib/middleware/pipeline.js +82 -0
- package/dist/src/lib/middleware/pipeline.js.map +1 -0
- package/dist/src/lib/middleware/types.d.ts +40 -0
- package/dist/src/lib/middleware/types.js +9 -0
- package/dist/src/lib/middleware/types.js.map +1 -0
- package/dist/src/lib/package-manager-detection.d.ts +1 -0
- package/dist/src/lib/package-manager-detection.js +17 -0
- package/dist/src/lib/package-manager-detection.js.map +1 -1
- package/dist/src/lib/registry.js +8 -0
- package/dist/src/lib/registry.js.map +1 -1
- package/dist/src/python/python-wizard-agent.js +1 -78
- package/dist/src/python/python-wizard-agent.js.map +1 -1
- package/dist/src/rails/rails-wizard-agent.d.ts +8 -0
- package/dist/src/rails/rails-wizard-agent.js +90 -0
- package/dist/src/rails/rails-wizard-agent.js.map +1 -0
- package/dist/src/rails/utils.d.ts +37 -0
- package/dist/src/rails/utils.js +187 -0
- package/dist/src/rails/utils.js.map +1 -0
- package/dist/src/ruby/ruby-wizard-agent.d.ts +7 -0
- package/dist/src/ruby/ruby-wizard-agent.js +113 -0
- package/dist/src/ruby/ruby-wizard-agent.js.map +1 -0
- package/dist/src/ruby/utils.d.ts +25 -0
- package/dist/src/ruby/utils.js +158 -0
- package/dist/src/ruby/utils.js.map +1 -0
- package/dist/src/run.d.ts +2 -0
- package/dist/src/run.js +8 -0
- package/dist/src/run.js.map +1 -1
- package/dist/src/utils/clack-utils.d.ts +1 -1
- package/dist/src/utils/clack-utils.js +26 -7
- package/dist/src/utils/clack-utils.js.map +1 -1
- package/dist/src/utils/debug.d.ts +11 -3
- package/dist/src/utils/debug.js +25 -6
- package/dist/src/utils/debug.js.map +1 -1
- package/dist/src/utils/oauth.js +1 -0
- package/dist/src/utils/oauth.js.map +1 -1
- package/dist/src/utils/types.d.ts +11 -0
- package/dist/src/utils/types.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Benchmark configuration loader.
|
|
3
|
+
*
|
|
4
|
+
* Loads .benchmark-config.json from the working directory with sensible defaults.
|
|
5
|
+
* All fields are optional — missing fields fall back to defaults.
|
|
6
|
+
*/
|
|
7
|
+
export interface BenchmarkConfig {
|
|
8
|
+
/** Enable/disable individual metric plugins */
|
|
9
|
+
plugins: Record<string, boolean>;
|
|
10
|
+
output: {
|
|
11
|
+
/** Path for the benchmark JSON output file */
|
|
12
|
+
benchmarkPath: string;
|
|
13
|
+
/** Whether to write the benchmark JSON file */
|
|
14
|
+
benchmarkEnabled: boolean;
|
|
15
|
+
/** Path for the main wizard debug log file */
|
|
16
|
+
logPath: string;
|
|
17
|
+
/** Whether to write the main wizard debug log */
|
|
18
|
+
logEnabled: boolean;
|
|
19
|
+
/** Suppress benchmark console output (disables the summary plugin) */
|
|
20
|
+
suppressWizardLogs: boolean;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export declare function loadBenchmarkConfig(installDir: string): BenchmarkConfig;
|
|
24
|
+
export declare function getDefaultConfig(): BenchmarkConfig;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Benchmark configuration loader.
|
|
4
|
+
*
|
|
5
|
+
* Loads .benchmark-config.json from the working directory with sensible defaults.
|
|
6
|
+
* All fields are optional — missing fields fall back to defaults.
|
|
7
|
+
*/
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.loadBenchmarkConfig = loadBenchmarkConfig;
|
|
13
|
+
exports.getDefaultConfig = getDefaultConfig;
|
|
14
|
+
const fs_1 = __importDefault(require("fs"));
|
|
15
|
+
const path_1 = __importDefault(require("path"));
|
|
16
|
+
const debug_1 = require("../../utils/debug");
|
|
17
|
+
const agent_interface_1 = require("../agent-interface");
|
|
18
|
+
const DEFAULT_CONFIG = {
|
|
19
|
+
plugins: {
|
|
20
|
+
tokens: true,
|
|
21
|
+
cache: true,
|
|
22
|
+
turns: true,
|
|
23
|
+
compactions: true,
|
|
24
|
+
contextSize: true,
|
|
25
|
+
cost: true,
|
|
26
|
+
duration: true,
|
|
27
|
+
summary: true,
|
|
28
|
+
jsonWriter: true,
|
|
29
|
+
},
|
|
30
|
+
output: {
|
|
31
|
+
benchmarkPath: '/tmp/posthog-wizard-benchmark.json',
|
|
32
|
+
benchmarkEnabled: true,
|
|
33
|
+
logPath: '/tmp/posthog-wizard.log',
|
|
34
|
+
logEnabled: true,
|
|
35
|
+
suppressWizardLogs: false,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
function loadBenchmarkConfig(installDir) {
|
|
39
|
+
const configPath = process.env.POSTHOG_WIZARD_BENCHMARK_CONFIG ??
|
|
40
|
+
path_1.default.join(installDir, '.benchmark-config.json');
|
|
41
|
+
try {
|
|
42
|
+
const raw = fs_1.default.readFileSync(configPath, 'utf-8');
|
|
43
|
+
const parsed = JSON.parse(raw);
|
|
44
|
+
const config = {
|
|
45
|
+
plugins: { ...DEFAULT_CONFIG.plugins, ...parsed.plugins },
|
|
46
|
+
output: { ...DEFAULT_CONFIG.output, ...parsed.output },
|
|
47
|
+
};
|
|
48
|
+
// Env var overrides for parallel runs
|
|
49
|
+
if (process.env.POSTHOG_WIZARD_BENCHMARK_FILE) {
|
|
50
|
+
config.output.benchmarkPath = process.env.POSTHOG_WIZARD_BENCHMARK_FILE;
|
|
51
|
+
}
|
|
52
|
+
if (process.env.POSTHOG_WIZARD_LOG_FILE) {
|
|
53
|
+
config.output.logPath = process.env.POSTHOG_WIZARD_LOG_FILE;
|
|
54
|
+
}
|
|
55
|
+
// If benchmark output is disabled, disable the jsonWriter plugin
|
|
56
|
+
if (!config.output.benchmarkEnabled) {
|
|
57
|
+
config.plugins.jsonWriter = false;
|
|
58
|
+
}
|
|
59
|
+
(0, debug_1.logToFile)(`${agent_interface_1.AgentSignals.BENCHMARK} Loaded config from ${configPath}`);
|
|
60
|
+
return config;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// No config file or invalid JSON — use defaults
|
|
64
|
+
const config = structuredClone(DEFAULT_CONFIG);
|
|
65
|
+
// Env var overrides
|
|
66
|
+
if (process.env.POSTHOG_WIZARD_BENCHMARK_FILE) {
|
|
67
|
+
config.output.benchmarkPath = process.env.POSTHOG_WIZARD_BENCHMARK_FILE;
|
|
68
|
+
}
|
|
69
|
+
if (process.env.POSTHOG_WIZARD_LOG_FILE) {
|
|
70
|
+
config.output.logPath = process.env.POSTHOG_WIZARD_LOG_FILE;
|
|
71
|
+
}
|
|
72
|
+
return config;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function getDefaultConfig() {
|
|
76
|
+
return structuredClone(DEFAULT_CONFIG);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/lib/middleware/config.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;AA6CH,kDAyCC;AAED,4CAEC;AAxFD,4CAAoB;AACpB,gDAAwB;AACxB,6CAA8C;AAC9C,wDAAkD;AAmBlD,MAAM,cAAc,GAAoB;IACtC,OAAO,EAAE;QACP,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,IAAI;QACjB,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;KACjB;IACD,MAAM,EAAE;QACN,aAAa,EAAE,oCAAoC;QACnD,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,yBAAyB;QAClC,UAAU,EAAE,IAAI;QAChB,kBAAkB,EAAE,KAAK;KAC1B;CACF,CAAC;AAEF,SAAgB,mBAAmB,CAAC,UAAkB;IACpD,MAAM,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,+BAA+B;QAC3C,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,wBAAwB,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAoB;YAC9B,OAAO,EAAE,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE;YACzD,MAAM,EAAE,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE;SACvD,CAAC;QAEF,sCAAsC;QACtC,IAAI,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;QAC1E,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;QAC9D,CAAC;QAED,iEAAiE;QACjE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC;QACpC,CAAC;QAED,IAAA,iBAAS,EAAC,GAAG,8BAAY,CAAC,SAAS,uBAAuB,UAAU,EAAE,CAAC,CAAC;QACxE,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;QAChD,MAAM,MAAM,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;QAE/C,oBAAoB;QACpB,IAAI,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;QAC1E,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;QAC9D,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB;IAC9B,OAAO,eAAe,CAAC,cAAc,CAAC,CAAC;AACzC,CAAC","sourcesContent":["/**\n * Benchmark configuration loader.\n *\n * Loads .benchmark-config.json from the working directory with sensible defaults.\n * All fields are optional — missing fields fall back to defaults.\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { logToFile } from '../../utils/debug';\nimport { AgentSignals } from '../agent-interface';\n\nexport interface BenchmarkConfig {\n /** Enable/disable individual metric plugins */\n plugins: Record<string, boolean>;\n output: {\n /** Path for the benchmark JSON output file */\n benchmarkPath: string;\n /** Whether to write the benchmark JSON file */\n benchmarkEnabled: boolean;\n /** Path for the main wizard debug log file */\n logPath: string;\n /** Whether to write the main wizard debug log */\n logEnabled: boolean;\n /** Suppress benchmark console output (disables the summary plugin) */\n suppressWizardLogs: boolean;\n };\n}\n\nconst DEFAULT_CONFIG: BenchmarkConfig = {\n plugins: {\n tokens: true,\n cache: true,\n turns: true,\n compactions: true,\n contextSize: true,\n cost: true,\n duration: true,\n summary: true,\n jsonWriter: true,\n },\n output: {\n benchmarkPath: '/tmp/posthog-wizard-benchmark.json',\n benchmarkEnabled: true,\n logPath: '/tmp/posthog-wizard.log',\n logEnabled: true,\n suppressWizardLogs: false,\n },\n};\n\nexport function loadBenchmarkConfig(installDir: string): BenchmarkConfig {\n const configPath =\n process.env.POSTHOG_WIZARD_BENCHMARK_CONFIG ??\n path.join(installDir, '.benchmark-config.json');\n try {\n const raw = fs.readFileSync(configPath, 'utf-8');\n const parsed = JSON.parse(raw);\n const config: BenchmarkConfig = {\n plugins: { ...DEFAULT_CONFIG.plugins, ...parsed.plugins },\n output: { ...DEFAULT_CONFIG.output, ...parsed.output },\n };\n\n // Env var overrides for parallel runs\n if (process.env.POSTHOG_WIZARD_BENCHMARK_FILE) {\n config.output.benchmarkPath = process.env.POSTHOG_WIZARD_BENCHMARK_FILE;\n }\n if (process.env.POSTHOG_WIZARD_LOG_FILE) {\n config.output.logPath = process.env.POSTHOG_WIZARD_LOG_FILE;\n }\n\n // If benchmark output is disabled, disable the jsonWriter plugin\n if (!config.output.benchmarkEnabled) {\n config.plugins.jsonWriter = false;\n }\n\n logToFile(`${AgentSignals.BENCHMARK} Loaded config from ${configPath}`);\n return config;\n } catch {\n // No config file or invalid JSON — use defaults\n const config = structuredClone(DEFAULT_CONFIG);\n\n // Env var overrides\n if (process.env.POSTHOG_WIZARD_BENCHMARK_FILE) {\n config.output.benchmarkPath = process.env.POSTHOG_WIZARD_BENCHMARK_FILE;\n }\n if (process.env.POSTHOG_WIZARD_LOG_FILE) {\n config.output.logPath = process.env.POSTHOG_WIZARD_LOG_FILE;\n }\n\n return config;\n }\n}\n\nexport function getDefaultConfig(): BenchmarkConfig {\n return structuredClone(DEFAULT_CONFIG);\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middleware system for wizard agent runs.
|
|
3
|
+
*/
|
|
4
|
+
export { MiddlewarePipeline } from './pipeline';
|
|
5
|
+
export { PhaseDetector } from './phase-detector';
|
|
6
|
+
export type { Middleware, MiddlewareContext, MiddlewareStore } from './types';
|
|
7
|
+
export { loadBenchmarkConfig, getDefaultConfig } from './config';
|
|
8
|
+
export type { BenchmarkConfig } from './config';
|
|
9
|
+
export { createBenchmarkPipeline } from './benchmark';
|
|
10
|
+
export type { BenchmarkData, StepUsage } from './benchmark';
|
|
11
|
+
export { createPluginsFromConfig } from './benchmarks';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Middleware system for wizard agent runs.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createPluginsFromConfig = exports.createBenchmarkPipeline = exports.getDefaultConfig = exports.loadBenchmarkConfig = exports.PhaseDetector = exports.MiddlewarePipeline = void 0;
|
|
7
|
+
var pipeline_1 = require("./pipeline");
|
|
8
|
+
Object.defineProperty(exports, "MiddlewarePipeline", { enumerable: true, get: function () { return pipeline_1.MiddlewarePipeline; } });
|
|
9
|
+
var phase_detector_1 = require("./phase-detector");
|
|
10
|
+
Object.defineProperty(exports, "PhaseDetector", { enumerable: true, get: function () { return phase_detector_1.PhaseDetector; } });
|
|
11
|
+
var config_1 = require("./config");
|
|
12
|
+
Object.defineProperty(exports, "loadBenchmarkConfig", { enumerable: true, get: function () { return config_1.loadBenchmarkConfig; } });
|
|
13
|
+
Object.defineProperty(exports, "getDefaultConfig", { enumerable: true, get: function () { return config_1.getDefaultConfig; } });
|
|
14
|
+
var benchmark_1 = require("./benchmark");
|
|
15
|
+
Object.defineProperty(exports, "createBenchmarkPipeline", { enumerable: true, get: function () { return benchmark_1.createBenchmarkPipeline; } });
|
|
16
|
+
var benchmarks_1 = require("./benchmarks");
|
|
17
|
+
Object.defineProperty(exports, "createPluginsFromConfig", { enumerable: true, get: function () { return benchmarks_1.createPluginsFromConfig; } });
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/middleware/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,uCAAgD;AAAvC,8GAAA,kBAAkB,OAAA;AAC3B,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAGtB,mCAAiE;AAAxD,6GAAA,mBAAmB,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAG9C,yCAAsD;AAA7C,oHAAA,uBAAuB,OAAA;AAGhC,2CAAuD;AAA9C,qHAAA,uBAAuB,OAAA","sourcesContent":["/**\n * Middleware system for wizard agent runs.\n */\n\nexport { MiddlewarePipeline } from './pipeline';\nexport { PhaseDetector } from './phase-detector';\nexport type { Middleware, MiddlewareContext, MiddlewareStore } from './types';\n\nexport { loadBenchmarkConfig, getDefaultConfig } from './config';\nexport type { BenchmarkConfig } from './config';\n\nexport { createBenchmarkPipeline } from './benchmark';\nexport type { BenchmarkData, StepUsage } from './benchmark';\n\nexport { createPluginsFromConfig } from './benchmarks';\n"]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Phase transitions from [STATUS] in assistant text. Keep in sync with workflow "Status to report" bullets. */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PhaseDetector = void 0;
|
|
5
|
+
const PHASES_ORDER = [
|
|
6
|
+
'1.0-begin',
|
|
7
|
+
'1.1-edit',
|
|
8
|
+
'1.2-revise',
|
|
9
|
+
'1.3-conclude',
|
|
10
|
+
];
|
|
11
|
+
const STATUS_PHRASES_BY_PHASE = {
|
|
12
|
+
'1.0-begin': [
|
|
13
|
+
'Checking project structure',
|
|
14
|
+
'Verifying PostHog dependencies',
|
|
15
|
+
'Generating events based on project',
|
|
16
|
+
],
|
|
17
|
+
'1.1-edit': ['Inserting PostHog capture code'],
|
|
18
|
+
'1.2-revise': [
|
|
19
|
+
'Finding and correcting errors',
|
|
20
|
+
'Report details of any errors you fix',
|
|
21
|
+
'Linting, building and prettying',
|
|
22
|
+
],
|
|
23
|
+
'1.3-conclude': ['Configured dashboard', 'Created setup report'],
|
|
24
|
+
};
|
|
25
|
+
class PhaseDetector {
|
|
26
|
+
currentPhase = 'setup';
|
|
27
|
+
detect(message) {
|
|
28
|
+
if (message.type !== 'assistant')
|
|
29
|
+
return null;
|
|
30
|
+
const nextPhase = this.getNextPhase();
|
|
31
|
+
if (nextPhase === null)
|
|
32
|
+
return null;
|
|
33
|
+
const content = message.message?.content;
|
|
34
|
+
if (!Array.isArray(content))
|
|
35
|
+
return null;
|
|
36
|
+
for (const block of content) {
|
|
37
|
+
if (block.type !== 'text' || typeof block.text !== 'string')
|
|
38
|
+
continue;
|
|
39
|
+
if (!block.text.includes('[STATUS]'))
|
|
40
|
+
continue;
|
|
41
|
+
const phrases = STATUS_PHRASES_BY_PHASE[nextPhase];
|
|
42
|
+
for (const phrase of phrases) {
|
|
43
|
+
if (block.text.includes(phrase)) {
|
|
44
|
+
this.currentPhase = nextPhase;
|
|
45
|
+
return nextPhase;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
getNextPhase() {
|
|
52
|
+
if (this.currentPhase === 'setup')
|
|
53
|
+
return '1.0-begin';
|
|
54
|
+
const i = PHASES_ORDER.indexOf(this.currentPhase);
|
|
55
|
+
if (i < 0 || i >= PHASES_ORDER.length - 1)
|
|
56
|
+
return null;
|
|
57
|
+
return PHASES_ORDER[i + 1];
|
|
58
|
+
}
|
|
59
|
+
reset() {
|
|
60
|
+
this.currentPhase = 'setup';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.PhaseDetector = PhaseDetector;
|
|
64
|
+
//# sourceMappingURL=phase-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase-detector.js","sourceRoot":"","sources":["../../../../src/lib/middleware/phase-detector.ts"],"names":[],"mappings":";AAAA,gHAAgH;;;AAEhH,MAAM,YAAY,GAAG;IACnB,WAAW;IACX,UAAU;IACV,YAAY;IACZ,cAAc;CACN,CAAC;AAEX,MAAM,uBAAuB,GAC3B;IACE,WAAW,EAAE;QACX,4BAA4B;QAC5B,gCAAgC;QAChC,oCAAoC;KACrC;IACD,UAAU,EAAE,CAAC,gCAAgC,CAAC;IAC9C,YAAY,EAAE;QACZ,+BAA+B;QAC/B,sCAAsC;QACtC,iCAAiC;KAClC;IACD,cAAc,EAAE,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;CACjE,CAAC;AAEJ,MAAa,aAAa;IAChB,YAAY,GAA4C,OAAO,CAAC;IAExE,MAAM,CAAC,OAAY;QACjB,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAE9C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACtC,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAEpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAEzC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACtE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,SAAS;YAE/C,MAAM,OAAO,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;YACnD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAChC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;oBAC9B,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO;YAAE,OAAO,WAAW,CAAC;QACtD,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACvD,OAAO,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;IAC9B,CAAC;CACF;AAtCD,sCAsCC","sourcesContent":["/** Phase transitions from [STATUS] in assistant text. Keep in sync with workflow \"Status to report\" bullets. */\n\nconst PHASES_ORDER = [\n '1.0-begin',\n '1.1-edit',\n '1.2-revise',\n '1.3-conclude',\n] as const;\n\nconst STATUS_PHRASES_BY_PHASE: Record<(typeof PHASES_ORDER)[number], string[]> =\n {\n '1.0-begin': [\n 'Checking project structure',\n 'Verifying PostHog dependencies',\n 'Generating events based on project',\n ],\n '1.1-edit': ['Inserting PostHog capture code'],\n '1.2-revise': [\n 'Finding and correcting errors',\n 'Report details of any errors you fix',\n 'Linting, building and prettying',\n ],\n '1.3-conclude': ['Configured dashboard', 'Created setup report'],\n };\n\nexport class PhaseDetector {\n private currentPhase: 'setup' | (typeof PHASES_ORDER)[number] = 'setup';\n\n detect(message: any): string | null {\n if (message.type !== 'assistant') return null;\n\n const nextPhase = this.getNextPhase();\n if (nextPhase === null) return null;\n\n const content = message.message?.content;\n if (!Array.isArray(content)) return null;\n\n for (const block of content) {\n if (block.type !== 'text' || typeof block.text !== 'string') continue;\n if (!block.text.includes('[STATUS]')) continue;\n\n const phrases = STATUS_PHRASES_BY_PHASE[nextPhase];\n for (const phrase of phrases) {\n if (block.text.includes(phrase)) {\n this.currentPhase = nextPhase;\n return nextPhase;\n }\n }\n }\n\n return null;\n }\n\n private getNextPhase(): (typeof PHASES_ORDER)[number] | null {\n if (this.currentPhase === 'setup') return '1.0-begin';\n const i = PHASES_ORDER.indexOf(this.currentPhase);\n if (i < 0 || i >= PHASES_ORDER.length - 1) return null;\n return PHASES_ORDER[i + 1];\n }\n\n reset(): void {\n this.currentPhase = 'setup';\n }\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middleware pipeline orchestrator.
|
|
3
|
+
*
|
|
4
|
+
* Implements the same { onMessage, finalize } interface that runAgent() expects,
|
|
5
|
+
* while internally dispatching to an ordered list of middleware plugins.
|
|
6
|
+
*/
|
|
7
|
+
import { PhaseDetector } from './phase-detector';
|
|
8
|
+
import type { Middleware, SDKMessage } from './types';
|
|
9
|
+
export declare class MiddlewarePipeline {
|
|
10
|
+
private middlewares;
|
|
11
|
+
private store;
|
|
12
|
+
private phaseDetector;
|
|
13
|
+
private autoDetectPhases;
|
|
14
|
+
private _currentPhase;
|
|
15
|
+
private _currentPhaseFreshContext;
|
|
16
|
+
constructor(middlewares: Middleware[], opts?: {
|
|
17
|
+
phaseDetector?: PhaseDetector;
|
|
18
|
+
autoDetectPhases?: boolean;
|
|
19
|
+
});
|
|
20
|
+
/** Feed an SDK message through all middleware (satisfies tracker.onMessage) */
|
|
21
|
+
onMessage(message: SDKMessage): void;
|
|
22
|
+
/** Finalize the run (satisfies tracker.finalize) */
|
|
23
|
+
finalize(resultMessage: any, totalDurationMs: number): any;
|
|
24
|
+
/** Explicit phase start (for phased runner support) */
|
|
25
|
+
startPhase(name: string, freshContext: boolean): void;
|
|
26
|
+
private transitionPhase;
|
|
27
|
+
private createContext;
|
|
28
|
+
private createStore;
|
|
29
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Middleware pipeline orchestrator.
|
|
4
|
+
*
|
|
5
|
+
* Implements the same { onMessage, finalize } interface that runAgent() expects,
|
|
6
|
+
* while internally dispatching to an ordered list of middleware plugins.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MiddlewarePipeline = void 0;
|
|
10
|
+
const phase_detector_1 = require("./phase-detector");
|
|
11
|
+
class MiddlewarePipeline {
|
|
12
|
+
middlewares;
|
|
13
|
+
store = new Map();
|
|
14
|
+
phaseDetector;
|
|
15
|
+
autoDetectPhases;
|
|
16
|
+
_currentPhase = 'setup';
|
|
17
|
+
_currentPhaseFreshContext = true;
|
|
18
|
+
constructor(middlewares, opts) {
|
|
19
|
+
this.middlewares = middlewares;
|
|
20
|
+
this.phaseDetector = opts?.phaseDetector ?? new phase_detector_1.PhaseDetector();
|
|
21
|
+
this.autoDetectPhases = opts?.autoDetectPhases ?? true;
|
|
22
|
+
const ctx = this.createContext();
|
|
23
|
+
for (const mw of this.middlewares) {
|
|
24
|
+
mw.onInit?.(ctx);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Feed an SDK message through all middleware (satisfies tracker.onMessage) */
|
|
28
|
+
onMessage(message) {
|
|
29
|
+
// Phase detection first — updates context before middleware sees it
|
|
30
|
+
if (this.autoDetectPhases) {
|
|
31
|
+
const newPhase = this.phaseDetector.detect(message);
|
|
32
|
+
if (newPhase && newPhase !== this._currentPhase) {
|
|
33
|
+
this.transitionPhase(newPhase, false);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const ctx = this.createContext();
|
|
37
|
+
const storeHandle = this.createStore();
|
|
38
|
+
for (const mw of this.middlewares) {
|
|
39
|
+
mw.onMessage?.(message, ctx, storeHandle);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Finalize the run (satisfies tracker.finalize) */
|
|
43
|
+
finalize(resultMessage, totalDurationMs) {
|
|
44
|
+
const ctx = this.createContext();
|
|
45
|
+
const storeHandle = this.createStore();
|
|
46
|
+
let result;
|
|
47
|
+
for (const mw of this.middlewares) {
|
|
48
|
+
const r = mw.onFinalize?.(resultMessage, totalDurationMs, ctx, storeHandle);
|
|
49
|
+
if (r !== undefined)
|
|
50
|
+
result = r;
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
/** Explicit phase start (for phased runner support) */
|
|
55
|
+
startPhase(name, freshContext) {
|
|
56
|
+
this.transitionPhase(name, freshContext);
|
|
57
|
+
}
|
|
58
|
+
transitionPhase(newPhase, freshContext) {
|
|
59
|
+
const oldPhase = this._currentPhase;
|
|
60
|
+
this._currentPhase = newPhase;
|
|
61
|
+
this._currentPhaseFreshContext = freshContext;
|
|
62
|
+
const ctx = this.createContext();
|
|
63
|
+
const storeHandle = this.createStore();
|
|
64
|
+
for (const mw of this.middlewares) {
|
|
65
|
+
mw.onPhaseTransition?.(oldPhase, newPhase, ctx, storeHandle);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
createContext() {
|
|
69
|
+
return {
|
|
70
|
+
currentPhase: this._currentPhase,
|
|
71
|
+
currentPhaseFreshContext: this._currentPhaseFreshContext,
|
|
72
|
+
get: (key) => this.store.get(key),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
createStore() {
|
|
76
|
+
return {
|
|
77
|
+
set: (key, value) => this.store.set(key, value),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.MiddlewarePipeline = MiddlewarePipeline;
|
|
82
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../../src/lib/middleware/pipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Middleware pipeline orchestrator.\n *\n * Implements the same { onMessage, finalize } interface that runAgent() expects,\n * while internally dispatching to an ordered list of middleware plugins.\n */\n\nimport { PhaseDetector } from './phase-detector';\nimport type {\n Middleware,\n MiddlewareContext,\n MiddlewareStore,\n SDKMessage,\n} from './types';\n\nexport class MiddlewarePipeline {\n private middlewares: Middleware[];\n private store = new Map<string, unknown>();\n private phaseDetector: PhaseDetector;\n private autoDetectPhases: boolean;\n private _currentPhase = 'setup';\n private _currentPhaseFreshContext = true;\n\n constructor(\n middlewares: Middleware[],\n opts?: { phaseDetector?: PhaseDetector; autoDetectPhases?: boolean },\n ) {\n this.middlewares = middlewares;\n this.phaseDetector = opts?.phaseDetector ?? new PhaseDetector();\n this.autoDetectPhases = opts?.autoDetectPhases ?? true;\n\n const ctx = this.createContext();\n for (const mw of this.middlewares) {\n mw.onInit?.(ctx);\n }\n }\n\n /** Feed an SDK message through all middleware (satisfies tracker.onMessage) */\n onMessage(message: SDKMessage): void {\n // Phase detection first — updates context before middleware sees it\n if (this.autoDetectPhases) {\n const newPhase = this.phaseDetector.detect(message);\n if (newPhase && newPhase !== this._currentPhase) {\n this.transitionPhase(newPhase, false);\n }\n }\n\n const ctx = this.createContext();\n const storeHandle = this.createStore();\n for (const mw of this.middlewares) {\n mw.onMessage?.(message, ctx, storeHandle);\n }\n }\n\n /** Finalize the run (satisfies tracker.finalize) */\n finalize(resultMessage: any, totalDurationMs: number): any {\n const ctx = this.createContext();\n const storeHandle = this.createStore();\n let result: any;\n for (const mw of this.middlewares) {\n const r = mw.onFinalize?.(\n resultMessage,\n totalDurationMs,\n ctx,\n storeHandle,\n );\n if (r !== undefined) result = r;\n }\n return result;\n }\n\n /** Explicit phase start (for phased runner support) */\n startPhase(name: string, freshContext: boolean): void {\n this.transitionPhase(name, freshContext);\n }\n\n private transitionPhase(newPhase: string, freshContext: boolean): void {\n const oldPhase = this._currentPhase;\n this._currentPhase = newPhase;\n this._currentPhaseFreshContext = freshContext;\n const ctx = this.createContext();\n const storeHandle = this.createStore();\n for (const mw of this.middlewares) {\n mw.onPhaseTransition?.(oldPhase, newPhase, ctx, storeHandle);\n }\n }\n\n private createContext(): MiddlewareContext {\n return {\n currentPhase: this._currentPhase,\n currentPhaseFreshContext: this._currentPhaseFreshContext,\n get: <T>(key: string) => this.store.get(key) as T | undefined,\n };\n }\n\n private createStore(): MiddlewareStore {\n return {\n set: (key: string, value: unknown) => this.store.set(key, value),\n };\n }\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middleware system types for wizard agent runs.
|
|
3
|
+
*
|
|
4
|
+
* Middleware receives lifecycle events (messages, phase transitions, finalize)
|
|
5
|
+
* and can publish data to a shared store for downstream middleware to read.
|
|
6
|
+
*/
|
|
7
|
+
import type clack from '../../utils/clack';
|
|
8
|
+
export type SDKMessage = any;
|
|
9
|
+
/** Read-only shared state available to all middleware */
|
|
10
|
+
export interface MiddlewareContext {
|
|
11
|
+
/** Current detected phase name */
|
|
12
|
+
readonly currentPhase: string;
|
|
13
|
+
/** Whether the current phase started with fresh context (new query) */
|
|
14
|
+
readonly currentPhaseFreshContext: boolean;
|
|
15
|
+
/** Read a value from the shared store (published by upstream middleware) */
|
|
16
|
+
get<T>(key: string): T | undefined;
|
|
17
|
+
}
|
|
18
|
+
/** Write handle for middleware to publish data to the shared store */
|
|
19
|
+
export interface MiddlewareStore {
|
|
20
|
+
set(key: string, value: unknown): void;
|
|
21
|
+
}
|
|
22
|
+
/** Lifecycle hooks a middleware can implement */
|
|
23
|
+
export interface Middleware {
|
|
24
|
+
/** Unique name for this middleware (used in config and store keys) */
|
|
25
|
+
readonly name: string;
|
|
26
|
+
/** Called once when the pipeline initializes */
|
|
27
|
+
onInit?(ctx: MiddlewareContext): void;
|
|
28
|
+
/** Called for every SDK message */
|
|
29
|
+
onMessage?(message: SDKMessage, ctx: MiddlewareContext, store: MiddlewareStore): void;
|
|
30
|
+
/** Called when a phase transition is detected */
|
|
31
|
+
onPhaseTransition?(fromPhase: string, toPhase: string, ctx: MiddlewareContext, store: MiddlewareStore): void;
|
|
32
|
+
/** Called at the end of the agent run. Return value from last middleware is used. */
|
|
33
|
+
onFinalize?(resultMessage: any, totalDurationMs: number, ctx: MiddlewareContext, store: MiddlewareStore): any;
|
|
34
|
+
}
|
|
35
|
+
/** Options bag passed to middleware factories during construction */
|
|
36
|
+
export interface MiddlewareFactoryOptions {
|
|
37
|
+
spinner?: ReturnType<typeof clack.spinner>;
|
|
38
|
+
outputPath?: string;
|
|
39
|
+
phased?: boolean;
|
|
40
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Middleware system types for wizard agent runs.
|
|
4
|
+
*
|
|
5
|
+
* Middleware receives lifecycle events (messages, phase transitions, finalize)
|
|
6
|
+
* and can publish data to a shared store for downstream middleware to read.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/lib/middleware/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG","sourcesContent":["/**\n * Middleware system types for wizard agent runs.\n *\n * Middleware receives lifecycle events (messages, phase transitions, finalize)\n * and can publish data to a shared store for downstream middleware to read.\n */\n\nimport type clack from '../../utils/clack';\n\nexport type SDKMessage = any;\n\n/** Read-only shared state available to all middleware */\nexport interface MiddlewareContext {\n /** Current detected phase name */\n readonly currentPhase: string;\n /** Whether the current phase started with fresh context (new query) */\n readonly currentPhaseFreshContext: boolean;\n /** Read a value from the shared store (published by upstream middleware) */\n get<T>(key: string): T | undefined;\n}\n\n/** Write handle for middleware to publish data to the shared store */\nexport interface MiddlewareStore {\n set(key: string, value: unknown): void;\n}\n\n/** Lifecycle hooks a middleware can implement */\nexport interface Middleware {\n /** Unique name for this middleware (used in config and store keys) */\n readonly name: string;\n /** Called once when the pipeline initializes */\n onInit?(ctx: MiddlewareContext): void;\n /** Called for every SDK message */\n onMessage?(\n message: SDKMessage,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void;\n /** Called when a phase transition is detected */\n onPhaseTransition?(\n fromPhase: string,\n toPhase: string,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void;\n /** Called at the end of the agent run. Return value from last middleware is used. */\n onFinalize?(\n resultMessage: any,\n totalDurationMs: number,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): any;\n}\n\n/** Options bag passed to middleware factories during construction */\nexport interface MiddlewareFactoryOptions {\n spinner?: ReturnType<typeof clack.spinner>;\n outputPath?: string;\n phased?: boolean;\n}\n"]}
|
|
@@ -33,4 +33,5 @@ export declare function detectNodePackageManagers(installDir: string): Promise<P
|
|
|
33
33
|
export declare function detectPythonPackageManagers(installDir: string): Promise<PackageManagerInfo>;
|
|
34
34
|
export declare function composerPackageManager(): Promise<PackageManagerInfo>;
|
|
35
35
|
export declare function swiftPackageManager(): Promise<PackageManagerInfo>;
|
|
36
|
+
export declare function bundlerPackageManager(): Promise<PackageManagerInfo>;
|
|
36
37
|
export declare function gradlePackageManager(): Promise<PackageManagerInfo>;
|
|
@@ -12,6 +12,7 @@ exports.detectNodePackageManagers = detectNodePackageManagers;
|
|
|
12
12
|
exports.detectPythonPackageManagers = detectPythonPackageManagers;
|
|
13
13
|
exports.composerPackageManager = composerPackageManager;
|
|
14
14
|
exports.swiftPackageManager = swiftPackageManager;
|
|
15
|
+
exports.bundlerPackageManager = bundlerPackageManager;
|
|
15
16
|
exports.gradlePackageManager = gradlePackageManager;
|
|
16
17
|
const package_manager_1 = require("../utils/package-manager");
|
|
17
18
|
const utils_1 = require("../python/utils");
|
|
@@ -149,6 +150,22 @@ function swiftPackageManager() {
|
|
|
149
150
|
});
|
|
150
151
|
}
|
|
151
152
|
// ---------------------------------------------------------------------------
|
|
153
|
+
// Ruby (Bundler) helper
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
const BUNDLER = {
|
|
156
|
+
name: 'bundler',
|
|
157
|
+
label: 'Bundler',
|
|
158
|
+
installCommand: 'bundle add',
|
|
159
|
+
runCommand: 'bundle exec',
|
|
160
|
+
};
|
|
161
|
+
function bundlerPackageManager() {
|
|
162
|
+
return Promise.resolve({
|
|
163
|
+
detected: [BUNDLER],
|
|
164
|
+
primary: BUNDLER,
|
|
165
|
+
recommendation: 'Use Bundler (bundle add). Run commands with bundle exec.',
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
152
169
|
// Android (Gradle) helper
|
|
153
170
|
// ---------------------------------------------------------------------------
|
|
154
171
|
const GRADLE = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager-detection.js","sourceRoot":"","sources":["../../../src/lib/package-manager-detection.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cross-ecosystem package manager detection.\n *\n * Provides a common interface (PackageManagerDetector) that each FrameworkConfig\n * implements, plus shared helpers for Node.js, Python, PHP, and Swift ecosystems.\n * The MCP tool in wizard-tools.ts delegates to whatever detector the\n * current framework supplies.\n */\n\nimport {\n detectAllPackageManagers,\n type PackageManager,\n} from '../utils/package-manager';\nimport {\n detectPackageManager as detectPythonPM,\n PythonPackageManager,\n} from '../python/utils';\n\n// ---------------------------------------------------------------------------\n// Common types\n// ---------------------------------------------------------------------------\n\n/** Structured package manager info the agent can act on */\nexport interface DetectedPackageManager {\n name: string;\n label: string;\n installCommand: string;\n runCommand?: string;\n}\n\n/** Result returned by every detector */\nexport interface PackageManagerInfo {\n detected: DetectedPackageManager[];\n primary: DetectedPackageManager | null;\n recommendation: string;\n}\n\n/** Signature each framework implements */\nexport type PackageManagerDetector = (\n installDir: string,\n) => Promise<PackageManagerInfo>;\n\n// ---------------------------------------------------------------------------\n// Node.js helper\n// ---------------------------------------------------------------------------\n\nfunction serializeNodePM(pm: PackageManager): DetectedPackageManager {\n return {\n name: pm.name,\n label: pm.label,\n installCommand: pm.installCommand,\n runCommand: pm.runScriptCommand,\n };\n}\n\n/**\n * Detect Node.js package managers via lockfiles.\n * Wraps the existing detectAllPackageManagers() from utils/package-manager.ts.\n */\nexport function detectNodePackageManagers(\n installDir: string,\n): Promise<PackageManagerInfo> {\n const detected = detectAllPackageManagers({ installDir }).map(\n serializeNodePM,\n );\n\n if (detected.length === 0) {\n return Promise.resolve({\n detected: [],\n primary: null,\n recommendation: 'No lockfile found. Default to npm (npm add, npm run).',\n });\n }\n\n const primary = detected[0];\n return Promise.resolve({\n detected,\n primary,\n recommendation:\n detected.length === 1\n ? `Use ${primary.label} (${primary.installCommand}).`\n : `Multiple package managers detected. Prefer ${primary.label} (${primary.installCommand}).`,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Python helper\n// ---------------------------------------------------------------------------\n\nconst PYTHON_PM_INFO: Record<PythonPackageManager, DetectedPackageManager> = {\n [PythonPackageManager.UV]: {\n name: 'uv',\n label: 'uv',\n installCommand: 'uv add',\n runCommand: 'uv run',\n },\n [PythonPackageManager.POETRY]: {\n name: 'poetry',\n label: 'Poetry',\n installCommand: 'poetry add',\n runCommand: 'poetry run',\n },\n [PythonPackageManager.PDM]: {\n name: 'pdm',\n label: 'PDM',\n installCommand: 'pdm add',\n runCommand: 'pdm run',\n },\n [PythonPackageManager.HATCH]: {\n name: 'hatch',\n label: 'Hatch',\n installCommand: 'hatch add',\n runCommand: 'hatch run',\n },\n [PythonPackageManager.RYE]: {\n name: 'rye',\n label: 'Rye',\n installCommand: 'rye add',\n runCommand: 'rye run',\n },\n [PythonPackageManager.PIPENV]: {\n name: 'pipenv',\n label: 'Pipenv',\n installCommand: 'pipenv install',\n runCommand: 'pipenv run',\n },\n [PythonPackageManager.CONDA]: {\n name: 'conda',\n label: 'Conda',\n installCommand: 'conda install',\n runCommand: 'conda run',\n },\n [PythonPackageManager.PIP]: {\n name: 'pip',\n label: 'pip',\n installCommand: 'pip install',\n },\n [PythonPackageManager.UNKNOWN]: {\n name: 'pip',\n label: 'pip (default)',\n installCommand: 'pip install',\n },\n};\n\n/**\n * Detect Python package managers via lockfiles and config files.\n * Wraps the existing detectPackageManager() from python/utils.ts.\n */\nexport async function detectPythonPackageManagers(\n installDir: string,\n): Promise<PackageManagerInfo> {\n const pm = await detectPythonPM({ installDir } as any);\n const info = PYTHON_PM_INFO[pm];\n\n return {\n detected: [info],\n primary: info,\n recommendation: `Use ${info.label} (${info.installCommand}).`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// PHP (Composer) helper\n// ---------------------------------------------------------------------------\n\nconst COMPOSER: DetectedPackageManager = {\n name: 'composer',\n label: 'Composer',\n installCommand: 'composer require',\n};\n\nexport function composerPackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [COMPOSER],\n primary: COMPOSER,\n recommendation: 'Use Composer (composer require).',\n });\n}\n\n// ---------------------------------------------------------------------------\n// Swift (SPM) helper\n// ---------------------------------------------------------------------------\n\nconst SPM: DetectedPackageManager = {\n name: 'spm',\n label: 'Swift Package Manager',\n installCommand: 'swift package add-dependency',\n};\n\nexport function swiftPackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [SPM],\n primary: SPM,\n recommendation:\n 'Use Swift Package Manager. Add the dependency to Package.swift or via Xcode.',\n });\n}\n\n// ---------------------------------------------------------------------------\n// Android (Gradle) helper\n// ---------------------------------------------------------------------------\n\nconst GRADLE: DetectedPackageManager = {\n name: 'gradle',\n label: 'Gradle',\n installCommand: 'implementation',\n};\n\nexport function gradlePackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [GRADLE],\n primary: GRADLE,\n recommendation:\n 'Add dependencies to build.gradle(.kts) using implementation().',\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"package-manager-detection.js","sourceRoot":"","sources":["../../../src/lib/package-manager-detection.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cross-ecosystem package manager detection.\n *\n * Provides a common interface (PackageManagerDetector) that each FrameworkConfig\n * implements, plus shared helpers for Node.js, Python, PHP, and Swift ecosystems.\n * The MCP tool in wizard-tools.ts delegates to whatever detector the\n * current framework supplies.\n */\n\nimport {\n detectAllPackageManagers,\n type PackageManager,\n} from '../utils/package-manager';\nimport {\n detectPackageManager as detectPythonPM,\n PythonPackageManager,\n} from '../python/utils';\n\n// ---------------------------------------------------------------------------\n// Common types\n// ---------------------------------------------------------------------------\n\n/** Structured package manager info the agent can act on */\nexport interface DetectedPackageManager {\n name: string;\n label: string;\n installCommand: string;\n runCommand?: string;\n}\n\n/** Result returned by every detector */\nexport interface PackageManagerInfo {\n detected: DetectedPackageManager[];\n primary: DetectedPackageManager | null;\n recommendation: string;\n}\n\n/** Signature each framework implements */\nexport type PackageManagerDetector = (\n installDir: string,\n) => Promise<PackageManagerInfo>;\n\n// ---------------------------------------------------------------------------\n// Node.js helper\n// ---------------------------------------------------------------------------\n\nfunction serializeNodePM(pm: PackageManager): DetectedPackageManager {\n return {\n name: pm.name,\n label: pm.label,\n installCommand: pm.installCommand,\n runCommand: pm.runScriptCommand,\n };\n}\n\n/**\n * Detect Node.js package managers via lockfiles.\n * Wraps the existing detectAllPackageManagers() from utils/package-manager.ts.\n */\nexport function detectNodePackageManagers(\n installDir: string,\n): Promise<PackageManagerInfo> {\n const detected = detectAllPackageManagers({ installDir }).map(\n serializeNodePM,\n );\n\n if (detected.length === 0) {\n return Promise.resolve({\n detected: [],\n primary: null,\n recommendation: 'No lockfile found. Default to npm (npm add, npm run).',\n });\n }\n\n const primary = detected[0];\n return Promise.resolve({\n detected,\n primary,\n recommendation:\n detected.length === 1\n ? `Use ${primary.label} (${primary.installCommand}).`\n : `Multiple package managers detected. Prefer ${primary.label} (${primary.installCommand}).`,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Python helper\n// ---------------------------------------------------------------------------\n\nconst PYTHON_PM_INFO: Record<PythonPackageManager, DetectedPackageManager> = {\n [PythonPackageManager.UV]: {\n name: 'uv',\n label: 'uv',\n installCommand: 'uv add',\n runCommand: 'uv run',\n },\n [PythonPackageManager.POETRY]: {\n name: 'poetry',\n label: 'Poetry',\n installCommand: 'poetry add',\n runCommand: 'poetry run',\n },\n [PythonPackageManager.PDM]: {\n name: 'pdm',\n label: 'PDM',\n installCommand: 'pdm add',\n runCommand: 'pdm run',\n },\n [PythonPackageManager.HATCH]: {\n name: 'hatch',\n label: 'Hatch',\n installCommand: 'hatch add',\n runCommand: 'hatch run',\n },\n [PythonPackageManager.RYE]: {\n name: 'rye',\n label: 'Rye',\n installCommand: 'rye add',\n runCommand: 'rye run',\n },\n [PythonPackageManager.PIPENV]: {\n name: 'pipenv',\n label: 'Pipenv',\n installCommand: 'pipenv install',\n runCommand: 'pipenv run',\n },\n [PythonPackageManager.CONDA]: {\n name: 'conda',\n label: 'Conda',\n installCommand: 'conda install',\n runCommand: 'conda run',\n },\n [PythonPackageManager.PIP]: {\n name: 'pip',\n label: 'pip',\n installCommand: 'pip install',\n },\n [PythonPackageManager.UNKNOWN]: {\n name: 'pip',\n label: 'pip (default)',\n installCommand: 'pip install',\n },\n};\n\n/**\n * Detect Python package managers via lockfiles and config files.\n * Wraps the existing detectPackageManager() from python/utils.ts.\n */\nexport async function detectPythonPackageManagers(\n installDir: string,\n): Promise<PackageManagerInfo> {\n const pm = await detectPythonPM({ installDir } as any);\n const info = PYTHON_PM_INFO[pm];\n\n return {\n detected: [info],\n primary: info,\n recommendation: `Use ${info.label} (${info.installCommand}).`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// PHP (Composer) helper\n// ---------------------------------------------------------------------------\n\nconst COMPOSER: DetectedPackageManager = {\n name: 'composer',\n label: 'Composer',\n installCommand: 'composer require',\n};\n\nexport function composerPackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [COMPOSER],\n primary: COMPOSER,\n recommendation: 'Use Composer (composer require).',\n });\n}\n\n// ---------------------------------------------------------------------------\n// Swift (SPM) helper\n// ---------------------------------------------------------------------------\n\nconst SPM: DetectedPackageManager = {\n name: 'spm',\n label: 'Swift Package Manager',\n installCommand: 'swift package add-dependency',\n};\n\nexport function swiftPackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [SPM],\n primary: SPM,\n recommendation:\n 'Use Swift Package Manager. Add the dependency to Package.swift or via Xcode.',\n });\n}\n\n// ---------------------------------------------------------------------------\n// Ruby (Bundler) helper\n// ---------------------------------------------------------------------------\n\nconst BUNDLER: DetectedPackageManager = {\n name: 'bundler',\n label: 'Bundler',\n installCommand: 'bundle add',\n runCommand: 'bundle exec',\n};\n\nexport function bundlerPackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [BUNDLER],\n primary: BUNDLER,\n recommendation: 'Use Bundler (bundle add). Run commands with bundle exec.',\n });\n}\n\n// ---------------------------------------------------------------------------\n// Android (Gradle) helper\n// ---------------------------------------------------------------------------\n\nconst GRADLE: DetectedPackageManager = {\n name: 'gradle',\n label: 'Gradle',\n installCommand: 'implementation',\n};\n\nexport function gradlePackageManager(): Promise<PackageManagerInfo> {\n return Promise.resolve({\n detected: [GRADLE],\n primary: GRADLE,\n recommendation:\n 'Add dependencies to build.gradle(.kts) using implementation().',\n });\n}\n"]}
|
package/dist/src/lib/registry.js
CHANGED
|
@@ -18,7 +18,11 @@ const laravel_wizard_agent_1 = require("../laravel/laravel-wizard-agent");
|
|
|
18
18
|
const svelte_wizard_agent_1 = require("../svelte/svelte-wizard-agent");
|
|
19
19
|
const swift_wizard_agent_1 = require("../swift/swift-wizard-agent");
|
|
20
20
|
const android_wizard_agent_1 = require("../android/android-wizard-agent");
|
|
21
|
+
const rails_wizard_agent_1 = require("../rails/rails-wizard-agent");
|
|
21
22
|
const python_wizard_agent_1 = require("../python/python-wizard-agent");
|
|
23
|
+
const ruby_wizard_agent_1 = require("../ruby/ruby-wizard-agent");
|
|
24
|
+
const javascript_node_wizard_agent_1 = require("../javascript-node/javascript-node-wizard-agent");
|
|
25
|
+
const javascript_web_wizard_agent_1 = require("../javascript-web/javascript-web-wizard-agent");
|
|
22
26
|
exports.FRAMEWORK_REGISTRY = {
|
|
23
27
|
[constants_1.Integration.nextjs]: nextjs_wizard_agent_1.NEXTJS_AGENT_CONFIG,
|
|
24
28
|
[constants_1.Integration.nuxt]: nuxt_wizard_agent_1.NUXT_AGENT_CONFIG,
|
|
@@ -36,6 +40,10 @@ exports.FRAMEWORK_REGISTRY = {
|
|
|
36
40
|
[constants_1.Integration.sveltekit]: svelte_wizard_agent_1.SVELTEKIT_AGENT_CONFIG,
|
|
37
41
|
[constants_1.Integration.swift]: swift_wizard_agent_1.SWIFT_AGENT_CONFIG,
|
|
38
42
|
[constants_1.Integration.android]: android_wizard_agent_1.ANDROID_AGENT_CONFIG,
|
|
43
|
+
[constants_1.Integration.rails]: rails_wizard_agent_1.RAILS_AGENT_CONFIG,
|
|
39
44
|
[constants_1.Integration.python]: python_wizard_agent_1.PYTHON_AGENT_CONFIG,
|
|
45
|
+
[constants_1.Integration.ruby]: ruby_wizard_agent_1.RUBY_AGENT_CONFIG,
|
|
46
|
+
[constants_1.Integration.javascriptNode]: javascript_node_wizard_agent_1.JAVASCRIPT_NODE_AGENT_CONFIG,
|
|
47
|
+
[constants_1.Integration.javascript_web]: javascript_web_wizard_agent_1.JAVASCRIPT_WEB_AGENT_CONFIG,
|
|
40
48
|
};
|
|
41
49
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/lib/registry.ts"],"names":[],"mappings":";;;AACA,2CAA0C;AAC1C,uEAAoE;AACpE,iEAA8D;AAC9D,8DAA2D;AAC3D,yFAAsF;AACtF,kGAA+F;AAC/F,+FAA4F;AAC5F,yFAAsF;AACtF,0EAAuE;AACvE,oEAAiE;AACjE,uEAAoE;AACpE,oEAAiE;AACjE,0EAAuE;AACvE,0EAAuE;AACvE,uEAAuE;AACvE,oEAAiE;AACjE,0EAAuE;AACvE,uEAAoE;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/lib/registry.ts"],"names":[],"mappings":";;;AACA,2CAA0C;AAC1C,uEAAoE;AACpE,iEAA8D;AAC9D,8DAA2D;AAC3D,yFAAsF;AACtF,kGAA+F;AAC/F,+FAA4F;AAC5F,yFAAsF;AACtF,0EAAuE;AACvE,oEAAiE;AACjE,uEAAoE;AACpE,oEAAiE;AACjE,0EAAuE;AACvE,0EAAuE;AACvE,uEAAuE;AACvE,oEAAiE;AACjE,0EAAuE;AACvE,oEAAiE;AACjE,uEAAoE;AACpE,iEAA8D;AAC9D,kGAA+F;AAC/F,+FAA4F;AAE/E,QAAA,kBAAkB,GAAyC;IACtE,CAAC,uBAAW,CAAC,MAAM,CAAC,EAAE,yCAAmB;IACzC,CAAC,uBAAW,CAAC,IAAI,CAAC,EAAE,qCAAiB;IACrC,CAAC,uBAAW,CAAC,GAAG,CAAC,EAAE,mCAAgB;IACnC,CAAC,uBAAW,CAAC,aAAa,CAAC,EAAE,yDAA2B;IACxD,CAAC,uBAAW,CAAC,WAAW,CAAC,EAAE,qDAAyB;IACpD,CAAC,uBAAW,CAAC,cAAc,CAAC,EAAE,2DAA4B;IAC1D,CAAC,uBAAW,CAAC,WAAW,CAAC,EAAE,qDAAyB;IACpD,CAAC,uBAAW,CAAC,OAAO,CAAC,EAAE,2CAAoB;IAC3C,CAAC,uBAAW,CAAC,KAAK,CAAC,EAAE,uCAAkB;IACvC,CAAC,uBAAW,CAAC,MAAM,CAAC,EAAE,yCAAmB;IACzC,CAAC,uBAAW,CAAC,KAAK,CAAC,EAAE,uCAAkB;IACvC,CAAC,uBAAW,CAAC,OAAO,CAAC,EAAE,2CAAoB;IAC3C,CAAC,uBAAW,CAAC,OAAO,CAAC,EAAE,2CAAoB;IAC3C,CAAC,uBAAW,CAAC,SAAS,CAAC,EAAE,4CAAsB;IAC/C,CAAC,uBAAW,CAAC,KAAK,CAAC,EAAE,uCAAkB;IACvC,CAAC,uBAAW,CAAC,OAAO,CAAC,EAAE,2CAAoB;IAC3C,CAAC,uBAAW,CAAC,KAAK,CAAC,EAAE,uCAAkB;IACvC,CAAC,uBAAW,CAAC,MAAM,CAAC,EAAE,yCAAmB;IACzC,CAAC,uBAAW,CAAC,IAAI,CAAC,EAAE,qCAAiB;IACrC,CAAC,uBAAW,CAAC,cAAc,CAAC,EAAE,2DAA4B;IAC1D,CAAC,uBAAW,CAAC,cAAc,CAAC,EAAE,yDAA2B;CAC1D,CAAC","sourcesContent":["import type { FrameworkConfig } from './framework-config';\nimport { Integration } from './constants';\nimport { NEXTJS_AGENT_CONFIG } from '../nextjs/nextjs-wizard-agent';\nimport { NUXT_AGENT_CONFIG } from '../nuxt/nuxt-wizard-agent';\nimport { VUE_AGENT_CONFIG } from '../vue/vue-wizard-agent';\nimport { REACT_ROUTER_AGENT_CONFIG } from '../react-router/react-router-wizard-agent';\nimport { TANSTACK_ROUTER_AGENT_CONFIG } from '../tanstack-router/tanstack-router-wizard-agent';\nimport { TANSTACK_START_AGENT_CONFIG } from '../tanstack-start/tanstack-start-wizard-agent';\nimport { REACT_NATIVE_AGENT_CONFIG } from '../react-native/react-native-wizard-agent';\nimport { ANGULAR_AGENT_CONFIG } from '../angular/angular-wizard-agent';\nimport { ASTRO_AGENT_CONFIG } from '../astro/astro-wizard-agent';\nimport { DJANGO_AGENT_CONFIG } from '../django/django-wizard-agent';\nimport { FLASK_AGENT_CONFIG } from '../flask/flask-wizard-agent';\nimport { FASTAPI_AGENT_CONFIG } from '../fastapi/fastapi-wizard-agent';\nimport { LARAVEL_AGENT_CONFIG } from '../laravel/laravel-wizard-agent';\nimport { SVELTEKIT_AGENT_CONFIG } from '../svelte/svelte-wizard-agent';\nimport { SWIFT_AGENT_CONFIG } from '../swift/swift-wizard-agent';\nimport { ANDROID_AGENT_CONFIG } from '../android/android-wizard-agent';\nimport { RAILS_AGENT_CONFIG } from '../rails/rails-wizard-agent';\nimport { PYTHON_AGENT_CONFIG } from '../python/python-wizard-agent';\nimport { RUBY_AGENT_CONFIG } from '../ruby/ruby-wizard-agent';\nimport { JAVASCRIPT_NODE_AGENT_CONFIG } from '../javascript-node/javascript-node-wizard-agent';\nimport { JAVASCRIPT_WEB_AGENT_CONFIG } from '../javascript-web/javascript-web-wizard-agent';\n\nexport const FRAMEWORK_REGISTRY: Record<Integration, FrameworkConfig> = {\n [Integration.nextjs]: NEXTJS_AGENT_CONFIG,\n [Integration.nuxt]: NUXT_AGENT_CONFIG,\n [Integration.vue]: VUE_AGENT_CONFIG,\n [Integration.tanstackStart]: TANSTACK_START_AGENT_CONFIG,\n [Integration.reactRouter]: REACT_ROUTER_AGENT_CONFIG,\n [Integration.tanstackRouter]: TANSTACK_ROUTER_AGENT_CONFIG,\n [Integration.reactNative]: REACT_NATIVE_AGENT_CONFIG,\n [Integration.angular]: ANGULAR_AGENT_CONFIG,\n [Integration.astro]: ASTRO_AGENT_CONFIG,\n [Integration.django]: DJANGO_AGENT_CONFIG,\n [Integration.flask]: FLASK_AGENT_CONFIG,\n [Integration.fastapi]: FASTAPI_AGENT_CONFIG,\n [Integration.laravel]: LARAVEL_AGENT_CONFIG,\n [Integration.sveltekit]: SVELTEKIT_AGENT_CONFIG,\n [Integration.swift]: SWIFT_AGENT_CONFIG,\n [Integration.android]: ANDROID_AGENT_CONFIG,\n [Integration.rails]: RAILS_AGENT_CONFIG,\n [Integration.python]: PYTHON_AGENT_CONFIG,\n [Integration.ruby]: RUBY_AGENT_CONFIG,\n [Integration.javascriptNode]: JAVASCRIPT_NODE_AGENT_CONFIG,\n [Integration.javascript_web]: JAVASCRIPT_WEB_AGENT_CONFIG,\n};\n"]}
|