Commit Graph
535 Commits
Author SHA1 Message Date
Kevin LoftisandGitHub 5af63f755d fix: use --no-optional-locks for background git status calls (#188)
* fix: use --no-optional-locks for background git status calls

Prevent index.lock contention by adding --no-optional-locks to all
git status --porcelain calls. This is the same approach VSCode uses
in its built-in git extension (GIT_OPTIONAL_LOCKS=0).

The status-line component polls git status every ~1s to show
staged/unstaged/untracked counts. Without --no-optional-locks,
each call acquires index.lock for an opportunistic index refresh,
which blocks concurrent git operations (pull, rebase, commit) run
by the user or by omp's own tool execution.

The git-status documentation explicitly recommends this:
  'Scripts running status in the background should consider
   using git --no-optional-locks status'

References:
- git docs: https://git-scm.com/docs/git-status (BACKGROUND REFRESH)
- git commit adding the flag: https://github.com/git/git/commit/27344d6
- VSCode's fix: GIT_OPTIONAL_LOCKS=0 in extensions/git/src/git.ts:2716
- Claude Code same issue: https://github.com/anthropics/claude-code/issues/11005
- GitExtensions same issue: https://github.com/gitextensions/gitextensions/issues/5066
- VSCode issue #31069: https://github.com/microsoft/vscode/issues/31069

* style: fix biome formatting for long lines in worktree.ts
2026-02-27 11:59:39 +01:00
Kevin LoftisandGitHub 6c5b3739a4 feat: support explicit OAuth clientId and callbackPort in MCP server config (#189)
Add an optional `oauth` config block on MCP server entries in mcp.json,
allowing explicit `clientId` and `callbackPort` values for servers that
don't expose these through auto-discovery (e.g. Slack).

The `oauth.clientId` is used as a fallback — if the server's error
response or well-known metadata includes a client_id, that takes
precedence. The `callbackPort` defaults to 3000 when not specified.
2026-02-27 11:58:48 +01:00
can1357 6c42ad43b7 feat(coding-agent): no warning necessary for move
- Modified no-op detection logic to allow move-only operations with unchanged content.
2026-02-26 11:04:42 +01:00
can1357 8f78e50f1b Move poimandres themes into builtin defaults 2026-02-26 11:02:17 +01:00
can1357 0d87031f1b feat: added sampling control parameters (topP, topK, minP, penalties) to agent options
- Added topP, topK, minP, presencePenalty, and repetitionPenalty sampling control options to StreamOptions and AgentOptions interfaces.
- Implemented getter and setter properties on Agent class for runtime configuration of model sampling parameters.
- Added UI configuration and preset value providers for five new sampling parameters in coding-agent settings schema and components.
- Integrated sampling control parameters through proxy layer and agent session configuration for end-to-end provider support.
2026-02-26 10:20:41 +01:00
can1357 0e668a25ed fix: persist approved plan file to new session local directory
After plan approval, handleClearCommand() creates a new session with a
fresh artifacts directory. The local:// URL is session-scoped, so the
renamed plan file in the old session local dir was unreachable from
the execution session.

Write the plan content to the new session local dir after the session
switch so the titled plan artifact resolves correctly.
2026-02-26 09:45:23 +01:00
can1357 049a5a8a2c Merge PR #148 2026-02-26 09:16:56 +01:00
can1357 1c8b3f8cb3 Merge PR #155 and fix isolation merge regressions 2026-02-26 08:53:25 +01:00
lukeandGitHub bac30de126 feat: add PERPLEXITY_COOKIES env var for session cookie auth (#178)
Support Perplexity web search via session cookies extracted from
the desktop app (Electron/AppImage). Accepts either a raw cookie
string or a bare session token value.

Auth resolution order: PERPLEXITY_COOKIES > agent.db OAuth > PERPLEXITY_API_KEY
2026-02-26 08:42:53 +01:00
Kevin LoftisandGitHub bb9f899638 fix: prevent thundering herd of git status processes in status line (#180)
The #getGitStatus() method fires an async `git status --porcelain` but
only updates the TTL timestamp after the async completes. In large repos
where git status takes seconds, every TUI render cycle during that window
spawns a new process — cascading into hundreds of concurrent git processes,
exhausting file descriptors and creating .git/index.lock contention.

Add a #gitStatusInFlight boolean guard that ensures exactly one git status
process runs at a time. Use a finally block to unconditionally reset the
guard and refresh the TTL to completion time.
2026-02-26 08:41:56 +01:00
Chay ChoongandGitHub b29b06d73a fix(mcp): make disabledServers work on user-level third-party servers (#175)
The disabledServers mechanism introduced in 4bfa3b0c (Merge branch
'pr-82', 2026-02-16) was defeated by a level guard added after merge:
servers with _source.level === "user" were exempt from the disabled
check. This meant servers discovered from ~/.claude.json (which the
Claude provider tags as level "user") were never actually filtered out,
even when present in disabledServers.

Remove the level guard so disabledServers applies unconditionally. This
is safe because the /mcp disable command already uses updateMCPServer
(setting enabled: false inline) for servers defined in omp own configs;
the disabledServers path only fires for third-party discovered servers.

Also fix the /mcp list display to cross-filter discovered servers
against the disabled list, preventing a server from appearing both as
"connected" and "disabled" when the MCP manager has stale state.
2026-02-25 19:43:42 +01:00
Zakhar KoganandCan Bölük bb7f288489 fix(extensions): guard wrapTextWithAnsi with width validation
- Guard Container.render() to ensure width >= 1 for ALL components
- Guard TwoColumnBody.rightWidth with Math.max(0, ...)
- Validate description type before passing to native function
- Fall back to truncation when width <= 2

Fixes crash when opening extensions in narrow terminals.
2026-02-24 03:29:06 +01:00
can1357 a83175c94c refactor: migrated imports to unified package root and consolidated skill discovery logic
- Consolidated @oh-my-pi/pi-utils subpath imports into single package root import across 100+ files.
- Moved tryParseJson utility from local web scrapers module to @oh-my-pi/pi-utils package for centralized JSON parsing.
- Renamed loadSkillsFromDir to scanSkillsFromDir and refactored skill discovery to use fs.promises.readdir instead of glob-based approach.
- Replaced custom parseJSON with tryParseJson across discovery modules for consistent error handling.
- Removed emitCustomToolSessionEvent method and cleanupSshResources function, consolidating shutdown logic into dispose method.
- Updated glob pattern construction to use GlobBuilder with literal_separator(true) for improved path handling.
2026-02-23 20:59:17 +01:00
DeprecatedLuke 696d6ba545 feat(task): add better commit messages and nested repo isolation 2026-02-23 19:17:43 +00:00
DeprecatedLuke c1370f7332 feat(task): implement branch merge strategy for isolated tasks 2026-02-23 19:17:42 +00:00
can1357 4b60af5c47 feat(text-display): implemented configurable tab width
- Added a `display.tabWidth` setting to control default tab rendering.
- Integrated `.editorconfig` resolution for c ontext-aware tab indentation.
- Updated native text processing to use the resolved tab width for calculations.
- Improved tab visualization in diffs and other UI elements for consistency.
2026-02-23 15:00:06 +01:00
julia 85219821ff feat(oauth): Enabled manual OAuth callbacks via slash command input
- Introduced OAuthManualInputManager and routed callback-server logins to await pasted redirect URLs with a visible tip.
- Extended /login slash command to submit redirect URLs, block overlapping logins, and covered manual callbacks in tests.
- Propagated onManualCodeInput through OAuth provider login helpers with a default authorization prompt.
- Resolved docs index generation paths using path.resolve relative to the script directory.
2026-02-23 06:21:32 +00:00
can1357 0298a88601 feat(coding-agent): added in-memory todo phase management to ToolSession API
- Added getTodoPhases() and setTodoPhases() methods to ToolSession API for in-memory todo phase management.
- Added getLatestTodoPhasesFromEntries() export to retrieve todo phases from session history entries.
- Changed todo state management from file-based (todos.json) to in-memory session cache with automatic persistence.
- Changed todo phases to sync from session branch history during branching and rewriting operations.
- Removed file-based todo loading logic and replaced with session-based todo phase retrieval throughout codebase.
2026-02-22 19:11:24 +01:00
can1357 2574d4c977 feat(todo): add phased todo ops and task statuses 2026-02-22 18:35:06 +01:00
can1357 666a71e7b0 feat: add developer message role support 2026-02-22 18:34:49 +01:00
can1357 cd5c9655aa refactor: renamed notes protocol to local
- Renamed the `notes://` protocol to `local://` for better clarity.
- Updated all internal references, prompts, and tool documentation.
- Migrated plan storage paths to use the new `local://` scheme.
2026-02-22 18:05:22 +01:00
can1357 563d6a0ab9 feat(coding-agent): introduced notes:// protocol for session-scoped artifact storage
- Replaced plan:// protocol with notes:// for session-scoped artifact storage and plan finalization.
- Added title parameter to exit_plan_mode tool to enable plan file renaming during approval workflow.
- Implemented NotesProtocolHandler for notes:// URL scheme with path traversal protection and session fallback.
- Added renameApprovedPlanFile function to handle plan artifact finalization with validation and error handling.
- Updated system prompt documentation to reference notes:// protocol and internal URL schemes for artifact access.
2026-02-22 17:41:01 +01:00
can1357 d912e692d8 feat(coding-agent): added per-command PTY control to bash tool
- Added per-command `pty` parameter to bash tool for fine-grained PTY mode control.
- Removed global `bash.virtualTerminal` setting in favor of per-command PTY parameter.
- Fixed potential deadlock in shell session cleanup by replacing blocking lock with non-blocking try_lock.
- Updated async session key generation to include jobId for improved session isolation.
2026-02-22 16:58:46 +01:00
can1357 8b17a91a74 feat(coding-agent): introduced stripInternalArgs utility to filter harness-internal keys
- Added stripInternalArgs() utility function to filter harness-internal keys from tool arguments.
- Hidden agent__intent parameter from UI and log displays across agent, session, MCP, and tool-execution components.
- Implemented HIDDEN_ARG_KEYS constant to centrally manage internal argument filtering.
- Updated formatArgsInline() to exclude internal keys when rendering tool arguments.
2026-02-22 12:56:21 +01:00
can1357 23f472e44d fix status-line gap fill when right segments are present 2026-02-22 12:48:02 +01:00
can1357 476b858b3a feat(coding-agent): added async background job execution with configurable concurrency limits
- Added async background job execution for bash and task tools with configurable concurrency limits and automatic result delivery.
- Added cancel_job tool and /jobs slash command to manage and inspect running background jobs with status display.
- Added jobs:// internal protocol handler for querying job status and retrieving job execution details.
- Added async.enabled and async.maxJobs settings to control background job execution behavior.
- Enhanced status line to display count of running background jobs with visual indicator.
- Implemented AsyncJobManager with exponential backoff retry delivery, job lifecycle tracking, and automatic eviction.

Fixes #56.
2026-02-22 12:44:57 +01:00
can1357 abf8c1efc9 refactor: unslop common utilities 2026-02-22 11:01:11 +01:00
can1357 888a3b3307 refactor(coding-agent): migrated credential and utility logic to shared modules
- Extracted credential storage to shared @oh-my-pi/pi-ai package with AuthCredentialStore and AuthStorage classes.
- Consolidated UI formatting logic from ToolUIKit class into standalone utility functions across render-utils and output-meta modules.
- Moved utility functions (parseCommandArgs, substituteArgs, expandPath, normalizeUnicode) to dedicated modules for improved code reuse.
- Extracted JTD type definitions and type guards to jtd-utils module for shared use across schema conversion tools.
- Updated Claude model pricing and added cache read costs in models.json for accurate billing calculations.
- Refactored agent-storage to delegate credential management to AuthCredentialStore instead of direct SQLite operations.
2026-02-22 01:35:32 +01:00
can1357 e4225d6829 refactor(coding-agent): consolidated output utilities into streaming-output module
- Consolidated truncation and output utilities from tools/truncate.ts and tools/output-utils.ts into session/streaming-output.ts with improved UTF-8 boundary handling.
- Renamed formatSize() to formatBytes() across codebase for consistency and clarity in byte-level formatting.
- Refactored OutputSink to use windowed byte truncation instead of full-buffer encoding, improving memory efficiency on large outputs.
- Migrated from Buffer to Uint8Array in web scrapers for better cross-platform compatibility and native browser support.
- Added getArtifactManager() lazy-initialization method to ToolSession for deferred artifact manager instantiation.
- Simplified API surface with wildcard exports from tools and session modules, reducing import complexity.
2026-02-22 01:02:26 +01:00
can1357 0b1514da61 feat(coding-agent): added overlay UI option and fixed viewport sync race conditions
- Added overlay option to custom UI hooks for bottom-centered component display.
- Added automatic chat transcript rebuild when returning from custom or debug UI modes.
- Fixed race condition in bash interactive component preventing output append after closure.
- Extracted environment variable configuration into reusable NO_PAGER_ENV constant for bash execution.
- Fixed viewport synchronization issue in TUI causing terminal desync during full re-renders.
2026-02-21 22:52:59 +01:00
can1357 93e28a8029 refactor: consolidated timing instrumentation to centralized logger methods
- Migrated timing instrumentation from custom utils/timings module to centralized logger.time() and logger.timeAsync() methods across coding-agent and natives packages.
- Removed PI_DEBUG_STARTUP environment variable and debugStartup() function, consolidating debug output to logger.debug() for conditional logging.
- Replaced custom TextDecoder buffer decoding with native toString('utf-8') method in natives package for simplified string conversion.
- Added RingBuffer<T> circular buffer implementation to pi-utils with comprehensive test coverage for efficient queue operations.
- Enhanced logger interface with time() and timeAsync() methods providing unified operation timing and performance tracking across packages.
2026-02-21 22:42:18 +01:00
DeprecatedLukeandCan Bölük faf90b274b refactor(coding-agent)!: standardize renderCall signatures to (args, options, theme) 2026-02-21 15:50:31 +01:00
Can BölükandGitHub fca00fc8fa Merge branch 'main' into feat/cosmetic-fixes 2026-02-20 14:00:56 +01:00
can1357 94ee2f99ac fix(coding-agent): use ready-signal protocol for RPC client startup
Replace flaky time-based heuristic (sleep + 500ms race) with a proper
ready-signal protocol. The RPC server now emits {"type":"ready"} on
stdout when initialized, and the client waits for that signal instead
of guessing based on timing.

Fixes CI failure where the process took longer than 600ms to reach
provider validation (due to auth discovery + model registry refresh),
causing start() to resolve even when the process was about to exit.
2026-02-20 12:28:25 +01:00
can1357 c8230be4a7 fix(coding-agent): fail fast when RPC startup exits early 2026-02-20 11:01:37 +01:00
DeprecatedLuke ae2721c4cd fix(coding-agent): cosmetic TUI fixes - spinner icons, bracket styling, status icon placement 2026-02-19 23:46:20 +00:00
Can BölükandGitHub afe6be6dc2 Merge pull request #115 from kenvunz/fix/screen-flickering
fix(coding-agent): stopped forced redraws on autocomplete updates
2026-02-19 22:29:06 +01:00
Ken Vu b0a6d710fb fix(coding-agent): stopped forced redraws on autocomplete updates
onAutocompleteUpdate was calling requestRender(true), which resets all
differential rendering state on every keystroke while the slash menu is
open (debounced at 100ms). This caused the TUI to perform a full screen
clear and repaint on each filter update, producing visible flicker when
the editor is pushed to the bottom of the terminal.

onAutocompleteCancel retains requestRender(true) since it fires only
once on dismissal and the forced redraw is needed to erase the stale
menu rows that the differential renderer would otherwise leave on screen.

onAutocompleteUpdate is changed to requestRender() (no force), letting
the differential renderer repaint only the changed lines within the
autocomplete area.
2026-02-20 09:25:41 +13:00
can1357 7f3079bf2f feat(coding-agent): added streamed tool intent display and hashline edit operations
- Added streamed tool intent display in working message to show real-time intent tracking during agent execution.
- Changed intent tracing field name from `$intent` to `_intent` across tool schemas and agent core for consistency.
- Added support for file deletion and renaming operations in hashline edit mode.
- Renamed hashline edit operation fields: `set` to `target`/`new_content`, `set_range` to `first`/`last`/`new_content`, `insert` to `inserted_lines`.
2026-02-19 18:05:35 +01:00
can1357 e41ebe61ec feat(coding-agent): added SSH host management with CLI and slash commands
- Added SSH host management feature with `ssh` CLI command and `/ssh` slash command for add, list, and remove operations.
- Added SSH configuration support at project (.omp/ssh.json) and user (~/.omp/agent/ssh.json) scopes with host discovery from project files.
- Added SSH host configuration flags: --host, --user, --port, --key, --desc, --compat, and --scope for flexible host setup.
- Removed automatic line relocation on stale hash references; now fails with error instead.
2026-02-19 12:52:43 +01:00
can1357 c4e83d317a fix(coding-agent): deduplicate provider lists, fix priority order
- Export SEARCH_PROVIDER_ORDER from provider.ts as single source of truth
- Remove duplicate provider arrays from web-search.ts and web-search-cli.ts
- Add missing 'kimi' to CLI command validation (was causing --provider kimi to reject)
- Move perplexity to top of auto-resolve priority
- Fix kimi position in priority order to match documentation
2026-02-19 05:54:42 +01:00
oglassdevandcan1357 929e3d2c9b fix(coding-agent): format web search options 2026-02-19 05:53:14 +01:00
oglassdevandcan1357 487eb9166c feat(coding-agent): add kimi web search provider 2026-02-19 05:53:14 +01:00
can1357 081f1063d9 fix(coding-agent): hardened mermaid prerender failure handling
Fixes #109
2026-02-19 05:31:10 +01:00
can1357 4dac726c8d feat(coding-agent): added streaming text preview with real-time delta updates
- Added streaming text preview during agent specification generation with real-time text delta updates.
- Added `onRequestRender` callback to agent dashboard for async UI re-renders on state changes.
- Improved system prompt preview rendering with text wrapping and line count indicators.
- Enhanced agent creation flow to display generation status hint and reordered spec review before input form.
2026-02-19 05:13:33 +01:00
can1357 e403ab698c feat(coding-agent): introduced AI-powered agent creation with architect model
- Added AI-powered agent creation flow with architect model for generating custom agent specifications from natural language requests.
- Added keyboard shortcuts (N for new agent, R for regenerate) and scope selection (project/user) for agent creation workflow.
- Added model suggestions UI and success/error notices to agent dashboard for improved creation feedback.
- Added system prompts for agent-creation-architect and agent-creation-user roles with 6-step methodology and JSON schema validation.
- Added file persistence with YAML frontmatter for storing agent specifications at project or user scope.
2026-02-19 05:07:26 +01:00
can1357 69664396a8 fix(tui): fixed history navigation visibility and paging
Fixes #99
2026-02-19 05:06:10 +01:00
can1357 e2bb5041d2 feat(coding-agent): add Agent Control Center dashboard
Closes #93
2026-02-19 04:56:52 +01:00
can1357 50eeaed282 fix: hardened codex session state and cleared tui shrink artifacts 2026-02-19 04:33:45 +01:00
can1357 9fd37c0f0f fix(coding-agent): prevented enter from clearing hook editor
Handle plain Enter/Return in HookEditorComponent as newline input so the editor no longer triggers the submit-reset path when no onSubmit handler is wired.

Ctrl+Enter submit behavior remains unchanged.

Fixes #100
2026-02-19 04:12:54 +01:00