Commit Graph

571 Commits

Author SHA1 Message Date
can1357 084de48d4b fix: updated CI workflows and TypeBox validation for build compatibility
- Updated CI workflows to include explicit coding-agent build step for proper binary compilation.
- Changed TypeBox validation from ts-expect-error to explicit any cast to resolve CJS/ESM type mismatch.
2026-01-02 22:55:00 +01:00
can1357 2665c03402 fix: corrected test expectations and template string interpolation 2026-01-02 22:52:27 +01:00
can1357 ddc240592f ci(workflows): consolidated release automation into unified publish workflow
- Replaced build-binaries workflow with unified publish workflow to consolidate release automation.
- Added matrix-based parallel binary builds across platforms for faster release cycles.
- Simplified CI workflow by removing concurrency settings and adding CLI smoke tests.
- Added npm publish step with provenance support for secure package distribution.
- Introduced skip_npm input to allow binary-only releases when needed.
2026-01-02 22:40:25 +01:00
can1357 26fd43d999 refactor(coding-agent): improved process cleanup with tree kill
- Replaced process group kill with descendant-aware tree traversal to handle non-leader processes.
- Added pgrep-based child discovery with /proc fallback for broader Linux compatibility.
- Introduced optional grace period parameter to allow SIGTERM before SIGKILL for graceful shutdown.
- Simplified focus return value in interactive mode for consistency.
2026-01-02 22:33:26 +01:00
can1357 e43e6bc236 feat(tui): added TabBar component for horizontal tab navigation
- Added TabBar component to enable horizontal tab navigation with keyboard support.
- Refactored settings selector to use tabbed interface for better organization of Config, Exa, and Plugins sections.
- Added Shift+Space handling via Kitty protocol to fix space insertion in editor.
- Removed redundant LSP explanation text from system prompt for conciseness.
2026-01-02 22:31:27 +01:00
can1357 cfb99df249 feat(coding-agent): added specialized Exa tools with granular toggles
- Added specialized Exa web search tools for deep search, code context, URL crawling, LinkedIn, and company research.
- Implemented settings UI for granular control over Exa tool availability with per-feature toggles.
- Changed Exa addon defaults to disabled to prevent unexpected API usage for LinkedIn, company, researcher, and websets features.
- Added settings manager methods to persist individual Exa feature preferences.
2026-01-02 22:26:21 +01:00
can1357 fbae5cbb0d refactor(coding-agent): simplified toolset and enhanced navigation
- Removed ast and replace tools to simplify toolset and reduce maintenance overhead.
- Added LSP call hierarchy support (incoming_calls, outgoing_calls) for better code navigation.
- Added Exa as web search provider alongside Anthropic and Perplexity for broader search options.
- Enhanced tool descriptions with detailed usage guidelines to improve agent tool selection.
- Simplified task tool by removing single-mode execution and agentScope parameter.
- Added GitHub tree rendering and improved web-fetch documentation for better URL handling.
2026-01-02 22:13:05 +01:00
can1357 8ca26c58a1 feat(coding-agent): added bash interception to guide tool selection
- Added bash interception layer to redirect shell patterns like grep/cat/find to specialized tools for better results.
- Introduced anti-bash rules in system prompt to guide LLM toward preferred tool hierarchy (lsp > ast > grep > find > read > edit > bash).
- Enhanced LSP tool description to emphasize semantic code queries over text-based grep searches.
- Simplified edit tool by enabling fuzzy matching by default to reduce friction from whitespace mismatches.
- Updated error messages to provide context-aware guidance based on fuzzy matching state.
2026-01-02 21:44:49 +01:00
can1357 eac529bc30 feat(coding-agent): added fuzzy matching to handle indentation variance
- Added fuzzy matching with Levenshtein distance to handle whitespace and indentation differences in edit operations.
- Implemented configurable similarity threshold (default 95%) to balance precision with flexibility.
- Added detailed error messages showing closest match location and similarity percentage to aid debugging.
- Updated edit tool schema to expose fuzzy parameter for user control over matching behavior.
2026-01-02 21:07:11 +01:00
can1357 2be354322d chore: renamed package scope to @oh-my-pi for consistent branding
- Renamed npm package scope from @mariozechner to @oh-my-pi across all packages for consistent branding.
- Removed packages/pods directory and all related pod management functionality.
- Updated import paths and module declarations throughout codebase to reflect new package names.
- Reformatted code with consistent trailing comma removal and ternary operator alignment.
2026-01-02 18:08:23 +01:00
can1357 560c9670a8 feat: added MCP support and plugin system for external tool integration
- Added MCP (Model Context Protocol) support with stdio and HTTP transports for external tool integration.
- Implemented plugin system with install, enable, configure, and doctor commands for extensibility.
- Added 22 Exa MCP tools for web search, LinkedIn, company research, and websets operations.
- Introduced LSP tool with rust-analyzer support for code intelligence (diagnostics, hover, references, code actions).
- Added task tool for delegating work to specialized subagents with parallel execution support.
- Implemented web_search and web_fetch tools with Anthropic and Perplexity provider support.
2026-01-02 17:54:42 +01:00
can1357 36467c2a57 feat(coding-agent): added git context to system prompt for repo awareness
- Added git context loading to system prompt to provide AI with repository state awareness.
- Implemented automatic detection of main/master branch to support varied repository conventions.
- Included current branch, git status, and recent commits snapshot for contextual understanding.
2026-01-02 15:12:32 +01:00
can1357 47c6849a5a feat(tui): added emergency terminal restore to prevent corrupted state on crashes
- Added emergency terminal restore function to reset terminal state on crashes without requiring instance access.
- Implemented crash handlers for SIGTERM, SIGHUP, uncaught exceptions, and unhandled rejections to ensure clean terminal exit.
- Added active terminal tracking to enable blind restore when no instance is available.
2026-01-02 15:10:14 +01:00
can1357 cf5c4286f1 feat(tui): overhauled UI with welcome screen and powerline footer
- Implemented a new welcome screen component for startup.
- Introduced a powerline-style footer with integrated git status, model info, and token usage.
- Consolidated extension loading messages into a new `/status` command.
- Added `?` hotkey to display shortcuts when the editor is empty.
2026-01-02 15:05:36 +01:00
can1357 b85d3f6aa4 merge(pi/main): integrate upstream changes through v0.31.1
Merged 53 commits from pi/main including:
- Export HTML rewrite with tree sidebar and /share command
- Hooks API enhancements (custom status, editor, session management)
- Edit diff preview before tool execution
- TUI fixes (Unicode format chars, OSC 8 hyperlinks, emoji optimization)
- Gemini CLI rate limit retry with server-provided delay
- Various bug fixes and documentation updates

