can1357--oh-my-pi
18 KiB
18 KiB
Changelog
[Unreleased]
[16.4.6] - 2026-07-12
Added
- Added
AsyncDrain, the deferred write-batching helper previously private to the coding-agent's prompt-history storage; now shared with model-perf recording.
[16.4.2] - 2026-07-10
Added
- Added
stringifyJsonutility with support for BigInt serialization.
[16.3.12] - 2026-07-08
Added
- Added
postmortem.interceptUnhandledRejections()to register interceptors consulted before an unhandled rejection tears the process down; a consuming interceptor (e.g. the JS eval runtime claiming rejections floated by user cell code) keeps the process alive and owns reporting.
Fixed
- Fixed child shell environment filtering to drop launch-directory
.env.localvalues that Bun auto-loaded before OMP starts command shells. (#4723)
[16.3.10] - 2026-07-06
Added
- Added
postmortem.markExpectedCleanupError()/postmortem.isExpectedCleanupError()to tag errors thrown by routine resource teardown; the globaluncaughtException/unhandledRejectionhandlers downgrade marked errors (walking thecausechain) to warnings instead of exiting the process.
Fixed
- Bounded postmortem cleanup with a 10s deadline so a hanging cleanup callback can no longer wedge the process indefinitely after a fatal error or signal; the process now always reaches
process.exit.
[16.3.7] - 2026-07-05
Added
- Added
classifyJsonPrefix, a strict RFC 8259 streaming-buffer classifier ("complete" | "prefix" | "invalid"). Providers use it to disambiguate identifierless streaming tool-call deltas: a{-prefixed chunk only advances to a sibling call when the current argument buffer cannot absorb it.
[16.3.1] - 2026-07-02
Fixed
- Fixed
parseJsonWithRepairfailing tool calls whose streamed arguments contain an unquoted string value (e.g.{"paths": packages/foo/*, "i": "…"}). Final parsing now recovers such barewords in object/array value position as strings, terminating at,/}/]/ newline. Recovery deliberately refuses anything that could mask real structure or bad data — truncated values, tokens containing"/{/[or a key-like:(URL://and Windows:\colons stay literal), and non-finite atoms (NaN,Infinity,undefined) — and streaming partial parses still roll back unfinished barewords instead of committing them.
[16.3.0] - 2026-07-02
Added
- Added
wrapFetchForExtraCaandwithExtraCaFetchutility functions to applyNODE_EXTRA_CA_CERTSto Bun'sRequestInit.tls.caconfiguration.
[16.2.9] - 2026-06-30
Added
- Improved resilience in
fetchWithRetry()by adding a response-body retry gate to handle deterministic provider failures that return retryable HTTP statuses.
Fixed
- Fixed YAML frontmatter parsing for skill descriptions containing unquoted colons (
:), ensuring typed fields are correctly preserved without triggering unnecessary warnings.
[16.2.7] - 2026-06-30
Added
- Added a utility to detect binary files based on content sniffing.
[16.2.6] - 2026-06-29
Added
- Added
stripWindowsExtendedLengthPathPrefix()utility to normalize\\?\and native Win32 path prefixes before Bun import or spawn calls.
[16.2.3] - 2026-06-28
Added
- Added
escapeXmlAttributeutility function for safe XML attribute value encoding.
Fixed
- Fixed a crash in
ptree.ChildProcess.bytes()and thessh://read path when handling large subprocess outputs (over 128 KB) under Bun by ensuring it consistently returns aUint8Array.
[16.2.0] - 2026-06-27
Added
- Added a relaxed JSON parser supporting single-quoted strings, unquoted keys, and comments.
- Added
parseStreamingJsonandparseStreamingJsonThrottledfor robust, efficient parsing of truncated or incremental streaming JSON. - Added an XDG-aware document conversion cache directory helper.
- Exported
removeWithRetries()as a standalone asynchronous function to handle retry-on-EBUSY cleanup logic.
Changed
- Improved
readSseJsonto gracefully recover truncated or malformed final events using the streaming JSON parser, ending the stream cleanly instead of throwing. - Increased the retry delay for EBUSY file-lock errors from 25ms to 50ms (extending the total retry window to 2 seconds) to improve reliability on Windows.
[16.1.8] - 2026-06-20
Added
- Exported
removeSyncWithRetries()as a standalone function so tests that manage their own temp dirs can use the same retry-on-EBUSY cleanup logic asTempDir.removeSync().
[16.1.3] - 2026-06-19
Changed
- Expanded the
TempDirWindows retry window from 4×10ms to 40×25ms (1s total) to accommodate SQLite WAL/SHM file handle release delays
Fixed
- Made EPIPE rejections from IPC
send()to worker subprocesses (syscall: "send") non-fatal: the globalunhandledRejectionhandler now logs and continues instead of terminating the session when an optional subsystem's pipe breaks. A broken optional subsystem (TTS/STT/tiny-title/MCP) can no longer crash the whole agent session mid-task. (#2997)
[16.1.2] - 2026-06-19
Added
- Added
directoryExists(dir)todirs: resolves whether a path is an existing directory, returningfalseon any stat failure (ENOENT, permission, non-directory). Lets callers check a directory is safe tochdirinto beforesetProjectDirthrows.
Removed
- Removed the public
createAbortableStreamAPI from@oh-my-pi/pi-utils. Consumers should use the lighter, direct-readerabortableSourceasync generator inside@oh-my-pi/pi-utils/streamto avoid the extra ReadableStream wrapper layer and per-chunk enqueue overhead.
[16.0.11] - 2026-06-19
Removed
- Removed
getIndentation,setDefaultTabWidth, andgetDefaultTabWidthhelpers
[16.0.8] - 2026-06-18
Changed
- Mermaid diagrams are now rendered to ASCII by a first-party vendored renderer (
src/vendor/mermaid-ascii, derived from the MIT-licensedbeautiful-mermaid, ASCII pipeline only) with terminal display width measured viaBun.stringWidth(grapheme-aware, correct for wide/East-Asian glyphs and emoji). Inline label formatting (HTML formatting tags and markdown emphasis) is now reduced to plain text instead of printed raw.
Removed
- Removed the external
beautiful-mermaiddependency (and its transitiveelkjs, ~3.13MB) in favor of the vendored ASCII renderer.
[16.0.3] - 2026-06-16
Added
- Added
escapeXmlTextutility to escape XML-significant characters&,<, and>in element body text - Added
isTerminalHeadless()/setTerminalHeadless()to centrally suppress real-terminal side effects (stdout escape/frame writes, stdin raw mode, CSI/OSC capability probes, SIGWINCH, window-title changes, emergency restore) under the test runtime. Defaults on whenbun testsetsNODE_ENV=test; terminal-contract tests opt out viasetTerminalHeadless(false)
[15.13.3] - 2026-06-15
Added
- Added
installWorkerInbox(port)/consumeWorkerInbox()to@oh-my-pi/pi-utils/worker-host. A self-dispatching CLI host that imports a Bun worker module dynamically attaches the worker's realmessagelistener after Bun flushes the messages the parent posted before spawn, dropping a synchronously-postedinit. The host installs this buffering inbox synchronously in the entry's sync prefix so a listener exists at flush time; the worker module consumes it and binds the real handler, replaying anything buffered.
[15.13.1] - 2026-06-15
Added
- Added profile-aware directory helpers and isolated profile state roots, while keeping the install ID shared across profiles.
- Added a named-profile API to the
dirsmodule —setProfile(),getActiveProfile(),getProfileRootDir(), andnormalizeProfileName()— plusresolveProfileEnv(), which selects the active profile fromOMP_PROFILE(canonical; takes precedence) thenPI_PROFILE(legacy fallback, consulted only whenOMP_PROFILEis unset). - 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 the side-effect-free
@oh-my-pi/pi-utils/worker-hostmodule (declareWorkerHostEntry()/workerHostEntry()), extracted fromenv(still re-exported there) so worker spawn sites can resolve the self-dispatching CLI host entry without importingenv's side-effecting module graph.
Fixed
- Fixed profile directory isolation when a profile's agent
.envcustomizes directory roots: directory-affecting keys (XDG_DATA_HOME/XDG_STATE_HOME/XDG_CACHE_HOME, and a default-modePI_CODING_AGENT_DIR) are now honored. Theenvloader rebuilds thedirsresolver after applying.envfiles (refreshDirsFromEnv()), so a profile.envthat points XDG roots elsewhere no longer leaks state into the home-based config dir. - Made
TempDircleanup retry transient WindowsEBUSY/EPERM/ENOTEMPTYremoval failures so tests are less likely to fail when deleting just-used temp directories. - Fixed
installRuntimeModuleResolver()to keep bare requests from runtime-cache modules inside that registered runtime before falling back to host/workspace packages.
[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
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()
[15.11.4] - 2026-06-12
Added
- 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).
[15.11.3] - 2026-06-11
Added
- 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).
[15.11.1] - 2026-06-11
Fixed
- Fixed cleanup reentry noise during fatal shutdown: recursive cleanup requests now no-op idempotently instead of logging repeated
Cleanup invoked recursivelyerrors (#2284).
[15.11.0] - 2026-06-10
Added
- 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
Fixed
- 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).
[15.10.11] - 2026-06-10
Added
- 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()(env): 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
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-identical
Fixed
- 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 markersomp <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.
[15.10.8] - 2026-06-09
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
[15.10.0] - 2026-06-06
Changed
logger.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.
[15.9.2] - 2026-06-05
Added
- Added
getAuthBrokerSnapshotCachePath()withOMP_AUTH_BROKER_SNAPSHOT_CACHEoverride support for isolating the encrypted broker snapshot cache.
[15.9.1] - 2026-06-04
Fixed
- 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).
[15.9.0] - 2026-06-04
Added
- 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).
[15.7.3] - 2026-05-31
Added
- Added
getFastembedCacheDirto return the FastEmbed model cache directory under ~/.omp/cache/fastembed
Fixed
- Fixed
$flagenvironment parsing to accept lowercase truthy values such asy,true,yes, andon
[15.6.0] - 2026-05-30
Added
- Added an XDG-aware tiny-title model cache directory helper for coding-agent local title models.