Commit Graph

108 Commits

Author SHA1 Message Date
can1357 50eeaed282 fix: hardened codex session state and cleared tui shrink artifacts 2026-02-19 04:33:45 +01:00
can1357 ba6f668644 fix(coding-agent): prevented auto-compaction after handoff 2026-02-18 17:48:00 +01:00
can1357 a1efc5f4e1 refactor(coding-agent): simplified error handling and import organization
- Reorganized import statements in openai-compat.ts for consistency.
- Consolidated multi-line ternary expression into single line in openai-compat.ts.
- Simplified AgentBusyError instantiation to use default message.
- Updated test assertion to check error type instead of message content.
2026-02-18 17:47:59 +01:00
can1357 e6f8001d9e feat: added 11 AI providers with OAuth and $pickenv() fallback support
- Added support for 11 new AI providers (Hugging Face, NVIDIA, Together, Ollama, LiteLLM, Xiaomi, Moonshot, Venice, Qwen Portal, vLLM, Cloudflare AI Gateway) with API key authentication and login flows.
- Implemented $pickenv() utility for environment variable fallback chains, enabling multi-key resolution for providers with alternative credential names.
- Extended KnownProvider and OAuthProvider types to include all 11 new providers with corresponding model manager functions and OAuth handlers.
- Expanded models.json with thousands of new model entries across all new providers and replaced deprecated opencode provider with cloudflare-ai-gateway.
- Refactored model generation script to use unified fetchProviderModelsFromCatalog() and centralized API key resolution for all providers.
2026-02-18 17:47:59 +01:00
can1357 e88facfc80 feat(coding-agent): added AgentBusyError with auto-retry for concurrent operations
- Added AgentBusyError exception class for concurrent operation handling across agent packages.
- Added automatic retry logic with 30-second timeout for agent prompts when agent is busy.
- Changed concurrent operation errors from generic Error to AgentBusyError for better error handling.
- Fixed model discovery to use default refresh mode instead of explicit 'online' parameter.
2026-02-18 17:47:59 +01:00
can1357 bad4db1365 fix(models): aligned synthetic/cerebras auth and discovery 2026-02-18 15:43:46 +01:00
can1357 95c9bc4f52 fix(coding-agent): fixed ttsr injection persistence timing 2026-02-18 02:03:47 +01:00
can1357 2249529e70 feat(coding-agent): added TTSR injection tracking and deduplication
- Added TTSR injection tracking with per-turn recording and deduplication to prevent repeated rule injections within the same turn.
- Changed TTSR message format to use custom message type with metadata fields for improved injection tracking and session persistence.
- Fixed TTSR repeat-after-gap mode to correctly restore injected rules from previous sessions and recalculate gap thresholds.
- Added test suite with 6 test cases covering TTSR repeat modes (once, after-gap, restored) and injection deduplication behavior.
2026-02-18 01:53:02 +01:00
can1357 09f6c5d7bb feat(coding-agent): implemented scoped TTSR rules with interrupt modes and unified discovery
- Added scoped TTSR rule matching with condition and scope fields supporting file globs and tool-specific filtering.
- Added ttsr.interruptMode setting to control when TTSR rules interrupt agent responses (never/prose-only/tool-only/always).
- Added support for loading rules, prompts, and commands from ~/.agent/ directory with fallback to ~/.agents/.
- Refactored rule discovery across all providers to use unified buildRuleFromMarkdown helper and per-stream-key buffering.
- Enhanced TTSR pattern matching to respect tool-specific scope filters and normalize file paths in glob matching.
2026-02-17 23:40:13 +01:00
can1357 25231d0723 feat: exported terminal ID utilities and improved session directory naming
- Exported `getTerminalId()` and `getTtyPath()` functions from tui package for obtaining stable terminal identifiers with support for TTY device paths and terminal multiplexers.
- Improved path display in status line to strip both `/work/` and `~/Projects/` prefixes when abbreviating paths.
- Refactored session directory naming to use single-dash format for home-relative paths and double-dash format for absolute paths, with automatic migration of legacy session directories on first access.
- Implemented TTY ID utilities in tui package with platform-specific TTY path resolution using /proc/self/fd/0 on Linux, dlopen on macOS/BSD, and libc on other Unix systems.
- Added macOS path standardization to strip `/private` prefix from paths when both original and stripped paths resolve to the same location.
2026-02-17 09:23:30 +01:00
can1357 008879103d fix(coding-agent/session): fixed agent promotion by removing redundant duplicate candidate logic
- Removed redundant agent promotion logic that was adding duplicate candidates with larger context windows.
2026-02-16 21:13:10 +01:00
can1357 734bfd0ea5 Merge branch 'pr-80'
# Conflicts:
#	packages/coding-agent/CHANGELOG.md
2026-02-16 19:19:18 +01:00
can1357 0bbe52dee7 feat(coding-agent): changed context promotion to trigger on overflow errors instead of threshold
- Changed context promotion to trigger on context overflow errors instead of a configurable threshold percentage.
- Removed the contextPromotion.thresholdPercent configuration setting.
- Updated context promotion to retry immediately on the promoted model without requiring compaction.
- Refactored context promotion logic to attempt promotion before compaction in the overflow handling flow.
- Updated agent session to merge context promotion checks into the compaction method for unified overflow handling.
- Updated tests to reflect overflow-based promotion triggering instead of threshold-based promotion.
2026-02-16 18:33:05 +01:00
can1357 a61ee16b65 feat(ai): implemented context promotion target model property for improved fallback handling
- Added contextPromotionTarget model property to specify preferred fallback model when context promotion is triggered.
- Added automatic context promotion target assignment for Spark models to their base model equivalents.
- Updated Qwen model context window and max token limits for improved accuracy.
- Updated o1 model context window from 256000 to 262144 tokens and max tokens from 64000 to 65536 tokens.
- Implemented context promotion logic to use configured contextPromotionTarget when available instead of role-based model resolution.
2026-02-16 18:33:04 +01:00
can1357 14beadd9b5 feat(coding-agent/session): enforced minimum 15% context window floor for session compaction reserves
- Added effectiveReserveTokens() function to enforce a minimum 15% context window floor for session compaction reserve calculations.
- Updated shouldCompact() to use effectiveReserveTokens() instead of raw configured reserve, ensuring more predictable compaction behavior regardless of configuration.
2026-02-16 18:33:03 +01:00
can1357 f193dc85b0 feat(session/compaction): limited file operation summary to 20 files per category with omitted count
- Implemented file operation summary limiting to 20 files per category with indication of omitted files when exceeded.
- Added truncateFileList() helper function to limit file arrays and append ellipsis message showing omitted file count.
- Added stripFileOperationTags() helper function to remove XML file operation tags from summary strings.
- Introduced upsertFileOperations() function to merge base summary with file operations by stripping old tags and concatenating new ones.
- Refactored branch-summarization and compaction modules to use new upsertFileOperations() function instead of formatFileOperations().
2026-02-16 18:33:03 +01:00
can1357 a2db7789b7 feat(coding-agent): implemented automatic context promotion to larger models when approaching limits
- Added automatic context promotion feature that switches to larger-context models when approaching context limits.
- Added 'contextPromotion.enabled' setting to control automatic model promotion with default value of enabled.
- Added 'contextPromotion.thresholdPercent' setting to configure context usage threshold for triggering promotion with default value of 90%.
- Implemented context promotion logic in AgentSession that monitors token usage and automatically switches models when threshold is exceeded.
- Added provider session cleanup during model switches to properly handle session state transitions.
- Added comprehensive test coverage for context promotion functionality including threshold-based promotion and non-promotion scenarios.
2026-02-16 18:33:03 +01:00
can1357 13d06f712c fix(coding-agent): suppress hashline output for agents without edit tool
Hashline prefixes (LINE:HASH|content) in read/grep output exist solely to
support the hashline edit mode. Agents that don't have the edit tool
(e.g. explore, plan, reviewer) gain nothing from them — they just waste
tokens and add noise.

