Commit Graph
319 Commits
Author SHA1 Message Date
can1357 d3575c752d feat(async): added job delivery acknowledgment
- Introduced mechanism to suppress future delivery attempts for acknowledged jobs.
- The AwaitTool acknowledges deliveries for jobs it finished awaiting.
- Prevents unnecessary retries and clears delivery queue for handled jobs.
2026-02-23 15:00:11 +01: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
can1357 90f68431bf Fix local URL resolution for bash destinations 2026-02-23 01:51:54 +01:00
can1357 a96178494a refactor(coding-agent): restructured tool schemas for consistency and clarity
- Renamed `file` parameter to `path` in edit tool schemas and all test cases for consistency.
- Removed `file` property fallback from EditRenderArgs interface and path resolution methods.
- Refactored browser viewport schema to use snake_case `device_scale_factor` with explicit camelCase mapping for Puppeteer API.
- Added hashline edit rule requiring `end` tag to include closing braces/brackets when replacing blocks.
- Refactored INTENT_FIELD injection logic to conditionally reorder schema properties and update required array.
2026-02-23 00:23:53 +01:00
can1357 0e1a4ef15a feat: strict mode + simplified hashline edit operations
- Consolidated `replace` operations and removed `insert`.
- Improved line hash collision resistance for symbol-only text.
2026-02-22 23:45:01 +01:00
can1357 0d628857c1 refactor(patch): consolidated edits into replace op 2026-02-22 19:24:55 +01: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 dfcc0958c7 fix: update abort handling / compaction tests 2026-02-22 18:44:25 +01:00
can1357 4a72bd659e feat(grep): improve grouped output and round-robin limiting 2026-02-22 18:35:19 +01:00
can1357 2574d4c977 feat(todo): add phased todo ops and task statuses 2026-02-22 18:35:06 +01:00
can1357 5f75455b91 feat: add blocking flag to bundled agents 2026-02-22 18:34:54 +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 4e8a3773c9 refactor(coding-agent): restructured XML tags to kebab-case format
- Renamed XML tags from underscore to kebab-case format for consistency across prompts and system messages.
- Updated context tag from `swarm_context` to `context` in render logic and test assertions.
- Consolidated conditional logic in subagent user prompt by removing duplicate assignment blocks.
- Updated system prompt documentation to reflect kebab-case naming convention for XML tags.
2026-02-22 17:57:52 +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 0197693cb1 fix(test): removed autocorrect heuristic tests for deleted functionality 2026-02-22 16:24:32 +01:00
can1357 d746edcd4b refactor(patch): removed experimental hashline utilities
- Removed replaceText edit operation and content-replace logic from hashline module.
- Removed autocorrect heuristics including line merge detection and whitespace normalization.
- Simplified edit operations to line-anchor-based methods (delete, rename, prepend, append, insert).
- Removed HL_REPLACE_ENABLED feature flag and related conditional logic.
2026-02-22 16:03:22 +01:00
can1357 2a35d016fd style(coding-agent): reformatted imports and array literals for consistency
- Reformatted import statements and array literal for consistency.
2026-02-22 15:34:51 +01:00
Miroslav DrbalandCan Bölük 8231ec3a7d fix(edit): do not strip leading '-' from replacement content
DIFF_PLUS_RE matched both '+' and '-' (unified-diff markers), but '-'
is also a valid Markdown/YAML list prefix. When all replacement lines
start with '- ', the 50%-threshold heuristic in stripNewLinePrefixes
fires and strips every leading '-', corrupting list-item content.

Narrow the regex to match only '+' (added-line markers), which is the
stated intent of the docstring and the safe strip target. Removed
lines ('-') are never valid replacement content in any case.

