@posthog/wizard 1.34.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.
Files changed (89) hide show
  1. package/dist/bin.js +9 -0
  2. package/dist/bin.js.map +1 -1
  3. package/dist/src/javascript-node/javascript-node-wizard-agent.d.ts +4 -0
  4. package/dist/src/javascript-node/javascript-node-wizard-agent.js +61 -0
  5. package/dist/src/javascript-node/javascript-node-wizard-agent.js.map +1 -0
  6. package/dist/src/javascript-web/javascript-web-wizard-agent.d.ts +3 -0
  7. package/dist/src/javascript-web/javascript-web-wizard-agent.js +150 -0
  8. package/dist/src/javascript-web/javascript-web-wizard-agent.js.map +1 -0
  9. package/dist/src/javascript-web/utils.d.ts +23 -0
  10. package/dist/src/javascript-web/utils.js +99 -0
  11. package/dist/src/javascript-web/utils.js.map +1 -0
  12. package/dist/src/lib/__tests__/agent-interface.test.js +1 -0
  13. package/dist/src/lib/__tests__/agent-interface.test.js.map +1 -1
  14. package/dist/src/lib/agent-interface.d.ts +5 -0
  15. package/dist/src/lib/agent-interface.js +19 -2
  16. package/dist/src/lib/agent-interface.js.map +1 -1
  17. package/dist/src/lib/agent-runner.js +8 -4
  18. package/dist/src/lib/agent-runner.js.map +1 -1
  19. package/dist/src/lib/api.js +3 -0
  20. package/dist/src/lib/api.js.map +1 -1
  21. package/dist/src/lib/constants.d.ts +4 -1
  22. package/dist/src/lib/constants.js +13 -1
  23. package/dist/src/lib/constants.js.map +1 -1
  24. package/dist/src/lib/middleware/benchmark.d.ts +54 -0
  25. package/dist/src/lib/middleware/benchmark.js +49 -0
  26. package/dist/src/lib/middleware/benchmark.js.map +1 -0
  27. package/dist/src/lib/middleware/benchmarks/cache-tracker.d.ts +44 -0
  28. package/dist/src/lib/middleware/benchmarks/cache-tracker.js +81 -0
  29. package/dist/src/lib/middleware/benchmarks/cache-tracker.js.map +1 -0
  30. package/dist/src/lib/middleware/benchmarks/compaction-tracker.d.ts +29 -0
  31. package/dist/src/lib/middleware/benchmarks/compaction-tracker.js +60 -0
  32. package/dist/src/lib/middleware/benchmarks/compaction-tracker.js.map +1 -0
  33. package/dist/src/lib/middleware/benchmarks/context-size-tracker.d.ts +26 -0
  34. package/dist/src/lib/middleware/benchmarks/context-size-tracker.js +56 -0
  35. package/dist/src/lib/middleware/benchmarks/context-size-tracker.js.map +1 -0
  36. package/dist/src/lib/middleware/benchmarks/cost-tracker.d.ts +16 -0
  37. package/dist/src/lib/middleware/benchmarks/cost-tracker.js +76 -0
  38. package/dist/src/lib/middleware/benchmarks/cost-tracker.js.map +1 -0
  39. package/dist/src/lib/middleware/benchmarks/duration-tracker.d.ts +20 -0
  40. package/dist/src/lib/middleware/benchmarks/duration-tracker.js +40 -0
  41. package/dist/src/lib/middleware/benchmarks/duration-tracker.js.map +1 -0
  42. package/dist/src/lib/middleware/benchmarks/index.d.ts +9 -0
  43. package/dist/src/lib/middleware/benchmarks/index.js +60 -0
  44. package/dist/src/lib/middleware/benchmarks/index.js.map +1 -0
  45. package/dist/src/lib/middleware/benchmarks/json-writer.d.ts +15 -0
  46. package/dist/src/lib/middleware/benchmarks/json-writer.js +145 -0
  47. package/dist/src/lib/middleware/benchmarks/json-writer.js.map +1 -0
  48. package/dist/src/lib/middleware/benchmarks/summary.d.ts +9 -0
  49. package/dist/src/lib/middleware/benchmarks/summary.js +106 -0
  50. package/dist/src/lib/middleware/benchmarks/summary.js.map +1 -0
  51. package/dist/src/lib/middleware/benchmarks/token-tracker.d.ts +40 -0
  52. package/dist/src/lib/middleware/benchmarks/token-tracker.js +77 -0
  53. package/dist/src/lib/middleware/benchmarks/token-tracker.js.map +1 -0
  54. package/dist/src/lib/middleware/benchmarks/turn-counter.d.ts +34 -0
  55. package/dist/src/lib/middleware/benchmarks/turn-counter.js +59 -0
  56. package/dist/src/lib/middleware/benchmarks/turn-counter.js.map +1 -0
  57. package/dist/src/lib/middleware/config.d.ts +24 -0
  58. package/dist/src/lib/middleware/config.js +78 -0
  59. package/dist/src/lib/middleware/config.js.map +1 -0
  60. package/dist/src/lib/middleware/index.d.ts +11 -0
  61. package/dist/src/lib/middleware/index.js +18 -0
  62. package/dist/src/lib/middleware/index.js.map +1 -0
  63. package/dist/src/lib/middleware/phase-detector.d.ts +7 -0
  64. package/dist/src/lib/middleware/phase-detector.js +64 -0
  65. package/dist/src/lib/middleware/phase-detector.js.map +1 -0
  66. package/dist/src/lib/middleware/pipeline.d.ts +29 -0
  67. package/dist/src/lib/middleware/pipeline.js +82 -0
  68. package/dist/src/lib/middleware/pipeline.js.map +1 -0
  69. package/dist/src/lib/middleware/types.d.ts +40 -0
  70. package/dist/src/lib/middleware/types.js +9 -0
  71. package/dist/src/lib/middleware/types.js.map +1 -0
  72. package/dist/src/lib/registry.js +4 -0
  73. package/dist/src/lib/registry.js.map +1 -1
  74. package/dist/src/python/python-wizard-agent.js +1 -78
  75. package/dist/src/python/python-wizard-agent.js.map +1 -1
  76. package/dist/src/run.d.ts +2 -0
  77. package/dist/src/run.js +8 -0
  78. package/dist/src/run.js.map +1 -1
  79. package/dist/src/utils/clack-utils.d.ts +1 -1
  80. package/dist/src/utils/clack-utils.js +26 -7
  81. package/dist/src/utils/clack-utils.js.map +1 -1
  82. package/dist/src/utils/debug.d.ts +11 -3
  83. package/dist/src/utils/debug.js +25 -6
  84. package/dist/src/utils/debug.js.map +1 -1
  85. package/dist/src/utils/oauth.js +1 -0
  86. package/dist/src/utils/oauth.js.map +1 -1
  87. package/dist/src/utils/types.d.ts +11 -0
  88. package/dist/src/utils/types.js.map +1 -1
  89. package/package.json +2 -2
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ /**
3
+ * Benchmark tracking for wizard runs.
4
+ *
5
+ * Usage:
6
+ * const pipeline = createBenchmarkPipeline(spinner, options);
7
+ * pipeline.onMessage(message);
8
+ * pipeline.finalize(resultMessage, durationMs);
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.createBenchmarkPipeline = createBenchmarkPipeline;
15
+ const chalk_1 = __importDefault(require("chalk"));
16
+ const clack_1 = __importDefault(require("../../utils/clack"));
17
+ const debug_1 = require("../../utils/debug");
18
+ const pipeline_1 = require("./pipeline");
19
+ const phase_detector_1 = require("./phase-detector");
20
+ const config_1 = require("./config");
21
+ const benchmarks_1 = require("./benchmarks");
22
+ const agent_interface_1 = require("../agent-interface");
23
+ // ── Factory ────────────────────────────────────────────────────────────
24
+ /**
25
+ * Create a middleware pipeline configured for benchmarking.
26
+ * Loads .benchmark-config.json from the install dir, falls back to defaults.
27
+ */
28
+ function createBenchmarkPipeline(spinner, options, configOverride) {
29
+ const config = configOverride ?? (0, config_1.loadBenchmarkConfig)(options.installDir);
30
+ (0, debug_1.configureLogFile)({
31
+ path: config.output.logPath,
32
+ enabled: config.output.logEnabled,
33
+ });
34
+ const plugins = (0, benchmarks_1.createPluginsFromConfig)(config, {
35
+ spinner,
36
+ phased: false,
37
+ outputPath: config.output.benchmarkPath,
38
+ });
39
+ if (!config.output.suppressWizardLogs) {
40
+ clack_1.default.log.info(`${chalk_1.default.cyan(agent_interface_1.AgentSignals.BENCHMARK)} Verbose logs: ${(0, debug_1.getLogFilePath)()}`);
41
+ clack_1.default.log.info(`${chalk_1.default.cyan(agent_interface_1.AgentSignals.BENCHMARK)} Benchmark data will be written to: ${config.output.benchmarkPath}`);
42
+ }
43
+ (0, debug_1.logToFile)(`${agent_interface_1.AgentSignals.BENCHMARK} Tracking enabled, starting with setup phase`);
44
+ return new pipeline_1.MiddlewarePipeline(plugins, {
45
+ phaseDetector: new phase_detector_1.PhaseDetector(),
46
+ autoDetectPhases: true,
47
+ });
48
+ }
49
+ //# sourceMappingURL=benchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../../../src/lib/middleware/benchmark.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;AA4DH,0DAqCC;AA/FD,kDAA0B;AAC1B,8DAAsC;AACtC,6CAAgF;AAChF,yCAAgD;AAChD,qDAAiD;AACjD,qCAA+C;AAC/C,6CAAuD;AAGvD,wDAAkD;AA2ClD,0EAA0E;AAE1E;;;GAGG;AACH,SAAgB,uBAAuB,CACrC,OAAyC,EACzC,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,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ,GAAG,eAAK,CAAC,IAAI,CAAC,8BAAY,CAAC,SAAS,CAAC,kBAAkB,IAAA,sBAAc,GAAE,EAAE,CAC1E,CAAC;QACF,eAAK,CAAC,GAAG,CAAC,IAAI,CACZ,GAAG,eAAK,CAAC,IAAI,CACX,8BAAY,CAAC,SAAS,CACvB,uCAAuC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CACtE,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 chalk from 'chalk';\nimport clack from '../../utils/clack';\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: ReturnType<typeof clack.spinner>,\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 clack.log.info(\n `${chalk.cyan(AgentSignals.BENCHMARK)} Verbose logs: ${getLogFilePath()}`,\n );\n clack.log.info(\n `${chalk.cyan(\n AgentSignals.BENCHMARK,\n )} 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"]}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Cache token tracking plugin (cache_read and cache_creation).
3
+ *
4
+ * Respects the dedup flag from TurnCounterPlugin.
5
+ */
6
+ import type { Middleware, MiddlewareContext, MiddlewareStore } from '../types';
7
+ /** Matches SDK usage.cache_creation (ephemeral 5m vs 1h for pricing). */
8
+ export interface CacheCreationBreakdown {
9
+ ephemeral_5m_input_tokens: number;
10
+ ephemeral_1h_input_tokens: number;
11
+ }
12
+ export interface CacheData {
13
+ phaseRead: number;
14
+ phaseCreation: number;
15
+ totalRead: number;
16
+ totalCreation: number;
17
+ totalCreation5m: number;
18
+ totalCreation1h: number;
19
+ phaseSnapshots: Array<{
20
+ phase: string;
21
+ cacheReadTokens: number;
22
+ cacheCreationTokens: number;
23
+ /** When present, use for pricing (5m vs 1h rates). */
24
+ cacheCreation5m: number;
25
+ cacheCreation1h: number;
26
+ }>;
27
+ }
28
+ export declare class CacheTrackerPlugin implements Middleware {
29
+ readonly name = "cache";
30
+ private phaseRead;
31
+ private phaseCreation;
32
+ private phaseCreation5m;
33
+ private phaseCreation1h;
34
+ private totalRead;
35
+ private totalCreation;
36
+ private totalCreation5m;
37
+ private totalCreation1h;
38
+ private phaseSnapshots;
39
+ private currentPhase;
40
+ onMessage(message: any, ctx: MiddlewareContext, store: MiddlewareStore): void;
41
+ onPhaseTransition(fromPhase: string, toPhase: string, _ctx: MiddlewareContext, store: MiddlewareStore): void;
42
+ onFinalize(_resultMessage: any, _totalDurationMs: number, _ctx: MiddlewareContext, store: MiddlewareStore): void;
43
+ private getData;
44
+ }
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ /**
3
+ * Cache token tracking plugin (cache_read and cache_creation).
4
+ *
5
+ * Respects the dedup flag from TurnCounterPlugin.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.CacheTrackerPlugin = void 0;
9
+ class CacheTrackerPlugin {
10
+ name = 'cache';
11
+ phaseRead = 0;
12
+ phaseCreation = 0;
13
+ phaseCreation5m = 0;
14
+ phaseCreation1h = 0;
15
+ totalRead = 0;
16
+ totalCreation = 0;
17
+ totalCreation5m = 0;
18
+ totalCreation1h = 0;
19
+ phaseSnapshots = [];
20
+ currentPhase = 'setup';
21
+ onMessage(message, ctx, store) {
22
+ if (message.type !== 'assistant')
23
+ return;
24
+ const turns = ctx.get('turns');
25
+ if (turns?.isDuplicate)
26
+ return;
27
+ const usage = message.message?.usage;
28
+ if (usage) {
29
+ const read = Number(usage.cache_read_input_tokens ?? 0);
30
+ const creation = Number(usage.cache_creation_input_tokens ?? 0);
31
+ const cc = usage.cache_creation;
32
+ const creation5m = Number(cc?.ephemeral_5m_input_tokens ?? 0);
33
+ const creation1h = Number(cc?.ephemeral_1h_input_tokens ?? 0);
34
+ this.phaseRead += read;
35
+ this.phaseCreation += creation;
36
+ this.phaseCreation5m += creation5m;
37
+ this.phaseCreation1h += creation1h;
38
+ this.totalRead += read;
39
+ this.totalCreation += creation;
40
+ }
41
+ store.set('cache', this.getData());
42
+ }
43
+ onPhaseTransition(fromPhase, toPhase, _ctx, store) {
44
+ this.phaseSnapshots.push({
45
+ phase: fromPhase,
46
+ cacheReadTokens: this.phaseRead,
47
+ cacheCreationTokens: this.phaseCreation,
48
+ cacheCreation5m: this.phaseCreation5m,
49
+ cacheCreation1h: this.phaseCreation1h,
50
+ });
51
+ this.currentPhase = toPhase;
52
+ this.phaseRead = 0;
53
+ this.phaseCreation = 0;
54
+ this.phaseCreation5m = 0;
55
+ this.phaseCreation1h = 0;
56
+ store.set('cache', this.getData());
57
+ }
58
+ onFinalize(_resultMessage, _totalDurationMs, _ctx, store) {
59
+ this.phaseSnapshots.push({
60
+ phase: this.currentPhase,
61
+ cacheReadTokens: this.phaseRead,
62
+ cacheCreationTokens: this.phaseCreation,
63
+ cacheCreation5m: this.phaseCreation5m,
64
+ cacheCreation1h: this.phaseCreation1h,
65
+ });
66
+ store.set('cache', this.getData());
67
+ }
68
+ getData() {
69
+ return {
70
+ phaseRead: this.phaseRead,
71
+ phaseCreation: this.phaseCreation,
72
+ totalRead: this.totalRead,
73
+ totalCreation: this.totalCreation,
74
+ totalCreation5m: this.totalCreation5m,
75
+ totalCreation1h: this.totalCreation1h,
76
+ phaseSnapshots: [...this.phaseSnapshots],
77
+ };
78
+ }
79
+ }
80
+ exports.CacheTrackerPlugin = CacheTrackerPlugin;
81
+ //# sourceMappingURL=cache-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-tracker.js","sourceRoot":"","sources":["../../../../../src/lib/middleware/benchmarks/cache-tracker.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cache token tracking plugin (cache_read and cache_creation).\n *\n * Respects the dedup flag from TurnCounterPlugin.\n */\n\nimport type { Middleware, MiddlewareContext, MiddlewareStore } from '../types';\nimport type { TurnData } from './turn-counter';\n\n/** Matches SDK usage.cache_creation (ephemeral 5m vs 1h for pricing). */\nexport interface CacheCreationBreakdown {\n ephemeral_5m_input_tokens: number;\n ephemeral_1h_input_tokens: number;\n}\n\nexport interface CacheData {\n phaseRead: number;\n phaseCreation: number;\n totalRead: number;\n totalCreation: number;\n totalCreation5m: number;\n totalCreation1h: number;\n phaseSnapshots: Array<{\n phase: string;\n cacheReadTokens: number;\n cacheCreationTokens: number;\n /** When present, use for pricing (5m vs 1h rates). */\n cacheCreation5m: number;\n cacheCreation1h: number;\n }>;\n}\n\nexport class CacheTrackerPlugin implements Middleware {\n readonly name = 'cache';\n\n private phaseRead = 0;\n private phaseCreation = 0;\n private phaseCreation5m = 0;\n private phaseCreation1h = 0;\n private totalRead = 0;\n private totalCreation = 0;\n private totalCreation5m = 0;\n private totalCreation1h = 0;\n private phaseSnapshots: Array<{\n phase: string;\n cacheReadTokens: number;\n cacheCreationTokens: number;\n cacheCreation5m: number;\n cacheCreation1h: number;\n }> = [];\n private currentPhase = 'setup';\n\n onMessage(\n message: any,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n if (message.type !== 'assistant') return;\n\n const turns = ctx.get<TurnData>('turns');\n if (turns?.isDuplicate) return;\n\n const usage = message.message?.usage;\n if (usage) {\n const read = Number(usage.cache_read_input_tokens ?? 0);\n const creation = Number(usage.cache_creation_input_tokens ?? 0);\n const cc = usage.cache_creation;\n const creation5m = Number(cc?.ephemeral_5m_input_tokens ?? 0);\n const creation1h = Number(cc?.ephemeral_1h_input_tokens ?? 0);\n this.phaseRead += read;\n this.phaseCreation += creation;\n this.phaseCreation5m += creation5m;\n this.phaseCreation1h += creation1h;\n this.totalRead += read;\n this.totalCreation += creation;\n }\n\n store.set('cache', this.getData());\n }\n\n onPhaseTransition(\n fromPhase: string,\n toPhase: string,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: fromPhase,\n cacheReadTokens: this.phaseRead,\n cacheCreationTokens: this.phaseCreation,\n cacheCreation5m: this.phaseCreation5m,\n cacheCreation1h: this.phaseCreation1h,\n });\n this.currentPhase = toPhase;\n this.phaseRead = 0;\n this.phaseCreation = 0;\n this.phaseCreation5m = 0;\n this.phaseCreation1h = 0;\n store.set('cache', this.getData());\n }\n\n onFinalize(\n _resultMessage: any,\n _totalDurationMs: number,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: this.currentPhase,\n cacheReadTokens: this.phaseRead,\n cacheCreationTokens: this.phaseCreation,\n cacheCreation5m: this.phaseCreation5m,\n cacheCreation1h: this.phaseCreation1h,\n });\n store.set('cache', this.getData());\n }\n\n private getData(): CacheData {\n return {\n phaseRead: this.phaseRead,\n phaseCreation: this.phaseCreation,\n totalRead: this.totalRead,\n totalCreation: this.totalCreation,\n totalCreation5m: this.totalCreation5m,\n totalCreation1h: this.totalCreation1h,\n phaseSnapshots: [...this.phaseSnapshots],\n };\n }\n}\n"]}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Compaction event tracking plugin.
3
+ *
4
+ * Tracks context compaction events (compact_boundary system messages)
5
+ * including pre-compaction token counts per phase.
6
+ */
7
+ import type { Middleware, MiddlewareContext, MiddlewareStore } from '../types';
8
+ export interface CompactionData {
9
+ phaseCompactions: number;
10
+ phasePreTokens: number[];
11
+ totalCompactions: number;
12
+ phaseSnapshots: Array<{
13
+ phase: string;
14
+ compactions: number;
15
+ preTokens: number[];
16
+ }>;
17
+ }
18
+ export declare class CompactionTrackerPlugin implements Middleware {
19
+ readonly name = "compactions";
20
+ private phaseCompactions;
21
+ private phasePreTokens;
22
+ private totalCompactions;
23
+ private phaseSnapshots;
24
+ private currentPhase;
25
+ onMessage(message: any, ctx: MiddlewareContext, store: MiddlewareStore): void;
26
+ onPhaseTransition(fromPhase: string, toPhase: string, _ctx: MiddlewareContext, store: MiddlewareStore): void;
27
+ onFinalize(_resultMessage: any, _totalDurationMs: number, _ctx: MiddlewareContext, store: MiddlewareStore): void;
28
+ private getData;
29
+ }
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ /**
3
+ * Compaction event tracking plugin.
4
+ *
5
+ * Tracks context compaction events (compact_boundary system messages)
6
+ * including pre-compaction token counts per phase.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.CompactionTrackerPlugin = void 0;
10
+ const debug_1 = require("../../../utils/debug");
11
+ const agent_interface_1 = require("../../agent-interface");
12
+ class CompactionTrackerPlugin {
13
+ name = 'compactions';
14
+ phaseCompactions = 0;
15
+ phasePreTokens = [];
16
+ totalCompactions = 0;
17
+ phaseSnapshots = [];
18
+ currentPhase = 'setup';
19
+ onMessage(message, ctx, store) {
20
+ if (message.type !== 'system' || message.subtype !== 'compact_boundary') {
21
+ return;
22
+ }
23
+ const preTokens = message.compact_metadata?.pre_tokens ?? 0;
24
+ const trigger = message.compact_metadata?.trigger ?? 'unknown';
25
+ this.phaseCompactions++;
26
+ this.totalCompactions++;
27
+ this.phasePreTokens.push(preTokens);
28
+ (0, debug_1.logToFile)(`${agent_interface_1.AgentSignals.BENCHMARK} [COMPACTION] Context compacted during "${ctx.currentPhase}" (trigger: ${trigger}, pre_tokens: ${preTokens})`);
29
+ store.set('compactions', this.getData());
30
+ }
31
+ onPhaseTransition(fromPhase, toPhase, _ctx, store) {
32
+ this.phaseSnapshots.push({
33
+ phase: fromPhase,
34
+ compactions: this.phaseCompactions,
35
+ preTokens: [...this.phasePreTokens],
36
+ });
37
+ this.currentPhase = toPhase;
38
+ this.phaseCompactions = 0;
39
+ this.phasePreTokens = [];
40
+ store.set('compactions', this.getData());
41
+ }
42
+ onFinalize(_resultMessage, _totalDurationMs, _ctx, store) {
43
+ this.phaseSnapshots.push({
44
+ phase: this.currentPhase,
45
+ compactions: this.phaseCompactions,
46
+ preTokens: [...this.phasePreTokens],
47
+ });
48
+ store.set('compactions', this.getData());
49
+ }
50
+ getData() {
51
+ return {
52
+ phaseCompactions: this.phaseCompactions,
53
+ phasePreTokens: [...this.phasePreTokens],
54
+ totalCompactions: this.totalCompactions,
55
+ phaseSnapshots: [...this.phaseSnapshots],
56
+ };
57
+ }
58
+ }
59
+ exports.CompactionTrackerPlugin = CompactionTrackerPlugin;
60
+ //# sourceMappingURL=compaction-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction-tracker.js","sourceRoot":"","sources":["../../../../../src/lib/middleware/benchmarks/compaction-tracker.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAGH,gDAAiD;AACjD,2DAAqD;AAarD,MAAa,uBAAuB;IACzB,IAAI,GAAG,aAAa,CAAC;IAEtB,gBAAgB,GAAG,CAAC,CAAC;IACrB,cAAc,GAAa,EAAE,CAAC;IAC9B,gBAAgB,GAAG,CAAC,CAAC;IACrB,cAAc,GAIjB,EAAE,CAAC;IACA,YAAY,GAAG,OAAO,CAAC;IAE/B,SAAS,CACP,OAAY,EACZ,GAAsB,EACtB,KAAsB;QAEtB,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,KAAK,kBAAkB,EAAE,CAAC;YACxE,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,EAAE,UAAU,IAAI,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,EAAE,OAAO,IAAI,SAAS,CAAC;QAC/D,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEpC,IAAA,iBAAS,EACP,GAAG,8BAAY,CAAC,SAAS,2CAA2C,GAAG,CAAC,YAAY,eAAe,OAAO,iBAAiB,SAAS,GAAG,CACxI,CAAC;QAEF,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,iBAAiB,CACf,SAAiB,EACjB,OAAe,EACf,IAAuB,EACvB,KAAsB;QAEtB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YACvB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,IAAI,CAAC,gBAAgB;YAClC,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC5B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,UAAU,CACR,cAAmB,EACnB,gBAAwB,EACxB,IAAuB,EACvB,KAAsB;QAEtB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YACvB,KAAK,EAAE,IAAI,CAAC,YAAY;YACxB,WAAW,EAAE,IAAI,CAAC,gBAAgB;YAClC,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;SACpC,CAAC,CAAC;QACH,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAEO,OAAO;QACb,OAAO;YACL,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;YACxC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;SACzC,CAAC;IACJ,CAAC;CACF;AA1ED,0DA0EC","sourcesContent":["/**\n * Compaction event tracking plugin.\n *\n * Tracks context compaction events (compact_boundary system messages)\n * including pre-compaction token counts per phase.\n */\n\nimport type { Middleware, MiddlewareContext, MiddlewareStore } from '../types';\nimport { logToFile } from '../../../utils/debug';\nimport { AgentSignals } from '../../agent-interface';\n\nexport interface CompactionData {\n phaseCompactions: number;\n phasePreTokens: number[];\n totalCompactions: number;\n phaseSnapshots: Array<{\n phase: string;\n compactions: number;\n preTokens: number[];\n }>;\n}\n\nexport class CompactionTrackerPlugin implements Middleware {\n readonly name = 'compactions';\n\n private phaseCompactions = 0;\n private phasePreTokens: number[] = [];\n private totalCompactions = 0;\n private phaseSnapshots: Array<{\n phase: string;\n compactions: number;\n preTokens: number[];\n }> = [];\n private currentPhase = 'setup';\n\n onMessage(\n message: any,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n if (message.type !== 'system' || message.subtype !== 'compact_boundary') {\n return;\n }\n\n const preTokens = message.compact_metadata?.pre_tokens ?? 0;\n const trigger = message.compact_metadata?.trigger ?? 'unknown';\n this.phaseCompactions++;\n this.totalCompactions++;\n this.phasePreTokens.push(preTokens);\n\n logToFile(\n `${AgentSignals.BENCHMARK} [COMPACTION] Context compacted during \"${ctx.currentPhase}\" (trigger: ${trigger}, pre_tokens: ${preTokens})`,\n );\n\n store.set('compactions', this.getData());\n }\n\n onPhaseTransition(\n fromPhase: string,\n toPhase: string,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: fromPhase,\n compactions: this.phaseCompactions,\n preTokens: [...this.phasePreTokens],\n });\n this.currentPhase = toPhase;\n this.phaseCompactions = 0;\n this.phasePreTokens = [];\n store.set('compactions', this.getData());\n }\n\n onFinalize(\n _resultMessage: any,\n _totalDurationMs: number,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n this.phaseSnapshots.push({\n phase: this.currentPhase,\n compactions: this.phaseCompactions,\n preTokens: [...this.phasePreTokens],\n });\n store.set('compactions', this.getData());\n }\n\n private getData(): CompactionData {\n return {\n phaseCompactions: this.phaseCompactions,\n phasePreTokens: [...this.phasePreTokens],\n totalCompactions: this.totalCompactions,\n phaseSnapshots: [...this.phaseSnapshots],\n };\n }\n}\n"]}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Context size tracking plugin (context tokens in/out per phase).
3
+ *
4
+ * Context tokens out = sum of input + cache_read + cache_creation from the
5
+ * last assistant message's usage (per-turn, NOT aggregate).
6
+ * Context tokens in = previous phase's context tokens out.
7
+ */
8
+ import type { Middleware, MiddlewareContext, MiddlewareStore } from '../types';
9
+ export interface ContextSizeData {
10
+ /** Per-phase context size snapshots */
11
+ phaseSnapshots: Array<{
12
+ phase: string;
13
+ contextTokensIn?: number;
14
+ contextTokensOut?: number;
15
+ freshContext: boolean;
16
+ }>;
17
+ }
18
+ export declare class ContextSizeTrackerPlugin implements Middleware {
19
+ readonly name = "contextSize";
20
+ private phaseSnapshots;
21
+ private lastContextTokensOut?;
22
+ onPhaseTransition(fromPhase: string, _toPhase: string, ctx: MiddlewareContext, store: MiddlewareStore): void;
23
+ onFinalize(_resultMessage: any, _totalDurationMs: number, ctx: MiddlewareContext, store: MiddlewareStore): void;
24
+ private computeContextTokensOut;
25
+ private getData;
26
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ /**
3
+ * Context size tracking plugin (context tokens in/out per phase).
4
+ *
5
+ * Context tokens out = sum of input + cache_read + cache_creation from the
6
+ * last assistant message's usage (per-turn, NOT aggregate).
7
+ * Context tokens in = previous phase's context tokens out.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.ContextSizeTrackerPlugin = void 0;
11
+ class ContextSizeTrackerPlugin {
12
+ name = 'contextSize';
13
+ phaseSnapshots = [];
14
+ lastContextTokensOut;
15
+ onPhaseTransition(fromPhase, _toPhase, ctx, store) {
16
+ const tokens = ctx.get('tokens');
17
+ const contextTokensOut = this.computeContextTokensOut(tokens?.lastUsage);
18
+ this.phaseSnapshots.push({
19
+ phase: fromPhase,
20
+ contextTokensIn: ctx.currentPhaseFreshContext
21
+ ? undefined
22
+ : this.lastContextTokensOut,
23
+ contextTokensOut,
24
+ freshContext: ctx.currentPhaseFreshContext,
25
+ });
26
+ this.lastContextTokensOut = contextTokensOut;
27
+ store.set('contextSize', this.getData());
28
+ }
29
+ onFinalize(_resultMessage, _totalDurationMs, ctx, store) {
30
+ const tokens = ctx.get('tokens');
31
+ const contextTokensOut = this.computeContextTokensOut(tokens?.lastUsage);
32
+ this.phaseSnapshots.push({
33
+ phase: ctx.currentPhase,
34
+ contextTokensIn: ctx.currentPhaseFreshContext
35
+ ? undefined
36
+ : this.lastContextTokensOut,
37
+ contextTokensOut,
38
+ freshContext: ctx.currentPhaseFreshContext,
39
+ });
40
+ store.set('contextSize', this.getData());
41
+ }
42
+ computeContextTokensOut(usage) {
43
+ if (!usage)
44
+ return undefined;
45
+ return (Number(usage.input_tokens ?? 0) +
46
+ Number(usage.cache_read_input_tokens ?? 0) +
47
+ Number(usage.cache_creation_input_tokens ?? 0));
48
+ }
49
+ getData() {
50
+ return {
51
+ phaseSnapshots: [...this.phaseSnapshots],
52
+ };
53
+ }
54
+ }
55
+ exports.ContextSizeTrackerPlugin = ContextSizeTrackerPlugin;
56
+ //# sourceMappingURL=context-size-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-size-tracker.js","sourceRoot":"","sources":["../../../../../src/lib/middleware/benchmarks/context-size-tracker.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAeH,MAAa,wBAAwB;IAC1B,IAAI,GAAG,aAAa,CAAC;IAEtB,cAAc,GAKjB,EAAE,CAAC;IACA,oBAAoB,CAAU;IAEtC,iBAAiB,CACf,SAAiB,EACjB,QAAgB,EAChB,GAAsB,EACtB,KAAsB;QAEtB,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAY,QAAQ,CAAC,CAAC;QAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEzE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YACvB,KAAK,EAAE,SAAS;YAChB,eAAe,EAAE,GAAG,CAAC,wBAAwB;gBAC3C,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,IAAI,CAAC,oBAAoB;YAC7B,gBAAgB;YAChB,YAAY,EAAE,GAAG,CAAC,wBAAwB;SAC3C,CAAC,CAAC;QAEH,IAAI,CAAC,oBAAoB,GAAG,gBAAgB,CAAC;QAC7C,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,UAAU,CACR,cAAmB,EACnB,gBAAwB,EACxB,GAAsB,EACtB,KAAsB;QAEtB,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAY,QAAQ,CAAC,CAAC;QAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEzE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YACvB,KAAK,EAAE,GAAG,CAAC,YAAY;YACvB,eAAe,EAAE,GAAG,CAAC,wBAAwB;gBAC3C,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,IAAI,CAAC,oBAAoB;YAC7B,gBAAgB;YAChB,YAAY,EAAE,GAAG,CAAC,wBAAwB;SAC3C,CAAC,CAAC;QAEH,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAEO,uBAAuB,CAAC,KAAU;QACxC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,OAAO,CACL,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,CAAC,CAC/C,CAAC;IACJ,CAAC;IAEO,OAAO;QACb,OAAO;YACL,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;SACzC,CAAC;IACJ,CAAC;CACF;AApED,4DAoEC","sourcesContent":["/**\n * Context size tracking plugin (context tokens in/out per phase).\n *\n * Context tokens out = sum of input + cache_read + cache_creation from the\n * last assistant message's usage (per-turn, NOT aggregate).\n * Context tokens in = previous phase's context tokens out.\n */\n\nimport type { Middleware, MiddlewareContext, MiddlewareStore } from '../types';\nimport type { TokenData } from './token-tracker';\n\nexport interface ContextSizeData {\n /** Per-phase context size snapshots */\n phaseSnapshots: Array<{\n phase: string;\n contextTokensIn?: number;\n contextTokensOut?: number;\n freshContext: boolean;\n }>;\n}\n\nexport class ContextSizeTrackerPlugin implements Middleware {\n readonly name = 'contextSize';\n\n private phaseSnapshots: Array<{\n phase: string;\n contextTokensIn?: number;\n contextTokensOut?: number;\n freshContext: boolean;\n }> = [];\n private lastContextTokensOut?: number;\n\n onPhaseTransition(\n fromPhase: string,\n _toPhase: string,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const tokens = ctx.get<TokenData>('tokens');\n const contextTokensOut = this.computeContextTokensOut(tokens?.lastUsage);\n\n this.phaseSnapshots.push({\n phase: fromPhase,\n contextTokensIn: ctx.currentPhaseFreshContext\n ? undefined\n : this.lastContextTokensOut,\n contextTokensOut,\n freshContext: ctx.currentPhaseFreshContext,\n });\n\n this.lastContextTokensOut = contextTokensOut;\n store.set('contextSize', this.getData());\n }\n\n onFinalize(\n _resultMessage: any,\n _totalDurationMs: number,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const tokens = ctx.get<TokenData>('tokens');\n const contextTokensOut = this.computeContextTokensOut(tokens?.lastUsage);\n\n this.phaseSnapshots.push({\n phase: ctx.currentPhase,\n contextTokensIn: ctx.currentPhaseFreshContext\n ? undefined\n : this.lastContextTokensOut,\n contextTokensOut,\n freshContext: ctx.currentPhaseFreshContext,\n });\n\n store.set('contextSize', this.getData());\n }\n\n private computeContextTokensOut(usage: any): number | undefined {\n if (!usage) return undefined;\n return (\n Number(usage.input_tokens ?? 0) +\n Number(usage.cache_read_input_tokens ?? 0) +\n Number(usage.cache_creation_input_tokens ?? 0)\n );\n }\n\n private getData(): ContextSizeData {\n return {\n phaseSnapshots: [...this.phaseSnapshots],\n };\n }\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import type { Middleware, MiddlewareContext, MiddlewareStore } from '../types';
2
+ export interface CostData {
3
+ totalCost: number;
4
+ phaseCosts: Array<{
5
+ phase: string;
6
+ cost: number;
7
+ }>;
8
+ }
9
+ export declare class CostTrackerPlugin implements Middleware {
10
+ readonly name = "cost";
11
+ private phaseCosts;
12
+ private totalCost;
13
+ onPhaseTransition(fromPhase: string, _toPhase: string, ctx: MiddlewareContext, store: MiddlewareStore): void;
14
+ onFinalize(resultMessage: any, _totalDurationMs: number, ctx: MiddlewareContext, store: MiddlewareStore): void;
15
+ private getData;
16
+ }
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CostTrackerPlugin = void 0;
4
+ /** Claude Sonnet 4.6 pricing (USD per 1M tokens) */
5
+ const PRICE_PER_MTOK = {
6
+ input: 3,
7
+ output: 15,
8
+ cacheRead: 0.3,
9
+ cacheCreation5m: 3.75,
10
+ cacheCreation1h: 6,
11
+ };
12
+ function computeCost(inputTokens, outputTokens, cacheReadTokens, cacheCreation5m, cacheCreation1h, cacheCreationFallback) {
13
+ const hasBreakdown = cacheCreation5m > 0 || cacheCreation1h > 0;
14
+ return (inputTokens * (PRICE_PER_MTOK.input / 1e6) +
15
+ outputTokens * (PRICE_PER_MTOK.output / 1e6) +
16
+ cacheReadTokens * (PRICE_PER_MTOK.cacheRead / 1e6) +
17
+ (hasBreakdown
18
+ ? cacheCreation5m * (PRICE_PER_MTOK.cacheCreation5m / 1e6) +
19
+ cacheCreation1h * (PRICE_PER_MTOK.cacheCreation1h / 1e6)
20
+ : cacheCreationFallback * (PRICE_PER_MTOK.cacheCreation5m / 1e6)));
21
+ }
22
+ class CostTrackerPlugin {
23
+ name = 'cost';
24
+ phaseCosts = [];
25
+ totalCost = 0;
26
+ onPhaseTransition(fromPhase, _toPhase, ctx, store) {
27
+ const tokens = ctx.get('tokens');
28
+ const cache = ctx.get('cache');
29
+ const tokenSnap = tokens?.phaseSnapshots.at(-1);
30
+ const cacheSnap = cache?.phaseSnapshots.at(-1);
31
+ const totalIn = tokenSnap?.inputTokens ?? 0;
32
+ const read = cacheSnap?.cacheReadTokens ?? 0;
33
+ const creation = cacheSnap?.cacheCreationTokens ?? 0;
34
+ const c5m = cacheSnap?.cacheCreation5m ?? 0;
35
+ const c1h = cacheSnap?.cacheCreation1h ?? 0;
36
+ const baseIn = Math.max(0, totalIn - read - creation);
37
+ const phaseCost = computeCost(baseIn, tokenSnap?.outputTokens ?? 0, read, c5m, c1h, creation);
38
+ this.phaseCosts.push({ phase: fromPhase, cost: phaseCost });
39
+ this.totalCost += phaseCost;
40
+ store.set('cost', this.getData());
41
+ }
42
+ onFinalize(resultMessage, _totalDurationMs, ctx, store) {
43
+ const tokens = ctx.get('tokens');
44
+ const cache = ctx.get('cache');
45
+ const tokenSnap = tokens?.phaseSnapshots.at(-1);
46
+ const cacheSnap = cache?.phaseSnapshots.at(-1);
47
+ const totalIn = tokenSnap?.inputTokens ?? 0;
48
+ const read = cacheSnap?.cacheReadTokens ?? 0;
49
+ const creation = cacheSnap?.cacheCreationTokens ?? 0;
50
+ const c5m = cacheSnap?.cacheCreation5m ?? 0;
51
+ const c1h = cacheSnap?.cacheCreation1h ?? 0;
52
+ const baseIn = Math.max(0, totalIn - read - creation);
53
+ const lastPhaseCost = computeCost(baseIn, tokenSnap?.outputTokens ?? 0, read, c5m, c1h, creation);
54
+ this.phaseCosts.push({ phase: ctx.currentPhase, cost: lastPhaseCost });
55
+ this.totalCost += lastPhaseCost;
56
+ const sdkTotal = Number(resultMessage?.usage?.total_cost_usd ?? 0) ||
57
+ Number(resultMessage?.total_cost_usd ?? 0);
58
+ if (sdkTotal > 0 && this.totalCost > 0) {
59
+ const scale = sdkTotal / this.totalCost;
60
+ this.phaseCosts = this.phaseCosts.map((p) => ({
61
+ phase: p.phase,
62
+ cost: p.cost * scale,
63
+ }));
64
+ this.totalCost = sdkTotal;
65
+ }
66
+ store.set('cost', this.getData());
67
+ }
68
+ getData() {
69
+ return {
70
+ totalCost: this.totalCost,
71
+ phaseCosts: [...this.phaseCosts],
72
+ };
73
+ }
74
+ }
75
+ exports.CostTrackerPlugin = CostTrackerPlugin;
76
+ //# sourceMappingURL=cost-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-tracker.js","sourceRoot":"","sources":["../../../../../src/lib/middleware/benchmarks/cost-tracker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Middleware, MiddlewareContext, MiddlewareStore } from '../types';\nimport type { TokenData } from './token-tracker';\nimport type { CacheData } from './cache-tracker';\n\nexport interface CostData {\n totalCost: number;\n phaseCosts: Array<{ phase: string; cost: number }>;\n}\n\n/** Claude Sonnet 4.6 pricing (USD per 1M tokens) */\nconst PRICE_PER_MTOK = {\n input: 3,\n output: 15,\n cacheRead: 0.3,\n cacheCreation5m: 3.75,\n cacheCreation1h: 6,\n} as const;\n\nfunction computeCost(\n inputTokens: number,\n outputTokens: number,\n cacheReadTokens: number,\n cacheCreation5m: number,\n cacheCreation1h: number,\n cacheCreationFallback: number,\n): number {\n const hasBreakdown = cacheCreation5m > 0 || cacheCreation1h > 0;\n return (\n inputTokens * (PRICE_PER_MTOK.input / 1e6) +\n outputTokens * (PRICE_PER_MTOK.output / 1e6) +\n cacheReadTokens * (PRICE_PER_MTOK.cacheRead / 1e6) +\n (hasBreakdown\n ? cacheCreation5m * (PRICE_PER_MTOK.cacheCreation5m / 1e6) +\n cacheCreation1h * (PRICE_PER_MTOK.cacheCreation1h / 1e6)\n : cacheCreationFallback * (PRICE_PER_MTOK.cacheCreation5m / 1e6))\n );\n}\n\nexport class CostTrackerPlugin implements Middleware {\n readonly name = 'cost';\n\n private phaseCosts: Array<{ phase: string; cost: number }> = [];\n private totalCost = 0;\n\n onPhaseTransition(\n fromPhase: string,\n _toPhase: string,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const tokens = ctx.get<TokenData>('tokens');\n const cache = ctx.get<CacheData>('cache');\n const tokenSnap = tokens?.phaseSnapshots.at(-1);\n const cacheSnap = cache?.phaseSnapshots.at(-1);\n\n const totalIn = tokenSnap?.inputTokens ?? 0;\n const read = cacheSnap?.cacheReadTokens ?? 0;\n const creation = cacheSnap?.cacheCreationTokens ?? 0;\n const c5m = cacheSnap?.cacheCreation5m ?? 0;\n const c1h = cacheSnap?.cacheCreation1h ?? 0;\n const baseIn = Math.max(0, totalIn - read - creation);\n\n const phaseCost = computeCost(\n baseIn,\n tokenSnap?.outputTokens ?? 0,\n read,\n c5m,\n c1h,\n creation,\n );\n\n this.phaseCosts.push({ phase: fromPhase, cost: phaseCost });\n this.totalCost += phaseCost;\n store.set('cost', this.getData());\n }\n\n onFinalize(\n resultMessage: any,\n _totalDurationMs: number,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const tokens = ctx.get<TokenData>('tokens');\n const cache = ctx.get<CacheData>('cache');\n const tokenSnap = tokens?.phaseSnapshots.at(-1);\n const cacheSnap = cache?.phaseSnapshots.at(-1);\n\n const totalIn = tokenSnap?.inputTokens ?? 0;\n const read = cacheSnap?.cacheReadTokens ?? 0;\n const creation = cacheSnap?.cacheCreationTokens ?? 0;\n const c5m = cacheSnap?.cacheCreation5m ?? 0;\n const c1h = cacheSnap?.cacheCreation1h ?? 0;\n const baseIn = Math.max(0, totalIn - read - creation);\n\n const lastPhaseCost = computeCost(\n baseIn,\n tokenSnap?.outputTokens ?? 0,\n read,\n c5m,\n c1h,\n creation,\n );\n\n this.phaseCosts.push({ phase: ctx.currentPhase, cost: lastPhaseCost });\n this.totalCost += lastPhaseCost;\n\n const sdkTotal =\n Number(resultMessage?.usage?.total_cost_usd ?? 0) ||\n Number(resultMessage?.total_cost_usd ?? 0);\n\n if (sdkTotal > 0 && this.totalCost > 0) {\n const scale = sdkTotal / this.totalCost;\n this.phaseCosts = this.phaseCosts.map((p) => ({\n phase: p.phase,\n cost: p.cost * scale,\n }));\n this.totalCost = sdkTotal;\n }\n\n store.set('cost', this.getData());\n }\n\n private getData(): CostData {\n return {\n totalCost: this.totalCost,\n phaseCosts: [...this.phaseCosts],\n };\n }\n}\n"]}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Duration tracking plugin (per-phase and total).
3
+ */
4
+ import type { Middleware, MiddlewareContext, MiddlewareStore } from '../types';
5
+ export interface DurationData {
6
+ phaseSnapshots: Array<{
7
+ phase: string;
8
+ startTime: number;
9
+ endTime: number;
10
+ durationMs: number;
11
+ }>;
12
+ totalDurationMs: number;
13
+ }
14
+ export declare class DurationTrackerPlugin implements Middleware {
15
+ readonly name = "duration";
16
+ private phaseStartTime;
17
+ private phaseSnapshots;
18
+ onPhaseTransition(fromPhase: string, _toPhase: string, _ctx: MiddlewareContext, store: MiddlewareStore): void;
19
+ onFinalize(_resultMessage: any, totalDurationMs: number, ctx: MiddlewareContext, store: MiddlewareStore): void;
20
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /**
3
+ * Duration tracking plugin (per-phase and total).
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DurationTrackerPlugin = void 0;
7
+ class DurationTrackerPlugin {
8
+ name = 'duration';
9
+ phaseStartTime = Date.now();
10
+ phaseSnapshots = [];
11
+ onPhaseTransition(fromPhase, _toPhase, _ctx, store) {
12
+ const now = Date.now();
13
+ this.phaseSnapshots.push({
14
+ phase: fromPhase,
15
+ startTime: this.phaseStartTime,
16
+ endTime: now,
17
+ durationMs: now - this.phaseStartTime,
18
+ });
19
+ this.phaseStartTime = now;
20
+ store.set('duration', {
21
+ phaseSnapshots: [...this.phaseSnapshots],
22
+ totalDurationMs: 0,
23
+ });
24
+ }
25
+ onFinalize(_resultMessage, totalDurationMs, ctx, store) {
26
+ const now = Date.now();
27
+ this.phaseSnapshots.push({
28
+ phase: ctx.currentPhase,
29
+ startTime: this.phaseStartTime,
30
+ endTime: now,
31
+ durationMs: now - this.phaseStartTime,
32
+ });
33
+ store.set('duration', {
34
+ phaseSnapshots: [...this.phaseSnapshots],
35
+ totalDurationMs,
36
+ });
37
+ }
38
+ }
39
+ exports.DurationTrackerPlugin = DurationTrackerPlugin;
40
+ //# sourceMappingURL=duration-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration-tracker.js","sourceRoot":"","sources":["../../../../../src/lib/middleware/benchmarks/duration-tracker.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAcH,MAAa,qBAAqB;IACvB,IAAI,GAAG,UAAU,CAAC;IAEnB,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5B,cAAc,GAKjB,EAAE,CAAC;IAER,iBAAiB,CACf,SAAiB,EACjB,QAAgB,EAChB,IAAuB,EACvB,KAAsB;QAEtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YACvB,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,IAAI,CAAC,cAAc;YAC9B,OAAO,EAAE,GAAG;YACZ,UAAU,EAAE,GAAG,GAAG,IAAI,CAAC,cAAc;SACtC,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC1B,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE;YACpB,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;YACxC,eAAe,EAAE,CAAC;SACI,CAAC,CAAC;IAC5B,CAAC;IAED,UAAU,CACR,cAAmB,EACnB,eAAuB,EACvB,GAAsB,EACtB,KAAsB;QAEtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YACvB,KAAK,EAAE,GAAG,CAAC,YAAY;YACvB,SAAS,EAAE,IAAI,CAAC,cAAc;YAC9B,OAAO,EAAE,GAAG;YACZ,UAAU,EAAE,GAAG,GAAG,IAAI,CAAC,cAAc;SACtC,CAAC,CAAC;QAEH,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE;YACpB,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;YACxC,eAAe;SACO,CAAC,CAAC;IAC5B,CAAC;CACF;AAlDD,sDAkDC","sourcesContent":["/**\n * Duration tracking plugin (per-phase and total).\n */\n\nimport type { Middleware, MiddlewareContext, MiddlewareStore } from '../types';\n\nexport interface DurationData {\n phaseSnapshots: Array<{\n phase: string;\n startTime: number;\n endTime: number;\n durationMs: number;\n }>;\n totalDurationMs: number;\n}\n\nexport class DurationTrackerPlugin implements Middleware {\n readonly name = 'duration';\n\n private phaseStartTime = Date.now();\n private phaseSnapshots: Array<{\n phase: string;\n startTime: number;\n endTime: number;\n durationMs: number;\n }> = [];\n\n onPhaseTransition(\n fromPhase: string,\n _toPhase: string,\n _ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const now = Date.now();\n this.phaseSnapshots.push({\n phase: fromPhase,\n startTime: this.phaseStartTime,\n endTime: now,\n durationMs: now - this.phaseStartTime,\n });\n this.phaseStartTime = now;\n store.set('duration', {\n phaseSnapshots: [...this.phaseSnapshots],\n totalDurationMs: 0,\n } satisfies DurationData);\n }\n\n onFinalize(\n _resultMessage: any,\n totalDurationMs: number,\n ctx: MiddlewareContext,\n store: MiddlewareStore,\n ): void {\n const now = Date.now();\n this.phaseSnapshots.push({\n phase: ctx.currentPhase,\n startTime: this.phaseStartTime,\n endTime: now,\n durationMs: now - this.phaseStartTime,\n });\n\n store.set('duration', {\n phaseSnapshots: [...this.phaseSnapshots],\n totalDurationMs,\n } satisfies DurationData);\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Plugin registry and factory.
3
+ *
4
+ * Maps plugin names to constructors and creates the ordered plugin list
5
+ * from a BenchmarkConfig.
6
+ */
7
+ import type { Middleware, MiddlewareFactoryOptions } from '../types';
8
+ import type { BenchmarkConfig } from '../config';
9
+ export declare function createPluginsFromConfig(config: BenchmarkConfig, opts: MiddlewareFactoryOptions): Middleware[];