resolveFileDisplayMode now takes a session-like object with an optional
hasEditTool flag. When false, hashlines are suppressed regardless of
settings. ToolSession gains hasEditTool (set from toolNames in the SDK),
and AgentSession exposes it as a getter over the tool registry.
2026-02-16 13:43:35 +01:00
can1357 c12be01a5f fix(coding-agent): backported pi-mono changes (34878e..5133697)
packages/ai:
- fix: hardened OpenAI tool-call JSON parsing for malformed trailing arguments
- feat: routed GitHub Copilot Claude 4.x models through anthropic-messages
- feat: centralized dynamic Copilot headers and anthropic bearer auth handling
- feat: added optional StreamOptions.metadata propagation
- test: added Copilot headers/auth/routing coverage
- fix: updated model generator and models.json for Copilot Claude API mapping

packages/coding-agent:
- fix: made CLI model resolution deterministic with provider-aware pattern parsing
- fix: corrected compaction boundary/context usage handling after compaction
- feat: expanded extension events and terminal input hook integration
- fix: hardened git source parsing to avoid local-path misclassification
- test: added git-url parser coverage and model-resolver cases

packages/tui:
- fix: scoped @ fuzzy autocomplete to typed path prefixes
- feat: added Windows VT input mode support via bun:ffi

