@diff-review-system/drs 3.2.1 → 3.3.1

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 (92) hide show
  1. package/.pi/agents/review/unified-reviewer.md +74 -11
  2. package/README.md +10 -5
  3. package/dist/cli/describe-mr.d.ts.map +1 -1
  4. package/dist/cli/describe-mr.js +11 -0
  5. package/dist/cli/describe-mr.js.map +1 -1
  6. package/dist/cli/describe-pr.d.ts.map +1 -1
  7. package/dist/cli/describe-pr.js +11 -0
  8. package/dist/cli/describe-pr.js.map +1 -1
  9. package/dist/cli/index.js +34 -0
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/cli/post-comments.d.ts +4 -0
  12. package/dist/cli/post-comments.d.ts.map +1 -1
  13. package/dist/cli/post-comments.js +5 -2
  14. package/dist/cli/post-comments.js.map +1 -1
  15. package/dist/cli/review-local.d.ts +1 -0
  16. package/dist/cli/review-local.d.ts.map +1 -1
  17. package/dist/cli/review-local.js +1 -0
  18. package/dist/cli/review-local.js.map +1 -1
  19. package/dist/cli/review-mr.d.ts +3 -0
  20. package/dist/cli/review-mr.d.ts.map +1 -1
  21. package/dist/cli/review-mr.js +6 -0
  22. package/dist/cli/review-mr.js.map +1 -1
  23. package/dist/cli/review-pr.d.ts +3 -0
  24. package/dist/cli/review-pr.d.ts.map +1 -1
  25. package/dist/cli/review-pr.js +6 -1
  26. package/dist/cli/review-pr.js.map +1 -1
  27. package/dist/cli/review-url.d.ts +3 -0
  28. package/dist/cli/review-url.d.ts.map +1 -1
  29. package/dist/cli/review-url.js +6 -0
  30. package/dist/cli/review-url.js.map +1 -1
  31. package/dist/lib/comment-formatter.d.ts +14 -6
  32. package/dist/lib/comment-formatter.d.ts.map +1 -1
  33. package/dist/lib/comment-formatter.js +22 -6
  34. package/dist/lib/comment-formatter.js.map +1 -1
  35. package/dist/lib/comment-formatter.test.js +18 -0
  36. package/dist/lib/comment-formatter.test.js.map +1 -1
  37. package/dist/lib/comment-poster.d.ts +4 -2
  38. package/dist/lib/comment-poster.d.ts.map +1 -1
  39. package/dist/lib/comment-poster.js +5 -4
  40. package/dist/lib/comment-poster.js.map +1 -1
  41. package/dist/lib/comment-poster.test.js +16 -2
  42. package/dist/lib/comment-poster.test.js.map +1 -1
  43. package/dist/lib/config.d.ts +7 -0
  44. package/dist/lib/config.d.ts.map +1 -1
  45. package/dist/lib/config.js +11 -0
  46. package/dist/lib/config.js.map +1 -1
  47. package/dist/lib/cursor-fix-link.d.ts +23 -0
  48. package/dist/lib/cursor-fix-link.d.ts.map +1 -0
  49. package/dist/lib/cursor-fix-link.js +111 -0
  50. package/dist/lib/cursor-fix-link.js.map +1 -0
  51. package/dist/lib/cursor-fix-link.test.d.ts +2 -0
  52. package/dist/lib/cursor-fix-link.test.d.ts.map +1 -0
  53. package/dist/lib/cursor-fix-link.test.js +70 -0
  54. package/dist/lib/cursor-fix-link.test.js.map +1 -0
  55. package/dist/lib/description-executor.d.ts.map +1 -1
  56. package/dist/lib/description-executor.js +15 -2
  57. package/dist/lib/description-executor.js.map +1 -1
  58. package/dist/lib/description-executor.test.js +8 -0
  59. package/dist/lib/description-executor.test.js.map +1 -1
  60. package/dist/lib/prompt-budget.d.ts +29 -0
  61. package/dist/lib/prompt-budget.d.ts.map +1 -0
  62. package/dist/lib/prompt-budget.js +42 -0
  63. package/dist/lib/prompt-budget.js.map +1 -0
  64. package/dist/lib/prompt-budget.test.d.ts +2 -0
  65. package/dist/lib/prompt-budget.test.d.ts.map +1 -0
  66. package/dist/lib/prompt-budget.test.js +55 -0
  67. package/dist/lib/prompt-budget.test.js.map +1 -0
  68. package/dist/lib/review-core.d.ts.map +1 -1
  69. package/dist/lib/review-core.js +139 -111
  70. package/dist/lib/review-core.js.map +1 -1
  71. package/dist/lib/review-core.test.js +2 -3
  72. package/dist/lib/review-core.test.js.map +1 -1
  73. package/dist/lib/review-orchestrator.d.ts +3 -0
  74. package/dist/lib/review-orchestrator.d.ts.map +1 -1
  75. package/dist/lib/review-orchestrator.js +4 -1
  76. package/dist/lib/review-orchestrator.js.map +1 -1
  77. package/dist/lib/unified-review-executor.d.ts +5 -0
  78. package/dist/lib/unified-review-executor.d.ts.map +1 -1
  79. package/dist/lib/unified-review-executor.js +2 -1
  80. package/dist/lib/unified-review-executor.js.map +1 -1
  81. package/dist/pi/sdk.d.ts.map +1 -1
  82. package/dist/pi/sdk.js +3 -1
  83. package/dist/pi/sdk.js.map +1 -1
  84. package/dist/pi/sdk.test.js +76 -1
  85. package/dist/pi/sdk.test.js.map +1 -1
  86. package/dist/runtime/client.d.ts +1 -1
  87. package/dist/runtime/client.d.ts.map +1 -1
  88. package/dist/runtime/client.js +8 -1
  89. package/dist/runtime/client.js.map +1 -1
  90. package/dist/runtime/client.test.js +106 -0
  91. package/dist/runtime/client.test.js.map +1 -1
  92. package/package.json +1 -2
