fix: emit formatter events from hashline-edit tool (fixes #2117)

This commit is contained in:
YeonGyu-Kim
2026-03-23 18:22:49 +09:00
parent d5d7c7dd26
commit f95d3b1ef5
4 changed files with 157 additions and 4 deletions
@@ -6,6 +6,8 @@ import { canonicalizeFileText, restoreFileText } from "./file-text-canonicalizat
import { normalizeHashlineEdits, type RawHashlineEdit } from "./normalize-edits"
import type { HashlineEdit } from "./types"
import { HashlineMismatchError } from "./validation"
import { runFormattersForFile } from "./formatter-trigger"
import type { PluginContext } from "../../plugin/types"
interface HashlineEditArgs {
filePath: string
@@ -80,7 +82,7 @@ function buildSuccessMeta(
}
}
export async function executeHashlineEditTool(args: HashlineEditArgs, context: ToolContext): Promise<string> {
export async function executeHashlineEditTool(args: HashlineEditArgs, context: ToolContext, pluginCtx?: PluginContext): Promise<string> {
try {
const metadataContext = context as ToolContextWithMetadata
const filePath = args.filePath
@@ -129,6 +131,34 @@ export async function executeHashlineEditTool(args: HashlineEditArgs, context: T
await Bun.write(filePath, writeContent)
if (pluginCtx?.client) {
await runFormattersForFile(pluginCtx.client as any, context.directory, filePath)
const formattedContent = Buffer.from(await Bun.file(filePath).arrayBuffer()).toString("utf8")
if (formattedContent !== writeContent) {
const formattedEnvelope = canonicalizeFileText(formattedContent)
const formattedMeta = buildSuccessMeta(
filePath,
oldEnvelope.content,
formattedEnvelope.content,
applyResult.noopEdits,
applyResult.deduplicatedEdits
)
if (typeof metadataContext.metadata === "function") {
metadataContext.metadata(formattedMeta)
}
const callID = resolveToolCallID(metadataContext)
if (callID) {
storeToolMetadata(context.sessionID, callID, formattedMeta)
}
if (rename && rename !== filePath) {
await Bun.write(rename, formattedContent)
await Bun.file(filePath).delete()
return `Moved ${filePath} to ${rename}`
}
return `Updated ${filePath}`
}
}
if (rename && rename !== filePath) {
await Bun.write(rename, writeContent)
await Bun.file(filePath).delete()