docs:
- chore: updated porting sync point to 5133697
2026-02-16 10:08:53 +01:00
can1357 d6bd208c25 fix: deferred model resolution and extension provider registration
- Fixes deferred `--model` resolution to match extension-provided models before fallback
- Fixes CLI `--api-key` handling to support deferred model selection
- Adds OAuth provider support for extensions with source-scoped registration cleanup
- Adds custom API registration helpers with built-in collision checks
- Expands `Api` type to support extension-defined identifiers
- Adds tests for runtime provider registration and model selection
2026-02-16 04:52:33 +01:00
luk 2924495bfd feat(secrets): add secret obfuscation with regex flags support 2026-02-15 17:02:33 +00:00
can1357 a155d98f9f feat(coding-agent): auto-switch dark/light theme via SIGWINCH
Replace single `theme` setting with `theme.dark` and `theme.light`.
Auto-detection is always on — COLORFGBG determines which slot to use.
On SIGWINCH, re-check COLORFGBG and switch themes if background changed.
Old `theme` setting auto-migrated using luminance detection.

Fixes #65
2026-02-15 10:20:11 +01:00
can1357 918bf9b043 style: formatting 2026-02-15 09:44:56 +01:00
can1357 6cf89113f2 merge: PR #71 (closes #71) 2026-02-15 09:40:45 +01:00
can1357 473e51ff44 merge: PR #70 (closes #70) 2026-02-15 09:40:45 +01:00
can1357 dc0a126dd0 fix(coding-agent): guarded prompt setup race in abort_and_prompt with generation counter 2026-02-15 09:39:47 +01:00
can1357 d7711748b6 fix(coding-agent): called abort before extension callbacks on TTSR interruption and excluded aborted streams from retry guard 2026-02-15 09:19:17 +01:00
Chris Watson 1ece498a17 feat(coding-agent): expose runtime lifecycle signals to extensions and custom tools
Also stabilizes extension/skills test suites by isolating user-installed extensions and tightening skill source gating.
2026-02-15 09:13:57 +01:00
Chris Watson 315aa32115 fix(coding-agent): improve todo progress tracking reliability 2026-02-15 09:13:56 +01:00
luk 04556b44a5 feat(coding-agent/rpc): add abort_and_prompt command
New RPC command that atomically aborts the current turn and starts
a new one with the given message, avoiding the race condition of
separate abort + wait + prompt calls.