@@ -0,0 +1,70 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { buildCursorFixLink, inferCursorWorkspaceName, resolveCursorFixLinkOptions, } from './cursor-fix-link.js';
3
+ const issue = {
4
+ category: 'QUALITY',
5
+ severity: 'HIGH',
6
+ title: 'Missing null check',
7
+ file: 'src/service.ts',
8
+ line: 42,
9
+ problem: 'The handler dereferences a nullable value.',
10
+ solution: 'Add a guard before reading the value.',
11
+ agent: 'quality',
12
+ };
13
+ describe('cursor-fix-link', () => {
14
+ it('builds a Cursor prompt deeplink for a review issue', () => {
15
+ const link = buildCursorFixLink(issue, { enabled: true, workspace: 'drs' });
16
+ expect(link).toBeDefined();
17
+ const url = new URL(link);
18
+ expect(url.protocol).toBe('https:');
19
+ expect(url.host).toBe('cursor.com');
20
+ expect(url.pathname).toBe('/link/prompt');
21
+ expect(url.searchParams.get('mode')).toBe('agent');
22
+ expect(url.searchParams.get('workspace')).toBe('drs');
23
+ expect(url.searchParams.get('text')).toContain('Fix this DRS review issue');
24
+ expect(url.searchParams.get('text')).toContain('src/service.ts:42');
25
+ expect(url.searchParams.get('text')).toContain('Missing null check');
26
+ });
27
+ it('does not build a link when disabled', () => {
28
+ expect(buildCursorFixLink(issue, { enabled: false })).toBeUndefined();
29
+ expect(buildCursorFixLink(issue)).toBeUndefined();
30
+ });
31
+ it('sanitizes hidden control characters from prompt text', () => {
32
+ const link = buildCursorFixLink({
33
+ ...issue,
34
+ title: 'Hidden\u2028separator',
35
+ problem: 'Zero\u200bwidth',
36
+ solution: 'Paragraph\u2029separator',
37
+ }, { enabled: true });
38
+ const prompt = new URL(link).searchParams.get('text');
39
+ expect(prompt).toContain('Hidden separator');
40
+ expect(prompt).toContain('Zero width');
41
+ expect(prompt).toContain('Paragraph separator');
42
+ expect(prompt).not.toContain('\u2028');
43
+ expect(prompt).not.toContain('\u2029');
44
+ expect(prompt).not.toContain('\u200b');
45
+ });
46
+ it('infers workspace name from repository-like project IDs', () => {
47
+ expect(inferCursorWorkspaceName('owner/repo', '/tmp/fallback')).toBe('repo');
48
+ expect(inferCursorWorkspaceName('123', '/tmp/drs')).toBe('drs');
49
+ });
50
+ it('resolves config and CLI overrides', () => {
51
+ const config = {
52
+ review: {
53
+ cursorFixLinks: {
54
+ enabled: true,
55
+ workspace: 'configured-workspace',
56
+ },
57
+ },
58
+ };
59
+ expect(resolveCursorFixLinkOptions(config, 'owner/repo', '/tmp/repo')).toEqual({
60
+ enabled: true,
61
+ workspace: 'configured-workspace',
62
+ });
63
+ expect(resolveCursorFixLinkOptions(config, 'owner/repo', '/tmp/repo', undefined, true)).toBe(undefined);
64
+ expect(resolveCursorFixLinkOptions(config, 'owner/repo', '/tmp/repo', true, true)).toEqual({
65
+ enabled: true,
66
+ workspace: 'configured-workspace',
67
+ });
68
+ });
69
+ });
70
+ //# sourceMappingURL=cursor-fix-link.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-fix-link.test.js","sourceRoot":"","sources":["../../src/lib/cursor-fix-link.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"description-executor.d.ts","sourceRoot":"","sources":["../../src/lib/description-executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AASrD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAA0C,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACpG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,WAAW,GAAG,QAAQ,CAMxD;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;CACnD;AAED,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,OAAO,EACf,aAAa,CAAC,EAAE,kBAAkB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CA6E9B;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,YAAY,EAAE,EACrB,qBAAqB,EAAE,OAAO,EAC9B,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,OAAO,GACd,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAoC7B"}
1
+ {"version":3,"file":"description-executor.d.ts","sourceRoot":"","sources":["../../src/lib/description-executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AASrD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAA0C,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEpG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,WAAW,GAAG,QAAQ,CAMxD;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;CACnD;AAED,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,OAAO,EACf,aAAa,CAAC,EAAE,kBAAkB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CA+F9B;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,YAAY,EAAE,EACrB,qBAAqB,EAAE,OAAO,EAC9B,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,OAAO,GACd,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAoC7B"}
@@ -12,6 +12,7 @@ import { loadGlobalContext } from './context-loader.js';
12
12
  import { displayDescription, normalizeDescription, postDescription, } from './description-formatter.js';
13
13
  import { parseDescribeOutput } from './describe-parser.js';
14
14
  import { aggregateAgentUsage, applyUsageMessage, createAgentUsageSummary } from './review-usage.js';
15
+ import { estimatePromptBudget, formatPromptBudgetEstimate } from './prompt-budget.js';
15
16
  import { getDescriberModelOverride } from './config.js';
16
17
  /**
17
18
  * Detect platform type from PR/MR platform data
@@ -24,8 +25,11 @@ export function detectPlatform(pr) {
24
25
  return 'PR';
25
26
  }
26
27
  export async function runDescribeAgent(runtimeClient, config, label, files, workingDir, debug, preCompressed) {
28
+ const describeModelOverrides = getDescriberModelOverride(config);
29
+ const describeModelId = describeModelOverrides['describe/pr-describer'];
27
30
  let compressedFiles;
28
31
  let compressionSummary;
32
+ let contextWindow;
29
33
  if (preCompressed) {
30
34
  // Use pre-compressed data from orchestrator (avoids duplicate compression)
31
35
  compressedFiles = preCompressed.files;
@@ -35,8 +39,8 @@ export async function runDescribeAgent(runtimeClient, config, label, files, work
35
39
  // Standalone describe — compress here
36
40
  const filteredFileNames = new Set(filterIgnoredFiles(files.map((f) => f.filename), config));
37
41
  const filteredFiles = files.filter((f) => filteredFileNames.has(f.filename));
38
- const describeModelIds = [...new Set(Object.values(getDescriberModelOverride(config)))].filter((id) => !!id);
39
- const contextWindow = runtimeClient.getMinContextWindow(describeModelIds);
42
+ const describeModelIds = [...new Set(Object.values(describeModelOverrides))].filter((id) => !!id);
43
+ contextWindow = runtimeClient.getMinContextWindow(describeModelIds);
40
44
  const compressionOptions = resolveCompressionBudget(contextWindow, config.contextCompression);
41
45
  const compression = prepareDiffsForAgent(filteredFiles, compressionOptions);
42
46
  compressedFiles = compression.files;
@@ -48,6 +52,15 @@ export async function runDescribeAgent(runtimeClient, config, label, files, work
48
52
  const includeProjectContext = config.describe?.includeProjectContext ?? true;
49
53
  const projectContext = includeProjectContext ? loadGlobalContext(workingDir) : null;
50
54
  const instructions = buildDescribeInstructions(label, compressedFiles, compressionSummary, projectContext ?? undefined);
55
+ const promptContextWindow = describeModelId
56
+ ? runtimeClient.getModelContextWindow?.(describeModelId)
57
+ : contextWindow;
58
+ const promptEstimate = estimatePromptBudget(instructions, {
59
+ tokenEstimateDivisor: config.contextCompression?.tokenEstimateDivisor,
60
+ contextWindow: promptContextWindow,
61
+ });
62
+ const modelText = describeModelId ? ` | model: ${describeModelId}` : '';
63
+ console.log(chalk.gray(`${formatPromptBudgetEstimate('describe/pr-describer', promptEstimate)}${modelText}\n`));
51
64
  if (debug) {
52
65
  console.log(chalk.yellow('\n=== Describe Agent Instructions ==='));
53
66
  console.log(instructions);
@@ -1 +1 @@
1
- {"version":3,"file":"description-executor.js","sourceRoot":"","sources":["../../src/lib/description-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"description-executor.js","sourceRoot":"","sources":["../../src/lib/description-executor.ts"],"names":[],"mappings":"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"}
@@ -46,6 +46,7 @@ describe('description-executor', () => {
46
46
  };
47
47
  }),
48
48
  getMinContextWindow: vi.fn(() => undefined),
49
+ getModelContextWindow: vi.fn(() => undefined),
49
50
  };
50
51
  platformClient = {};
51
52
  config = {
@@ -116,5 +117,12 @@ describe('description-executor', () => {
116
117
  await runDescribeIfEnabled(runtimeClient, configWithExplicitDescribeModel, platformClient, 'manojlds/drs', pr, files, false, process.cwd(), false);
117
118
  expect(runtimeClient.getMinContextWindow).toHaveBeenCalledWith(['provider/describe-200k']);
118
119
  });
120
+ it('falls back to describe context window when model-specific window is unavailable', async () => {
121
+ runtimeClient.getMinContextWindow.mockReturnValue(1000);
122
+ runtimeClient.getModelContextWindow.mockReturnValue(undefined);
123
+ await runDescribeIfEnabled(runtimeClient, config, platformClient, 'manojlds/drs', pr, files, false, process.cwd(), false);
124
+ const output = consoleLogSpy.mock.calls.map((call) => String(call[0])).join('\n');
125
+ expect(output).toContain('% of 1,000 context');
126
+ });
119
127
  });
120
128
  //# sourceMappingURL=description-executor.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"description-executor.test.js","sourceRoot":"","sources":["../../src/lib/description-executor.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"description-executor.test.js","sourceRoot":"","sources":["../../src/lib/description-executor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /** Prefix used for prompt budget log lines to simplify CI filtering. */
2
+ export declare const PROMPT_BUDGET_LOG_PREFIX = "[prompt-budget]";
3
+ /**
4
+ * Estimated prompt budget and optional context-window utilization.
5
+ */
6
+ export interface PromptBudgetEstimate {
7
+ /** Raw prompt character length. */
8
+ characters: number;
9
+ /** Estimated prompt tokens derived from character length. */
10
+ estimatedTokens: number;
11
+ /** Model context window used for utilization calculation (if known). */
12
+ contextWindow?: number;
13
+ /** Percentage of context window consumed by the prompt (if known). */
14
+ contextUsagePercent?: number;
15
+ /** Character-to-token divisor used for the estimate. */
16
+ tokenEstimateDivisor: number;
17
+ }
18
+ /**
19
+ * Estimate prompt token usage from character length.
20
+ */
21
+ export declare function estimatePromptBudget(prompt: string, options?: {
22
+ tokenEstimateDivisor?: number;
23
+ contextWindow?: number;
24
+ }): PromptBudgetEstimate;
25
+ /**
26
+ * Format a prompt budget estimate for human-readable logs.
27
+ */
28
+ export declare function formatPromptBudgetEstimate(agentLabel: string, estimate: PromptBudgetEstimate): string;
29
+ //# sourceMappingURL=prompt-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-budget.d.ts","sourceRoot":"","sources":["../../src/lib/prompt-budget.ts"],"names":[],"mappings":"AAIA,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,oBAAoB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,eAAe,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wDAAwD;IACxD,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AASD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAClE,oBAAoB,CAoBtB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,oBAAoB,GAC7B,MAAM,CAaR"}
@@ -0,0 +1,42 @@
1
+ import { formatCount } from './format-utils.js';
2
+ const DEFAULT_TOKEN_ESTIMATE_DIVISOR = 4;
3
+ /** Prefix used for prompt budget log lines to simplify CI filtering. */
4
+ export const PROMPT_BUDGET_LOG_PREFIX = '[prompt-budget]';
5
+ function resolveTokenEstimateDivisor(value) {
6
+ if (typeof value === 'number' && Number.isFinite(value) && value > 0) {
7
+ return value;
8
+ }
9
+ return DEFAULT_TOKEN_ESTIMATE_DIVISOR;
10
+ }
11
+ /**
12
+ * Estimate prompt token usage from character length.
13
+ */
14
+ export function estimatePromptBudget(prompt, options) {
15
+ const tokenEstimateDivisor = resolveTokenEstimateDivisor(options?.tokenEstimateDivisor);
16
+ const characters = prompt.length;
17
+ const estimatedTokens = Math.ceil(characters / tokenEstimateDivisor);
18
+ const contextWindow = typeof options?.contextWindow === 'number' && Number.isFinite(options.contextWindow)
19
+ ? options.contextWindow
20
+ : undefined;
21
+ const contextUsagePercent = contextWindow && contextWindow > 0 ? (estimatedTokens / contextWindow) * 100 : undefined;
22
+ return {
23
+ characters,
24
+ estimatedTokens,
25
+ contextWindow,
26
+ contextUsagePercent,
27
+ tokenEstimateDivisor,
28
+ };
29
+ }
30
+ /**
31
+ * Format a prompt budget estimate for human-readable logs.
32
+ */
33
+ export function formatPromptBudgetEstimate(agentLabel, estimate) {
34
+ const base = `${PROMPT_BUDGET_LOG_PREFIX} Prompt input (${agentLabel}): ` +
35
+ `${formatCount(estimate.characters)} chars ≈ ${formatCount(estimate.estimatedTokens)} tokens`;
36
+ if (estimate.contextWindow && estimate.contextUsagePercent !== undefined) {
37
+ return (`${base} ` +
38
+ `(${estimate.contextUsagePercent.toFixed(2)}% of ${formatCount(estimate.contextWindow)} context)`);
39
+ }
40
+ return base;
41
+ }
42
+ //# sourceMappingURL=prompt-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-budget.js","sourceRoot":"","sources":["../../src/lib/prompt-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAEzC,wEAAwE;AACxE,MAAM,CAAC,MAAM,wBAAwB,GAAG,iBAAiB,CAAC;AAkB1D,SAAS,2BAA2B,CAAC,KAAc;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACrE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,8BAA8B,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,OAAmE;IAEnE,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IACxF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;IACjC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,oBAAoB,CAAC,CAAC;IAErE,MAAM,aAAa,GACjB,OAAO,OAAO,EAAE,aAAa,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC;QAClF,CAAC,CAAC,OAAO,CAAC,aAAa;QACvB,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,mBAAmB,GACvB,aAAa,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3F,OAAO;QACL,UAAU;QACV,eAAe;QACf,aAAa;QACb,mBAAmB;QACnB,oBAAoB;KACrB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,UAAkB,EAClB,QAA8B;IAE9B,MAAM,IAAI,GACR,GAAG,wBAAwB,kBAAkB,UAAU,KAAK;QAC5D,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,WAAW,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC;IAEhG,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QACzE,OAAO,CACL,GAAG,IAAI,GAAG;YACV,IAAI,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAClG,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prompt-budget.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-budget.test.d.ts","sourceRoot":"","sources":["../../src/lib/prompt-budget.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { estimatePromptBudget, formatPromptBudgetEstimate, PROMPT_BUDGET_LOG_PREFIX, } from './prompt-budget.js';
3
+ describe('estimatePromptBudget', () => {
4
+ it('uses the default divisor when none is provided', () => {
5
+ const estimate = estimatePromptBudget('a'.repeat(9));
6
+ expect(estimate.tokenEstimateDivisor).toBe(4);
7
+ expect(estimate.characters).toBe(9);
8
+ expect(estimate.estimatedTokens).toBe(3);
9
+ });
10
+ it('uses a custom divisor when provided', () => {
11
+ const estimate = estimatePromptBudget('a'.repeat(10), {
12
+ tokenEstimateDivisor: 5,
13
+ });
14
+ expect(estimate.tokenEstimateDivisor).toBe(5);
15
+ expect(estimate.estimatedTokens).toBe(2);
16
+ });
17
+ it('falls back to default divisor when custom divisor is invalid', () => {
18
+ const estimate = estimatePromptBudget('a'.repeat(8), {
19
+ tokenEstimateDivisor: 0,
20
+ });
21
+ expect(estimate.tokenEstimateDivisor).toBe(4);
22
+ expect(estimate.estimatedTokens).toBe(2);
23
+ });
24
+ it('computes context usage percentage when context window is provided', () => {
25
+ const estimate = estimatePromptBudget('a'.repeat(40), {
26
+ tokenEstimateDivisor: 4,
27
+ contextWindow: 100,
28
+ });
29
+ expect(estimate.estimatedTokens).toBe(10);
30
+ expect(estimate.contextWindow).toBe(100);
31
+ expect(estimate.contextUsagePercent).toBe(10);
32
+ });
33
+ });
34
+ describe('formatPromptBudgetEstimate', () => {
35
+ it('formats without context window details when unavailable', () => {
36
+ const formatted = formatPromptBudgetEstimate('review/security', estimatePromptBudget('a'.repeat(400)));
37
+ expect(formatted).toContain(PROMPT_BUDGET_LOG_PREFIX);
38
+ expect(formatted).toContain('Prompt input (review/security):');
39
+ expect(formatted).toContain('400 chars');
40
+ expect(formatted).toContain('100 tokens');
41
+ expect(formatted).not.toContain('context');
42
+ });
43
+ it('formats with context window details when available', () => {
44
+ const formatted = formatPromptBudgetEstimate('describe/pr-describer', estimatePromptBudget('a'.repeat(800), {
45
+ tokenEstimateDivisor: 4,
46
+ contextWindow: 2000,
47
+ }));
48
+ expect(formatted).toContain(PROMPT_BUDGET_LOG_PREFIX);
49
+ expect(formatted).toContain('Prompt input (describe/pr-describer):');
50
+ expect(formatted).toContain('800 chars');
51
+ expect(formatted).toContain('200 tokens');
52
+ expect(formatted).toContain('10.00% of 2,000 context');
53
+ });
54
+ });
55
+ //# sourceMappingURL=prompt-budget.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-budget.test.js","sourceRoot":"","sources":["../../src/lib/prompt-budget.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"review-core.d.ts","sourceRoot":"","sources":["../../src/lib/review-core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C,OAAO,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,oCAAoC;IACpC,OAAO,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IAC7C,+CAA+C;IAC/C,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,sDAAsD;IACtD,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EAAE,EACrB,WAAW,CAAC,EAAE,MAAM,EACpB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAoIR;AAuHD,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,SAAS,EACjB,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,EACvB,iBAAiB,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAC/C,UAAU,GAAE,MAAsB,EAClC,KAAK,UAAQ,GACZ,OAAO,CAAC,iBAAiB,CAAC,CAyJ5B;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,SAAS,EACjB,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,EACvB,iBAAiB,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAC/C,UAAU,GAAE,MAAsB,EAClC,KAAK,UAAQ,GACZ,OAAO,CAAC,iBAAiB,CAAC,CAsL5B;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,SAAS,EACjB,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,EACvB,iBAAiB,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAC/C,UAAU,GAAE,MAAsB,EAClC,KAAK,UAAQ,GACZ,OAAO,CAAC,iBAAiB,CAAC,CAW5B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B,GAAG,IAAI,CAkDP;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,OAAO,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;CAC9C,GAAG,OAAO,CAEV"}
1
+ {"version":3,"file":"review-core.d.ts","sourceRoot":"","sources":["../../src/lib/review-core.ts"],"names":[],"mappings":"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"}