- Extracted cross-platform URL and file path opening logic into a unified `openPath` utility function.
- Removed duplicate platform-specific browser opening code from five modules (stats-cli, debug, login-dialog, command-controller, mcp-command-controller) and replaced with calls to the centralized utility.
- Simplified error handling by delegating platform detection and command execution to the reusable utility function.
- Added computeHashlineDiff function to compute diffs for hashline-based edits without applying them.
- Added support for hashline edits in tool execution with caching mechanism to avoid redundant diff computations.
- Added formatStreamingHashlineEdits function to format and display hashline edits with configurable limits.
- Enhanced EditRenderArgs interface with optional previewDiff and edits fields for hashline mode support.
- Refactored import paths from absolute package-scoped imports to relative imports for better module resolution.
- Added missing type annotation for `settings` parameter in `resolvePrimaryModel` function.
- Added missing type annotation for `settings` parameter in `resolveSmolModel` function.
- Added missing type annotation for `settings` parameter in `ModelSelectorComponent` constructor.
- Added `temperature` configuration setting to control LLM sampling temperature with values from 0 (deterministic) to 1 (creative) to -1 (provider default).
- Added temperature option selector in settings UI with preset values: Default, 0, 0.2, 0.5, 0.7, 1.
- Renamed `settingsInstance` parameter to `settings` in `CreateAgentSessionOptions` for consistency.
- Updated all internal references from `settingsInstance` to `settings` throughout SDK and components.
- Integrated temperature setting into agent configuration and selector controller.
- Removed unsafe OAuth endpoint extraction from error message text
- Fixed PKCE verifier storage with typed #codeVerifier field
- Fixed refresh token fallback using access token as refresh token
- Enforced restrictive file permissions (0o700/0o600) for MCP configs
- Fixed wizard buildConfig() to respect user-chosen env var and header names
- Fixed reauth endpoint discovery for non-OAuth servers
- Stored original config on connection, resolved config only for transport
- Added runtime type validation for enabled/timeout in config loaders
- Converted all TS private keywords to ES # private fields
- Wrapped uncaught throws in /mcp add with try/catch error handling
- Replaced new Promise with Promise.withResolvers() pattern
- Sanitized TUI output with replaceTabs/truncateToWidth
- Enforced http/https URL validation in add wizard
- Fixed greedy /mcp prefix match in input controller
- Corrected config filename references in MCP guide
- Added server name validation to updateMCPServer
- Fixed timeout timer leak in stdio transport
* + /mcp
- Reloads MCP manager in runtime state (no restart needed) and syncs with mcp.json.
- Handles OAuth discovery/auth flow automatically for auth-required servers.
- Validates server names and config shape before saving.
- Persists OAuth credentials in auth storage and links them to MCP config.
- Provides immediate connection checks and clear status messages.
- Supports enable/disable, reauth, and unauth flows that are easy to get wrong by hand.
* active agent tool registry runtime reload + token support for bearer auth http based transport
* +session rebind on succesful connection
* fix(coding-agent): address /mcp check failures
---------
Co-authored-by: can1357 <me@can.ac>
- Migrated console.error() calls to structured logger.warn() and logger.error() throughout codebase.
- Updated os.tmpdir() import style in browser tool from destructured to namespace import.
- Renamed XML tag `<important>` to `<caution>` across system prompts and tool documentation for improved semantic clarity.
- Collapsed multi-line function calls to single lines in diff component formatting for improved code conciseness.
- Consolidated emoji guideline into critical section in write tool documentation.
- Fixed whitespace visualization in CHANGELOG diff output and corrected incomplete text.
- Added visualization of leading whitespace (indentation) in diff output with dim glyphs--tabs display as ` -> ` and spaces as `·` for improved readability.
- Implemented visualizeIndent() function to normalize and display indentation patterns, collapsing 3-space groups into tab arrows and marking individual spaces with middle dots.
- Removed getCursorPosition() method from Component interface and implementations, eliminating hardware cursor positioning support.
- Changed PI_HARDWARE_CURSOR environment variable default from implicit true to explicit '1' with fallback pattern.
- Changed PI_CLEAR_ON_SHRINK environment variable default from implicit false to explicit '0' with fallback pattern.
- Added screen clearing on TUI startup to prevent shell prompts from bleeding into first rendered frame.
- Refactored full-render logic into reusable fullRender() helper function.
- Implemented width-aware text truncation across all tool renderers to respect terminal width constraints and prevent output overflow.
- Enhanced render caching to include width parameter for cache invalidation when terminal width changes, improving cache accuracy.
- Migrated truncateToWidth function imports from render-utils to centralized tui module for better code organization.
- Introduced Hasher utility for generating width-aware cache keys in calculator, find, grep, todo-write, and write tools.
- Optimized box component rendering to only truncate lines that exceed content width, reducing unnecessary truncation operations.
- Replaced ASCII ellipsis characters (three dots '...') with Unicode ellipsis character ('...') throughout the codebase for improved typography.
- Adjusted string truncation logic to account for single-character Unicode ellipsis instead of three-character ASCII ellipsis, reducing reserved space from 3 to 1 character in truncation calculations.
- Updated truncation offsets in multiple files (session-manager, agent, executor, footer) to preserve 2 additional characters before ellipsis due to more compact Unicode representation.
- Implemented caching for tool output block rendering to avoid redundant computations on re-renders.
- Enhanced read tool grouping to prevent coalescing across narrative boundaries (text/thinking blocks between tool calls).
- Improved string preview formatting to detect multi-line strings and display line counts with ellipsis indicators.
- Refactored tool execution component to use reactive render state tracking for better state management.
- Enhanced error handling in tool renderers with logging for failures.
- Fixed truncation indicator to use ellipsis character instead of verbose suffix.
- Renamed web search types and functions to remove 'Web' prefix for broader applicability (WebSearchProvider -> SearchProviderId, WebSearchResponse -> SearchResponse, WebSearchTool -> SearchTool, etc.).
- Refactored web search provider system from object-based configuration to class-based architecture with abstract SearchProvider base class and concrete provider implementations.
- Refactored ModelRegistry to use direct constructor instantiation instead of discoverModels() helper function, simplifying model discovery pattern.
- Refactored config system to use new ConfigFile class with schema validation, caching, and multi-format support (JSON, JSONC, YAML).
- Simplified Exa API key discovery to check environment variables only, removing .env file reading logic.
- Converted class properties to TypeScript parameter properties across 51 files to reduce boilerplate code.
- Removed explicit field declarations and manual assignments in constructors by using TypeScript's parameter property syntax with access modifiers.
- Applied consistent pattern of declaring private readonly and public readonly properties directly in constructor parameters.
- Converted SubmenuSettingDef.getOptions() method to options getter property for improved API ergonomics.
- Changed OptionProvider type to support both static arrays and function providers, enabling simpler configuration of option lists.
- Added createSubmenuSettingDef() helper function to simplify creation of submenu settings with flexible option providers.
- Refactored internal option provider definitions to use static arrays instead of arrow functions where applicable.
- Updated SelectSubmenu to enforce immutability of options parameter using ReadonlyArray type.
- Refactored select-list.ts to use TypeScript parameter properties for cleaner constructor implementation.
- Extracted external editor handling logic into shared utility module to reduce code duplication across hook-editor and input-controller components.
- Created new external-editor utility module with getEditorCommand() and openInEditor() functions for centralizing editor process management and temporary file handling.
- Simplified hook-editor component by replacing manual editor spawning and file operations with openInEditor() utility function call.
- Simplified input-controller component by replacing manual editor spawning and file operations with openInEditor() utility function call.
- Added UI dropdown options for `task.maxRecursionDepth` setting with presets (Unlimited, None, Single, Double, Triple).
- Added UI dropdown options for `grep.contextBefore` setting with presets (0-5 lines).
- Added UI dropdown options for `grep.contextAfter` setting with presets (0-10 lines).
- Simplified `task.maxRecursionDepth` description in settings UI to remove specific value examples.
- Replaced nanoid and randomUUID with Snowflake ID generator across codebase for consistent distributed ID generation.
- Created new Snowflake utility module in packages/utils with support for 64-bit distributed ID generation with configurable epoch, machine ID, and sequence numbers.
- Updated session ID format documentation from nanoid to snowflake hex string format (16 hex characters).
- Removed nanoid dependency from package.json as it is now replaced by internal Snowflake implementation.
- Migrated environment variable access from function-based `getEnv()` API to object property-based `$env` API across 43 files in the monorepo.
- Simplified `packages/utils/src/env.ts` by removing scoped environment variable logic (EnvScope, getEnvMap, getEnv functions) and replacing with direct `process.env` reference exported as `$env`.
- Updated `packages/ai/src/stream.ts` to remove environment parameter from KeyResolver functions and use global `$env` object instead of passed-in env parameter.
- Migrated environment variable access from direct process.env to centralized getEnv() utility function across all packages.
- Renamed environment variable prefix from OMP_ to PI_ throughout codebase (e.g., OMP_CODING_AGENT_DIR -> PI_CODING_AGENT_DIR).
- Removed automatic environment variable migration from PI_ to OMP_ prefixes via migrate-env.ts module.
- Removed env setting from configuration schema and applyEnvironmentVariables() method from settings.
- Updated CI/CD build configuration to use PI_COMPILED flag instead of OMP_COMPILED.
- Changed venvPath property in PythonRuntime from nullable (string | null) to optional (string | undefined).
- Added terminal-capabilities module with NotifyProtocol enum and notification formatting/sending methods to TerminalInfo class.
- Renamed TERMINAL_INFO export to TERMINAL and consolidated terminal image/capability exports from terminal-image to terminal-capabilities module.
- Removed terminal-image module exports from public API with functionality migrated to terminal-capabilities.
- Simplified notification settings in coding-agent by removing protocol detection logic and delegating to TERMINAL.sendNotification().
- Removed terminal-notify.ts utility module from coding-agent, consolidating notification handling into pi-tui package.
- Added task.maxConcurrency configuration setting with default value of 32 to control concurrent execution limits for subagents.
- Added UI options for task concurrency configuration with 8 preset levels (Unlimited, 1, 2, 4, 8, 16, 32, 64) in the tools settings tab.
- Changed task concurrency to be configurable via task.maxConcurrency setting instead of hardcoded MAX_CONCURRENCY constant.
- Changed concurrency limit calculation to support unlimited concurrency when task.maxConcurrency is set to 0.
- Removed MAX_CONCURRENCY constant and associated hardcoded concurrency limit from task execution.
- Updated task execution to dynamically retrieve maxConcurrency from session settings instead of using imported constant.
- Removed WASM-specific naming conventions and terminology throughout the codebase, including import aliases, comments, and type aliases.
- Removed legacy type aliases 'WasmMatch' and 'WasmSearchResult' from grep types module.
- Removed TypeScript module declaration for '*.wasm?raw' file imports.
- Updated error handling in task executor to properly handle stopReason === 'error' case with exit code and error message capture.
- Simplified documentation comments to remove implementation details about WASM and Photon library internals.
- Updated README to reflect shift from WASM to N-API for pi-natives crate implementation.
- Added 'commit' model role for dedicated commit message generation.
- Exported 'resolveModelOverride' function from model-resolver module for public use.
- Refactored model role system to centralize role configuration in MODEL_ROLES registry.
- Extracted model resolution utilities into dedicated model-resolver module for improved code organization.
- Made 'tag' and 'color' properties optional in ModelRoleInfo interface to support roles without visual indicators.
- Enhanced model selector with defensive null/undefined checks for optional role properties.
- Added default generic type parameter to Model interface, allowing Model to be used without explicit type argument.
- Removed explicit <any> generic type parameters from Model type annotations throughout codebase, leveraging new default parameter.
- Centralized model role system into MODEL_ROLES registry with metadata (tag, name, color) and MODEL_ROLE_IDS array for consistent role management across the codebase.
- Refactored model selector to dynamically generate menu actions from MODEL_ROLES registry instead of hardcoded role definitions.
- Simplified model role resolution by replacing hardcoded role checks with loops over MODEL_ROLE_IDS array.
- Removed support for 'omp/' model role prefix in favor of 'pi/' prefix throughout model selection, task execution, and configuration.
- Added getModelRoles() and overrideModelRoles() helper methods to Settings class for cleaner model role management.
- Added exclusive concurrency mode enforcement to file-modifying tools (edit, write, bash, python, ssh, todo-write) by introducing a new public `concurrency` property set to "exclusive" on each tool class.
- Updated CHANGELOG.md to document the enforcement of exclusive concurrency mode for file-modifying tools.
- Cleaned up imports in tool-execution.ts by removing unused Theme type import and reordering imports for better organization.
- Extracted JSON tree rendering utilities into dedicated module for reuse across tool renderers.
- Moved formatArgsInline, renderJsonTreeLines, and related constants from mcp/render.ts to tools/json-tree.ts.
- Updated tool-execution.ts to import and use shared JSON tree rendering functions.
- Reorganized settings tabs from 8 to 10 tabs with improved categorization: Display, Agent, Input, Tools, Config, Services, Bash, LSP, TTSR, and Status.
- Moved behavior-related settings (thinking level, steering mode, retry attempts) from Behavior tab to new Agent tab.
- Moved input/interaction settings (escape action, collapse changelog, notifications) to new Input tab.
- Moved tool configuration settings (line numbers, fuzzy matching, patch mode) from Tools tab to new Config tab.
- Moved provider and external service settings (web, image, exa) to new Services tab.
- Removed type guard functions (isBashToolResult, isReadToolResult, isEditToolResult, isWriteToolResult, isGrepToolResult, isFindToolResult, isLsToolResult) from public API exports.
- Renamed `EllipsisKind` enum to `Ellipsis` across all packages for clearer API naming.
- Refactored Rust text module from 356 to 155 lines with simplified state tracking using u32 ColorVal instead of enum ColorCode and named attribute constants.
- Removed `Env` parameter from public NAPI functions `truncate_to_width` and `extract_segments` to simplify API surface.
- Changed return type of `truncate_to_width` from `JsString` to `Either<JsString, Utf16String>` to support zero-copy returns.
- Removed early return optimization in `truncateToWidth()` function.
- Reordered native module search paths to prioritize repository build artifacts over system paths.
- Changed TextInput type parameter to string in truncateToWidth(), visibleWidth(), sliceWithWidth(), and extractSegments() functions in native bindings.
- Removed TextInput type export from public API of pi-natives package.
- Removed format.ellipsis symbol from theme configuration, replacing all theme-based ellipsis references with hardcoded Unicode ellipsis character (...).
- Removed ellipsis property from SymbolTheme interface in pi-tui package.
- Removed truncateToWidth, sliceWithWidth, and extractSegments wrapper functions from pi-tui public API, now re-exporting directly from pi-natives.
- Added early return optimizations in truncateToWidth() and sliceWithWidth() native functions to skip native calls when possible.
- Replaced SettingsManager class with new Settings singleton providing synchronous get/set API and background persistence.
- Introduced settings-schema.ts as single source of truth for all configuration definitions with 100+ settings organized into logical groups.
- Migrated from method-based settings access (getTheme(), setTheme()) to path-based access using dot notation (settings.get('theme'), settings.set('theme', value)).
- Removed 2035-line settings-manager.ts file and replaced with modular settings.ts (693 lines) and settings-schema.ts (836 lines) for improved maintainability.
- Unified settings schema into single source of truth eliminating duplicate definitions across settings-defs.ts and settings-manager.ts.
- Extracted manual space padding logic into a reusable `padding()` utility function across all UI components and utilities.
- Optimized padding operations by introducing a pre-allocated 512-space buffer in the `padding()` function to reduce repeated string allocations.
- Updated all imports across 30 files to use the new `padding()` function from pi-tui instead of inline `' '.repeat()` calls.
- Renamed local variables from `padding` to `pad`, `padSize`, `indent`, or `linePad` to avoid naming conflicts with the imported `padding()` function.
- Exported the `padding()` utility function from the tui package index for public use.
- Added persistent shell session support for bash tool with environment variable preservation across commands.
- Added shellForceBasic setting to force bash/sh even if user's default shell is different (default: true).
- Added OMP_SHELL_PERSIST environment variable to control persistent shell behavior (set to 0 to disable).
- Restructured system prompt with coordinator-specific guidance for parallel task delegation.
- Added grep CLI subcommand with support for pattern matching, file globbing, context lines, and multiple output modes (content, files-with-matches, count).
- Added diff syntax highlighting support with distinct colors for inserted and deleted lines in code output.
- Implemented FileReader abstraction for cross-platform file reading with mmap support and 4MB size limit.
- Refactored worker pool initialization to support both compiled and development build environments using resolveWorkerSpecifier utility.
- Enhanced markdown rendering with improved inline style context handling and blockquote formatting with text wrapping.
- Replaced external strip-ansi dependency with Bun's built-in stripANSI method across all packages.
- Added Kimi Code provider with support for both OpenAI and Anthropic API formats.
- Added kimiApiFormat configuration option to allow users to select between 'openai' and 'anthropic' API formats for Kimi Code provider.
- Added Kimi API format setting in the tools configuration tab with descriptions for each format option.
- Refactored Anthropic provider authentication logic to support multiple API endpoints including Kimi's Anthropic-compatible API.
- Updated OpenAI completions provider to route direct Kimi models to dedicated Kimi provider implementation.
- Replaced interface-based terminal capabilities with class-based TerminalInfo model.
- Converted ImageProtocol from union type to enum with escape sequence values.
- Removed detectCapabilities, getCapabilities, and resetCapabilitiesCache functions in favor of eager TERMINAL_ID and TERMINAL_INFO constants.
- Introduced TerminalId type and KNOWN_TERMINALS registry for terminal detection.
- Updated renderImage and TUI.queryCellSize to use TERMINAL_INFO directly instead of calling getCapabilities().
- Updated exports in index.ts to reflect new API surface.
- Added native text utilities in pi-natives (visible width, truncation, slicing, segment extraction)
- Wired pi-tui to use native implementations with short-string JS fast path
- Optimized key matching via cached parsed key ids
- Refactored visual truncation to reuse Text instances
- Reduced theme color lookups by switching from Map to plain records
- Regenerated WASM artifacts
Benchmarks (after vs before, lower is better):
- truncateToWidth/ansi: 20.37ms vs 38.13ms (2000 iters)
- sliceWithWidth/ansi: 5.12ms vs 20.39ms
- extractSegments/ansi: 8.92ms vs 27.60ms
- truncateToVisualLines: 3.51ms vs 411.55ms (500 iters)
- visibleWidth/ansi: 0.24ms vs 0.31ms
- Added configurable ask timeout and notification settings to control ask tool behavior and user notifications.
- Added AskSettings interface with timeout (in seconds, default 30) and notification method properties to settings manager.
- Added ask timeout and notification configuration options to settings UI with values for timeout (off, 15, 30, 60, 120 seconds) and notification methods (auto, bell, osc99, osc9, off).
- Refactored process execution across multiple tools (exec, fetch, grep, read, youtube scraper) to use centralized ptree.execText() API instead of custom implementations.
- Refactored ChildProcess class in ptree to use public readonly properties and Promise.withResolvers() for cleaner exit handling.
- Added outline option to dialog and select UI components for rendering outlined lists in extension dialogs and ask tool.
- Replaced ripgrep-based file listing with fs.glob for project scans in system-prompt, find, and read tools.
- Added timeout tracking to ask tool multi-select flow to prevent hanging on selection operations.
- Created new OutlinedList component in hook-selector for rendering bordered list containers.
- Implemented globPaths utility function in pi-utils for glob-based file discovery with gitignore support.
- Added reset() method to CountdownTimer class to allow resetting countdown to initial value.
- Added initialMs field to CountdownTimer to track original timeout duration.
- Integrated countdown reset into HookSelectorComponent to reset timer on user interaction.
- Added SkillMessageComponent to render /skill command messages as compact skill entries with expandable/collapsible UI showing skill metadata and optional full prompt content.
- Added promptCustomMessage() public method to AgentSession to support custom message types with metadata and details properties.
- Added SKILL_PROMPT_MESSAGE_TYPE constant and SkillPromptDetails interface to support skill-specific message handling.
- Enhanced patch tool documentation with guidance on structured block editing, error recovery, and best practices for maintaining code integrity.
- Refactored message handling in AgentSession by extracting _promptWithMessage() private method to consolidate common logic between prompt() and promptCustomMessage().
- Added timeout support to hook selector with auto-selection behavior on timeout.
- Extended ExtensionUIDialogOptions to include timeout and tui configuration properties.
- Changed hook selector timeout behavior from cancellation to auto-selecting the currently highlighted option.
- Updated UIContext.select() method signature to accept timeout option for automated selection scenarios.