Fix session.abort() not clearing promptInFlight flag due to
microtask ordering (waitForIdle resolves before promptWithMessage
finally block), which left isStreaming true and blocked subsequent
prompts.
2026-02-15 09:13:54 +01:00
can1357 2e33e436b4 feat: switched to native text sanitization, removed Bun.stripANSI
- Added `sanitizeText` function to pi-natives that strips ANSI escape sequences, removes control characters and lone surrogates, and normalizes line endings.
- Moved `sanitizeText` function from `@oh-my-pi/pi-utils` to `@oh-my-pi/pi-natives` for better code organization and native performance.
- Added line length clamping (4000 characters) to bash and Python execution output to prevent excessively long lines.
- Replaced internal `#normalizeOutput` methods with `sanitizeText` utility function in bash and Python execution components.
- Fixed bash interactive tool to gracefully handle malformed output chunks by normalizing them with `sanitizeText`.
- Simplified documentation by removing WASM terminology from package descriptions and comments.
2026-02-14 03:25:13 +01:00
can1357 4571e505d9 feat(coding-agent): implemented codex-style memory system with two-phase extraction and consolidation pipeline
- Added autonomous memory extraction and consolidation system with two-phase pipeline for extracting durable knowledge and consolidating into reusable skills.
- Added /memory slash command with subcommands (view, clear, reset, enqueue, rebuild) for inspecting and managing memory maintenance.
- Added configurable memory settings including concurrency limits, lease timeouts, token budgets, and rollout age constraints.
- Added memory injection payload that includes learned context in system prompts with operational rules for reading and using memory artifacts.
- Improved system prompt building to support memory guidance injection and enhanced error handling in resolvePromptInput function for multiline input.
2026-02-14 02:02:48 +01:00
can1357 87010ea61e feat: added WebSocket retry logic with configurable budget and enum-based transport policy
- Added automatic retry logic for WebSocket stream closures before response completion with configurable retry budget.
- Changed `providers.openaiWebsockets` setting from boolean to enum with values 'auto', 'off', 'on' for more granular WebSocket policy control.
- Implemented WebSocket stream retry mechanism that attempts reconnection before falling back to SSE transport when retry budget is exhausted.
- Fixed WebSocket stream retry logic to properly handle mid-stream connection closures and preferWebsockets option handling.
- Added helper functions isCodexWebSocketTransportError() and isCodexWebSocketRetryableStreamError() to classify WebSocket errors.
- Reorganized imports across multiple files for better code organization and consistency.
2026-02-14 00:58:42 +01:00
can1357 26f0eb378c feat: added WebSocket session state management and retry logic with idle timeout detection
- Added `providerSessionState` option to share provider state map for session-scoped transport and session caches.
- Added WebSocket retry logic with configurable retry budget and delays via environment variables.
- Added WebSocket idle timeout detection to prevent hanging connections.
- Added WebSocket v2 beta header support for newer protocol versions.
- Added WebSocket handshake header capture to extract and replay session metadata.
- Implemented automatic cleanup of provider session state resources on session disposal.
2026-02-14 00:26:04 +01:00
can1357 d1e16d2101 refactor: implemented $PWD > cwd to prevent macOS symlink resolution
- Replaced all direct `process.cwd()` calls with `getProjectDir()` utility function across 40+ files to centralize project directory resolution logic.
- Added `getProjectDir()` and `setProjectDir()` functions to `@oh-my-pi/pi-utils/dirs` module to provide abstracted project directory management.
- Made `SessionManager.list()` method asynchronous to support asynchronous session discovery operations.
- Updated default working directory resolution throughout codebase to use `getProjectDir()` instead of `process.cwd()` for improved project directory detection.
2026-02-13 23:40:02 +01:00
can1357 fcd7ff4f84 refactor(dirs): centralized directory path utilities into @oh-my-pi/pi-utils/dirs module
- Extracted directory path utilities from multiple packages into a centralized '@oh-my-pi/pi-utils/dirs' module.
- Moved 30+ path helper functions (getAgentDir, getConfigRootDir, getPluginsDir, getMCPConfigPath, etc.) from scattered locations into a single shared utility module.
- Consolidated APP_NAME, CONFIG_DIR_NAME, and VERSION constants into the centralized dirs module for reuse across packages.
- Updated 70+ import statements across packages/ai, packages/coding-agent, packages/stats, and packages/tui to use the new centralized module.
- Removed local path construction logic and replaced with utility function calls for improved maintainability and consistency.
- Deleted packages/coding-agent/src/extensibility/plugins/paths.ts as its functions were moved to the centralized dirs module.
2026-02-13 15:06:05 +01:00
can1357 02bf493ba8 fix(coding-agent): handled fully exhausted oauth rotation
Fixes #55.
2026-02-13 12:28:46 +01:00
can1357 df7a45b774 feat(coding-agent): added /move command to relocate sessions to different working directories
- Added /move slash command to allow users to relocate sessions to different working directories.
- Added moveTo() method to SessionManager for programmatic session relocation with file system operations and rollback support.
- Added refreshSlashCommandState() method to InteractiveMode for dynamic slash command reloading when changing directories.
- Added setSlashCommands() method to AgentSession to allow external management of file-based slash commands.
- Added handleMoveCommand() handler in command-controller to process /move commands with validation and error handling.
2026-02-12 02:38:59 +01:00
can1357 2e0cbf9f4c feat(oauth): added Perplexity OAuth authentication with native macOS app extraction and email OTP flows
- Added Perplexity OAuth authentication support with native macOS app extraction and email OTP login flows.
- Implemented loginPerplexity and refreshPerplexityToken functions for OAuth token management.
- Created PerplexitySocket class providing Socket.IO v4 client over Engine.IO v4 WebSocket transport with RPC support.
- Added OAuth authentication to Perplexity web search provider with automatic token refresh and SSE streaming support.
- Extended SearchResponse interface with authMode field to track authentication method (oauth or api_key).
- Changed PerplexityProvider.isAvailable() to async to support OAuth token availability checking.
2026-02-12 02:31:58 +01:00
can1357 ebab346561 fix(pr-merge): fixed copilot initiator and provider login regressions 2026-02-12 00:25:11 +01:00
Chris Watson f4a4aad60d feat(ai): add MiniMax Coding Plan to OAuth login menu
Add MiniMax Coding Plan providers to the interactive login menu:
- minimax-code (International): https://api.minimax.io/v1
- minimax-code-cn (China): https://api.minimaxi.com/v1

