{"version":3,"file":"progress.mjs","names":[],"sources":["../../src/compaction/progress.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport {\n\tCompactionSummaryMessageComponent,\n\ttype ExtensionAPI,\n} from '@earendil-works/pi-coding-agent';\n\nimport { normalizeOptionalText } from '@live-compaction/config';\nimport type { HookContext, NotifyLevel, SummaryProgress } from '@live-compaction/types';\nimport { safeUI } from '@live-compaction/types';\n\nconst TASK_STATE_MAX_CHARS = 6000;\n\nexport { TASK_STATE_MAX_CHARS };\n\nexport function notify(ctx: HookContext, message: string, level: NotifyLevel = 'warning'): void {\n\tif (ctx.hasUI) {\n\t\tctx.ui.notify(message, level);\n\t}\n}\n\nexport function boundTaskStateBlock(value: string | undefined): string | undefined {\n\tconst normalized = normalizeOptionalText(value);\n\tif (!normalized) return undefined;\n\tif (normalized.length <= TASK_STATE_MAX_CHARS) return normalized;\n\treturn `${normalized.slice(0, TASK_STATE_MAX_CHARS)}\\n- … task state truncated; call TaskRead after resume.`;\n}\n\nexport function fetchTaskStateSnapshot(\n\tevents: ExtensionAPI['events'],\n\ttimeoutMs = 750,\n): Promise<string | undefined> {\n\tconst requestId = randomUUID();\n\treturn new Promise((resolve) => {\n\t\tlet settled = false;\n\t\tconst done = (value: string | undefined) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tclearTimeout(timer);\n\t\t\tunsub();\n\t\t\tresolve(value?.trim() || undefined);\n\t\t};\n\t\tconst timer = setTimeout(() => done(undefined), timeoutMs);\n\t\tconst unsub = events.on(`tasks:rpc:snapshot:reply:${requestId}`, (raw: unknown) => {\n\t\t\tconst reply = raw as { success?: boolean; data?: { markdown?: string }; error?: string };\n\t\t\tdone(reply.success ? reply.data?.markdown : undefined);\n\t\t});\n\t\tevents.emit('tasks:rpc:snapshot', { requestId, consumer: 'live-compaction' });\n\t});\n}\n\nexport function makeSummaryProgress(ctx: HookContext): SummaryProgress | undefined {\n\tif (!ctx.hasUI) return undefined;\n\tif (!ctx.ui.setStatus && !ctx.ui.setWidget && !ctx.ui.setWorkingMessage) return undefined;\n\n\tconst ui = safeUI(ctx);\n\tconst key = 'live-compaction';\n\tlet lastUpdate = 0;\n\tlet started = false;\n\tlet tokensBefore = 0;\n\n\tconst setCompactionWidget = (summary: string) => {\n\t\tui.setWidget?.(\n\t\t\tkey,\n\t\t\t() => {\n\t\t\t\tconst component = new CompactionSummaryMessageComponent({\n\t\t\t\t\trole: 'compactionSummary',\n\t\t\t\t\tsummary: summary.trimEnd() || '_Waiting for model output…_',\n\t\t\t\t\ttokensBefore,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\t\t\t\tcomponent.setExpanded(true);\n\t\t\t\treturn component;\n\t\t\t},\n\t\t\t{ placement: 'aboveEditor' },\n\t\t);\n\t};\n\n\tconst clear = () => {\n\t\tui.setStatus?.(key, undefined);\n\t\tui.setWidget?.(key, undefined);\n\t\tui.setWorkingMessage?.();\n\t};\n\n\treturn {\n\t\tstart(modelLabel: string, compactedTokensBefore: number) {\n\t\t\tstarted = true;\n\t\t\ttokensBefore = compactedTokensBefore;\n\t\t\tui.setStatus?.(key, `compacting with ${modelLabel}`);\n\t\t\tui.setWorkingMessage?.(`Compacting with ${modelLabel}…`);\n\t\t\tsetCompactionWidget('');\n\t\t},\n\t\tupdate(text: string) {\n\t\t\tif (!started) return;\n\t\t\tconst now = Date.now();\n\t\t\tif (now - lastUpdate < 150) return;\n\t\t\tlastUpdate = now;\n\t\t\tconst lineCount = text ? text.split('\\n').length : 0;\n\t\t\tui.setStatus?.(key, `compacting · ${lineCount} lines`);\n\t\t\tsetCompactionWidget(text);\n\t\t},\n\t\tfinish() {\n\t\t\tclear();\n\t\t},\n\t\tfail(message: string) {\n\t\t\tui.setStatus?.(key, `compaction failed: ${message}`);\n\t\t\tui.setWidget?.(key, [`Grounded compaction failed: ${message}`], {\n\t\t\t\tplacement: 'aboveEditor',\n\t\t\t});\n\t\t\tui.setWorkingMessage?.();\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;AAWA,MAAM,uBAAuB;AAI7B,SAAgB,OAAO,KAAkB,SAAiB,QAAqB,WAAiB;CAC/F,IAAI,IAAI,OACP,IAAI,GAAG,OAAO,SAAS,KAAK;AAE9B;AAEA,SAAgB,oBAAoB,OAA+C;CAClF,MAAM,aAAa,sBAAsB,KAAK;CAC9C,IAAI,CAAC,YAAY,OAAO,KAAA;CACxB,IAAI,WAAW,UAAA,KAAgC,OAAO;CACtD,OAAO,GAAG,WAAW,MAAM,GAAG,oBAAoB,EAAE;AACrD;AAEA,SAAgB,uBACf,QACA,YAAY,KACkB;CAC9B,MAAM,YAAY,WAAW;CAC7B,OAAO,IAAI,SAAS,YAAY;EAC/B,IAAI,UAAU;EACd,MAAM,QAAQ,UAA8B;GAC3C,IAAI,SAAS;GACb,UAAU;GACV,aAAa,KAAK;GAClB,MAAM;GACN,QAAQ,OAAO,KAAK,KAAK,KAAA,CAAS;EACnC;EACA,MAAM,QAAQ,iBAAiB,KAAK,KAAA,CAAS,GAAG,SAAS;EACzD,MAAM,QAAQ,OAAO,GAAG,4BAA4B,cAAc,QAAiB;GAClF,MAAM,QAAQ;GACd,KAAK,MAAM,UAAU,MAAM,MAAM,WAAW,KAAA,CAAS;EACtD,CAAC;EACD,OAAO,KAAK,sBAAsB;GAAE;GAAW,UAAU;EAAkB,CAAC;CAC7E,CAAC;AACF;AAEA,SAAgB,oBAAoB,KAA+C;CAClF,IAAI,CAAC,IAAI,OAAO,OAAO,KAAA;CACvB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,GAAG,mBAAmB,OAAO,KAAA;CAEhF,MAAM,KAAK,OAAO,GAAG;CACrB,MAAM,MAAM;CACZ,IAAI,aAAa;CACjB,IAAI,UAAU;CACd,IAAI,eAAe;CAEnB,MAAM,uBAAuB,YAAoB;EAChD,GAAG,YACF,WACM;GACL,MAAM,YAAY,IAAI,kCAAkC;IACvD,MAAM;IACN,SAAS,QAAQ,QAAQ,KAAK;IAC9B;IACA,WAAW,KAAK,IAAI;GACrB,CAAC;GACD,UAAU,YAAY,IAAI;GAC1B,OAAO;EACR,GACA,EAAE,WAAW,cAAc,CAC5B;CACD;CAEA,MAAM,cAAc;EACnB,GAAG,YAAY,KAAK,KAAA,CAAS;EAC7B,GAAG,YAAY,KAAK,KAAA,CAAS;EAC7B,GAAG,oBAAoB;CACxB;CAEA,OAAO;EACN,MAAM,YAAoB,uBAA+B;GACxD,UAAU;GACV,eAAe;GACf,GAAG,YAAY,KAAK,mBAAmB,YAAY;GACnD,GAAG,oBAAoB,mBAAmB,WAAW,EAAE;GACvD,oBAAoB,EAAE;EACvB;EACA,OAAO,MAAc;GACpB,IAAI,CAAC,SAAS;GACd,MAAM,MAAM,KAAK,IAAI;GACrB,IAAI,MAAM,aAAa,KAAK;GAC5B,aAAa;GACb,MAAM,YAAY,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,SAAS;GACnD,GAAG,YAAY,KAAK,gBAAgB,UAAU,OAAO;GACrD,oBAAoB,IAAI;EACzB;EACA,SAAS;GACR,MAAM;EACP;EACA,KAAK,SAAiB;GACrB,GAAG,YAAY,KAAK,sBAAsB,SAAS;GACnD,GAAG,YAAY,KAAK,CAAC,+BAA+B,SAAS,GAAG,EAC/D,WAAW,cACZ,CAAC;GACD,GAAG,oBAAoB;EACxB;CACD;AACD"}