Token efficiency

This commit is contained in:
Colin McDonnell
2025-12-22 18:16:55 -08:00
parent 0cf88e1752
commit 7fb788a883
6 changed files with 25 additions and 44 deletions
+6 -10
View File
@@ -12,7 +12,7 @@ type PullFile = RestEndpointMethodTypes["pulls"]["listFiles"]["response"]["data"
/**
* formats PR files with explicit line numbers for each code line.
* preserves all original diff info (file headers, hunk headers) and adds:
* OLD | NEW | TYPE | code
* | OLD | NEW | TYPE | code
*/
export function formatFilesWithLineNumbers(files: PullFile[]): string {
const output: string[] = [];
@@ -50,18 +50,18 @@ export function formatFilesWithLineNumbers(files: PullFile[]): string {
if (changeType === "-") {
// removed line: show old line number, no new line number
output.push(`${padNum(oldLine)} | | - | ${code}`);
output.push(`| ${padNum(oldLine)} | | - | ${code}`);
oldLine++;
} else if (changeType === "+") {
// added line: no old line number, show new line number
output.push(` | ${padNum(newLine)} | + | ${code}`);
output.push(`| | ${padNum(newLine)} | + | ${code}`);
newLine++;
} else if (changeType === " " || changeType === "\\") {
// context line or "\ No newline at end of file"
if (changeType === "\\") {
output.push(line); // pass through as-is
} else {
output.push(`${padNum(oldLine)} | ${padNum(newLine)} | | ${code}`);
output.push(`| ${padNum(oldLine)} | ${padNum(newLine)} | | ${code}`);
oldLine++;
newLine++;
}
@@ -263,12 +263,8 @@ export function CheckoutPrTool(ctx: ToolContext) {
writeFileSync(diffPath, diffContent);
log.debug(`wrote diff to ${diffPath} (${diffContent.length} bytes)`);
// return diff inline only if small enough
const MAX_INLINE_DIFF_SIZE = 50 * 1024; // 50KB
const diff =
diffContent.length <= MAX_INLINE_DIFF_SIZE
? diffContent
: `Diff is ${(diffContent.length / 1024).toFixed(0)}KB - use grep or read from ${diffPath}`;
// don't inline diff - always point to file to reduce context size
const diff = `Diff written to ${diffPath} (${(diffContent.length / 1024).toFixed(1)}KB). Use grep or read_file to explore.`;
return {
success: true,
-4
View File
@@ -28,11 +28,7 @@ export function GetIssueCommentsTool(ctx: ToolContext) {
id: comment.id,
body: comment.body,
user: comment.user?.login,
created_at: comment.created_at,
updated_at: comment.updated_at,
html_url: comment.html_url,
author_association: comment.author_association,
reactions: comment.reactions,
})),
count: comments.length,
};
+5 -8
View File
@@ -1,4 +1,5 @@
import type { StandardSchemaV1 } from "@standard-schema/spec";
import { encode as toonEncode } from "@toon-format/toon";
import type { FastMCP, Tool } from "fastmcp";
import type { ToolContext } from "../main.ts";
@@ -12,14 +13,10 @@ export interface ToolResult {
isError?: boolean;
}
export const handleToolSuccess = (data: Record<string, any>): ToolResult => {
export const handleToolSuccess = (data: Record<string, any> | string): ToolResult => {
const text = typeof data === "string" ? data : toonEncode(data);
return {
content: [
{
type: "text",
text: JSON.stringify(data, null, 2),
},
],
content: [{ type: "text", text }],
};
};
@@ -40,7 +37,7 @@ export const handleToolError = (error: unknown): ToolResult => {
* Helper to wrap a tool execute function with error handling.
* Captures ctx in closure so tools don't need to handle try/catch.
*/
export const execute = <T>(fn: (params: T) => Promise<Record<string, any>>) => {
export const execute = <T>(fn: (params: T) => Promise<Record<string, any> | string>) => {
return async (params: T): Promise<ToolResult> => {
try {
const result = await fn(params);