Both use API key flow (not OAuth):
- Opens browser to https://platform.minimax.io/subscribe/coding-plan
- User subscribes and pastes API key back to CLI
- API keys stored as OAuth credentials with never-expire timestamp
2026-02-12 00:20:40 +01:00
Chris Watson 103174ba13 feat(ai): add Z.AI (GLM Coding Plan) as login provider
Add support for z.ai's GLM Coding Plan as a provider accessible via `/login`.
Implements API key-based authentication similar to Kimi Code.

Changes:
- Create login flow in `utils/oauth/zai.ts` with browser redirect to API keys page
- Add API key storage methods (`saveApiKey`, `getApiKey`) to CliAuthStorage
- Register Z.AI in OAuth provider types, exports, and CLI handler
- Add GLM-5 model to Z.AI provider

Users can now authenticate with:
 bunx @oh-my-pi/pi-ai login zai
2026-02-12 00:19:00 +01:00
can1357 f10f60c786 feat(coding-agent): refactored file display mode handling and improved hashline format readability
- Changed hashline display format separator from pipe to two spaces for improved readability.
- Removed `lines` and `hashes` parameters from read tool in favor of automatic file display mode resolution.
- Added `resolveFileDisplayMode` utility to centralize file display mode configuration logic.
- Integrated file display mode settings into grep and read tools for consistent output formatting.
- Consolidated tool parameter types to use schema-derived types via Typebox `Static` utility.
- Updated parseLineRef to handle both legacy pipe-separator and new two-space hashline formats.
2026-02-11 12:11:08 +01:00
Dev Ned 7e4bedf18b Runtime MCP support (#17)
* + /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>
2026-02-10 14:09:41 +01:00
can1357 acf8ab5225 style: stylistic changes 2026-02-10 07:39:39 +01:00
can1357 a777ad179d fix(coding-agent): fixed bash tool hanging and file size validation for large @mentions
- Fixed bash tool hanging with background jobs by implementing timeout-based cancellation and draining stdout/stderr pipes instead of waiting indefinitely for EOF.
- Fixed crash when auto-reading large @mentions by adding file size validation (5MB for text, 25MB for images) before reading file contents.
- Prevented out-of-memory issues by skipping files exceeding size limits and displaying file size information in UI for skipped files.
- Added GB file size formatting support to handle very large files in human-readable format.
- Added file size display in UI for skipped files to inform users why files were not included.
- Added test case verifying bash executor returns correctly when command spawns background jobs.
2026-02-10 03:26:43 +01:00
can1357 1c84a70417 fix(coding-agent): backported pi-mono changes (9ce00079..34878e)
packages/ai:
- feat: added OpenAI Codex stream test
- fix: google-gemini-cli provider cleanup
- fix: google-shared provider improvements
- fix: amazon-bedrock provider fix
- fix: openai-codex-responses provider fix
- chore: regenerated models

packages/coding-agent:
- feat: extension API reload method and UI sub-protocol
- feat: tilde expansion in custom skill directories
- feat: RPC mode reload support
- feat: tools-manager improvements
- fix: CLI args updates
- docs: extensions and RPC documentation updates

packages/tui:
- feat: kill-ring and undo-stack modules
- feat: editor enhancements (kill/yank, undo/redo)
- feat: input component improvements

packages/agent:
- test: agent test additions
2026-02-10 03:15:19 +01:00
can1357 ba8b9de696 fix(coding-agent): backported pi-mono changes (9ce0007..f9161c4)
packages/agent:
- feat: added hasQueuedMessages() and dequeue helpers for steering/follow-up queues
- fix: resume queued messages from continue() after auto-compaction

packages/ai:
- feat: added Bedrock cache retention support with PI_CACHE_RETENTION env var
- feat: added adaptive thinking for Bedrock Opus 4.6+ models
- feat: added AWS_BEDROCK_SKIP_AUTH for unauthenticated Bedrock proxies
- feat: added AWS_BEDROCK_FORCE_HTTP1 for custom endpoints requiring HTTP/1.1
- feat: re-exported Static, TSchema, Type from @sinclair/typebox
- fix: disabled OpenAI Responses storage by default (store: false)
- fix: clamped reasoning effort for gpt-5.3 Codex models (minimal -> low)
- fix: Bedrock supportsPromptCaching checks model cost fields

packages/coding-agent:
- feat: added /quit slash command as alias for /exit
- feat: added per-model overrides (modelOverrides) in models.json
- feat: merged custom models with built-ins by provider+id instead of replacing
- fix: assistant message spacer before tool executions without visible content
- fix: extension runner emit() type safety with narrowed event/result types
- fix: extension runner tool_result event chaining via dedicated emitToolResult()
- fix: queued messages not delivered after auto-compaction completes
2026-02-07 04:59:57 +01:00
can1357 25d7156ac5 feat(coding-agent/session): added terminal breadcrumb tracking for concurrent session management
- Added terminal breadcrumb tracking to remember the last session per terminal, enabling `--continue` to work correctly with concurrent sessions in different terminals.
- Implemented `getTerminalId()` function to identify the current terminal using TTY device path or environment variables (Kitty, tmux, macOS Terminal, Windows Terminal).
- Implemented `writeTerminalBreadcrumb()` function to persist terminal-to-session mappings in the agent directory.
- Implemented `readTerminalBreadcrumb()` function to retrieve the last session for the current terminal, scoped to the current working directory.
- Modified session initialization to write breadcrumbs when loading or creating sessions, ensuring terminal context is preserved.
2026-02-06 09:41:38 +01:00
can1357 aa69f5dd3d feat(coding-agent): refactored screenshot and image handling for PNG-only format and improved memory efficiency
- Changed screenshot format to always use PNG instead of supporting JPEG with quality parameter.
- Changed default extract_readable format from text to markdown.
- Changed screenshot storage to use temporary directory with Snowflake IDs instead of artifacts directory.
- Changed ResizedImage interface to return buffer as Uint8Array with lazy-loaded base64 data getter for improved memory efficiency.
- Removed JPEG quality parameter from screenshot options.
- Removed ability to save screenshots to custom paths or artifacts directory.
2026-02-06 09:20:32 +01:00