Reproducer: passing content=["- [x] item"] as a bare string to a
set/replace op — the '-' is silently dropped, writing ' [x] item'.
Passing content as string[] bypasses stripNewLinePrefixes entirely and
was the workaround, but the root cause should be fixed.
2026-02-22 15:22:34 +01:00
can1357 84edd931ff fix async job disposal pending state and cancelAll test ordering 2026-02-22 12:47:51 +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 8a49f11110 test(scrapers): increased PubMed timeout and relaxed metadata assertions for API variability
- Increased PubMed test timeout from 20s to 60s to accommodate slower network conditions.
- Updated metadata field assertions to handle variable response formats from PubMed API.
2026-02-22 12:01:26 +01:00
can1357 688d46b9ca test: added artifact allocation to test tool sessions
- Created unique artifact paths and directories for tests.
2026-02-22 11:53:18 +01:00
can1357 7ab8abbcf2 feat(scrapers): added retry mechanisms and data fallbacks
- Added retry logic to PubMed and OpenLibrary fetches.
- Implemented XML parsing fallback for Chocolatey package details.
- Restructured Hackage scraper to use .json and .cabal for metadata.
- Generated informative markdown for OpenCorporates API failures.
- Updated User-Agent headers for Repology.
2026-02-22 11:53:05 +01:00
can1357 469f1546f9 refactor(coding-agent): migrated artifact management to SessionManager for centralized control
- Moved artifact management from ToolSession to SessionManager for centralized lifecycle control and caching.
- Replaced getArtifactManager() with allocateOutputArtifact() async method in ToolSession interface for simplified artifact allocation.
- Updated bash, fetch, python, and ssh tools to call session.allocateOutputArtifact() directly with optional chaining fallback.
- Fixed Lobsters scraper to handle user fields as strings instead of nested objects in API responses.
2026-02-22 11:28:58 +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 6a7914b41f feat(ai): introduced GitLab Duo provider with OAuth and 16 models
- Added GitLab Duo provider with support for Claude, GPT-5, and Duo Chat models via GitLab AI Gateway.
- Added OAuth authentication for GitLab Duo with automatic token refresh, PKCE security, and 25-minute token caching.
- Added 16 new GitLab Duo models including Claude Opus/Sonnet/Haiku and GPT-5 variants with reasoning and multimodal support.
- Added `isOAuth` option to Anthropic provider for OAuth bearer token authentication mode.
- Exported `streamGitLabDuo`, `getGitLabDuoModels`, and `clearGitLabDuoDirectAccessCache` functions for GitLab Duo integration.
2026-02-22 01:02:26 +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 1932e175f5 feat(coding-agent): added Buffer.toBase64() polyfill for Bun compatibility
- Added Buffer.toBase64() polyfill for Bun compatibility to enable base64 encoding of buffers.
- Added test coverage for Buffer.toBase64() polyfill to verify base64 encoding functionality.
2026-02-21 22:59:04 +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 fc2c3c2c7c fix(coding-agent): corrected shell session state reset and hard timeout handling for command execution
- Fixed persistent shell session state not being reset after command abort or hard timeout.
- Fixed hard timeout handling to properly interrupt long-running commands exceeding grace period.
- Introduced hard timeout mechanism with Promise.race() to enforce absolute timeout limit and prevent command hangs.
- Replaced shell command execution with explicit timeout and SIGKILL signal handling in shell-snapshot.
- Simplified bash command normalization to use only explicit head/tail parameters from tool input.
- Exported getAntigravityUserAgent() function for centralized User-Agent header construction.
2026-02-21 16:52:37 +01:00
can1357 c199779a05 fix(task): corrected submit_result to terminate only on success
- Fixed submit_result tool to only terminate on successful execution instead of always terminating.
- Removed deferred termination logic and simplified abort behavior to call requestAbort immediately.
- Added submitResultCalled flag tracking to properly manage tool execution state.
- Added test coverage for submit_result tool retry behavior after execution errors.
2026-02-20 20:03:37 +01:00
can1357 a15c39ae7d feat(coding-agent/task): added subprocess output finalization with submit_result validation
- Exported `finalizeSubprocessOutput()` function and `SubmitResultItem` interface for subprocess output finalization with submit_result validation.
- Added automatic reminders (up to 3) when subagent stops without calling submit_result tool, aborting with exit code 1 after final reminder.
- Extracted subprocess output finalization logic into dedicated `finalizeSubprocessOutput()` function for improved testability and reusability.
- Added comprehensive test coverage for subagent warning injection, reminder behavior, and abort handling in executor module.
2026-02-20 17:15:02 +01:00
can1357 83e914d075 fix(submit-result): corrected submit_result validation to prevent false completion flags
- Added validation to submit_result tool to ensure status field is present and correctly typed as 'success' or 'aborted'.
- Fixed executor to only mark submitResultCalled when submit_result tool succeeds or aborts, preventing false positives on validation failures.
- Added type guards and error state checks to prevent setting completion flags on malformed tool execution results.
- Added comprehensive test coverage for submit_result extraction with valid and malformed payload validation.
2026-02-20 15:23:33 +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
can1357 09f0a46c6d fix(coding-agent): allow non-adjacent insert anchors 2026-02-20 10:38:37 +01:00
can1357 7ce3bb6906 feat(coding-agent): introduced hashline format v2 with colon separators and tag-based API
- Changed hashline format separator from pipe (|) to colon (:) for improved readability across all tools and output formats.
- Refactored hashline edit API with operation-based structure: renamed delete->rm, rename->mv, set->target/new_content, and added explicit op field for operation types.
- Updated hashline hash encoding from 4-character base36 to 2-character hexadecimal for more compact representation.
- Replaced anchor terminology with tags throughout hashline documentation and API for clearer semantics.
2026-02-19 22:04:18 +01:00
can1357 aea59fa3e5 style: formatting 2026-02-19 17:06:21 +01:00
can1357 d22fb5e878 feat(patch): added file deletion and rename operations to hashline edit mode
- Added file deletion and rename operations to hashline edit mode with atomic semantics.
- Renamed hashline edit operation keys and fields for clarity: set->target, set_range->first/last, insert->before/after, body->new_content/inserted_lines.
- Added optional content-replace edit variant in hashline mode via PI_HL_REPLACETXT environment variable.
- Enhanced edit validation with per-variant type checking and detailed error messages for malformed operations.
2026-02-19 17:00:45 +01:00
can1357 c9c1077272 feat(tools/grep): added artifact:// URL resolution to grep tool for backing file search
- Added support for resolving internal artifact:// URLs in grep tool to search backing files.
- Fixed grep tool to properly handle internal URL resolution with validation for missing backing files.
- Added comprehensive test suite covering artifact URL resolution, regex patterns, and error handling.
- Optimized CI matrix to conditionally include platform variants based on git tag presence.
2026-02-19 15:47:15 +01:00
can1357 2bdcd618ad feat: introduced hashline API redesign with structured operations and LINE#ID format
- Redesigned hashline edit API with new operation names (set, set_range, insert) and structured body parameter accepting string arrays for multiline edits.
- Changed hashline reference format from LINE:HASH to LINE#ID throughout tools and documentation for improved clarity.
- Enhanced insert operation to support optional before/after anchors enabling flexible insertion positioning and boundary echo stripping.
- Made hashline autocorrect heuristics conditional on PI_HL_AUTOCORRECT environment variable for controlled behavior.
- Added benchmark reports for claude-haiku-4-5 and GPT-5.2-Codex models demonstrating hashline edit variant performance.
2026-02-19 15:02:59 +01:00
can1357 a9fb9c9791 feat(react-edit-benchmark): resolved hashline regression with strict validation
- Added provider failure detection and exponential backoff retry logic to handle authentication and authorization errors in benchmark tasks.
- Implemented HashlineMismatchError behavior in coding-agent to fail on stale hash references instead of silently relocating edits.
- Simplified hashline validation by removing automatic line relocation logic and hash tracking infrastructure.
- Added benchmark report for claude-sonnet-4-6 model showing 85% task success rate with detailed failure analysis and performance metrics.
2026-02-19 12:52:13 +01:00
can1357 548b40c2da fix(coding-agent): stabilized codex model switch tests 2026-02-19 05:16:47 +01:00
can1357 50eeaed282 fix: hardened codex session state and cleared tui shrink artifacts 2026-02-19 04:33:45 +01:00
can1357 15497c3049 fix(coding-agent): updated test expectation to match "custom models" error message 2026-02-19 03:16:51 +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
Colin Mason b55e6901f3 fix(coding-agent): coerce autocomplete setting values in runtime handler 2026-02-18 09:40:19 -05:00
Colin Mason bf0bcf73e2 feat(coding-agent): expose autocomplete max items setting
Wire the existing TUI autocompleteMaxVisible plumbing into the
declarative settings system so it appears in /settings under the
Input tab. Users can pick from 3/5/7/10/15/20 items; the TUI editor
clamps to 3-20 regardless.

- Add autocompleteMaxVisible to SETTINGS_SCHEMA (number, default 5)
- Add OPTION_PROVIDERS entry for the submenu dropdown
- Handle runtime side-effect in selector-controller
- Set initial value from settings on editor construction
- Add tests for default, runtime, persistence, and config loading
2026-02-18 09:40:16 -05:00
can1357 ba1e3f8a07 fix(coding-agent): expanded internal url resolution and hardened memory protocol
Fixes #54
Fixes #74
2026-02-18 15:14:21 +01:00