Resolved conflicts by preserving Bun migration (spawn→Bun.spawn,
fs→Bun.file) while accepting upstream's new features and APIs.
2026-01-02 14:34:27 +01:00
can1357 1cee37cf92 build: migrated from Node.js to Bun for native TypeScript support
- Migrated from Node.js to Bun runtime to leverage native TypeScript execution and faster startup times.
- Replaced npm with bun package manager and updated lockfile format.
- Converted Node.js APIs (child_process, fs, readline) to Bun equivalents across all packages.
- Updated shebang lines from node/tsx to bun for CLI entry points.
- Removed TypeScript build step by using source files directly as package entry points.
- Updated CI workflows to use Bun instead of Node.js for installation and testing.
2026-01-02 13:46:05 +01:00
Mario Zechner 7396b1e3c4 fix: export type guard functions at runtime, fixes #397 2026-01-02 10:37:28 +01:00
Armin Ronacher 5c8f7344d4 Fix arrow key in model selector prior to model loading (#398) 2026-01-02 10:31:48 +01:00
Mario Zechner 3eb55518eb Fix edit tool failing on files with UTF-8 BOM
Strip BOM before matching (LLM won't include invisible BOM in oldText),
restore on write.

Based on #394 by @prathamdby
2026-01-02 01:57:24 +01:00
Mario Zechner b3c416d556 Fix BorderedLoader to pass theme to DynamicBorder
BorderedLoader receives theme as a parameter but was creating
DynamicBorder() without passing it, causing DynamicBorder to
fall back to the global theme variable which is undefined when
loaded via jiti (separate module cache).

Added doc comment to DynamicBorder explaining the jiti issue.
2026-01-02 01:21:07 +01:00
Mario Zechner bb5070171b Fix DynamicBorder crash when theme not initialized
Make DynamicBorder defensive against undefined theme by checking
at render time instead of relying on default parameter closure.
2026-01-02 01:15:45 +01:00
Mario Zechner d8b94822c8 fix(coding-agent): prevent full re-renders during write tool streaming
Move line count from header to footer to avoid changing the first line
during streaming, which was triggering full screen re-renders in the
TUI's differential rendering logic.
2026-01-02 01:11:06 +01:00
Mario Zechner 4b0e345353 Remove unnecessary comments from types 2026-01-02 00:39:54 +01:00
Mario Zechner 1ed86c8bd1 Add Clawd summary comments to hook and custom tool types 2026-01-02 00:32:38 +01:00
Mario Zechner bfdfb96bf8 Add agent state methods to CustomToolContext and fix abort signature
CustomToolContext now has:
- isIdle() - check if agent is streaming
- hasQueuedMessages() - check if user has queued messages
- abort() - abort current operation (fire-and-forget)

Changed abort() signature from Promise<void> to void in both
HookContext and CustomToolContext. The abort is fire-and-forget:
it calls session.abort() without awaiting, so the abort signal
is set immediately while waitForIdle() runs in the background.

Fixes #388
2026-01-02 00:31:23 +01:00
Mario Zechner 321462bda7 Split HookContext and HookCommandContext to prevent deadlocks
HookContext (all events):
- isIdle() - read-only state check
- hasQueuedMessages() - read-only state check
- abort() - fire-and-forget, does not wait

HookCommandContext (slash commands only):
- waitForIdle() - waits for agent to finish
- newSession(options?) - create new session
- branch(entryId) - branch from entry
- navigateTree(targetId, options?) - navigate session tree

Session control methods moved from HookAPI (pi.*) to HookCommandContext (ctx.*)
because they can deadlock when called from event handlers that run inside
the agent loop (tool_call, tool_result, context events).
2026-01-02 00:24:58 +01:00
Mario Zechner cd7df64220 Add session management and agent state methods to hooks API
HookAPI additions:
- pi.newSession(options?) - create new session with optional setup callback
- pi.branch(entryId) - branch from a specific entry
- pi.navigateTree(targetId, options?) - navigate the session tree

HookContext additions:
- ctx.isIdle() - check if agent is streaming
- ctx.waitForIdle() - wait for agent to finish
- ctx.abort() - abort current operation
- ctx.hasQueuedMessages() - check for queued user messages

These enable hooks to programmatically manage sessions (handoff, templates)
and check agent state before showing interactive UI.

Fixes #388
2026-01-01 23:56:24 +01:00
Mario Zechner f107f980c9 Consolidate session events: remove session_before_new/session_new, add reason field to switch events
- Remove session_before_new and session_new hook events
- Add reason: 'new' | 'resume' to session_before_switch and session_switch events
- Remove 'new' reason from custom tool onSession (use 'switch' for both /new and /resume)
- Rename reset() to newSession(options?) in AgentSession
- Add NewSessionOptions with optional parentSession for lineage tracking
- Rename branchedFrom to parentSession in SessionHeader
- Rename RPC reset command to new_session with optional parentSession
- Update example hooks to use new event structure
- Update documentation and changelog

Based on discussion in #293
2026-01-01 23:31:26 +01:00
Mario Zechner 7cc7150125 Remove extra spacer before loader in BorderedLoader 2026-01-01 22:30:19 +01:00
Mario Zechner 06ae57b2c9 Add theme-configurable HTML export colors (from PR #387)
- Add optional 'export' section to theme JSON with pageBg, cardBg, infoBg
- If not specified, colors are auto-derived from userMessageBg
- Add export colors to dark.json and light.json
- Update theme-schema.json and TypeBox schema
- Add documentation to docs/theme.md
- Add margin-top back to tool-output for spacing between header and content
2026-01-01 22:21:40 +01:00
Mario Zechner 424401f426 Fix markdown code block default color to use --text not --mdCodeBlock
The mdCodeBlock color was being applied to all text in code blocks,
overriding hljs syntax highlighting for unspanned text.
2026-01-01 22:15:26 +01:00
Mario Zechner 6130518f60 Fix hljs v11 compound class selectors for functions/types 2026-01-01 22:07:04 +01:00
Mario Zechner 98d56b15d7 Fix hljs color mappings to match TUI theme
- Add .hljs-function for syntaxFunction
- Separate .hljs-punctuation to use syntaxPunctuation (was using syntaxOperator)
2026-01-01 22:04:38 +01:00
Mario Zechner a46024a5ff Fix HTML escaping in markdown code blocks
Move HTML tag escaping from pre-parse to custom renderers.
This preserves < in code blocks while still escaping in text content.
2026-01-01 22:03:01 +01:00
Mario Zechner 7720f3512b Add ctx.ui.theme getter for styling status text with theme colors
- Add theme property to HookUIContext interface
- Implement in interactive, RPC, and no-op contexts
- Add status-line.ts example hook
- Document styling with theme colors in hooks.md
2026-01-01 21:58:01 +01:00
Mario Zechner 8e42104f9a Remove padding from markdown code blocks 2026-01-01 21:50:23 +01:00
Mario Zechner 31ab52e752 Fix markdown code block syntax highlighting
Marked v15 removed the highlight option from setOptions.
Use marked.use() with a custom renderer instead.
2026-01-01 21:42:18 +01:00
Mario Zechner 42205e6636 Fix tool-output spacing by removing pre-wrap from container
The white-space: pre-wrap on .tool-output was preserving template
literal whitespace (newlines and indentation). The pre elements
inside still have pre-wrap for actual code content.
2026-01-01 21:40:16 +01:00
Prateek Sunal 8319bd530e Hooks can render custom status (#385)
* Add ctx.ui.setStatus(key, text) API for hooks to display status in footer

- Add setStatus to HookUIContext interface
- Implement in interactive mode (FooterComponent)
- Implement in RPC mode (fire-and-forget)
- Add no-op implementations for headless contexts
- Multiple statuses displayed on single line, sorted by key
- Supports ANSI styling (hooks handle their own colors)

* Remove setStatus from changelog for now

* Fix hook status API to follow TUI rules

- Sanitize status text: replace newlines, tabs, carriage returns with spaces
- Truncate combined status line to terminal width using truncateToWidth
- Update JSDoc to document sanitization and truncation behavior
- Remove unused createHookUIContext method
- Add missing setStatus to test mock

* Add setStatus to changelog

* Use dim ellipsis for hook status truncation for consistency with footer style

---------

Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
2026-01-01 21:35:37 +01:00
Mario Zechner ae4c7b2794 Fix export HTML styling issues
- Match help-bar font size (11px) with header-info
- Add newline after 'Available Tools' header
- Remove excessive margin-top from tool-output
2026-01-01 21:34:07 +01:00
Mario Zechner 24cdb8a34b Make /share cancellable with Escape, add CHANGELOG entries
- Use BorderedLoader for /share command so Escape cancels gist creation
- Add CHANGELOG entries for /share command and HTML export improvements
- Add todo.md with remaining export-html issues
2026-01-01 21:27:33 +01:00
Mario Zechner 5b173ffaa1 Remove unused imports and variables 2026-01-01 21:14:36 +01:00
Mario Zechner d3dab84c6d Refactor export-html and add /share command
- Split template into separate files: template.html, template.css, template.js
- Add tree visualization sidebar for session navigation
- Fix HTML sanitization to prevent <style> tags breaking DOM
- Add DOM node caching for faster re-renders
- Fix tree indentation to match tree-selector.ts
- Add /share command to upload session as GitHub gist
- Support shittycodingagent.ai/session?{gistId} URLs

Closes #375, closes #380
2026-01-01 21:13:40 +01:00
Mario Zechner a6dac7dc2b Show edit diff before tool execution (fixes #393)
- Extract diff computation from edit.ts into shared edit-diff.ts
- ToolExecutionComponent computes and caches diff when args are complete
- Diff is visible while permission hooks block, before tool executes
2026-01-01 20:34:19 +01:00
Mario Zechner aa628e14fa Fix export-html tree sidebar to match TUI tree-selector
- Show tool results in default filter (not hidden)
- Branch summary shows summary text inline
- Custom message support in tree with customType label
- Remove extra padding from tree nodes (use line-height)
- Remove border styling from active/in-path nodes
- Consistent 18px line-height for tree entries
2026-01-01 17:25:30 +01:00
Mario Zechner a8fdbd17d2 Fix export-html message stats and help bar
- Fix entry type names: branch_summary, custom_message (snake_case)
- Fix toolResult role (was 'tool')
- Count all entry types: user, assistant, tool results, custom, compactions, branch summaries
- Use global stats for tokens/cost (all entries), not just current branch
- Make help bar more prominent (12px, full opacity)
- Remove Esc shortcut from help bar
2026-01-01 17:16:47 +01:00
Mario Zechner d4f7957a65 Fix export-html header stats and UX
- Header h1 font size now 12px (matches body)
- Token/cost stats now computed for all entries, not just current branch
- Token display matches footer format: ↑input ↓output Rcache Wcache
- Cost display uses 3 decimal places like footer
- Scroll to target uses requestAnimationFrame for DOM readiness
- Initial load and Escape scroll to bottom, tree clicks scroll to target
2026-01-01 17:12:44 +01:00
Mario Zechner 8c33c90e97 Fix export-html spacing to use line-height based system
- Add --line-height CSS variable (18px = 12px font * 1.5)
- Convert all padding/margin to use var(--line-height)
- Remove fractional values for terminal-like consistency
- Fix gap between consecutive tool executions
- Remove extra padding from error-text and model-change
- Fix thinking toggle to show 'Thinking ...' when collapsed
- Remove top padding after timestamps in assistant messages
- Remove bottom padding from assistant-text
2026-01-01 14:28:31 +01:00
Mario Zechner 87fff4bae1 Fix export-html styling and behavior
- Fix UTF-8 decoding with TextDecoder for base64 session data
- Use toolOutput color for expand hints (not borderAccent)
- Remove '- click to expand' text to match TUI
- Ctrl+O toggles expanded state (not visibility) on tool outputs
- Edit diffs always visible (not affected by Ctrl+O)
- Remove Ctrl+F override to allow browser search
- Replace tabs with 3 spaces in all tool outputs
- Fix syntax highlighting default color to use --text
- Add more hljs token selectors (property, punctuation, operator)
- Compaction uses customMessageBg/Label/Text colors
- Model change uses dim color without background
- Scroll to end on initial load
- Pointer cursor on expandable elements
2026-01-01 13:24:01 +01:00
Mario Zechner c262b57db1 Add image support and mobile UX improvements to export-html
- Display images from read tool results (base64 encoded)
- Add ellipsis for truncated tree entries
- Make mobile hamburger button more subtle
- Add X close button in sidebar header on mobile
- Hide hamburger when sidebar is open
2026-01-01 12:41:58 +01:00