# Conflicts: # .github/actions/build-native/action.yml # .github/workflows/ci.yml
9.3 KiB
Changelog
[Unreleased]
Added
- Added profile-aware directory helpers and isolated profile state roots, while keeping the install ID shared across profiles.
[15.12.4] - 2026-06-13
Fixed
- Fixed abortable stream wrappers to cancel the source stream on abort, so timeout watchdogs release upstream HTTP bodies instead of only stopping the local reader.
[15.12.0] - 2026-06-12
Added
- Added support for a runtime
overridesmap inRuntimeInstallSpec, which is now written into generated runtimepackage.jsonmanifests to force dependency pins (including transitive ones) across the runtime tree - Added a lightweight loop-phase breadcrumb stack (
pushLoopPhase/popLoopPhase/currentLoopPhase, plustakeRecentLoopPhasewhich returns the live phase or the most recently popped one and clears it) so the TUI event-loop watchdog can attribute a main-thread block to the phase that caused it — including a synchronous phase already popped before the watchdog's delayed tick runs (#2485) - Added
FetchWithRetryOptions.timeout(forwarded to the underlyingfetchcall).falsedisables Bun's native ~300s pre-response timeout; a positive number overrides the ceiling. Bare browser/Node fetch ignores it (#2422) - Added
runtime-install: shared on-demand runtime dependency support —ensureRuntimeInstalled()(locked, idempotentbun installof a pinned dependency set into a cache dir) and a multi-rootinstallRuntimeModuleResolver()/resolveRuntimeModule()for loading those graphs inside compiled binaries (Bun #1763). Extracted from the coding-agent tiny-model worker; now also backs Mnemopi's on-demand fastembed runtime (#2389) - Added
getFastembedRuntimeDir()(~/.omp/cache/fastembed-runtime) alongsidegetFastembedCacheDir() - Added
getEditorConfigFormatting(file): returns the.editorconfig-pinnedtabSize/insertSpaces(both optional, no fallback) so LSP-format callers can layer per-file defaults under it without paving over silence with the renderer's display tab width (#2329). - Added the
path-treemodule (buildPathTree,walkPathTree,formatGroupedPaths,isUrlLikePath), moved from the coding agent's grouped file output so compaction file lists can share the same prefix-folded directory-tree rendering;formatGroupedPathsgains an optionalannotatecallback for per-file suffixes - Restored
PI_DEBUG_STARTUPstreaming startup markers:logger.timenow writes a synchronous[startup] <op>:start/:done/:failstderr line per phase (independent ofPI_TIMING), so a startup that hangs hard still names the phase it is stuck in — thePI_TIMINGtree only prints after startup completes and is structurally unable to diagnose a hang. The CLI runner emitscli:load:<name>markers around each lazily-imported command module for the same reason. - Added
logger.openSpanPath(): ops of the currently-open timing-span chain (root → deepest), used by the coding agent's startup watchdog to name the in-flight phase of a stalled startup. - Added
declareWorkerHostEntry()/workerHostEntry()in the side-effect-freeworker-hostmodule (also re-exported fromenv): self-dispatching CLI entrypoints declareBun.mainas the worker host so worker spawn sites can re-enter the single entry module withWorkerOptions.argvselectors across source, npm-bundle, and compiled distributions - Added
getAuthBrokerSnapshotCachePath()withOMP_AUTH_BROKER_SNAPSHOT_CACHEoverride support for isolating the encrypted broker snapshot cache. - Added color helpers
colorLuma(perceptual luma),relativeLuminance(WCAG, linearized sRGB), andhslToHexto the color utilities. The luminance helpers parse#rgb/#rrggbbhex and 256-color palette indices, returningundefinedfor unparseable values. - Added
peekFileEnds, a single-open head-and-tail file peek helper that reuses the head bytes for the tail when the file fits the head window. - Added
peekFileTail, the tail mirror ofpeekFile: reads up to the lastmaxBytesof a file ending at EOF, reusing the same pooled-buffer strategy (no per-call allocation for small reads). - Added
getFastembedCacheDirto return the FastEmbed model cache directory under ~/.omp/cache/fastembed - Added an XDG-aware tiny-title model cache directory helper for coding-agent local title models.
Changed
- Changed
prompt.compile()to cache compiled templates by the raw template string so repeated calls reuse the same compiled function without re-disambiguating Snowflake.formatPartspacks the id as a single 64-bit BigInt hex format instead of stitching four 16-bit segments (simpler and ~1.7x faster), andgetTimestampextracts via exact double arithmetic instead of a BigInt round-trip. Output is bit-identical.- Logger initialization is lazy: the winston logger, file transport, and log-directory creation now happen on first log emission instead of at module import (the import previously cost ~8ms of fs work on the CLI startup path); the in-memory timing infrastructure never touches winston
prompt.format()post-processing got cheap per-line guards and a single-pass ASCII-symbol replacement (was 7 chained regex passes per line), roughly halving render post-processing cost; output is byte-identicallogger.printTimings()(thePI_TIMINGstartup tree) now surfaces two previously-invisible regions: a(before instrumentation)line for runtime init / uncaptured pre-marker work, and an(unattributed self)line for the root span's own untimed work so the gap between visible top-level spans andTotalis no longer swallowed.Totalis now labelled(since first marker)to make the window explicit. The restoredmodule-timer.tspreload can feed module spans into the report: each module recordsonLoad→ final top-level marker astotal, a prepended body marker → final marker asbody/TLA, and resolved static imports as a bounded dependency tree so the report separates graph wait from actual top-level module work.
Fixed
-
Made
TempDircleanup retry transient WindowsEBUSY/EPERM/ENOTEMPTYremoval failures so tests are less likely to fail when deleting just-used temp directories. -
Fixed abortable stream wrappers to cancel the source stream on abort, so timeout watchdogs release upstream HTTP bodies instead of only stopping the local reader.
-
Fixed cleanup reentry noise during fatal shutdown: recursive cleanup requests now no-op idempotently instead of logging repeated
Cleanup invoked recursivelyerrors (#2284). -
Fixed the
{{join}}prompt helper joining with a literal two-character\nwhen templates pass"\n"as the separator — Handlebars string literals carry no escape processing. The separator now unescapes\n/\t, matching the{{#list}}helper's documented convention (visible as literal\nbetween paths in compaction<read-files>lists). -
Fixed
prompt.format()so ASCII symbol replacements such as-->and!=still run on lines containing a closing HTML comment token when not inside a comment -
isCompiledBinary()now also honors a define-foldedprocess.env.PI_COMPILED(onlyBun.envwas checked), so builds that constant-foldprocess.envkeep compiled-binary detection without relying onimport.meta.urlbunfs markers -
omp <cmd> --helpnow loads only the requested command module instead of the entire command table, so an unrelated command whose import graph hangs or crashes can no longer take down every per-command help invocation. -
Hardened
getIndentationagainst malformed paths: any filesystem error from the.editorconfigprobe (e.g.ENAMETOOLONGon oversized garbage path segments) is now swallowed and cached as a miss instead of escaping and crashing the TUI mid-render (#1871). -
Fixed
getIndentation(and the edit renderer'sreplaceTabscallers) crashing withENAMETOOLONG/ENOTDIR/etc. when handed a path with an overlong component or a non-directory in its parent chain. Editorconfig discovery now short-circuits to the default tab width on any path component aboveNAME_MAX(255 bytes) and absorbs anyFsErrorwhile walking the editorconfig chain — best-effort discovery must never escape as an uncaught exception (#1872). -
Fixed
$flagenvironment parsing to accept lowercase truthy values such asy,true,yes, andon -
Fixed
installRuntimeModuleResolver()to keep bare requests from runtime-cache modules inside that registered runtime before falling back to host/workspace packages.
Removed
- Removed the exported
hookFetchAPI, which previously interceptedglobalThis.fetchvia middleware handlers - Removed
hookFetchfrom the package entrypoint, so imports from@.../utilsno longer provide this fetch interception helper