From 8c483e5fe380606dcafbaa43865d64b07f59b949 Mon Sep 17 00:00:00 2001 From: can1357 Date: Fri, 1 May 2026 15:40:40 +0200 Subject: [PATCH] perf(coding-agent/utils): restructured Markit conversion flow to use lazy instance init - Replaced the eager `markit-ai` singleton import with a lazy async factory in `markit.ts`. - Initialized and memoized a `Markit` instance on first use, with later calls reusing it. - Updated conversion helpers to receive the initialized `Markit` instance and execute conversions through a shared runner. --- .gitignore | 1 + packages/coding-agent/src/utils/markit.ts | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 3fa6fd9c0..f61c5d5f9 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,4 @@ scripts/session-stats/edit-analysis.csv # parallel-agent worktrees .wt/ +CPU*.md diff --git a/packages/coding-agent/src/utils/markit.ts b/packages/coding-agent/src/utils/markit.ts index 107558c57..ab622c957 100644 --- a/packages/coding-agent/src/utils/markit.ts +++ b/packages/coding-agent/src/utils/markit.ts @@ -1,6 +1,5 @@ import { untilAborted } from "@oh-my-pi/pi-utils"; -import type { StreamInfo } from "markit-ai"; -import { Markit } from "markit-ai"; +import type { Markit, StreamInfo } from "markit-ai"; import { ToolAbortError } from "../tools/tool-errors"; export interface MarkitConversionResult { @@ -9,7 +8,15 @@ export interface MarkitConversionResult { error?: string; } -const markit = new Markit(); +let markit: () => Markit | Promise = async () => { + const promise = import("markit-ai").then(({ Markit }) => { + const instance = new Markit(); + markit = () => instance; + return instance; + }); + markit = () => promise; + return promise; +}; function normalizeExtension(extension: string): string { const trimmed = extension.trim().toLowerCase(); @@ -24,9 +31,10 @@ function normalizeError(error: unknown): string { return "Conversion failed"; } -async function runMarkitConversion(task: () => Promise, signal?: AbortSignal): Promise { +async function runMarkitConversion(task: (markit: Markit) => Promise, signal?: AbortSignal): Promise { try { - return signal ? await untilAborted(signal, task) : await task(); + const instance = await markit(); + return signal ? await untilAborted(signal, () => task(instance)) : await task(instance); } catch (error) { if (error instanceof ToolAbortError) { throw error; @@ -48,7 +56,7 @@ function finalizeConversion(markdown?: string): MarkitConversionResult { export async function convertFileWithMarkit(filePath: string, signal?: AbortSignal): Promise { try { - const result = await runMarkitConversion(() => markit.convertFile(filePath), signal); + const result = await runMarkitConversion(markit => markit.convertFile(filePath), signal); return finalizeConversion(result.markdown); } catch (error) { if (error instanceof ToolAbortError) { @@ -70,7 +78,7 @@ export async function convertBufferWithMarkit( }; try { - const result = await runMarkitConversion(() => markit.convert(Buffer.from(buffer), streamInfo), signal); + const result = await runMarkitConversion(markit => markit.convert(Buffer.from(buffer), streamInfo), signal); return finalizeConversion(result.markdown); } catch (error) { if (error instanceof ToolAbortError) {