28 KiB
28 KiB
Changelog
[Unreleased]
Fixed
- Fixed the Markdown renderer incorrectly breaking into a raw code block when a 4-space-indented line (such as a box-drawing tree child under a └── branch) directly followed paragraph text; it now correctly stays part of the paragraph, matching standard Markdown behavior.
[17.3.2] - 2026-08-13
Fixed
- Fixed
fetchWithRetry()aborts during retry backoff to preserve the documented"Request was aborted"error contract (#8450).
[17.3.0] - 2026-08-13
Fixed
- Optimized performance of partial JSON parsing for long streaming tool-call arguments.
- Fixed Mermaid ASCII multi-word edge labels where routed lines would show through spaces.
[17.2.15] - 2026-08-12
Changed
- Extended parsed Server-Sent Events (SSE) to include optional id and retry fields, enabling reconnecting transports to retain stream cursors and respect server-requested retry intervals.
[17.2.13] - 2026-08-11
Changed
- Changed stale process-log retention from the newest five files globally to one newest file per completed process and day within the current and previous four local calendar days. This preserves bounded daily diagnostic coverage while continuing to remove one-use audit files.
- Changed outbound User-Agent consumers to share the versioned
USER_AGENTconstant (omp/<version>).
Fixed
- Fixed Mermaid ASCII state pseudostates rendering empty boxes, miscoloring final-state borders, and inverting rounded corners in bottom-to-top diagrams.
[17.2.11] - 2026-08-07
Added
- Added
repairandrawKeysoptions toparseFrontmatterto support spec-conformant loading (disabling lenient recovery and preserving keys verbatim), and exportednormalizeFrontmatterKeysfor manual key normalization.
Fixed
- Fixed the in-house
markedlist tokenizer incorrectly consuming trailing blank lines at the end of input, ensuring correct list tightness and token generation matching standardmarkedbehavior.
[17.2.10] - 2026-08-06
Added
- Introduced zero-dependency in-house modules replacing external packages, importable via
@oh-my-pi/pi-utils/<module>:acp(Agent Client Protocol),browsers(Chrome for Testing discovery/install),chalk(ANSI styling),dates(date formatting),dom(HTML parser, WHATWG DOM subset, and CSS selectors),docx(DOCX to HTML),headers(browser header generation),lru(LRU cache),marked(GFM markdown lexer/parser),readability(article extraction),template(Handlebars-compatible templating),turndown(HTML to Markdown),vterm(headless terminal emulator), andxml(XML parser). - Added postmortem fatal recovery hint providers to allow applications to print actionable recovery commands before cleanup starts.
Changed
- Rewrote the logger file backend in-house, maintaining the identical line format, daily rotation, and pruning behavior without external dependencies.
Fixed
- Fixed PowerShell (
powershell.exe/pwsh) support when used as a customshellPathby correctly passing-NoLogo -Command(and-NoProfileunderPI_BASH_NO_LOGIN) instead of POSIX flags. - Fixed the in-house
markedlist tokenizer consuming the trailing blank line into the list token when the next top-level line was a plain paragraph. The blank now always becomes a separatespacetoken (matching real marked), so a list's token shape no longer depends on what follows it — restoring the TUI streaming lexer's freeze invariant — and a list followed by a paragraph is tight, not loose, per CommonMark. - Added the missing Handlebars built-in
lookuphelper to the in-housetemplateengine ({{lookup obj key}}, proto-safe property access; a user-registeredlookuphelper still takes precedence).
Removed
- Removed external dependencies on
handlebars,winston, andwinston-daily-rotate-file.
[17.2.9] - 2026-08-05
Added
- Added a public
compareVersionsutility (@oh-my-pi/pi-utils) that compares two version strings with SemVer-2.0 prerelease ordering, build-metadata stripping, and numeric segment comparison without float overflow; never throws.
Fixed
- Honor the current process
PATHwhen caching executable lookups, preventing stale tool paths after environment reloads. - Parsed account-cap reset windows such as “Your limit will reset in 13 minutes” so credential backoff honors the provider's full reset duration.
[17.2.6] - 2026-08-03
Added
- Added a shared
file-lockutility backed by process-owned native OS locks with automatic crash release and bounded asynchronous retry.
[17.2.5] - 2026-08-03
Added
- Added utility functions
parseFlag(),getBrowserRelayDir(), andgetGlobalDaemonRuntimeDir()to support browser relay mode and global daemon runtime directory resolution.
Changed
- Updated the lightweight CLI runner to support static command metadata, allowing root help to render without importing full command implementations.
[17.2.4] - 2026-08-01
Added
- Added
getSecretPlaceholderKeyPath(),getDaemonRuntimeDir(),getProviderInFlightRoot(), andgetMarketplacesRegistryPath()to resolve secret key, daemon runtime, provider in-flight, and marketplace registry paths under their respective XDG categories (state, data) instead of the config root. - Existing installs enabling XDG keep their data: a legacy
~/.omp/agent/secret-placeholder.keyor~/.omp/marketplaces.jsonis copied to its XDG location on first resolution, so persisted transcripts still deobfuscate and added marketplaces survive the move.
Changed
- Headless hosts (print/RPC/ACP/eval/SDK) now use a 1s SQLite
busy_timeoutfor the session-critical databases (agent.db, history.db, stats.db) viagetDbBusyTimeoutMs(), so lock contention no longer freezes the protocol loop for the full interactive 5s timeout; interactive hosts keep the 5s timeout.
Fixed
- Fixed Bun test-runtime detection treating application-owned
NODE_ENV=testandBUN_ENV=testvalues as test-runner signals (#7261).
[17.2.1] - 2026-07-30
Added
- Added a
postmortem.quitconfiguration option to safely handle shutdown paths when the terminal output has already disconnected. - Added project-keyed OMP security-state directory helpers under the user state root.
[17.1.8] - 2026-07-28
Added
- Added
setProcessNameutility to set the OS-visible process name on Linux viabun:ffi, bypassing Bun'sprocess.titlelimitations.
Fixed
- Fixed child shell environment filtering to drop launch-directory
.envvalues in addition to Bun-autoloaded.env.localvalues.
[17.1.5] - 2026-07-27
Fixed
getShellConfigno longer throwsNo bash shell foundon Windows hosts without a discoverable bash.resolveWindowsShellsearches Git for Windows install roots (machine, per-user,GIT_INSTALL_ROOT, scoop app dirs — scoop shimssh.exe/git.exebut neverbash.exe), thenbash.exe/sh.exeon PATH, and finally falls back tocmd.exefrom ComSpec with/cargs, so shell resolution always succeeds.
[17.1.4] - 2026-07-26
Fixed
- Fixed postmortem signal and fatal shutdown exits being intercepted by temporary
process.exitguards during extension startup (#6488). - Corrected Windows shell resolution errors to identify the active global, project, overlay, or runtime source for
shellPathinstead of directing every user to the retiredsettings.jsonfile (#6579). - Contained timed-out child lifecycle rejections so
ptreecallers cannot leak an unhandledTimeoutErrorafter settling (#6635). - Fixed an invalid configured
shellPathbeing silently masked whenever an earlier caller had already resolved a shell in the same process; the guidance error now surfaces regardless of cache state.
[17.0.9] - 2026-07-23
Breaking Changes
- Renamed
getAutoQaDbDirtogetAutoQaDbPathfor accuracy; update any usage accordingly
[17.0.5] - 2026-07-18
Changed
- Updated
installRuntimeModuleResolverto return an uninstaller function that restores the stocknode:moduleresolver once all runtime roots are unregistered. - Added documentation regarding a known limitation with Bun 1.3.14's
createRequirebehavior when the module resolver patch is active.
[17.0.2] - 2026-07-17
Added
- Added a structured log sink API (
registerLogSink,LogEvent,LogLevel) to the centralized logger, enabling out-of-band consumers (such as OpenTelemetry) to receive log events without affecting local file or console logging.
Changed
- Bounded default
ptree.ChildProcessstderr retention to a 32 KiB tail to prevent memory leaks in long-lived subprocesses. Full stderr capture must now be explicitly requested at spawn time using{ stderr: "full" }onspawnorexec.
Fixed
- Fixed fatal cleanup failing to reach
process.exit()when terminal stderr is revoked. - Isolated rotating log files and audit state per process to prevent concurrent instances from racing during compression and rotation.
[17.0.1] - 2026-07-16
Fixed
- Added scoped graceful handling for stdio-write EPIPE rejections so protocol servers can await postmortem cleanup when their peer disconnects (#4788).
[17.0.0] - 2026-07-15
Fixed
- Improved SSE streaming performance by batching complete lines into a single UTF-8 decode per chunk, reducing decoder overhead.
- Fixed an issue in
parseFrontmatterwhere a single malformed YAML line would corrupt sibling values by parsing each line independently.
[16.5.2] - 2026-07-14
Fixed
- Improved CLI argument and flag validation error output to display a concise error message and command usage instead of a minified code frame.
- Corrected required variadic positionals to render as
MODELS...instead of[MODELS]in usage help.
[16.5.1] - 2026-07-14
Added
- Added terminal stderr guard utilities (suppressTerminalStderr and restoreTerminalStderr) to prevent macOS runtime diagnostics from corrupting TUI viewports while ensuring crash reports remain visible.
Fixed
- Fixed an issue in Mermaid ASCII routing where unreachable edge attachment points caused unbounded pathfinder searches.
[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.